가상 메모리(Virtual Memory)
다중 프로그래밍 방식의 protection 문제를 해결하기 위해 가상 메모리 개념이 도입되었다.
이는 각 프로세스마다 가상의 메모리 주소 체계를 갖게하고 이를 실제 물리 메모리 공간과 맵핑 시키는 방식이다.
즉, 서로 다른 프로세스들의 가상 메모리 상에서의 주소가 같더라도 실제 물리 메모리에서는 다른 주소 공간을 가리키게 된다. 이러한 방식으로 process간 isolation을 보장하게 된다.
프로세스 실행 과정
1. 태스크 로딩
디스크에 저장되어 있는 파일은 stack과 heap을 가질 필요가 없기 때문에 text 영역과 data 영역으로 이루어져있다.
또한 디스크에 저장되는 파일은 disk block 단위로 나뉘어 저장이 되는데 보통 그 크기는 4KB이다. 한편 메모리에서는 프로세스를 page frame 단위로 나누어 보관을 하는데 그 크기는 disk block의 크기와 같다.
위의 그림에서 test.exe가 실행 되기 위해서는 디스크에서 메모리로 이동되어야 한다. 프로그램 전체를 메모리에 올릴 수도 있지만 보통은 실행에 필요한 프로그램의 일부만 먼저 메모리에 올린다.
※ 프로그램의 일부만 메모리에 올리는 이유?
=> 최대한 많은 프로세스를 메모리에 올려 CPU의 효율을 높이기 위해
2. 페이지 시스템: 주소 변환
디스크에 있는 프로그램을 물리 메모리에 로딩하면서 각 프로세스의 페이지 테이블에 위치 정보를 기록한다.
3. Page Fault
page fault는 trap의 일종으로써 디스크에서 로딩하지 않은 페이지를 포인터로 가리키고 실행할 경우 발생한다.
이 경우 I/O를 통해 디스크에서 해당 페이지를 읽어온 후 스케줄링, 문맥교환이 연쇄적으로 일어난다.
fork()를 호출하는 프로세스의 실행
fork()를 호출하는 경우 부모 프로세스와 자식 프로세스는 동일한 코드를 사용하기 때문에 text 영역은 서로 공유하게 된다 (같은 물리 메모리를 가리킨다). 반면 data 영역과 stack 영역에 대해서는 물리 메모리에 새로운 페이지 프레임을 생성하여 자식 프로세스에게 할당하게 되는데 이는 메모리 낭비가 심하다는 단점이 있다. 자식 프로세스가 내부적으로 지역 변수나 전역 변수를 수정하지 않는다면 굳이 새로운 페이지 프레임을 생성하지 않아도 되기 때문이다. 현대 OS에서 사용하는 COW 방식은 이러한 문제점을 해결해준다.
COW (Copy-On-Write)
COW 방식은 fork() 직후에는 모든 영역을 공유하다가 자식 프로세스의 stack 또는 data 영역에 수정이 일어날 때 해당 영역을 copy 한 후 수정하여 새로운 페이지 프레임에 저장한다.
※ fork() 후 exec()를 호출하는 경우
자식프로세스가 생성된 후 exec()를 호출하는 경우 기존에 사용하던 모든 메모리 영역을 교체하게 된다. 따라서 exec() 호출 시 넘겨준 새로운 실행 파일을 디스크에서 읽어들여 새로운 text, data, stack 영역을 생성해 가리키게 된다.
'운영체제(OS)' 카테고리의 다른 글
[OS] Page Placement Policy (페이지 배치 전략) (0) | 2022.10.26 |
---|---|
[OS] 페이징(Paging) 기법 (0) | 2022.10.26 |
[OS] 물리 메모리 관리 기법 (0) | 2022.10.18 |
[OS] Scheduling (0) | 2022.10.17 |
[OS] Limited Direct Execution (0) | 2022.10.17 |