mmap 관련 궁금점.
733
작성한 질문수 10
1. 파일을 메모리상에 매핑하는 이 함수가 언제 유용하게 쓰이는지 궁금합니다.
2. 프로그램안에서 파일을 열면 파일을 닫듯이, 메모리에 매핑하고 unmap해줘야하는 건가요? 그냥 map하고 종료되면 메모리상에 매핑된 파일을 모두 자동으로 unmap되는 건가요?
답변 1
5
1. mmap은 여러 가지 용도로 사용됩니다. 예를 들어, 하드웨어의 특정 레지스터를 메모리로 매핑하여 사용하기도 하구요, 파일을 공유메모리로 사용할 때도 사용됩니다. 이것 말고도 여러 가지 용도가 있습니다 :) 일반적으로는 파일을 메모리에 매핑하여 사용하게 되는 경우가 많은 것 같습니다.
사람 이름과 그 사람의 나이를 저장한다고 생각해보시죠. 메모리에서 이 데이터를 관리하기 위해서 '사람'이라는 structure를 선언하고 structure array를 사용하면 아주 쉽게 데이터를 저장하고 사용할 수 있습니다.
이 데이터를 파일에 저장해놓고 수시로 읽고 쓴다고 가정해봅시다. fwrite()/fread()를 이용해 structure 단위로 읽고 쓸 수 있습니다. 그런데 첫번째 사람의 데이터를 읽었다가 열번째 사람의 데이터를 읽으려면, 또 그 다음엔 세번째 사람 데이터를 읽으려면.. fseek()을 이용해 파일의 오프셋을 적절히 움직인 후 fwrite/fread를 해야 적절한 데이터를 읽고 쓸 수 있습니다. 매우 불편하죠.
이 때 mmap을 사용하게되면 굉장히 간단해 집니다. mmap을 이용해 파일의 데이터를 structure pointer에 mapping 해 놓으면, n 번째 사람의 데이터는 person_ptr[n]의 형식으로 접근할 수 있습니다. 읽고 쓰는 것 모두 가능하죠.
이처럼 mmap은 매핑된 메모리 영역에 데이터를 읽고 쓰게 되면 실제로 파일에서 읽거나 파일에 저장하게 됩니다. 아주 편리하죠 :)
2. 맞습니다. mmap()과 munmap()은 fopen()과 fclose() 처럼 쌍으로 호출해줘야 합니다. 다행인 것은, 프로세스가 종료될 때 mmap, fopen을 이용해 열어 놓고 닫지 않은 열린 파일 디스크립터는 커널이 자동으로 닫아줍니다. 하지만 프로세스가 종료 중일 때에는 계속 열려있게 되므로 반드시 열었으면 닫아주세요 :)
inotify 객체에 등록된 watch descriptor 해제 관련 질문
0
37
2
select API 실습 코드 질문
0
40
2
wsl에서 fcntl사용
0
73
2
inotify_event 구조체 질문 [파일 이벤트 - 라이브 프로그래밍]에서...
0
180
2
./stat 파일이름
0
273
2
fopen r, r+모드 차이
0
460
2
강의를 모두 수강하고 스스로 구현하면 좋을 과제나 프로젝트 주제가 있을까요?
0
326
1
pthread 질문
0
419
2
I/O Multiplexing(select) 질문
0
325
1
inotify.c. ret 질문
0
302
1
inotify.c 질의합니다.
1
317
1
child process
0
715
1
read/blocking
0
565
1
flock
0
565
1
system call
0
598
1
pthread_create() 함수 이용했을 때, thread가 두번 호출되는 것 처럼 나타납니다. 왜 그런것인가요?
0
487
1
fork() 함수 사용시 결과 관련 질문
0
371
1
exec 관련 궁금한 사항
0
450
2
파일 디스크립터와 FILE 구조체에 대한 질문
0
552
1
buf 선언에 따른 read() fail 문제
0
251
2
파일 이벤트 - 라이브 프로그래밍 에서 캐스팅 질문
0
254
1
2번 multi thread 방법 질문
0
242
1
segmentation fault 발생 관련 문의
1
842
1
라이브 코딩 실습 코드
0
235
1





