OS-9) 메인 메모리 할당
| topics | 700-컴퓨터과학 704 운영체제 |
| types | 이론 학습 |
| tags |
메인 메모리 할당
- 프로그램이 실행되기 위해서는 메모리에 저장되어 프로세스 내에 배치되어야 한다
- 메인 메모리와 레지스터는 CPU가 직접 접근할 수 있는 유일한 저장장치
- 메모리 하드웨어는 주소 + 읽기 요청 or 주소 + 데이터 쓰기 요청만 가능
- 메인 메모리 접근에는 많은 사이클이 필요하고 stall이 발생한다
| 용어 | 설명 |
|---|---|
| 논리(logical) 주소 | = 가상(virtual) 주소 = 재할당(relocatable) 주소 |
| Symbolic 주소 | 프로그래머가 코드에서 사용하는 상징적인 이름을 주소로 사용하는 것 |
프로세스 수행과 메인 메모리
프로그램이 실행되기 위해서 메모리에 저장되어 프로세스 안에 배치되어야 한다 (== 프로세스 수행하려면 메모리 접근이 필요함).
메모리 공간 보호
Base & limit 레지스터는 프로세스의 논리적(logical) 주소의 범위를 지정한다.

| 레지스터 | 설명 |
|---|---|
| base (= relocation) 레지스터 | 프로세스의 시작 메모리 주소를 저장 |
| limit 레지스터 | 프로세스가 사용할 수 있는 메모리 공간의 크기를 저장 |
CPU H/W는 사용자 모드에서 생성된 모든 주소를 레지스터와 비교해서 사용자 기준과 상한 범위에 속하는지 검사해야 한다.
물리 주소를 가지고 있으면:
논리 주소를 가지고 있으면:
메모리 주소 바인딩 (할당)
CPU가 만든 논리 주소를 물리 주소에 할당하는 것을 말한다.
시점에 따른 바인딩
| 시점 | 상황 | 설명 |
|---|---|---|
| Compile time | 메모리 위치를 미리 알고 있음 | 절대 주소(absolute)가 생성될 수 있다 |
| Load time | 컴파일할 때 주소를 알 수 없음 | 재배치 가능 주소가 생성되어야 한다. 후에 loader에 의해 재배치 주소가 절대 주소로 변환 |
| Execution time | 프로세스가 메모리 세그먼트 위치를 변경할 수 있음 | 바인딩이 실행 시간까지 연기됨. 주소 맵을 유지하기 위한 하드웨어 지원이 필요. 메모리 참조가 일어날 때 바인딩된다 |
현재 OS가 대부분 Execution time 방식 사용
- MMU(Memory Management Unit) 장치에 의해 논리 주소를 물리 주소로 변환
- MMU는 논리 주소를 물리 주소로 매핑하는 하드웨어 장치
MMU 동작
Dynamic Relocation
프로세스에 의해 생성된 주소 + 재배치(base) 레지스터 값을 더하여 요청한다.

Dynamic Linking
프로세스 실행 중 필요할 때 라이브러리를 링크하는 방식이다. 메모리 절약 가능하고 유지보수가 용이하다.
- linking과 로더가 시스템 라이브러리와 프로그램 코드를 결합하여 이진 프로그램 이미지가 생성
- **스텁(stub)**이 상주 라이브러리 루틴의 위치를 찾기 위해 사용됨
- 자기 자신을 루틴의 주소로 대체하여 라이브러리 루틴 실행
- 상주 라이브러리 == shared libraries
Swapping

| 용어 | 설명 |
|---|---|
| swap out | 메인 메모리 → 보조 저장장치 |
| swap in | 보조 저장 장치 → 메인 메모리 |
- 스왑 시간의 대부분은 전송 시간
- 디스크에 메모리 이미지를 가진 ready-to-run 프로세스로 구성된 준비 큐를 유지
- roll out, roll in: 우선순위 스케줄링 알고리즘에서 사용되는 스와핑의 변형
- 다음에 실행시킬 프로세스가 없다면 하나를 swap out하고 하나를 swap in 해야 함
- 시간: swap in 시간 + swap out 시간 + 디스크 입력 지연 * 2
- 현재 OS들은 수정 버전을 사용
모바일에서의 Swapping
| 플랫폼 | 방식 |
|---|---|
| iOS | 자발적으로 메모리 반환을 요구 |
| Android | 가용 메모리가 적으면 앱 종료. 빠르게 재시작시킬 수 있도록 앱 상태를 기록 |
모바일에서는 swapping을 사용하지 않지만 페이징은 지원한다.
메모리 분할 할당
| 분할 방식 | 설명 |
|---|---|
| Fixed partition (고정 분할) | 고정된 크기로 분할 |
| Variable partition (가변 분할) | 가변적인 크기로 분할 |
- 분할 개수가 다중 프로그래밍 정도를 제한함
- hole: 가용 메모리 블록 (= 가용 분할)
- 종료되는 프로세스는 자신의 분할을 반환하고 인접한 가용 분할과 합쳐짐
- 운영체제는 할당된 분할, hole의 정보를 유지한다
Hole을 찾는 알고리즘
| 알고리즘 | 설명 |
|---|---|
| First-fit (최초 적합) | 충분히 큰 최초의 hole을 할당 |
| Best-fit (최적 적합) | 충분히 큰 가장 작은 hole을 할당. 크기 순으로 정렬되어 있지 않다면 리스트 전체를 탐색해야 함. 가장 작은 hole을 남김 |
| Worst-fit (최악 적합) | 가장 큰 hole을 할당. 크기 순으로 정렬되어 있지 않다면 리스트 전체를 탐색해야 함. 공간 이용률이 좋지 않음 |
단편화
| 종류 | 설명 |
|---|---|
| 내부 단편화 | 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 메모리 공간이 낭비되는 현상 |
| 외부 단편화 | 메모리가 할당 및 해제 작업의 반복으로 메모리 중간중간에 사용하지 않는 메모리가 생기고 이를 합쳤을 때는 메모리가 충분하지만 실제로는 할당할 수 없는 상황 |


해결 방법
| 방법 | 설명 |
|---|---|
| Compaction (압축) | 메모리 내용을 이동시켜 모든 가용 메모리가 하나의 커다란 블록이 되도록 만듦. 재할당이 동적이고 실행 시간에 완료될 때만 가능. 외부 단편화를 해결 |
| Paging and Segmentation | OS-10) 가상 메모리-%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC.html) 참조 |
관련 문서
- OS-8) 프로세스 교착상태-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9C.html) - 교착 상태와 자원 관리
- OS-10) 가상 메모리-%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC.html) - 가상 메모리와 페이징