Virtual Memory System은 사용자 프로세스 이미지를 메모리로 로딩할 때 프로세스 전체를 로딩하는 것이 아니라 일부만 조각내서 로딩하기 때문에 Discontiguous Allocation이다.
Address Mapping, Address Binding에서도 Runtime Binding을 할 수밖에 없다. (Load time Binding은 매우 복잡하므로 현실적으로 어렵다)
Page이던 Segment이던, General한 용어로 'Block'으로 칭해 보자
Runtime의 Address Mapping 과정에서, 프로세스 이미지를 블록 단위로 나누어 Block 단위로 Mapping을 한다.
각 블록에 대해 Address Mapping Information도 블록 단위로 유지한다.
프로세스의 이미지를 m개의 block으로 나누었을 때, 그 중 한 주소에 접근하고자 할 때 해당 주소에 대해서 virtual address는 (b, d)로 표현한다.
v는 block number, d 는 해당 block에서의 displacement(offset)이다.
각 프로그램의 블록에 대해 virtual address와 real address, 기타 정보들을 저장하는 테이블
1이면 해당 블록이 메모리에 로딩되어 있다는 뜻이다. 0이면 해당 블록이 메모리에 로딩되어있지 않는 것이다. (Discontiguous Allocation은 Residence Bit이 필요 없지만 Virtual Memory는 반드시 필요하다)
Physical Memory에서의 실제 주소
이 (b, d) 는 Virtual Address 이다.
Real Address가 a번지면, a와 d (displacement)를 더한 a+d가 실제 Physical Address가 된다.
(1) 해당 Block을 읽어서 메모리에 가져와야 한다.
(2) Pa는 Sleep을 해서 Context Switching이 발생한다. 하드디스크 등 Storage에 해당 블록을 읽으라는 command을 요청한다.
(3) 다 읽혀지고 나면, 프로세스 Pa가 인터럽트로 wake up 되고, ready상태가 된 후, 스케줄링 받으면 CPU에서 실행되어 Address Mapping을 할 수 있다.
-> 이로 인해 굉장히 많은 시간이 소모될 수 있으므로, 이를 'Block Fault'라고 한다!