2021. 3. 12. 18:47ㆍComputer(인강)/시스템 프로그래밍
안녕하세요 bannavi입니다^ㅅ^
오늘은 시스템 프로그래밍 첫번째 시간입니다
메모리와 mmap에 대해서 공부를 해볼거에요
바로 시작하겠습니다!
메모리와 관련된 주요함수
# heap영역에 동적인 메모리를 생성하는 malloc함수
* 이외에도 메모리를 관리하는 함수는 strcmp/strcpy/memset등이 있습니다
파일처리 성능 개선 기법
mmap
파일의 특정 공간을 메모리의 특정 공간에 매핑을 시켜놓습니다.
이렇게되면 프로세스는 파일을 처리하는것이 아니라 메모리에 있는 데이터를 읽거나 쓰면 되기때문에
프로세스가 메모리를 자주 access해서 처리하게끔 만들어주면
시스템콜, 스케쥴러, 인터럽트도 필요가 없고, DMA, systembus도 필요없기 때문에
성능이 굉장히 올라간다고 볼 수 있습니다.
첫번째 인자는 파일에 어디서부터를 매핑할거냐를 나타냅니다.
보통 start는 NULL또는 0을 사용합니다. offset: mapping되기 원하는 물리 메모리 주소로 지정
[start+offset] ~ [start+offset+length] 만큼의 물리 메모리 공간을 mapping 할 것을 요청
두번째인자는 파일을 어느정도 사이즈만큼 메모리에 매핑을할거냐를 나타냅니다.
세번째 인자(prot)는 보호모드를 설정하는 부분으로, 읽기가 가능할지, 쓰기가 가능할지, 실행을 가능하게할지
이런 권한을 설정해주는 부분입니다.(보통 읽기 쓰기가 많이 쓰입니다)
1) PROT_READ(읽기가능)
2) PROT_WRITE(쓰기가능)
3) PROT_EXEC(실행 가능)
4) PROT_NONE(접근 불가)
네번째 인자(flags)는 메모리 주소 공간을 설정합니다. 주소공간을 어디에 만들었는지
1)MAP_SHARED(다른 프로세스와 공유 가능)
2)MAP_PRIVATE(프로세스 내에서만 사용가능)
3)MAP_FIXED(지정된 주소로 공간 지정)
다섯번째 인자(fd)는 device file에 대한 file descriptor
mmap동작 방식으로 이해하는 실제 메모리동작 총정리
# 운영체제, 가상 메모리 이해를 기반으로 실제 활용 총정리
컴퓨터 공학 이해 없이는 mmap동작을 이해하기 어려움
1. mmap실행 시, 가상 메모리 주소에 file 주소 매핑(가상 메모리 이해)
2. 해당 메모리 접근 시, (요구 페이징, lazy allocation)
1) 페이지폴트 인터럽트 발생
2) OS에서 file data를 복사해서 물리 메모리 페이지에 넣어줌
3. 메모리 read시: 해당 물리 페이지 데이터를 읽으면 됨(메모리 access만 필요. 속도가 굉장히 올라갈 것)
4. 메모리 write 시 : 해당 물리페이지 데이터 수정 후, 페이지 상태 flag 중 dirty bit를 1로 수정
5. 파일 close시, 물리 페이지 데이터가 file에 업데이트 됨(성능 개선)(이 페이지가 file로 쓰여져야 할 때, mmap을 더이상 안할때라던지 mmap으로 매핑된 메모리를 파일에 싱크(저장)할때라던지, 아니면 해당 프로세스가 끝날때라던지 뒷처리 작업으로 해당 페이지에 관련된 내용을 파일에 덮어씌운다)
file에 대한 access가 지금 거의 이 메모리를 쓰고나서, 그것도 여러번 써도되고, 프로세스가 끝날때 또는 mmap이 끝날때만 씀.
파일 엑세스가 굉장히 적음. -> 그렇기 때문에 이 mmap이라는 방식이 속도를 높이는데에 도움이 된다.
그리고 내부적인 구조는 다 가상메모리 페이징 시스템과 연관이 많다. (왜 mmap이 빨라질 수 있는가)
가상메모리 4G의 특정한 부분에 이 file 주소가 매핑이 되는것
그럼 페이지 몇번부터 몇번까지 할당이 될거고,(가상 메모리 안에 페이징 시스템을 쓰고 있다면)
맨처음 부터는 이거 이상의 동작을 하지 않습니다.
페이징 디렉토리를 여러개 만들어놓고, 그중 사용 디렉토리만 페이지 테이블을 구성해서 사용한다
이렇게 파일이 특별 페이지와 매칭이 되면, 당연히 이 페이지와 관련된 페이지 디렉토리에 있는 페이지 테이블도 생길 수 있는것
여기까지가 mmap이 실행되면 동작하는 부분
나머지는 해당 메모리에 접근하면 이루어집니다
(파일에 있는것을 메모리에 올리거나 또다른 메모리에 있는 영역을 복사해서 다른 메모리에 올리거나)
이 시간은 기본적으로 시간이 많이 걸리게 되어있으므로, 그래서 반드시 지금 바로 쓰기 직전까지는 웬만하면 이 작업을 안하는게 좋습니다.
그래야 다른 코드들이 최대한 빨리 돌아갈 수 있거든요
파일, 메모리, 그리고 가상메모리
장점
1) read(), write()시, 반복적인 파일 접근을 방지하여 성능 개선
2) mapping된 영역은 파일 처리를 위한 lseek()를 사용하지 않고 간단한 포인터 조작으로 탐색 가능
-> mapping된 영역을 메모리에 올려놨기 때문에 메모리 변수에 접근하듯이 쉽게 해당 주소에 접근하고, 쉽게 해당 데이터를 쓰거나, 변수를 업데이트 하는 것처럼 읽을 수 있기 때문에 역시 프로그래밍도 간소화되고 속도도 빨라질 수 있다.
단점
1) mmap은 페이지 사이즈 단위로 매핑
- 페이지 사이즈 단위의 정수배가 아닌 경우, 한 페이지 정도의 공간 추가 할당 및 남은 공간을 0으로 채워주게 됨
-> 페이지는 고정된 블록으로 있는데 만약에 단순히 1byte에 있는 파일의 데이터를 mmap을 사용해서 메모리에 매핑시킨다고 했을 때,
페이지 사이즈가 4KB라면, 메모리에는 4KB가 들어갑니다. 그래서 때로는 추가 공간이 필요하거나 공간 낭비가 있을 수 있습니다.
munmap
mmap으로 강제로 매핑이 된 데이터를 메모리 해제시켜줄 수 있음.
첫번째 인자에는 매핑된 주소의 첫번째 주소를 써주면 됌.
1) *addr에 mapping된 물리 메모리 주소를 해제한다.
2) length: mapping된 메모리의 크기(mmap에서 지정했던 동일값을 넣음)
'Computer(인강) > 시스템 프로그래밍' 카테고리의 다른 글
시스템 프로그래밍 03 파일 시스템 관련 시스템콜 이해 (0) | 2021.03.14 |
---|---|
시스템 프로그래밍 02 mmap 예제 및 활용 (0) | 2021.03.13 |
스레드 02 - 기본과 동기화 (0) | 2021.03.12 |
스레드 01 기본 (0) | 2021.03.12 |
쉘스크립트 - 04 협업 예제 및 정리 (0) | 2021.03.12 |