프로세스 : 실행 중인 프로그램
→ "실행 중" = 메모리에 프로그램이 로드 되어있다.
메모리 (memory) : 거대한 바이트의 배열, 각 바이트에는 주소 (address)가 저장된다.
CPU는 PC가 지정한 메모리 주소에서 수행할 명령어를 가져온다.
그 명령어는 필요한 경우 추가적인 데이터를 더 가져올 수 있고, 반대로 데이터를 메모리로 내보낼 수도 있다.

각각의 프로세스는 독립된 메모리 공간을 가진다.
메모리 공간을 분리하기 위해 특정 프로세스만 접근할 수 있는 합법적인 메모리 주소 영역을 설정하는 과정이 필요하다.
→ 두 레지스터를 이용하여 메모리 공간을 분리한다.
만약 다른 프로세스의 메모리 공간에 접근하면 O/S는 치명적인 오류로 간주하고 트랩(trap)을 발생시킨다.
→ O/S나 다른 사용자 프로그램의 코드 or 데이터 구조를 수정이 방지된다.
MMU(Memory Management Unit)
프로그램 실행 중에 논리 주소를 물리 주소로 바꿔주는 하드웨어 장치

프로그램과 데이터 전체를 메모리에 불러올 필요가 있을까?
→ 메모리 공간을 효율적으로 사용하기 위해 프로그램, 루틴을 한꺼번에 로딩하지 않고 필요할 때마다 로딩한다.
루틴은 실제 호출되기 전까지는 메모리에 올라오지 않고 재배치 가능한 상태로 대기중이다.
다른 루틴이 호출되었을 때 만약 메모리에 적재되어 있지 않다면, 재배치 가능 연결 적재기(relocatable linking loader)가 루틴을 메모리로 가져오고, 변화를 기록한다.
메모리는 일반적으로 두 개의 부분으로 나뉜다.
일반적으로 여러 사용자 프로세스가 동시에 메모리에 존재는 경우가 많다.
연속적인 메모리 할당에서 각 프로세스는 다음 프로세스가 적재된 영역과 인접한 하나의 메모리 영역에 적재된다.

재배치 레지스터 (relocation register)와 상한 레지스터 (limit register)를 통해 이루어진다.
→ ex) 논리 주소(100)가 상한 레지스터(30000)을 통과 후 재배치 레지스터(10000)을 통과하게 되면 논리 주소값에 재배치 레지스터 값 10000을 더한 10100이 물리 주소로 메모리에 적재된다.

가변 파티션 기법(Variable-Partition scheme)
프로세스의 메모리 할당 & 해제를 반복하면 빈 공간이 생기는데, 이를 구멍 (hole)이라고 부른다.
동적 메모리 할당 문제(dynamic storage allocation problem)
저장 공간에 동적으로 메모리를 할당할 때 여러 hole들 중에 크기 n만큼의 프로세스를 어떤 hole에 할당할 지에 대한 문제가 발생한다.
3가지 해결 방법
최적 적합 (best-fit)
할당할 수 있는 가장 작은 구멍에 할당
(Hole의 리스트를 우선순위 큐로 구현할 수 있다.)
최악 적합 (worst-fit)
할당할 수 있는 가장 큰 구멍에 할당

ex) 200MB의 메모리 할당 요청??
1) 최초 적합 -> 205MB에 할당하게 되고, free frame 5MB 발생.
2) 최적 적합 -> 작은 공간부터 확인하다가 205MB에 할당.
3) 최악 적합 -> 큰 공간부터 확인하여 300MB에 할당, free frame 100MB 발생.
외부 단편화(external fragmentation)
내부 단편화(internal fragmentation)
페이징 → 내부 단편화, 연속 메모리 할당 → 외부 단편화
참고 :
Silberschatz et al. 『Operating System Concepts』. WILEY, 2020.