Operating System : Concepts - 주 메모리(Main Memory) (2)
https://github.com/BOOOO0/linux-operating-system
GitHub - BOOOO0/linux-operating-system: 리눅스 명령어, 이론과 운영체제 실습
리눅스 명령어, 이론과 운영체제 실습. Contribute to BOOOO0/linux-operating-system development by creating an account on GitHub.
github.com
깃허브에 더 많은 내용이 있습니다.
연속 메모리 할당 (Contiguous Memory Allocation)
연속 메모리 할당
메모리의 할당에 있어서 가장 간단한 방식은 주 메모리에 user process를 전체를 다 옮기는 것이다.
연속 메모리 할당은 어느 한 section에 프로세스의 전체 만큼 할당하기 때문에 연속적이고 하나의 메모리 영역(a single section of memory)를 가진다.
메모리 보호 (Memory Protection)
할당된 영역에 대한 보호는 상한 레지스터(limit register)와 재배치 레지스터(relocation register)를 가지고 메모리 영역을 나눈다.
메모리 할당 (Memory Allocation)
메모리 할당의 전략은 여러가지가 있으며 프로세스의 크기는 variable 하기 때문에 다 다르고 미리 알 수가 없다.
즉, 프로세스에게 할당되는 메모리의 영역, 파티션 자체가 다양하다는 의미이다.
그렇기 때문에 어떤 프로세스를 어떻게 할당할 것인지가 관건이다.
그림을 보면 연속적으로 메모리가 할당되어 있는 상황이였지만 P8이 실행이 종료되고 하나의 큰 pre-frame이 생기고 그 자리에 P9가 실행되기 시작한다 그리고 P5도 종료되고 나면 메모리에 두개의 pre-frame이 생겼다.
2개의 hole이 생겼다는 의미이다.
동적 메모리 할당 문제
사이즈가 N인 할당 요청을 연속적 할당으로 인해서 생긴 hole에 어떻게 할당해 줄 것인가?
그 방법으로는 3가지 전략이 있다.
- 최초 적합(First Fit) - free hole 간의 연결리스트를 이용해 탐색하면서 첫번째로 찾은 가용공간을 할당한다.
- 최적 적합(Best Fit) - Priority Queue를 이용해서 가장 작은 공간부터 찾으면서 가용공간을 할당한다.
- 최악 적합(Worst Fit) - 똑같이 Priority Queue를 유지하지만 가장 큰 공간을 찾아 할당한다.
위와 같은 문제를 최초 적합으로 해결해 본다면
- 200MB를 205MB 파티션에 할당해주고 5MB의 메모리 단편이 생긴다.
- 15MB를 100MB 파티션에 할당해주고 85MB의 메모리 단편이 생긴다.
- 185MB를 300MB 파티션에 할당해주고 115MB의 메모리 단편이 생긴다.
- 75MB를 2번에서 생긴 85MB에 할당해주고 10MB의 메모리 단편이 생긴다.
- 175MB를 185MB에 할당해주고 10MB의 메모리 단편이 생긴다.
- 80MB를 3번에서 생긴 115MB에 할당해주고 35MB의 메모리 단편이 생긴다.
단편화 (Fragmentation)
외부 단편화 (External Fragmentation)
위에서 본 것과 같이 메모리를 연속적으로 할당을 했을때 전체 메모리의 크기는 많이 남아 있지만 그 공간이 너무 잘게 쪼개져 있어서 예를들어 남은 메모리 공간은 100MB이고 요청이 20MB라고 했을때 전부다 10MB의 단편으로 나누어져 있다면 할당을 해줄 수가 없는데 이런 너무 많은 수의 작은 hole들로 메모리가 단편화 되는 것을 외부 단편화라고 말한다.
내부 단편화 (Internal Fragmentation)
다음번에 정리할 페이징에서 생기는 문제로 요청된 크기보다 할당된 크기가 더 커서 일정 크기의 프레임을 전부 사용하지 못해서 내부에 단편화가 생기는 것을 말한다.
세그멘테이션 (Segmentation)
메모리를 연속적으로 할당하지 않고 종류별로 나눠서 할당하는 것이다.
하지만 variable한 크기이기 때문에 외부 단편화 문제는 더 심해진다.
C 컴파일러를 예로 들면 다음과 같은 세그먼트를 만들어 낼 것이다.
- 코드
- 전역 변수
- 메모리 할당을 위한 힙
- 각각의 스레드를 위한 스택
- 표준 C 라이브러리
※ 10판 이후로는 세그멘테이션에 대한 내용이 삭제되었다고 한다.