Shared면 여러프로세스에서 읽고쓰고 가능하니까 당연히 쓸데가 많은데
Private모드면 파일 열어서 메모리에 싹 복사해놓는거랑 결과는 크게 다를게없는데 보통 무슨용도로 쓰는지 궁금
대충 내가 생각해본 장점은
여러 프로세스에서 동시에 같은 파일을 열어서 보려면 private mmap을 쓰면 한 파일에서만 열고 나머지는 그 페이지 주소를 참조하면 되니까 IO는 한번만 하면 됨
같은맥락에서 여러프로세스에서 큰 파일을 열어도 메모리공간은 파일하나만큼만 씀
정도인데 막상써보니 좋은거같기도 하고
암튼 보통 private mmap이 일반 open이랑 구별되는점이라고 생각해보면 저정도만 생각나는데 혹시 내가 모르는거 더있음?
글고 하나더
private 모드로 열린 read only mmap이 있을때
msync로 파일 내용 못바꾸는건 이해가는데 반대로
파일이 업데이트되었을때 그걸 열려있는 mmap 페이지에 반영하는 방법은 없음?
shared 면 msync로 되는데 private은 그것도 안되나
아 뒷질문은 그냥 코드 잘못짰던거였음 무시해주세요 ㅈㅅㅈㅅ
파일 입출력 용도의 mmap만을 얘기하는 거라면 일반적인 포인터 연산으로 파일을 읽고 쓰도록 동작한다는 장점이 있는데 여기에 private를 적용하면 VFS마냥 파일을 가상으로 관리하는 용도로도 쓸 수 있고 어쨌든 API를 계속 호출해주지 않아도 비교적 편하게 쓰니까 일부 상황에서 쓰임
근데 보통 협업을 중요하게 생각하는 리더가 관리하는 프로젝트라면 mmap으로 파일 매핑하는 행위는 지양함 왜냐하면 함수 여러 개 왔다갔다 하다 보면 다른 사람이 봤을 때 이게 무슨 동작인지 한 눈에 파악하기가 어려움
게다가 내가 알기로 read()/write()에 비해서 I/O 성능이 떨어지는 걸로 알고 있음. 버퍼링하는 방식이 달랐던가 하여튼 커널 내부적으로 다르게 동작함
오 ㄱㅅㄱㅅ
파일이 아니라 새로운 페이지 자체 필요할 때가 있음 대표적인 예시는 힙 구현인데 ptmalloc은 좀 복잡한데 dlmalloc은 힙 꽉차면 새로 mmap으로 새 페이지 매핑해서 힙 확장하는거로 알고있음 메모리가 아니라 파일의 경우는 잘 모르겠는데 추상화가 가능할거같기도 하고? 메모리랑 파일이랑 같은 인터페이스로 접근할 수 있으니까 근데 그쪽은 잘 모르겠다
오… Malloc이 mmap으로 돌아가는지는 몰랐네
정확히는 구현에 따라 다름 brk로만 쓰는 경우도 있고... strace로 찍어보면 libc단에서 mmap private 꽤 많이 쓸거임