동적 메모리 관리와 메모리 할당이 살짝 헷갈렸다. 하지만 관리는 큰 범주고 할당은 말 그대로 할당하는거라 생각하니 이해됐다.

메모리 관리는 세가지 기법이 있었다
다이나믹 로딩, 오버레이, 다이나믹 링킹

다이나믹 로딩은 실행루틴을 불러올때 물리적 메모리에 탑재하는 스낄이다. 오버레이는 이와 비슷하지만, 메모리용량이 적은 시수템에서 사용한다. 요즘은 가상메모리때문에 안쓴다했다

다이나믹 링킹은 실행할때 링킹을 하는거시다. 예를들어 라이브러리a를 사용하는 뿌로세스가 여러개 있으면, 원랜 라이브러리a를 메모리에 여러개 올렸다. 우리의 다이나믹 링킹은 라이브러리가 필요할때 메모리에서 한번 찾아본다. 와우! 하나만 메모리에 적재해도 여러 프로세스가 사용할수 있다.

메모리 할당으로 넘어갔다. 메모리 할당은 두개로 나뉘었다.
연속 할당과 분산 할당.
연속 할당은 말 그대로 물리 메모리에 프로세스가 연속적으로 올라간다. 요놈은 고정분할, 가변분할방식으로 또 나뉘었다.

고정 분할은 물리적 메모리를 스걱스걱 일정하게 잘라 프로세스를 끼워넣는다. 이때 공간이 프로세스의 메모리사용량보다 클수 있다. 이를 내부단편화(인터널 프래그먼테이션)이라고 했다.

가변 분할은 자르는 갯수와 크기를 프로쎄쓰에 마춘다. 다행히 프로세스에 맞춰 자르니까 내부단편화는 안 생긴다.
앗! 할당-해제를 반복하다보니 공간은 남았는데 남아있는 프로세스가 너무 커서 안들어갔다. 이를 외부 단편화라 했다.
두 단편화를 통틀어 구멍(조금 야했음)이라했다.
가변 분할에서 구멍에 프로세스를 우겨넣어야한다. 이걸 해결하기위한 알고리즘이 3개가 있다. 퍼스트 핏, 베스트 핏, 워스트 핏.
첨으로 딱맞는 사이즈, 최고로 딱맞는 사이즈, 제일 큰 사이즈
이 세개로 나뉜다. 시간은 워스트가 덜걸리지만 결국 효율은 퍼스트와 베스트가 좋았다. 역시 퍼스트앤 베스트지

분산할당은 세가지 기법을 배웠다.
페이징, 세그먼테이션, 페이지드 세그먼트
여기서 좀 헤맸다. 페이징 기법은 분산 할당이라 잘라잘라 쪼개쪼개 프로세스를 쪼개서 물리메모리에 할당한다. 순서대로 할당 하면 좋겠지만, 녹록치 않다. 순서를 기억해야한다. 그게 페이징 테이블이다. 여기까진 잘 이해함. 하지만 페이지 오프셋을 계산하거나, 페이지는 기본 4kb니까 4096개니 2의12승개의 주소를 가졌다던가...이해가 안갔다. 열심히 찾아봤다. 찾아서 보니 대단히 기초적인 것이었다. 생각해보니 그랬다. 메모리의 단위는 비트가 아닌 바이트여따. 1바이트. 페이지는 4kb(4096바잍)단위로 뭉땡이로 유리게숭 자른것이었다. 그러니까, 주소를 모조리 표현하려면 0과1을 표현하는 bit가 12개만 있으면 된다. 2의 12승개까지 표현 가능하니까!
32빗 환경에선 12빗이 오프셋이니, 20빗이 결국 페이지의 최대 개수여따. 다시말해, 2의 20승개 였떤거시거시다...
암튼 페이징 테이블로 매핑해서 쉭솩 가져오고 쉭삭 납품하고 하면 좋은데 단점이 있다. 페이징 터이블은 인덱스를 이용해야해서 페이징 끝까지 번호를 매기야한다. 번호=정수. 따라서 2의 20승 x 4(int값) = 한프로세스당 4메가짜리 테이블이 생기는거시다. 엄췅난 용량낭비가 아닐수 없다. 이를위해 등장한것이 TLB라는 놈인데 기냥 캐싱이다.