inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

리눅스 시스템 프로그래밍 - 이론과 실습

memory map - 라이브 프로그래밍

mmap 관련 궁금점.

733

zeroone

작성한 질문수 10

2

1. 파일을 메모리상에 매핑하는 이 함수가 언제 유용하게 쓰이는지 궁금합니다.

2. 프로그램안에서 파일을 열면 파일을 닫듯이, 메모리에 매핑하고 unmap해줘야하는 건가요? 그냥 map하고 종료되면 메모리상에 매핑된 파일을 모두 자동으로 unmap되는 건가요?

linux

답변 1

5

런잇(ProgCoach4U)

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