KAIST 전산학부 권영진 교수님 OS 강의를 통해 배운 내용을 정리해보았다.
OS를 설계한 사람의 관점에서 왜 이렇게 디자인하였는가에 대한 강의다.
왼쪽 코드는 같은 함수를 2번 부르지만 각각 속도 차이를 보인다. 코드를 한 번 찬찬히 뜯어보자.
왼쪽 코드에서 mmap으로 메모리를 1MB 할당받고, addr로 할당된 메모리 주소를 받아온다. 그 후 memset은 addr에 넣을 값을 1로 세팅한다. 자, 같은 과정을 거쳐 2번의 memset을 호출하였을 때 걸린 시간의 차이는 왜 10배나 날까?
캐시를 사용했기 때문이다. 첫 호출에서는 DRAM에서 memset을 수행하지만, 두번째는 캐시 메모리에서 memeset을 수행한다. 이전에 작업한 내역이 캐시 메모리에 저장되어 있기에 캐시 메모리에서 바로 가상 주소로 접근하므로 10배의 속도 차이가 생겨버린다.
이번에는 1MB 크기가 아닌 1GB라 생각해보자. 캐시 메모리는 1GB만큼 저장할 공간이 없기에 캐시가 통하지 않을 것으로 예측된다. 하지만.. 오른쪽 코드를 보면 2배의 차이가 나있다..!
이는 페이지 콜 매커니즘으로 인한 것이다. 가상 메모리에서 실행한 mmap은 DRAM의 물리 메모리를 전부 제공하지 않고 가상 메모리를 준다. 이 때 page fault가 발생한다. 첫 할당이기에 아직 물리 메모리는 매핑되지 않아 exception을 띄우고 memory allocation을 해주는 것이다.
하드웨어에서 application을 돌리다보니까 나온 것이 OS다. OS는
결국 high level의 목적을 위해 어떤 디자인을 했느냐가 OS의 핵심이다. 예를 들면, 프로세스간의 공유(통신)를 하고 싶다면 그를 위해 어떤 디자인을 할 것인가.
프로세스는 프로그램의 실행단위를 추상화한 것이다. 각 프로세스는 자신이 하나의 컴퓨터를 가진 것처럼 행동한다.