버티의 블로그
[운영체제 #12] Main Memory Allocation 본문
Memory Protection
프로세스가 segment 형태로 들어간게 아닌, 하나의 덩어리로 들어간 환경에서는 Base와 Limit이라는 레지스터로 CPU의 메모리 접근을 컨트롤하고 메모리를 보호할 수 있다.
- Base : 프로세스가 접근할 수 있는 메모리의 시작 주소를 저장
- Limit : 프로세스가 접근할 수 있는 메모리의 크기를 저장
오른쪽 그림에서, CPU에 메모리에 접근할 때 base보다 주소값이 크고 base+limit보다 주소값이 작아야 합법적인 주소로 간주하고 접근을 허용한다.
Address Binding
바인딩은 명령어와 데이터에 메모리 주소를 지정해주는 과정인데, 3가지 종류가 있다.
- Compile time binding : 컴파일을 시작하면서 적재할 메모리 주소를 지정
- Load time binding : 프로그램을 실행하기 위해 로딩할 때 메모리 상황에 따라 주소를 지정
- Execution time binding : 바인딩을 실행시간 전까지 지연시키고 이후 진행한다. 이는 프로그램이 실행되는 중에 메모리 주소(위치)를 동적으로 할당할 수 있는 방법이다.
또한 프로그램의 주소가 표현되는 방법도 다음과 같이 나눠진다.
- Symbolic Address : 소스 코드 내 인간이 이해할 수 있는 변수나 함수 이름을 뜻한다.
- Relocatable Address : 프로그램이 메모리에 로드될 때, 실제 위치가 정해지기 전까지의 상대적인 주소, load module로부터 시작된다.
- Absolute Address : 실제 메모리 내의 고정된 위치를 나타내는 주소이다.
마지막으로 프로그램이 실행되는 동안에서 사용되는 주소 개념은 다음과 같다.
- Logical Address : CPU가 프로그램 실행할 때 생성하는 가상의 주소
- Physical Address : 실제 메모리에서의 주소
Execution time binding에서는 Logical Address와 Physical Address가 서로 다르지만, Compile time binding과 load time binding에서는 동일하다.
- Logical Address Space : 프로그램에 의해 생성된 모든 logical address의 집합
- Physical Address Space : 프로그램에 의해 생성된 모든 physical address의 집합, 아래에서 설명할 MMU에 의해 매핑된 주소도 포함
Memory-Management
메모리를 관리하는데 요구되는 사항은 3가지가 있다.
- Relocation : 프로세스는 메모리 내 어느 위치에나 로드될 수 있어야 하고 주소가 실행 단계에서 physical address로 변환되어야 한다.
- Protection : 메모리 접근 시마다 검사가 이루어지고 프로세스 허락 없는 다른 프로세스 메모리 접근을 제한해야 한다.
- Sharing : 여러 프로세스가 동일한 메모리 부분을 공유할 수 있어야 하고 동일한 프로그램 복사본에 접근해야 한다.
MMU는 앞서 말했던 relocation과 protection의 역할을 한다. 그래서 CPU는 반드시 메모리 접근 시 MMU를 통해 접근해야한다. MMU는 CPU의 Logical Address를 Physical Address로 변환하고, base와 limit 레지스터로 메모리 접근 권한을 검사하는 역할을 한다.
Dynamic Loading and Linking
Static Loading : load module에 있는 프로그램 전체를 실행 전에 메모리로 적재
Dynamic Loading : 프로그램을 실행하는 도중 필요할 때만 메모리로 적재
- 루틴이 호출되기 전까지 로드되지 않고, 사용하지 않을 루틴은 적재되지 않으므로 효율적인 메모리 관리가 가능하다.
Static Linking : 컴파일 시 모든 라이브러리와 모듈을 링크하여 실행 파일을 만드는 방식
Dynamic Linking : 프로그램을 실행하는 도중 필요한 라이브러리를 동적으로 링크하는 방식
- stub이 필요한 라이브러리의 루틴의 위치를 찾는다. 그럼 stub은 자신의 주소를 루틴의 주소로 대체하고 해당 루틴을 실행한다.
Contiguous Allocation
1) Single-partition allocation
각 프로세스가 마치 하나의 덩어리로 들어가는 것으로, 메모리가 단 두 부분으로만 나뉘어 각각 OS와 프로세스가 상주하는 형태이다.
2) Multiple-partition allocation
메모리가 여러 파티션으로 나뉘어 각 파티션에 여러 사용자의 프로세스가 할당되는 형태이다.
- 주어진 프로세스 상황에 맞게 동적으로 크기를 조정한다.
- Hole : 사용 가능한 메모리 블록으로, 다양한 크기의 홀이 존재한다.
- 이 홀에 크기 n의 프로세스를 어떻게 할당시킬 것인지에 대한 3가지 알고리즘이 존재한다.
- First-Fit : 첫번째 홀을 할당
- Best-Fit : 크기가 딱 맞는 홀을 할당 (즉, n보다 큰 홀중에 가장 작은 홀에 할당)
- Worst-Fit : 크기가 자장 큰 홀을 할당
- 보통은 First-Fit과 Best-Fit이 속도와 공간 활용 면에서 더 우수하다.
이렇게 홀을 할당하면 2가지 단편화 문제를 맞딱드릴 수 있다.
- 내부 단편화 : 프로세스가 필요한 양보다 더 많은 메모리를 할당해서 메모리가 낭비되는 상황
- 외부 단편화 : 총 사용 가능한 메모리로 보면 할당 가능하지만 연속적이지 않아 할당되지 못하는 상황
- 중간중간 흩어져있는 홀들을 모으기 위해 메모리 내부를 이동해서 외부 단편화를 해결할 수 있는데, 이를 Compaction이라 한다.
'OS_NW > 운영체제' 카테고리의 다른 글
[운영체제 #14] Virtual Memory (2) | 2024.06.04 |
---|---|
[운영체제 #13] Segmentation and Paging (0) | 2024.05.30 |
[운영체제 #11] Deadlocks (0) | 2024.05.23 |
[운영체제 #10] Windows API Example (0) | 2024.05.22 |
[운영체제 #09] Synchronization Examples (0) | 2024.05.16 |