memory관리 기법을 알아보기에 앞서 메모리의 종류와, address binding, Overlay structure, Swapping에 대해 알아보자.
CPU가 cache memory나 main memory에서 데이터를 가져갈땐 word 단위로 가져간다. 하지만 auxiliarty storage에서 데이터를 가져갈땐 cpu가 직접 가져갈 수 없고, block 단위로 데이터를 가져간다.
Block
: 1~4KB
Word
: 16~64 bits
프로그램을 코딩한 후 실행하기까지의 과정은 다음과 같다.
실행파일(executable image)가 로드된 이후 OS가 메모리 관리를 시작하게 된다. 프로그램을 실행하기위해서 Loader가 커널에 어떤 메모리가 비었는지 물어보는 과정이다.
Compile-time binding
컴파일할때부터 프로그램이 memory에 어떤 부분에 위치할 지 정하는 방식이다. absolute code가 생성된다.
Load-time binding
Compile/linking할때는 프로그램 시작을 메모리 주소 0에 해두고, 실제로 메모리에 load될 때는 임의의 번지로 갈 수 있다.
다음과 같이 binding이 진행되는데, Jump 360와 같은 address constant를 그대로 두게 되면 loading 이후에 엉뚱한 주소로 jump되게 된다. 그렇기 때문에 relocation과정을 통해 Address constant들의 주소를 맞춰줘야한다.
Run-time binding
load-time에서의 relocation을 하지 않는다. 즉 address constant들을 건드리지 않기 때문에 MMU(Memory Management Unit)라는 하드웨어 장치를 통해, 프로세스를 그대로 시키면서 relocation register를 더해준다.
Notes
Dynamic-Linking
보통 load되기 전 linking을 하는 static linking을 하지만 실행당시에 linking을 하는 것을 dynamic-linkning이라고 한다.
stub
코드로 구현돼있다. 이 코드가 호출되면 dynamic-linking을 하게된다.
다음과 같이 8M의 메모리에 총 10M의 프로그램을 load해야하는 경우를 살펴보자.
Assembler는 pass-1의 실행이 끝나면 pass-2 실행이 시작된다. 즉 pass-1과 pass-2를 동시에 메모리에 올려둘일이 없다. 두 프로세스가 같은 메모리공간을 사용하기 떄문에 relocation을 할때나 run-time binding시 주소를 보정할 때 복잡해지는 점은 감안해야한다.
2장에서 살펴본 swap in/out과 같은 개념이다. 쫓겨난 프로세스는 backing store(swap device) 로 가게 된다.