2021. 5. 23. 16:22ㆍCS 스터디
1. 페이징(Paging) : 외부 단편화에 대한 해결책 (고정 분할 방식)
먼저 페이징은 외부 단편화로 인한 메모리 낭비가 매우 심하고 그때 Compaction(압축)을 사용하면 외부 단편화를 해결할 수는 있지만, 그로 인해 생기는 오버헤드와 비효율적인 성능으로 사용하기 어렵기 때문에 나온 기법이다.
- 단편화란?
단편화에는 내부 단편화, 외부 단편화가 있는데 둘 다 메모리 공간이 낭비되는 상황을 의미한다.

다음과 같이 메모리에 50MB의 공간이 남아있고 30MB의 신규 프로세스가 실행된다면, 다음과 같이 적재가 되고 이곳에는 20MB라는 내부 단편화가 생긴다.
이곳에 20MB 이상의 프로세스는 적재되지 못하고 낭비되는 현상이 생긴다.

외부 단편화란 그림처럼 공간이 100MB나 있음에도 C작업이 적재되지 못하고 낭비되는 상황을 의미한다. 이런 경우 Compaction이라는 압축 기법을 통해 분산된 자유 메모리 공간을 모아서 큰 블록을 형성하는데 프로세스 주소 공간이 동적으로 재배치되어야 하므로 굉장히 오버헤드가 크고 비효율적이다.
따라서 남은 메모리 공간을 동적으로 재배치하지 않고 프로세스 자체를 잘게 쪼개서 곳곳에 넣는 개념이 바로 페이징이다. 페이징을 통해서 외부 단편화를 해결할 수 있지만 내부 단편화는 여전히 남아있다.
다만, 하나의 프로세스는 연속적으로 시간에 따라 계속 동작을 수행하는데 이를 잘게 쪼개서 여기저기 분산해버리면 프로세스가 정상 작동하는가??
이를 위해서 실제로는 메모리 주소가 연속적이지 않지만 연속적으로 CPU에게 보이게끔 하는 기술이 필요하다.

먼저 프로세스 P1 은 5개의 페이지로 나뉜다. 그리고 메모리의 조각은 프레임이라고 한다. CPU는 연속된 논리주소로 명령을 내리지만 실제 메모리 주소는 연속적이지 않으므로 실제 물리 주소로 변환되는 과정이 필요하다. 이때 쓰이는 것이 페이지 테이블이다.
- 주소 변환

CPU가 논리주소 50번지에 간다고 하면 논리 주소를 p, d 값으로 나눠야 한다.
여기서 d를 구하는 방식은 페이지의 크기가 16byte 이므로 2^4인데 이때 제곱수 4의 크기만큼 d가 가지고 나머지 2를 p가 가진다.
50은 2진수로 110010 이고 여기서 앞에 2칸 11 = p , 뒤의 4칸 0010 = d 가 된다.
이때 p, d로 이뤄진 논리주소가 실제 주소 f, d로 바뀌어야 하는데 p가 11 이므로 이는 십진수로 3이고 페이지 3은 프레임 8번에 적재되어 있으므로 f는 8 즉, 2진수로 1000이 된다.
최종적으로 물리주소는물리 주소는 f, d로 구성되어 2진수로 표기하면 10000010이 되고 이는 십진수로 130번지가 된다. 여기서 마지막으로 변위는 d를 의미하는데 0010은 2이므로 페이지 8의 물리 주소는 128~130이 된다.
2. 세그맨테이션 : 내부 단편화의 해결책 (가변 분할 방식)
페이징은 프로세스를 물리적으로 나눠서 메모리에 할당하는 방식이라면 세그맨테이션은 프로세스를 논리적 내용을 기반으로 나눠서 배치하는 방식이다. 기본적으로 프로세스를 나눠서 메모리에 할당하는 것은 비슷한데, 세그먼트 크기가 일정하지 않기 때문에 세그먼트 테이블에는 limit 정보가 주어진다. CPU에서 해당 세그먼트의 크기를 넘어서는 주소가 들어오면 인터럽트가 발생해서 프로세스를 강제 종료시킨다.

CPU에서 s, d라는 명령을 보내면 테이블을 통해 a, d로 변환하는데 물리주소 a는 base[s] + d로 계산된다.
예를 들어 논리주소 (2,100) 이 들어오면 a는 base[2] + 100 = 물리 주소 4400번이 되고 limit 400인데 사이즈 100이니까 인터럽트 발생 x
논리 주소 (1,500) 이 들어오면 base[1]의 limit 400을 넘기는 500이 들어오므로 인터럽트 발생하여 프로세스 강제 종료
3. 페이징 vs 세그맨테이션
페이징은 프로세스 고정 분할 방식으로 외부 단편화를 극복하기 위한 기법이지만 내부 단편화가 존재하며 세그맨테이션은 프로세스 가변 분할 방식으로 내부 단편화를 극복하기 위한 기법이지만 외부 단편화가 존재한다. 세그맨테이션은 보호와 공유에서는 나은 성능을 보이지만, 대부분 요즘은 페이징을 씀. 왜냐면 세그맨테이션에 치명적 단점이 존재하기 때문인데, 이는 프로세스마다 크기가 제각각이고 그때마다 메모리 사이사이 공간이 예측 불가능하게 구멍이 숭숭 뚫려서 다음 프로세스를 적재할 때 어디에 할당하는 것이 최적인지에 대한 알고리즘이 존재하지 않고 기본적으로 외부 단편화가 훨씬 메모리 낭비가 크기 때문이다.
그래서 나온 게 세그먼트를 페이징 기법으로 나누는 Paged segmentation인데 이 역시 세그먼트 + 페이징 기법이긴 하지만 주소 변환도 2번 해야 되는 단점이 있다.
- 보호와 공유란?
1) 보호 : 접근하고자 하는 페이지에 대해 읽기나 쓰기 작업을 어떻게 제한할 것인 지 , 다른 프로세스의 주소 공간으로 침범하지 못하도록 하는 것. 보호 비트를 두어 접근 제어를 하고 보호에 위반되면 트랩을 일으킨다.
2) 공유 : 프로그램의 한 부분만을 메모리에 두고 실행함으로써 메모리 공간 절약이 가능.
'CS 스터디' 카테고리의 다른 글
| [CS : OS] 메모리 (0) | 2021.05.24 |
|---|---|
| [CS : OS] 페이지 교체 알고리즘 (0) | 2021.05.24 |
| [CS : OS] 셰마포어와 뮤텍스(Semaphore & Mutex) (0) | 2021.05.23 |
| [CS : OS] 경쟁상태 (Race Condition) (0) | 2021.05.23 |
| [CS : OS] IPC & CPU 스케줄링 & DeadLock (0) | 2021.05.21 |