Hased Page Table

q : virtual page number
s : the mapped page frame
c : a pointer to the next element // linked list
//64 bit : cluesteded page table : page 안에 page들
Inverted page Table

// 64bit에서 사용
Process가 여러개시 각각의 PageTable 사용 낭비
ㄴ Page Table) frame에 대한 logical 주소 및 PID 저장
(pid, p, d) → (i, d)
ㄴ 각 frame 마다 p와 pid 로 물리주소 i 를 search
ㄴ 전체 물리memory를 search 해야함..
> Hash Table(with TLB) : TLB에 없다면 (pid,p) 로 search
ㄴ d가 없어서 page 단위 변환
// d : 페이지내 위치 ::offset
> 공유메모리만 따로 logical -> physical mapping
Swapping


Backing store : Disk
main memory : Memory
Threshold High(메모리할당 많음) -> swap (roll out) -> 여유 -> roll in
ㄴ swap time (transter time) 은 매우길다!
ㄴ Memory <-> Disk 매우 느림
ㄴ ready queue에서 대기 > "disexecution"
// Binding(copiler/load time : 메모리 주소 고정 <> execution : 실행시 변경)
> 1G Memory -> 4G 처럼
C/S time with Swapping
ex) 원하는 P가 disk 에 있어서 memory에 있는 안쓰는 P 를 swap out
ㄴ 100MB , 50MB/sec
> 100/50 = swap out time(C/S): 2000ms
ㄴ Total C/S time : 2000ns * 2 = 4s
Pending I/O : I/O 중에는 swap X
ex) Read 중 process swap -> I/O 장치가 메모리에 없는데 건들려함 > 오류
> double Buffering
ㄴ App -> kernel(복사) -> I/O device
>> kernel (OS) 공간은 직접접근 X
ㄴ system call 로 복사
>>> swap 되더라도 오류 방지
단) overhead Big (두번복사과정)
Intel 32bit : segmentation with paging


segment : 메모리를 프로그램의 기능에 따라 나눈 부분
ㄴ 효율 , 유연성, 보호 // 부분들끼리 독립
ㄴ code segment ,data, stack, heap..
각 Process 마다 16K segment
ㄴ LDT : 8K, local descripter table :
ㄴ GDT : 8K, global " "
> Code Selector) 전체2^14
ㄴ 2^13 : LDT(s)
ㄴ 2^1 : GDT(g)
>
logical -> linear

>>>>>

- logical → linear
- [CS: offset]
(ex: CS = 0x3FFF, offset = 0x0010) - CS → GDT: 1FFF, LDT: 0x0001 ,offset: 0x0001 추출
- descriptor table -> 해당 segment 의 base, limit, 권한 확인
→ linear = base + offset - linear -> physical

p1 : outer :: page directory
p2 : inner :: page table
ㄴ 3level

page size :2개 :: 4KB , 4MB

PAE : page address extension
intel64 : 64bit는 너무많아서 48bit 로 축소
ㄴ page size : 4kb, 2MB, 1GB
ㄴ 4level
ARM :

ㄴ page : 4kb/16kb (2level)
ㄴ section : 1mb/16mb (1level)
TLBs(2level)
ㄴ outer : data/명령어 접근용
ㄴ inner : main