배경
- 프로세스의 크기는 다양하기 때문에 프로세스를 메모리에 연속적으로 적재하게 되면 프로세스 교체가 일어나면서 메모리에 사용하지 않는 공간(Hole)이 생긴다. 결국 메모리 활용에 있어 비효율(외부 단편화)이 생기는데, 페이징 기법과 세그먼테이션은 모두 프로세스를 메모리에 저장할 때, 메모리 활용 효율을 높이기 위한 방법이라고 할 수 있다.
우선, 프로세스를 분할해서 저장하는데 어떻게 정상적으로 작동시킬 수 있을까?
바로 MMU(Memory Management Unit)라는 주소 변환 장치 때문이다.
MMU
- MMU는 대부분 cpu에 탑재되어 있으며, 프로세스가 차례대로 저장되있는 것처럼 보이는 가상 주소를
프로세스가 분할되어 각각 산개되어 저장되어 있는 실제 물리 주소로 변환시켜준다.
EX.
예를 들어, 프로세스가 순서대로 A,B,C로 나누어져 있다고 하자.
그리고 물리적 주소는 A : 100, B : 300, C : 200에 각각 저장되어 있을 때,
메모리에는 프로세스 마다 page table이 존재하며 {A - 1 : 100, B - 2 : 300, C - 3 : 200} 처럼 {가상 주소 : 물리 주소}로
맵핑되어 있다.
따라서 CPU가 A, B, C가 연속적으로 저장되어 있는 page table의 가상 주소를 참조하면,
MMU의 재배치 레지스터가 이 가상 주소를 물리 주소로 맵핑하여 분할되어 있는 프로세스를 불러온다.
- TLB(Translation Lookaside Buffer) : MMU안에 있는 캐시이다. TLB에는 page table에서 최근에 사용된 맵핑 데이터가 저장된다. CPU가 어떤 가상 주소를 참조할 때, TLB를 우선적으로 참조하고, TLB에 원하는 데이터가 없으면 page table을 참조한다. (캐시 메모리 사용 이유와 같다.)
Paging
- 프로세스를 물리적으로 같은 크기의 단위(page)로 쪼개서 메모리에 저장한다.
- 모든 메모리 공간을 page단위로 사용하므로 메모리 중간에 생기는 빈 공간도 page 단위가 된다. 따라서, 어떤 프레임(page단위로 분리 된 process)이든 중간에 생기는 메모리 공간에 저장될 수 있다.
- 메모리 효율 : 따라서 페이징 기법으로 외부 단편화를 없앨 수 있다. 하지만 내부 단편화가 발생하여 메모리를 100% 활용하는 것은 아니다.
- 내부 단편화 : 프로세스가 정확히 page * N의 크기를 갖지는 않기 때문에, 마지막 프레임은 사용하지 않는 메모리가 존재한다. 하지만 외부 단편화에 비해 메모리 낭비가 훨씬 작을 것이다.
- 보호 : 페이지 테이블에는 물리 주소뿐만 아니라, r(read)-w(write)-x(execute) 비트 공간을 둔다. 이 r,w,x값을 통해 해당 프레임에 대한 r,w,x를 수행할 수 있는 상황인지 판단하게 된다.
- 공유 : 프로세스 포스팅에서 프로세스가 code, data, heap, stack으로 나누어진다고 했었다. 만약 같은 프로그램을 여러개 사용 중이라면, 이에 해당하는 프로세스들의 code 데이터는 당연히 동일하다. 이 때, code에 해당하는 프레임은 하나만 메모리에 적재하여 공유하여 메모리 효율을 더 향상시킬 수 있다.
Segmentation
- 세그먼테이션 : 프로세스를 논리적 단위(segment)로 나누어 메모리에 저장한다.
- 프로세스를 연관된 논리적 기능을 단위로 분할한다.
- 분리 기준은 서브루틴, 함수, main func, 스택, etc. 논리적으로 구분되는 기준들이다.
- 메모리 효율 : 논리적 단위로 쪼개어지므로 세그먼트의 크기는 다양하다. 그렇기 때문에 페이징 기법에서 발생한 내부 단편화는 발생하지 않는다. 하지만,, 모든 세그먼트 크기는 다르기 때문에 외부 단편화가 다시 발생한다.
- 따라서 페이징 기법에 비해 메모리 효율이 떨어진다.
- 보호 : 페이지 테이블처럼 세그먼트 테이블도 r, w, x를 가지고 있다. 하지만 페이징 기법의 경우 하나의 논리적 기능을 포함하는 부분이 서로 다른 프레임으로 분할되는 경우가 생긴다. 따라서 r, w, x에 대한 수행 가능 여부를 판단하는데 있어 애매한 경우가 생긴다. 하지만 세그먼테이션 기법은 애초에 논리적 단위로 분할되기 때문에 r, w, x 값을 관리하는데 페이징 보다 용이하다.
- 공유 : 공유하고자 하는 논리적 단위로 정확히 분할되어 있기 때문에 이 또한 페이징 기법 보다 낫다.
→ 페이징은 메모리 효율 측면에서, 세그먼테이션은 보호와 공유 측면에서 더 좋은 방법이다.
따라서, 페이징과 세그먼테이션을 혼합하여 사용하는 방법을 고려하게 된다.
세그먼테이션 + 페이징
- 세그먼테이션 기법을 적용한뒤에, 각 세그먼테이션에 페이징 기법을 또 다시 적용한다.
- 두 가지 기법에 대한 장점을 모두 포함하여 1 + 1 = 2가 되는 것은 아니다.
- 이렇게 혼합하여 사용하게 되면 가상 주소(s : segment num, p: page num in a 's', d: offset num in 'p') 형식으로 구성되고, 이 구조를 보면 알 수 있듯이 세그먼트 테이블과 해당 세그먼트의 페이지 테이블을 모두 참조해야한다. 그러므로 속도가 느려진다!
출처
velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-13.-%ED%8E%98%EC%9D%B4%EC%A7%95
'IT study > Notebooks' 카테고리의 다른 글
| OS - CPU Scheduling (0) | 2021.05.16 |
|---|---|
| DB - Index (0) | 2021.05.03 |
| OS - Global Interpreter Lock(feat. python) (0) | 2021.04.21 |
| DB - Transaction (0) | 2021.04.15 |
| OS - Deadlock (0) | 2021.04.11 |