• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

mmap 관련 궁금점.

19.11.12 09:12 작성 조회수 508

2

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을 이용해 열어 놓고 닫지 않은 열린 파일 디스크립터는 커널이 자동으로 닫아줍니다. 하지만 프로세스가 종료 중일 때에는 계속 열려있게 되므로 반드시 열었으면 닫아주세요 :)