(참고 강의 : http://www.kocw.net/home/search/kemView.do?kemId=1046323)
메모리(RAM)에 주소가 있는 것은 모두 알 것이다.
우리가 흔히 이야기 하는 주소는 Physical Address 일 것이다.
실제 메모리 어디에 있느냐
그런데 주소 종류가 1가지 더 있다.
Symbolic Address => Logical Address => Physical Address
Symbolic Address : 우리가 프로그래밍을 하면서 자연스럽게 사용하는 주소다.
인간의 입장으로서 실제 메모리 주소가 아닌 변수 명, 함수 명을 주소로 사용한다.
Logical Address : 소스코드를 컴파일한 실행파일 상에서 주소를 말한다.
Symbolic 주소가 Logical 주소로 바뀌었다.
컴퓨터는 이 주소를 따라 Jump하는 것이다.
Physical Address : 실제 메모리에 올라가는 주소다.
바인딩 방법은 크게 3가지가 있다.
실행 파일이 메모리에 올라갈 때 물리적 주소를 결정하는 것이다.
중요한 건 여기다.
메모리의 위치를 왜 계속 바꿔야 할까 생각해보자.
결국 메모리의 공간 때문이다.
메모리의 용량은 정해져 있다. 그리고 메모리 돈으로 사려면 ㅈㄴ 비싸다.
프로세스는 실행, 대기, 종료 등으로 상태가 계속 바뀐다.
메모리 공간이 중간 중간 구멍이 생길 수도 있고, ㅈㄴ 가끔 쓰는 프로세스 때문에 메모리 올려놓기는 공간이 너무 아깝다.
그래서 공간 재배치를 하기 위해 필요한 것이다.
아까 그림을 다시 보면
실행 중에 물리적 주소가 바뀐다. 또한 실행 파일에서 20,30으로 저장된 값이 진짜 20이 아닌 720,730을 참조해야 하기에, 0,100,200 단위를 시작으로 하는 것으로 보인다.
CPU는 Logical Address를 참조한다고 했다.
그럼 이 주소를 진짜 Physical 위치로 변환해줘야 값을 불러와서 계산을 할 거 아닌가?
그것이 MMU(Memory Management Unit)다.
사용자 프로세스가 CPU에서 수행되며 생성하는 모든 주소값에 대해
base register(=relocation register) 값을 더한다.
사용자 프로그램은 logical 주소만 신경 쓰면 된다.
physical address는 우리 소관이 아니라 MMU 소관이다.
CPU가 346번지를 불러오고 싶다면,
MMU가 relocation Register(base register) 값과 더해서 Physical Address를 찾을 수 있다.
base register는 프로세스들의 메모리 시작 위치를 저장해논다.
limit register는 프로세스 전체 크기보다 큰 주소를 참고 하려고 할 때 거르려고 쓰는 것이다.
(ex. 프로세스 크기가 300인데 400번지 주소를 달라고? 응 꺼져~)
더 쉽게 도식화하면 이렇다.
좋은 프로그램은 오류 처리, 보안 코드가 엄청 많다고 한다.
그런데 자주 쓰이지는 않으니, 메모리에 가~~끔 쓰는 걸 올리자니 공간 비효율.
그래서 다이나믹 로딩으로 관리하면 좋다! 이 소리다.
Dynamic loading이랑 똑같지 않은가?
똑같다.
다만 오버레이는 옛날에 프로그래머가 직접 이 부분을 구현해야 되는데,
Dynamic loading은 프로그래머가 신경쓸 필요없이 라이브러리 등이 해준다는 점이다.
프로세스를 일시적으로 메모리에서 backing store로 보내는 것
backing store(=swap area)
하드 디스크의 부분이다.
Swap in / Swap out
Linking을 실행 시간까지 미루는 기법
Static Linking
Dynamic Linking
자 그럼 실제 메모리를 어떻게 할당하느냐
메모리는 일반적으로 두 영역으로 나뉜다.
그 중에서
사용자 프로세스 영역 할당 방법
각 프로세스가 통으로 메모리의 연속적인 공간에 적재
앞에서 본 Dynamic Relocation이
연속 할당에서 일어나는 것이다.
relocation register에 각 프로세스의 시작점을 알고 있다고 했지 않는가?
그 말은 즉슨 프로세스들이 통째로 메모리에 올라간다는 뜻이다.
고정 분할(Fixed Partition) 방식
딱 봐도 단점이 보인다. 최대 실행 프로그램 수 제한, 프로그램 당 크기 제한, 메모리에 조각 조각 안 쓰는 공간 발생, 그래서 가변 분할 방식이 나온 것이다.
가변 분할(Variable partition) 방식
빈 메모리에 차례대로 채워 넣는 것이다.
물론 여러 프로그램 실행, 종료 하다보면 빈 공간이 날 것이고,
아래와 같이 B가 끝나 공간이 생기고 크기가 큰 D가 실행한다면,
B자리가 아닌 다른 큰 공간에 들어갈 것이다. 얘도 외부 조각이 생길 것이다.
또한 프로그램을 어디 어디에 배치하는 기술적 관리도 필요할 것이다.
Hole
운영체제가 메모리의 어떤 부분이 사용 가능하고, 어떤 부분은 사용 중인걸 알아야
배치를 할 것 아닌가?
Dynamic Storage-Allocation Problem
가변 분할 방식에서 size n인 요청을 만족하는 가장 적절한 hole을 찾는 문제
당연히 worst-fit이 속도, 공간 이용률 측면에서 효과적이겠지
Compaction = 압축
흩어진 hole들을 모으겠다는 말인데,
당연히 비용이 많이 들고, 실행 중인 프로세스들도 옮겨야 할 거 아닌가?
주소가 바뀌니 런타임 바인딩만 가능할 것이다.
이런 유용한 정보를 나눠주셔서 감사합니다.