프로세스의 Image를 여러 조각으로 분할하여 비연속적으로 흩어져서 메모리에 할당하는 기법 !
한 프로세스에 address space가 메모리에 배치될 때 noncontiguous 할 수 있도록 만드는 기법
하드웨어와 운영체제가 closely integrate 됨으로써 가능하다.
📌 페이지
Logical Memory(Process의 이미지)를 같은 사이즈의 블록으로 나눈 것
Paging 기법에서는 나뉘어진 조각을 '페이지'라고 한다.
페이지의 크기는 모두 동일하다 ❗
예를 들어 18KB 프로세스라면, 페이지는 총 4KB씩 5개가 있으며 마지막 페이지는 2KB는 사용하지 않는 형태이다.
페이지 사이즈는 주로 2의 거듭제곱 형태이다.(2의 k승)
📌 페이지 프레임
Physical Memory(주기억장치)를 고정된 사이즈의 블록으로 나눈 것
Logical Memory의 페이지를 Physical Memory의 페이지 프레임에 맵핑시키는 '맵핑 테이블'이 필요하다.
(Page Number, Page Offset(=displacement))
(페이지 번호, 해당 페이지의 시작주소부터의 거리)
예를 들어 페이지가 4개씩 4KB라면, 한 페이지당 4096 주소가 있을 것이다. 페이지 0은 0부터 4095번 주소까지, 페이지 1는 4096부터 8191까지, 페이지 2은 8192부터 ~ 이어질 것이다.
그렇다면 9000번지 주소는 (2, 808) 로 나타낼 수 있다.
Discontiguous Allocation은 메모리에 페이지가 흩어져 있기 때문에 Load Time Binding이 굉장히 복잡하다.
따라서 Discontiguous Allocation 은 'Address Mapping'을 통해, Runtime Binding을 할 수밖에 없다 ❗❗
1) Process가 Address Generation을 할 때 Logical Address는 (p, d)이다.
2) Page Table에서 해당 page를 찾고, Physical Address를 만든다.
3) Main Memory에서 해당 주소에 접근한다.
프로세스마다 페이지 테이블이 있는데, 이는 메모리 커널 공간 내 프로세스의 PCB에 저장될 수 있다.
그러나 이 경우 페이지 테이블 접근을 위해 매번 메모리 접근을 해야하므로, 프로세스의 Address Mapping을 빠르게 하기 위해서 다음과 같은 방법을 이용한다.
고속으로 접근할 수 있는 기억장치이다. 이 안에 페이지 테이블을 저장해놓고 고속으로 접근가능하게 할 수 있다.
프로세스의 이미지를 조각내어 메모리에 불연속적으로 배치한다. 그러나 각 조각의 크기는 서로 다르게 분할되며, 'segment'라고 부른다.
text영역, data영역, heap영역, stack영역, shared memory 영역으로 구분해서 segment를 만드는 경우가 많다.
(segment number, offset(displacement))
5개의 Logical Segment를 메모리에 로딩한 실제 Physical Address를 Segment Table의 Base Address로 저장한다.
또한 각 Logical Segment의 사이즈를 Segment Table의 Limit으로 저장한다.
예를 들어, 0번 segment는 1400번지부터 1000바이트에 걸쳐서 저장되어 있다는 의미이다.
Process가 segment0부터 n-1개 가지고 있다고 가정해보자.
Logical Address (s, d)라고 할 때 segment table에 가보면 해당 프로세스는 Physical Memory의 b번지에 위치하고, 그 크기가 l인 것이다.
더불어 displacement가 d이므로, d가 l(전체 사이즈)보다 작은지 확인한다. 만약 작지 않다면, error를 발생시킨다.
만약 작다면, d + b를 더하여 해당 프로세스가 접근하려고 했던 주소에 접근할 수 있다.