Page table을 2단계로만 사용하는 것이 아니라, 다단계로도 사용할 수 있다.
아무래도 프로그램 주소공간이 굉장히 넓기 때문에 3단계, 4단계... 점점 더 여러 단계의 page table을 사용하는게 가능함.
table을 위한 공간을 줄일 수 있지만, 하지만 한번 주소 변환하려고 할 때 page table을 여러번 거쳐야 하고, page table이라는게 물리적 메모리상에 있기 때문에 메모리에 한번 접근하기 위해서 주소 변환을 위해서 메모리를 4번 접근해야함. (page table이 메모리에 있기 때문에) 주소 변환을 하고 실제 원하는 data에 접근하기 위해서 또 메모리 접근을 해야함. (총 5번 메모리 접근)
인 경우
다섯번 접근하면 500ns
시간 overhead가 큼.
하지만,
TLB
(주소 변환을 전담해주는 일종의 cache 메모리.) 를 사용하면 메모리 접근 시간을 줄일 수 있다.
프로그램마다 주어지는 logical memory
physical memory
주소 변환하는 page table
사실, page table에 주소변환 정보만 들어있는 것이 아니고
부가적인 비트가 entry마다 저장이 되어있음
=> valid-invalid bit
현재 logical memory에는 6번 7번 page가 없음.
그런데 page table에는 6번 7번이 있음.
이유: 프로그램이 가질 수 있는 maximum 사이즈만큼 이 page table entry는 생겨야함
=> table 자료구조 특성상 위에서부터 index로 접근해야 하기 때문임.
하지만 사용이 안되기 때문에 invalid
로 표시
0번 page가 2번 프레임에 실제로 올라와 있다는 뜻.
Protection bit
자기 자신이 자기 page에 접근하는 것이기 때문에 누군가의 접근을 막는 의미가 아님.
page table
page table의 문제
Inverted Page Table
그동안의 page table을 역발상으로 뒤집어놓음.
원래 page table
inverted page table
1) 물리적 메모리에 올라가있는 page frame 의 f번째 entry를 가면
2) page table에서 logical memory의 page 번호 (p)가 나오게 한다.
physical address를 보고 logical address를 바꿀 수 있는 table임.
p
page 번호가 주어지면 page table entry 전부를 다 검색해야지만 주소 변환
을 할 수 있음. 왜 써야 할까?
p
가 어떤 프레임에 있는지를 알 수 있음. page table에 저장하는 요소
inverted page table은 시간적 overhead가 너무큼
프로그램을 구성하는 page들 중에는 다른 process들하고 공유할 수 있는 page가 있다.
이런식으로 물리적 메모리 안에 logical address가 적혀있다.
그렇기 때문에 shared code
는 모든 프로세스의 "logical address space"에서 동일한 위치에 있어야 한다.
예를들어)
여기서는 1번, 2번, 3번 동일한 logical address임.
예전에)shared memory를 이용해서 프로세스간에 IPC 하는 방법과 조금 다르다.
shared pages
공유할 수 있는 코드는 별도로 올리는게 아니라 같은 물리적 메모리 frame으로 mapping을 시켜서 메모리에 한 카피만 올릴 수 있다.
paging 기법 : 프로그램을 구성하는 address space 를 같은 크기의 page단위로 쪼갠것
segmentation 기법: 프로세스를 구성하는 주소 공간을 의미 단위로 쪼갠것.
segmentation 기법의 주소변환은 paging 기법이랑 비슷한 측면이 있음.
segment-number
와 offset
(segment안에서 얼마나 떨어져 있는지 나타냄.)
segmentation 기법을 통한 주소변환을 보여주는 그림.
cpu가 논리주소를 주게되면 두 부분으로 나뉜다.
segment-table의 시작위치는 register가 갖고 있음.
거기서 segment 번호만큼 떨어진 곳에 entry에가면
이 segment가 물리적인 메모리에 어떤 번지에 올라가 있는지를 가지고 있음. (base)
그런데 , segmentation 기법은 paging과 다르게 entry에 두가지 정보를 가지고 있음.
1) 논리주소의 segment 번호가 STLR 즉, 프로그램이 사용하는 segment의 수보다 작은지 확인해서, 만약 그 값보다 큰 segment 번호를 요청했다고 하면은 잘못된 시도 trap 걸림.
2) 이 segment의 길이가 예를 들어 1000 바이트인데 segment안에서 떨어진 위치(d : offset)를 2000바이트로 요청했다? => trap
만약 정상적인 요구라고 하면 주소 변환을 하게 되는데 주소 변환은 segment의 시작위치 base에다가 offset인 d를 더해서 주소 변환을 하는 것.