-
Notifications
You must be signed in to change notification settings - Fork 19
[c] mmap() and munmap()
dsindex edited this page Jul 30, 2014
·
1 revision
-
mmap()
- 파일에 대한 reference count를 증가시킨다. ( open()과 동일하게 )
- 파일에 대한 mapped file 정보를 프로세스 내부에 생성한다.
-
munmap()
- 파일에 대한 reference count를 감소시킨다.( close()와 동일하게 )
- 파일에 대한 mapped file 정보를 프로세스에서 제거한다.
-
프로그램이 끝날 때, munmap()을 호출하지 않아도 프로세스가 가지고 있는 파일에 대한 reference와 mapped file 정보는 알아서 지워지지만, munmap()을 명시적으로 호출하는 것이 좋다. 파일을 공유하는 여러개의 process가 동시에 돌아가다가 어느 하나가 munmap()을 호출해도 다른 process는 그것의 영향을 받지 않는 구조이다.
-
process가 어떤 파일에 대해 mapped file정보를 생성했는지 확인하려면, 아래 명령어를 사용하면 된다.
pmap -d pid
- mmap()으로 메모리를 공유하면 top으로 봤을 SHR 영역이 변하는 것을 알 수 있다.
- mmap으로 구현된
Aho-Corasick
의 python extension을 구현하고 python에서 사용해보았다. c에서는 pmap으로 shared 정보를 확인할수 있지만, python은 어떤 정보도 나오지 않는다. lsof로 프로세스가 파일을 열고 있다는 것을 확인하거나 top을 했을 때, SHR 영역이 증가하다가 오르락 내리락 하는 정도로 'shared되었구나' 하는 판단을 해볼 수 있을 것같다. 보다 정확히 확인해보려면, 이 블로그에서 언급된 것처럼
cat /proc/pid/smaps
파일에서 해당 파일이 실제 매핑되었는지 정보를 확인해보면 된다.
MMUPageSize: 4 kB
7f75f0c6e000-7f7639ccf000 r--s 00000000 08:11 15597640 /data/file.txt
또한 hadoop의 mapper 수를 max로 늘려서 어떤 job을 실행시켰을 때, 초기에 대량의 프로세스가 뜨면서 여기 저기서 page fault가 발생하므로 시스템이 버벅대다가 어느정도 시간이 지나면 정상화되는 현상도 있다.