> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/os_with_joonion/19-..md).

# 19강. 주 메모리 관리

### 개요

* 메모리는 주소를 가진 바이트 단위의 공간 배열
* CPU는 프로그램 카운터가 지목하는 instruction(기계어)을 수행한다.

<br>

### Address Binding

* 하나의 변수를 생성할 때, 따로 메모리 공간을 지정하지 않으면 컴파일러가 알아서 위치를 재설정 가능한 메모리 공간에 할당한다.
* 그럼 이 relocatable address를 linker 혹은 loader가 절대 주소로 변환한다.

<br>

#### Logical VS Physical Address Space

* 논리적 주소: CPU가 프로그램을 사용하는 주소
* 물리적 주소: 논리적 주소와 상관없고 실제 레지스터에 저장되는 공간
* 따라서 논리 주소와 물리 주소를 다루는 방식은 분리되어야 한다.
* MMU: 하드웨어를 통해 논리적 주소를 물리적 주소로 변환하는 장치

<br>

#### Dynamic Loading

* 프로그램을 실행할 때, 해당 프로그램의 모든 루틴을 한번에 로딩할 필요가 없다. 그냥 필요할 때 메모리에 로딩하면 된다.
* `DLLs (Dynamically Linked Libraries)`: 유저 프로그램에 연결되어있고, 프로그램이 실행중일 때 연결되는 시스템 라이브러리
* 하나의 프로그램을 메모리에 통으로 로딩하는 방식을 (`contiguous memory allocation`) 라고 하고, 이 경우 하나의 메모리 영역을 갖는다. 즉, 하나의 프로세스가 차지하는 메모리 영역이 파편화되지 않는다.
* `contiguous`하게 메모리 공간을 할당하는 방식은 크게 3가지, first-fit, best-fit, worst-fit으로 나뉜다.
* 외적 메모리 파편화: 하나의 메모리 공간을 일부씩 할당해주다보면 쪼가리 공간들만 남아서 실제로 할당할 수 있는 프로그램을 위한 공간이 없을 때를 의미한다.
* 내적 메모리 파편화: 프레임 단위로 쪼갰을 때 그 사이에서 나오는 잔여 공간
* segmentation: 통 메모리 방식과 페이징 방식의 중간쯤으로 프로그램 내부에서 사용될 목적에 따라 메모리 영역을 할당해두고 사용하는 방식. Paging 방식이 워낙 좋아서 더는 사용되지 않는다.

\ <br>
