메모리 관리 방식
메모리 관리의 역할은 크게 두 가지로 나뉘어진다. 프로세스에게 메모리를 분배하는 메모리 할당, 처리 중인 프로세스들의 메모리를 관리하는 메모리 보호이다.
Relocation
프로세스가 특정 번지의 메모리 주소에 할당되어 있을 때 주소를 옮겨주는 것을 말한다. 메모리 부족 현상을 해결하기 위해 주기억장치에 있던 프로세스를 잠시 보조기억장치로 옮겨 놓는 Swapping이나 메모리 공간을 조각모음하는 Compaction 등의 처리 과정에서 발생한다.
메모리 할당
고정분할식 메모리 할당
한정된 크기의 메인 메모리 공간을 여러 프로세스들에게 분배해주는 방법으로서, 초기 연구된 메모리 할당 방식이다. 파티션을 분할해놓고 프로세스가 생성되면 빈 파티션 중 하나를 부여해준다. 인덱싱 측면에서 유용하며, 적은 용량의 프로그램이라도 정해진 크기의 파티션에 할당되기 때문에 비효율적이다.
이처럼 파티션 용량보다 작은 프로그램이 들어와 남는 공간을 Fragment라고 하며, 이러한 현상을 Fragmentation이라고 한다.
가변 동적 메모리 할당
프로세스가 생성될 때마다 해당 용량만큼 파티션을 할당하는 방식으로, 고정분할식 메모리 할당 방법에서의 Fragmentation 현상을 방지할 수 있다. 가변동적인 메모리 할당을 위해서는 운영체제가 메모리 이용 상황을 파악하고 있어야 할 필요가 있다.
가변 메모리 할당 방식
- First-fit : 빈 메모리 리스트의 앞에서부터 차례대로 프로세스를 할당해나가는 방식
- Best-fit : 빈 메모리 리스트를 처음부터 끝까지 조사한 후, 할당할 프로세스와 제일 비슷한 용량의 파티션을 찾는 방식
- Worst-fit : 전부 조사 후 크기가 가장 차이나는 파티션에 할당하는 방식. 남은 공간을 이용할 경우를 고려하였음.
- Next-fit : 직전 알고리즘 실행 시의 위치 다음부터 할당하는 방식
버디 시스템
앞서 언급한 고정분할식, 가변동적 메모리 할당 방식은 요즘 잘 사용되지 않는 알고리즘이다. 그러나 앞으로 학습할 알고리즘들이 앞의 알고리즘을 뼈대로 연구되었기 때문에 알아둘 필요가 있다. 버디 시스템은 고정분할식, 가변동적 메모리의 할당 방식을 전부 가져와 개선한 할당 알고리즘이다.
버디 시스템 할당 (Request)
남은 공간(2^U) > 프로세스 용량 > 남은 공간의 절반(2^U-1) 인지 비교한다. 해당 조건을 만족하면 Internal fragment가 발생하더라도 할당해준다. 해당 조건을 만족하지 않는 더 작은 용량의 프로세스라면 재귀적으로 남은 공간을 로그분할하여 할당해준다. 로그분할 과정에서 똑같은 용량의 공간이 둘 생기는데 이를 버디라고 한다.
버디 시스템 회수(Release)
할당 과정에서 분할되었듯 회수 시에도 역순으로 결합된다. 단, 분할 시의 버디가 존재하는지 확인하여, 존재할경우 합쳐진 상태로 빈 영역의 메모리 리스트가 된다.
가상 메모리 공간
메모리 주소의 종류
- Physical Address : 메모리 단위 하드웨어가 사용하는 물리적인 주소. 메모리 반도체 칩에서 바이트 위치를 찾아갈 수 있다.
- Logical Address : 논리 연산 주소로, 프로그램 Instruction 간 이용된다. CPU와 프로세스가 바라보는 주소이다. 실제로 메모리에 접근하기 위해서는 Logical Address를 통해 Physical Address로 변환을 거친다. (Adress Translation)
- Virtual Address : 가상 메모리 공간에서의 논리 연산 주소이다.
- Relative Address : 상대 주소 (ex. Logical Address)
- Logical & Physical Address
- Logical Address == Physical Address in Compile-time & Load-time
- Logical Address != Physical Address in Execution-time
구조
32비트 기준 4G 용량의 메모리 주소를 가지며, 0GB ~ 3GB-1 주소 공간에는 사용자 프로그램에서의 Code / Data / Stack 영역 (User Context)이 포함되고, 3GB ~ 4GB-1 공간에서는 커널이 사용하는 Kernel stack / Kernel Data / Kernel Code (System Context)로 구성된다.