그동안 운영체제를 CPU의 관점으로 봐왔다. 이번에는 프로그램을 관리하는 장소인 메모리에 대해 알아볼 시간이다.
1. 메모리 관리
1) 메모리 관리가 필요한 이유
1. 메모리는 공유 자원이기 때문이다.
- 여러 프로세스 사이에 메모리가 공유되고 각 프로세스에게 물리 메모리를 할당한다.
2. 메모리를 보호해야 한다.
- 프로세스의 독립된 메모리 공간을 보장하고 다른 프로세스로부터 메모리 공간을 보호해야 한다.
- 사용자 코드로부터 커널 공간을 보호해야 한다.
3. 메모리 용량 한계를 극복해야 한다.
- 설치된 무리 메모리보다 큰 프로세스의 지원이 필요할 때가 있다.
4. 메모리의 효율성을 증대시킬 수 있다.
- 가능한 많은 개수의 프로세스를 한 번에 실행시키는 것이 좋다. 또한, 프로세스 당 최소한의 메모리로 할당한다.
2) 메모리 Remind
- 메모리는 컴퓨터 시스템 여러 곳에 계층적으로 존재한다. (CPU 레지스터 - CPU 캐시 - 메인 메모리 - 보조기억장치)
- CPU 레지스터에서 보조기억장치로 갈수록 가격이 저렴하고 용량이 커진다. 속도는 느려진다.
- 이렇게 계층화를 시킨 이유는 CPU의 메모리 액세스 시간을 줄이기 위함에 있다. (우와 이게 가능하다고!?)
3) 메모리 계층 구조
- 계층화가 가능한 이유 = Locality (참조의 지역성)
- 코드나 데이터, 자원 등이 아주 짧은 시간 내에 다시 사용되는 프로그램의 특성

4) 메모리 주소와 CPU 비트
1. 메모리 주소
- 1 Byte로 나뉜 메모리의 각 영억은 메모리 주소로 구분한다. 0번지부터 시작이다.
- CPU는 메모리에 있는 내용을 가져오거나 작업 결과를 메모리에 저장하기 위해 메모리 주소 레지스터를 사용한다.
2. CPU 비트
- 한 번에 최대로 다룰 수 있는 데이터의 크기 : 워드
- 32비트 CPU는 한 번에 다룰 수 있는 데이터의 최대 크기가 32bit (= 1 word) 이다.
-> 표현할 수 있는 메모리의 주소가 0 ~ 2^32 - 1이다.
5) 하지만 메모리 관리는 어렵다.
1. 폰 노이만 구조
- 메모리는 컴퓨터의 유일한 작업 공간이다. 모든 프로그램은 따라서 메모리에 있다.
- 다중 프로그래밍 : 운영체제를 포함한 모든 응용 프로그램이 메모리에 올라와야 한다.
- 따라서 메모리는 프로세스들이 같이 쓰는 것이다.
2. 메모리 관리의 이중성
- 프로세스는 가능한 많은 메모리를 쓰고 싶어한다.
- 하지만, 관리자는 가능한 메모리를 적게 주고 싶어한다.
→ ?
6) 따라서 어떻게 해야할 것인가를 잘 생각해야 한다.
그러면 메모리 관리자의 작업 및 정책을 딱 정해야 한다.
1) 적재 정책 : 프로세스가 필요로 하는 데이터를 언제 메모리로 가져올 것인가?
2) 배치 정책 : 가져온 프로세스를 어떤 위치에 올려놓을 것인가?
3) 재배치 정책 : 메모리가 꽉 찼을 때 메모리 내에 있는 어떤 프로세스를 내보낼 것인가?
이러한 작업 및 정책을 MMU (메모리 관리자)가 담당한다.
2. 메모리 주소
1) 물리 주소와 논리 주소
1. 물리 주소 (= 하드웨어적 관점)
- 물리 메모리 (RAM)에 매겨진 주소, 하드웨어에 의해 고정된 메모리 주소이다.
- 0에서 시작하여 연속되는 주소 체계이다.
- 메모리는 시스템 주소 버스를 통해 물리 주소의 신호를 받는다.
2. 논리 / 가상 주소 (= 프로세스 관점)
- 개발자나 프로세스가 프로세스 내에서 사용하는 주소
- CPU가 프로세스를 실행하는 동안 다루는 모든 주소는 논리 주소이다.
- 상대 주소 체계이다.
2) Address Binding
- 프로그램이 메모리 어느 위치에, 어떤 물리적 위치에 적재될 지 경정하는 과정이다.
1) Compile-time Binding : 프로세스의 물리적 주소가 컴파일 타임에 정해진다.
-> 물리 주소가 곧 논리 주소이다. 같은 주소를 쓰는 프로세스가 있다면 적재가 불가능하다.
2) Load-time Binding : Loader가 프로세스를 load하는 시점에 물리적 주소 결정
-> 바꿔야 할 주소가 많다면 비효율적이다.
3) Run-time Binding : 프로세스가 수행이 시작된 이후에 프로세스가 실행될 때 메모리 주소를 바꾼다.
-> Runtime 때 물리적 주소가 결정
3) MMU (메모리 관리자)
- 논리 주소를 물리 주소롤 바꿔주는 하드웨어 장치이다. CPU 안에 내장되어있다.
- 상대 주소 → 물리 주소
- 메모리 관리자는 사용자 프로세스가 상대 주소를 사용하여 메모리에 접근할 때마다 상대 주소값에 Base 레지스터 값을 더하여 절대 주소를 구한다.
- Base 레지스터는 주소 변환의 기본이 되는 주소값을 가진 레지스터로, 메모리에서 사용자 영역의 시작 주소값이 저장된다.
- Limit 레지스터는 메모리 관리자는 사용자가 작업을 요청할 때마다 경계를 벗어나는 작업을 요청하는 프로세스가 있으면 종료시킨다.

4) 주소 변환
1. 프로세스의 모든 코드들은 논리 주소로 구성된다.
2. CPU가 읽고 해석하고 발생시키는 주소는 모두 논리 주소이다.
3. 논리 줏와 물리 주소의 매핑 테이블이 존재
4. MMU를 거쳐 논리 주소가 물리 주소로 변환
5. MMU는 매핑 테이블을 이용하여 주소를 변환한다.
5) 메모리 오버레이
- 각 프로세스는 자신이 모든 메모리를 점유하는 것처럼 생각한다. 하지만, 실제로 할당된 공간은 적다.
- 메모리 오버레이란?
: 프로그램의 크기가 실제 메모리보다 클 때 전체 프로그램을 메모리에 가져오는 대신 적당한 크기로 잘라서 가져오는 기법이다.
- 프로그램이 실행되면 현재 필요한 부분만 메모리에 올라와 실행한다. 바꿔가면서 (Swap)

6) Swap
1. Swap Area
- 메모리가 모자라서 쫓겨난 프로세스를 저장 장치의 특별한 공간에 모아두는 영역이다.
- 메모리 관리자가 관리하다.
- 사용자는 실제 메모리의 크기와 스왑 영역의 크기를 합쳐서 전체 메모리로 인식한다.
- 자꾸 발생하면 단편화 문제가 발생된다.
7) ASLR (Address Space Layout Randomization)
- 메모리 주소가 누출되는 일은 보안 상 매우 위험하다. 따라서 임의의 코드로 실행한다면 보안 상 문제가 없을 것이다.
- 주소 공간이 랜덤으로 배치된다. 실행할 때마다 함수의 지역 변수와 할당 받는 메모리의 논리 주소가 바뀐다.
3. 메모리 할당
1) 메모리 할당 기법
1. 연속 vs 불연속 : Process Partitioning
- 연속 : 프로세스가 메모리 내에 인접되어 연속되게 하나의 블록을 차지하도록 배치한다.
- 불연속 : 프로세스가 페이지나 세그먼트 단위로 나뉘어 분산 배치되는 방법이다.
2. 가변 vs 고정 : Memory Partitioning
- 가변 : 프로세스의 크기에 맞게 메모리가 분할된다.
- 고정 : 프로세스의 크기에 상관없이 같은 크기로 메모리가 나뉜다.
2) 연속 메모리 할당

3) 연속 메모리 할당 구현
1. 하드웨어 지원 : base 레지스터, limit 레지스터, 주소 레지스터
2. 운영체제 지원 : 비어 있는 메모리 영역 관리
3. 연속 메모리 할당의 장단점
- 장점 : 논리 주소를 물리 주소로 바꾸는 과정이 단순하고 CPU 액세스 시간이 빠르다.
- 단점 : 메모리 할당의 유연성이 떨어지고 외부 단편화 발생
4) 연속 할당에서의 메모리 배치 기법
1. 최초 적합 : 비어 있는 파티션 중 맨 앞에 요청 크기보다 더 큰 파티션 선택
2. 최적 적합 : 비어 있는 파티션 중 요청을 수용하는 가장 작은 파티션 선택 -> 시간이 오래 걸림
3. 최악 적합 : 비어 있는 파티션 중 요청을 수용하는 가장 큰 파티션 선택 -> 가장 큰 홀 발생
5) 단편화
: 프로세스에게 할당할 수 없는 조각 메모리들이 생기는 현상이다.
1) 외부 단편화 : 할당된 메모리들 사이에 사용할 수 없는 홀이 생기는 현상
-> 가변 크기의 파티션이 생기고 반환되면서 작은 홀 발생
2) 내부 단편화 : 할당된 메모리 내부에 사용할 수 없는 홀이 생기는 현상
-> 파티션보다 작은 프로세스를 할당하는 경우
6) 단편화 해결 방법 : 조각 모음
조각을 모은다는 것이다. 굉장히 비싼 작업이긴 하다...

'CS 전공 > OS' 카테고리의 다른 글
[운영체제] 11. Demand Paging (0) | 2024.06.23 |
---|---|
[운영체제] 10. 페이징 (0) | 2024.06.23 |
[운영체제] 8. 교착상태 (0) | 2024.06.23 |
[운영체제] 7. 프로세스와 쓰레드의 동기화 (Synchronization) (0) | 2024.06.23 |
[운영체제] 6. 스케줄링 (2) | 2024.04.21 |