해결된 질문
작성
·
375
3
안녕하세요.
프로세스 동기화 부분에서 공유 메모리 관련하여 궁금한 점이 생겨 질문을 남기게 되었습니다.
메모리는 커널 영역과 사용자 영역으로 구분되어 커널 영역에는 OS, 사용자 영역에는 일반 프로세스가 적재되는걸로 이해를 했습니다.
그렇다면 공유 메모리나 버퍼캐시 같은 메모리는 사용자 영역에 위치해있는지 아니면 OS 영역에 위치해있는지 궁금합니다.
그리고 프로세스 생성시 0번 init 프로세스를 fork해서 코드와 데이터 영역의 부분을 exec 된다고 설명해주셨는데 일반 프로세스가 자식 프로세스 생성시에도 init 프로세스를 복사하는지 그냥 자기 자신을 복사해서 exec하는지 궁금합니다.
답변 1
1
안녕하세요 akgkfk3님!
질문에 답변드리겠습니다ㅎㅎ
공유메모리는 해당 공유메모리를 생성하는 프로세스의 주소공간에 할당됩니다.
즉 유저영역에 할당됩니다.
따라서 속도도 가장 빠른 방식입니다.
버퍼의 경우 공유메모리 내에 존재하게 되는데 공유메모리가 유저영역에 있으므로 버퍼도 유저영역에 존재합니다.
일반 프로세스는 init 프로세스를 복사하지 않고 자기 자신을 복사합니다!
😀
연달아 질문하게 되서 죄송합니다.
가상메모리 개요 강의에서 가상 메모리의 크기는 CPU의 Bit 수, 메모리의 크기에 의존한다고 말씀해주셨는데 그렇다면 32bit CPU에서는 최대 가상메모리의 크기는 4GB이므로 만약에 실 물리 메모리가 2GB이라면 스왑 영역의 최대 2GB까지 합친 것으로 이해했습니다.
다만, 그 뒤의 부분에서 MMU가 보는 물리 주소 관점으로 물리 메모리와 스왑 영역을 본다고 하셨는데 4GB의 가상메모리로 4GB짜리 프로세스 5개를 실행할 수 있다는 것이 이해가 가질 않습니다 ㅠㅠ
64bit CPU라면 논리 주소 공간이 TB급 이상으로 할당이 가능하므로 실 물리메모리가 4GB이라 하여도 스왑 파티션의 용량을 16GB까지 할당하였다면 MMU 관점에서는 20GB 램을 가지고 있는 것으로 판단하여 Swapping을 통해 실행이 가능하다고 이해하였으나 예로 들어주신 32bit CPU로 이해했을 때는 직관적으로 와닿지가 않네요 ㅠㅠ...