void func()
int x;
...
x = x + 3; // this is the line of code we are interested in
x = x + 3;을 실행할 때 거치는 과정
1. Load a value(x) from memory
2. Increment it by three (ALU)
3. Store a value(x+3) back into memory
128 : movl 0x0(%ebx), %eax ; load 0+ebx into eax
132 : addl $0x03, %eax ; add 3 to eax register
135 : movl %eax, 0x0(%ebx) ; store eax back to mem
135번지의 instruction까지 실행하면 15KB 위치의 3000 -> 3003으로 바뀐다.
위의 그림에 등장하는 모든 주소는 virtual address이다.
Q. address space에서 128번지가 physical memory의 어느 위치에 있을까?
A. 32KB + 128
Q. address space가 0KB~16KB인데 18KB의 주소값을 참조하면 어떻게 될까?
A. bounds register에 저장된 값보다 크면 segmentation fault
128번지를 physical address로 변환하면 32896이고 이 주소에 저장된 instruction을 fetch해서 register에 저장한다.
그리고 15KB를 physical address로 변환하면 47KB이고 이 주소에 저장된 x값을 load하여 register에 저장한다.
Base-Bounds register는 CPU에 1개씩만 존재한다.
-> 새로운 process가 relocate될 때 기존 register 값이 덮인다.
-> context switch가 발생하기 전에 base-bounds register 값을 PCB에 저장한다.
process가 실행되면 physical memory에 빈 공간을 찾는다.
OS는 physical memory에 사용하지 않는 memory들을 Free list로 저장하여 관리한다.
Free list중 하나를 골라 process를 load한다.
process가 종료되면 memory를 반환한다.
process가 종료되면 사용하던 memory 공간을 반환하고 Free list에 추가한다.