파일 API와 mmap 차이

2019. 11. 1. 11:52임베디드/리눅스시스템프로그래밍

프로세스가 파일을 읽는 방법에는 총 2가지가 있다

 

1. 파일 디스크립터

2. mmap을 통해 파일의 내용을 메모리에 매핑하여 사용

 

파일 디스크립터로 파일을 읽는 행위는 지양된다. 물리적인 거리에 의해서 프로세스가 디스크에서 파일을 읽는 속도는 매우 느리다. 그리고 읽는 도중에는 blocking이 되어 있으므로 CPU 효율이 떨어지게 된다

 

즉 OS 측면에서는

1. 시스템 콜

2. 스케쥴러

3. 인터럽트의 일을 수행하게 되고

 

컴퓨터구조 단에서는

1. DMA

2. System Bus

을 통해서 개선할 수 있지만 따로 추가해야 하는 부분이다

 

따라서 mmap의 장점은

1. 가상 메모리에 파일을 매핑하는 mmap을 사용하면 위의 일들을 줄여줄 수 있다

2. 파일의 내용을 읽을 때 제어되는 위치지정자 역시 fseek보다는 포인터로 주소를 옮겨가면서 읽는 것이 훨씬 편하다

 

 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset

- addr

커널에게 요청하는 mapping 시작 주소, 커널은 이를 참조만하고 적절하지 않는 위치라면 다른 위치에 파일을 매핑한다. 하지만 flag 옵션에서 MAP_FIXED가 써진다면 요구로 바뀌게되고 커널이 만족하지 못한다면 mmap은 실패하게 된다

 

- flags

1. MAP_SHARED : 다른 프로세스와 파일의 내용을 공유할 수 있다

2. MAP_PRIVATE

3. MAP_FIXED

 

프로세스가 종료하면 자동으로 sync, unmap을 해주므로 따로 해주지 않아도 무방하다

 

 

 

$ ls -al > "ls.txt" 

 

void *로 접근해서 파일을 읽는 코드

 

 

WRITE 옵션을 추가해서 파일을 수정하는 방법

 

 

'임베디드 > 리눅스시스템프로그래밍' 카테고리의 다른 글

pthread_join과 pthread_detach의 차이  (0) 2019.11.03
pthread  (0) 2019.11.03
open과 O_CREAT 그리고 mode_t  (0) 2019.11.01
쉘 스트립트 sleep  (0) 2019.10.28
pthread_create시 attr 속성  (0) 2019.10.21