버티의 블로그
[운영체제 #14] Virtual Memory 본문
기존에는 프로세스 전체를 메모리에 load하고 빼는 Swapping이란 방식을 사용했다. 그러나 이 방법으로 하면 오랜 문맥 교환 시간이 소요될 뿐더러, 메모리 용량보다 더 큰 프로그램은 실행할 수 없었고 프로세스들의 버퍼는 OS 영역 안에 남아있다는 문제점이 존재했다. 또한 다음과 같은 I/O 문제도 있었다.
- Pending I/O : 대기 중인 I/O가 있을 경우에 swapping을 하면 잘못된 프로세스에 I/O가 전달될 수 있다.
- Double Buffering : Pending I/O를 해결하기 위함으로, 데이터를 커널 공간으로 한번 더 전송한 후 I/O 디바이스로 전송하는 방식인데, 이는 추가적인 오버헤드를 발생시킨다.
따라서 아래의 virtual memory를 사용하게 되었다.
Vitrual memory는 프로세스 중 필요한 일부만 load하고 나머지는 backing store에 두는 방법이다. 앞서 보았던 paging과 segmentation 역시 모든 페이지와 segment를 load하는 방식이었는데, virtual memory에서는 이에 맞게 요구되는 페이지와 segment만 사용하는 demand paging과 demand segmentation을 사용한다. 이로 인해 physical memory보다 더 큰 용량의 프로그램도 실행할 수 있게 된다.
이때 페이지가 메모리에 load되었는지 안되어있는지를 확인하기 위해 page table에 valid-invalid bit를 기록한다. 이 값이 v면 페이지가 존재하는 것이고, i면 페이지가 존재하지 않는 것이다. 그래서 MMU가 logical address를 physical address로 변환할 때 이 값을 참조하게 된다. 여기서 페이지가 존재하지 않는 상황을 page fault라고 한다.
만약 이러한 page fault 상황이라면 OS가 페이지를 직접 불러와서 메모리에 load하는 작업을 거치게 된다. page fault를 해결하는 과정은 다음과 같다.
- 원하는 페이지의 valid bit를 확인한다.
- page fault 상황이라면 OS에 interrupt(trap)을 걸어 커널 모드로 전환한다.
- 빈 공간(free frame)을 찾는다.
- backing store에서 페이지를 불러오고 free frame에 적재한다.
- page table에서 해당 페이지의 valid bit를 v로 설정한다.
- 다시 유저 모드로 전환하고 중지됐던 시점의 명령어부터 재시작한다.
이 과정에서 발생 가능한 문제도 있다.
- Pure demand paging : 메모리에 페이지가 아예 존재하지 않은 상태로 시작하는 상황으로, 모든 페이지에 처음 접근할때마다 page fault가 발생한다.
- Multiple page faults : 하나의 명령어가 여러 페이지에 접근할 때 여러 page fault를 일으킬 수 있는 상황이다.
- 이는 연속한 메모리에 접근하거나 반복적으로 같은 페이지를 사용하는 참조 지역성(Locality of Reference)를 이용해서 성능 저하를 방지할 수 있다.
- No free frame : 메모리에 페이지를 load할 frame이 없는 경우로, 이때는 Page Replacement가 필요하다.
페이지 교체(Page Replacement)는 다음과 같이 진행된다.
- 페이지 교체 알고리즘에 따라 victim frame(교체될 frame)를 지정
- victim frame의 page를 swap out
- page table에서 해당 page의 valid vit를 i로 변경
- 새로운 페이지를 swap in
- page table에서 새로운 page의 valid vit를 v로 변경
여기서 추가로 고려해야할 점이 dirty bit(modify bit)인데, 이 비트로 페이지가 수정되었는지에 대한 여부를 추적한다. 수정한 적이 있는 페이지는 dirty bit값이 설정되고, 해당 페이지만 디스크에 따로 저장한다. 즉 수정된 페이지만 디스크에 저장하고 나머지 페이지는 바로 swap out하게 하여 불필요한 I/O작업을 줄이고 메모리 효율성을 높인다.
그럼 victim frame을 지정하는데 사용하는 페이지 교체 알고리즘이 중요하다는걸 알 수 있다.
메모리 내 frame 공간이 넓을수록 당연히 발생하는 page fault 수가 적어질 것이다. 페이지 교체 알고리즘은 이러한 그래프 형태를 따르면서 page fault의 비율을 최소화시키며 victim frame을 정하는 것이 최종 목표이다.
이 페이지 교체 알고리즘의 종류는 다음 장에서 알아보도록 한다.
'전공 공부 > 운영체제' 카테고리의 다른 글
[운영체제 #15] Page Replacement (2) | 2024.06.06 |
---|---|
[운영체제 #13] Segmentation and Paging (0) | 2024.05.30 |
[운영체제 #12] Main Memory Allocation (0) | 2024.05.28 |
[운영체제 #11] Deadlocks (0) | 2024.05.23 |
[운영체제 #10] Windows API Example (0) | 2024.05.22 |