페이징과 세그멘테이션은 가상 메모리를 관리하는 기법으로 프로세스가 사용하는 메모리 공간을 잘게 나누어 비연속적으로 실제 메모리에 할당하는 메모리 관리 기법이다.
페이징(Paging)
프로세스의 주소 공간을 페이지(page)란 단위의 고정된 사이즈로 나누어 물리적 메모리에 불연속으로 저장하는 방식
- 페이징 방식으로 메모리를 할당하게 되면 실제 프로세스가 실행될 때는 각각의 페이지들이 실제 메모리의 어디에 위치하고 있는지를 빠르게 알 수 있어야 함
- 프로세스의 입장에선 자신이 사용하고 있는 메모리 공간이 흩어져있는 페이지들이 아니라 하나의 연속된 메모리 공간으로 이해할 수 있어야지 프로그램 실행이 효율적이게 됨
→ 페이징은 프로세스가 바라보는 메모리 주소 공간(논리 주소)와 실제 메모리 주소 공간(물리 주소)를 구분하여 효율적인 메모리 할당과 효율적인 메모리 참조를 달성하고 있음
- CPU는 논리 주소로 프로그램이 설정한대로 연속적인 주소값으로 명령을 내리고 이는 메모리로 가기 전에 각 페이지의 실제 메모리 주소가 저장되어 있는 테이블에서 물리 주소로 변경되어야 한다.
- 논리 주소와 물리 주소가 분리되어 동적으로 논리주소가 물리 주소에 재배치되면서 할당되는 것을 허용해야 하고, 모든 메모리 참조에서 주소 변환이 필요하기 때문에 MMU가 필요함.
프레임 & 페이지
- Frame - 페이지가 저장된 실제 물리 메모리의 위치 영역의 단위
- Page - 프로세스가 바라보고 있는 메모리 공간. 즉 논리 주소 공간의 단위
- Page table -각가의 페이지가 실제 메모리에 어떤 프레임이 저장되는가에 대한 매핑 정보를 담고 있는 자료구조. 프로세스가 실행될 때 연속된 위치의 메모리라고 이해한 상태로 각각의 페이지가 어디에 있는지 빠르게 찾을 수 있도록 도움.
- page table은 프레임 번호를 담고 있는 배열
- page table의 index == 페이지 번호
- page table의 value == 프레임 번호
페이징의 주소 표현
- 이전의 주소값이라는 것은 한 바이트의 위치를 나타내는 주소값.
- 페이징 기법에서는 실제 어떤 변수(논리 주소)가 저장되어 있는 어떤 바이트 주소(물리 주소)를 알아야 되긴 하지만 이것들이 페이지 단위의 묶음으로 배치가 되기 때문에 먼저 페이지가 어디에 있는지를 알아내야 한다.
- 논리 주소 공간의 크기가 2^m이고, 페이지의 크기가 2^n일 때 상위 (m-n) 비트는 페이지 번호, 하위 n 비트는 오프셋이다.
- 페이지 크기가 4KB, 메모리 크기가 256KB인 메모리 페이징 시스템의 경우
- 페이지 프레임 수는?
- 페이지 크기 : 4KB == 2^12Byte
- 메모리 크기 : 256KB == 2^18Byte
- 페이지 프레임 수는 메모리 전체 크기에 페이지가 최대 몇개 들어 갈 수 있는지 묻고 있는것. 따라서 2^18/2^12 = 2^6 = 64개이다.
- 이 메모리 주소를 해결하는 데 필요한 비트 수는?
- 메모리 주소를 모두 표현하기 위해서는 메모리가 2^18임을 알고있고 결국 비트가 18개가 있어야 2^18을 만족 할 수 있게 된다. 따라서 18비트가 있으면 된다.
- 페이지 번호에 사용하는 비트와 오프셋에 사용하는 비트는?
- 페이지 번호를 나타내기 위한 비트 : 64개의 페이지를 나타내야 하기 때문에 2^6 → 6비트
- 오프셋에 사용되는 비트 : 하나의 페이지의 모든 위치를 나타내야하기 때문에 2^12 → 12비트
- 페이지 프레임 수는?
페이징의 한계 - 내부 단편화(interner fragment)
- 페이징의 방식으로는 외부 단편화 문제는 해결할 수 있지만, 내부 단편화 문제는 해결하지 못한다.
- 내부 단편화는 프로세스 크기가 페이지 크기의 배수가 아닐 경우, 마지막 페이지는 한 프레임(페이지)를 다 채울 수 없어서 발생하는 공간으로 메모리 낭비의 원인이 된다.
- 예를들어 페이지 크기가 4KB인데 10KB의 메모리를 필요하는 프로세스가 있다면?
- 페이지가 2개하고 2KB가 할당되는 것이 아니라 3개가 할당되어야 10KB메모리를 쓸 수 있음
- 마지막으로 할당된 페이지는 크기는 4KB이지만 실제 사용하고 있는 메모리는 2KB → 2KB만큼 메모리를 낭비하는 내부 단편화가 발생
- 페이지 크기를 작으면 내부 단편화가 감소가 되긴 하지만 이는 페이지 테이블 크기를 증가시킨다.
- 페이징에서는 내부 단편화를 해결할 방법이 없지만 내부 단편화는 외부 단편화에 비해 낭비되는 메모리 공간은 매우 적다. (내부 단편화의 최대 낭비 크기는 page size - 1. 반면 외부 단편화는 최대 전체 메모리의 1/3이 낭비)
보호와 공유
보호(Protection)
- 모든 주소는 페이지 테이블을 경유하므로, 테이블을 이용해서 보호 기능을 수행할 수 있음.
- 대표적으로 페이지 테이블마다 r(read), w(write), x(excute) 비트를 두어 해당 비트가 켜져있을 때 그 수행이 가능하도록 한다.
- 만약 쓰기 비트가 꺼져있는 페이지에 쓰기작업을 시도하면 CPU에 인터럽트가 발생하여 ISR(Interrupt Service Routine)에서 강제로 해당 프로세스를 종료시킨다.
공유(Sharing)
- 공유는 메모리 낭비를 방지하기 위함
- 프로세스의 메모리는 code+data+stack 영역으로 나뉘는데 프로그램이 같다면 code 영역은 같을 것임. 하나의 code 영역을 복수 개의 프로세스가 공유하여 메모리 낭비를 줄일 수 있다. 단, code가 공유되려면 변하지 않는 프로그램이어야 함.
- 각각의 프로세스들의 특정 페이지가 실제 물리 메모리에 같은 프레임으로 연결되도록 페이지 테이블 정보를 가지고 있게 된다면 서로 다른 프로세스이지만 동일한 메모리를 사용할 수 있다.
세그멘테이션(Segmentation)
물리적인 고정 크기로 분할하는 페이징과는 달리 프로그램의 논리적인 내용 단위로 프로세스의 메모리 공간을 분리하는 기법
- 페이징과 세그멘테이션을 구분하는 좋은 예시
- 우리가 돼지를 잡아서 보관을 한다고 생각해보자. 페이징의 방법을 사용하면 돼지를 모두 같은 단위로 잘라서 보관을 하는 것이다. 반면에 세그먼테이션은 부위별로 다른 크기로 잘라서 보관하는 것이다.
- 논리적 단위로는 method, procedure, function, object, variables, stack 등 함수단위로 나눌 수 있고 C컴파일러 관점에서는 코드, 전역 변수, 힙, 스택, 표준 C 라이브러리 단위로 구분지어 나눌 수 있다.
- 논리적 내용의 단위(의미가 같은)로 자르기 때문에 세그먼트들의 크기는 일반적으로 같지 않다.
- 프로세스를 어떻게 자르는가에 대한 방법 빼고 메모리에 할당한하는 방법에 대해서는 페이징과 방법이 같음. 세그멘테이션도 보호와 공유의 기능을 수행함.
- 세그먼트의 논리 주소는 세그먼트의 이름(번호)와 오프셋으로 나뉜다.
- 세그먼트 테이블(segment table) : 세그먼트 테이블에서는 각각의 세그먼트가 차지하는 크기가 서로 다르기 때문에 세그먼트의 실제 메모리 위치 정보 + 끝 주소(크기) 정보를 포함되어 있음
세그멘테이션의 한계 - 외부 단편화(external fragment)
- 세그멘테이션 방식은 가변적인 크기를 가져가기 때문에 내부 단편화 문제는 해결하지만, 외부 단편화 문제가 발생할 수 있다.
세그멘테이션과 페이징 기법은 모두 장단점을 가지고 있기 때문에 두 기법을 모두 사용하여 장점만을 가져와 단편화 문제를 효과적으로 해결할 수 있는 방법을 모색해 볼 수 있다. 세그멘테이션은 보호와 공유 면에서 효과적이고 페이징은 외부 단편화 문제를 해결하는데 효과적이다.
- 프로세스를 처음에 세그먼트 단위로 자른다.
- 의미있는 단위로 나누게 되면 보호와 공유를 하는 측면에서 이점을 가질 수 있게 된다.
- 세그먼트로 인한 외부 단편화 문제를 해결하기 위해 잘라진 세그먼트를 일정한 간격인 페이지 단위로 자르는 페이징 방법을 취한다.
- 이후 메모리에 적재하면 페이징의 일정 단위로 다시 잘렸기 때문에 외부 단편화가 발생하지 않는다
→ 단, 이와 같은 경우는 테이블을 두 가지 모두 거쳐야 하므로 속도 면에서 조금 떨어진다.
[참고]
반응형
'Tech > 운영체제' 카테고리의 다른 글
[개발 한 스푼] CPU 스케줄링 알고리즘의 종류와 각각에 대해 아는대로 설명해주세요 (2023.01.08) (0) | 2023.01.08 |
---|---|
[운영체제] Blocking&Non-Blocking와 Sync&Async (0) | 2022.03.11 |
[운영체제] 가상 메모리 (0) | 2021.12.18 |
[운영체제] 메모리 관리 (0) | 2021.12.15 |