들어가기 앞서서 용어정리
스와핑(Swapping)
- 프로세스를 보조기억장치의 스왑 영역으로 내보내고, 당장 필요한 프로세스를 메모리에 적재하는 메모리 관리 기법
스왑 아웃(Swap-out)
- 실행 중인 프로세스를 메모리에서 제거하고, 보조기억장치의 스왑 영역으로 이동시키는 작업
스왑 인(Swap-in)
- 스왑 아웃된 프로세스를 보조기억장치에서 다시 메모리로 적재하는 작업
스왑 영역(Swap Area)
- 스왑 아웃된 프로세스가 저장되는 보조기억장치의 특정 영역
- 일반적으로 디스크의 일부 공간이 사용되며, 메모리 관리의 효율성을 높이는 데 활용됨
스와핑의 동작방식
스와핑을 사용할 시 현재 메모리의 크기보다 더 많은 프로세스를 적재할 수 있는 장점이 있다.
만약 프로세스 A, B, C, D가 있고 이 프로세스의 메모리의 합은 현재 메모리의 구성보다 크다고 가정한다.
다음과 같이 차례대로 A, B, C를 메모리에 적재한다.
이때, 프로세스 B는 당장 실행할 필요가 없고, 프로세스 D를 당장 사용해야 한다면 프로세스 B는 보조기억 장치로 스왑 아웃된다. 그런 다음 프로세스 D는 메모리에 적재가 된다.
마찬가지로 프로세스 A는 당장 사용되지는 않고, 프로세스 B가 필요하다면, 보조기억장치로 프로세스 A는 스왑 아웃되며, 프로세스 B는 스왑 인되어진다.
연속 메모리 할당과 외부 단편화
처음 메모리에 대해 배우게 되면, 아래 그림과 같이 프로세스를 메모리에 연속적으로 배치하는 연속 메모리 할당방식으로 배우게 된다.
하지만 많은 운영체제에선 해당 방식으로 사용되지 않는다. 이러한 방식은 외부 단편화라는 문제를 야기할 수 있기 때문이다. 외부 단편화란 프로세스들이 실행되고 종료되는 과정이 반복되는 상황 속 빈 공간이 생기면서 발생하는 메모리 낭비 현상이다.
위 그림에서 다음과 같이 프로세스 B, D가 실행 종료되면, 남아있는 공간은 `50MB`가 남게 된다. 남은 공간은 `50MB`지만 분리되어 공간을 차지하므로 막상 `50MB`인 프로세스 B를 적재할 수 없다. 이러한 현상이 외부 단편화이다.
가상메모리와 페이징
스와핑이나 연속 메모리 할당 기법은 다음과 같은 두 가지 주요 문제가 있다.
- 외부 단편화: 프로세스를 메모리에 적재하고 삭제하는 작업을 반복하면, 프로세스들 사이에 사용하지 못하는 작은 빈 공간이 발생합니다. 이를 외부 단편화라고 한다.
- 메모리 크기 제한: 물리 메모리보다 크기가 큰 프로세스는 실행할 수 없다.
페이징
이러한 문제를 해결하기 위한 방법으로 페이징(Paging)이 사용된다.
페이징은 메모리와 프로세스를 일정한 크기의 단위로 나눈 뒤, 이 단위를 매칭하여 할당하는 기법이다.
- 메모리 단위: 프레임(Frame)
메모리는 고정 크기의 블록(프레임)으로 나뉜다. - 프로세스 단위: 페이지(Page)
프로세스는 메모리 크기와 동일한 크기의 블록(페이지)으로 나뉜다.
페이징은 이 페이지를 프레임에 할당하여, 외부 단편화 문제를 해결하고 물리 메모리보다 큰 프로세스도 실행할 수 있도록 지원한다.
페이징에서도 스와핑(Swapping)이 사용될 수 있다. 이 경우, 메모리 관리의 단위가 페이지(Page)로 설정되므로, 스왑 작업도 페이지 단위로 이루어진다.
- 페이지 아웃(Page-Out)
메모리가 부족할 때, 특정 페이지를 보조기억장치(스왑 영역)로 내보내는 작업이다.
이는 스와핑의 스왑 아웃(Swap-Out)과 동일한 개념이지만, 단위가 페이지로 제한된다. - 페이지 인(Page-In)
보조기억장치에 저장된 페이지를 다시 메모리로 불러오는 작업이다.
이는 스와핑의 스왑 인(Swap-In)과 동일한 개념이다.
가상 메모리
이번 포스팅의 주제가 가상 메모리인데 이런 페이징기법이 가상 메모리 관리기법에 하나이다. 가상 메모리는 다음과 같은 특징을 가진다.
- 프로세스 일부만을 적재하여 실제 물리 메모리보다 큰 프로세스를 실행하는 기술
- 페이징은 현재 운영체제에서 가장 대중적으로 사용되는 가상 메모리 관리 기법
세그멘테이션(Segmentation)
세그멘테이션은 가상 메모리 관리 기법 중 하나로, 메모리를 서로 다른 크기의 세그먼트로 나누어 관리하는 방법이다. 각 세그먼트는 논리적으로 관련된 데이터나 코드 블록을 포함하며, 프로세스는 이러한 세그먼트를 독립적으로 접근할 수 있다. 이를 통해 메모리 사용의 효율성을 높이고, 프로세스 간의 메모리 보호를 강화할 수 있다.
페이징을 사용하면 단편화 문제에서 자유로워지는 걸까?
페이징은 메모리를 일정한 크기의 블록(프레임)으로 나누고, 프로세스를 동일한 크기의 블록(페이지)으로 나눠 관리한다. 이 방식은 연속 메모리 할당 방식에서 발생하는 외부 단편화 문제를 효과적으로 해결한다.
그러나, 페이징이 모든 단편화 문제를 해결하는 것은 아니다. 페이징 방식에서도 내부 단편화(Internal Fragmentation)라는 새로운 문제가 발생할 수 있다.
내부 단편화란 메모리 낭비로 이어지는 상황을 말한다. 이는 페이지 크기와 프로세스 크기가 정확히 일치하지 않을 때 발생할 수 있다.
- 프로세스의 크기가 페이지 크기로 나뉘지 않는 경우, 마지막 페이지에는 프로세스 데이터가 남아있는 공간보다 작게 할당될 수 있다.
- 예를 들어, 페이지 크기가 4KB인데 프로세스의 크기가 10KB라면, 3개의 페이지가 필요하다.
- 두 개의 페이지(8KB)는 가득 채우지만, 마지막 페이지(4KB)는 2KB만 사용되고 나머지 2KB는 비어 있게 된다.
- 이 비어 있는 공간이 바로 내부 단편화이다.
페이지 테이블
페이징은 쪼개서 메모리에 할당하는 기법이므로, 물리 메모리 내에 불연속적인 배치가 발생할 수 있다. 이러한 경우 CPU 입장에서 다음으로 실행할 페이지의 위치를 찾기가 힘들어진다. CPU가 프로세스를 이루는 어떤 페이지가 어떤 프레임에 적재되어 있는지를 모두 알고 있기는 어렵기 때문이다.
이러한 문제를 해결하기 위해 프로세시의 페이지와 실제 적재된 프레임의 정보를 가지고 있는 페이지 테이블(page table)이라는 표 형태의 데이터를 제공해 준다. 덕분에 CPU는 페이지 테이블의 페이지 번화만 보고도 해당 프레임을 찾아갈 수 있게 된다.
페이지 테이블은 프레임과 페이지의 매핑 정보를 담고 있는 표 형태의 데이터이다. (사진) 이러한 페이지 테이블의 정보가 있다면 불연속적으로 적재되어 있는 페이지에도 CPU가 접근할 수 있게 된다.
프로세스는 각 프로세스마다 페이지 테이블을 가지고 있으며, CPU가 서로 다른 프로세스를 실행할 때는 각 프로세스의 페이지 테이블을 참조하여 메모리에 접근한다.
페이지 테이블 베이스 레지스터(PTBR)
페이지 테이블 베이스 레지스터(PTBR)는 각 프로세스의 페이지 테이블 위치를 가리키는 레지스터이다.
PTBR이 중요한 이유
페이징 기법에서는 각 프로세스마다 고유한 페이지 테이블이 존재한다.
페이지 테이블은 프로세스의 가상 주소를 실제 물리 주소로 변환하는 데 필요한 정보를 담고 있으며, CPU는 이를 참조하여 메모리 접근을 처리한다.
하지만 CPU는 어떤 프로세스의 페이지 테이블이 메모리 어디에 위치하는지 알아야만 접근할 수 있다.
이때 PTBR이 그 역할을 하게 된다.
- PTBR은 현재 실행 중인 프로세스의 페이지 테이블 시작 주소를 저장하고 있어 CPU가 해당 페이지 테이블에 빠르게 접근할 수 있도록 도와준다.
PTBR과 PCB의 관계
프로세스 제어 블록(PCB)은 각 프로세스의 상태와 관련된 정보를 저장하는 구조체입니다.
PCB에는 프로세스의 메모리 관련 정보도 포함되며, PTBR 역시 여기에 포함된다.
페이지 테이블이 메모리에 적재될 경우 발생하는 성능 문제
페이징 기법에서 페이지 테이블은 가상 주소를 실제 물리 주소로 변환하기 위한 중요한 데이터 구조이다. 하지만, 페이지 테이블이 메모리에 전부 적재되어 있다면 다음과 같은 성능 문제가 발생할 수 있다.
1. 메모리 접근 시간이 두 배 소요
- 가상 주소를 변환하려면 페이지 테이블을 먼저 참조해야 한다.
- 첫 번째 접근: 페이지 테이블에서 해당 페이지 번호에 대한 프레임 번호를 찾기 위해 메모리를 읽는다.
- 두 번째 접근: 해당 프레임 번호를 사용해 실제 데이터가 저장된 메모리 프레임에 접근한다.
- 결과적으로, 메모리 접근이 2번 필요하므로 접근 시간이 기존보다 두 배가 된다.
2. 메모리 접근 속도의 한계
- 메모리는 CPU의 캐시 메모리나 레지스터에 비해 접근 속도가 훨씬 느리다.
- 따라서 메모리를 2번씩 접근해야 한다면 전체 성능이 크게 저하된다.
- CPU와 메모리 간 속도 차이는 시스템의 병목현상을 유발할 수 있다.
TLB
이러한 문제를 완화하기 위해 **TLB(Translation Lookaside Buffer)**라는 캐시 메모리를 사용한다.
TLB는 일부 페이지 테이블 항목을 저장하는 캐시로, 자주 사용하는 테이블의 경우 빠르게 접근이 가능하게 한다.
캐시 메모리에 원하는 데이터가 있을 시 캐시 히트, 없을 때 캐시 미스라고 부른다. TLB에선 TLB 히트, TLB 미스라고 부르게 된다.
- TLB 히트(TLB Hit)
- 필요한 페이지 테이블 항목이 TLB에 있을 경우, 메모리를 직접 접근하지 않아도 된다.
- 따라서 페이지 테이블 접근 시간을 효과적으로 줄일 수 있다.
- TLB 미스(TLB Miss)
- 필요한 항목이 TLB에 없을 경우, 메모리에 직접 접근해야 한다.
- 이 경우, 앞서 설명한 것처럼 메모리 접근이 2번 발생하므로 성능이 저하된다.
페이지 테이블 엔트리
페이지 테이블 동작 방식에 대해 알아봤고, 페이지 테이블의 구성요소인 페이지 테이블 엔트리에 대해 조금 더 알아보자.
페이지 테이블의 페이지 번호와 프레임 번호 이 외에 많은 정보가 존재하는데 다음과 같은 대표적인 정보들이 있다.
1. 유효 비트(valid bit)
유효비트는 메모리에 적재된 페이지와 적재되지 않은 페이지를 구분하기 위해 사용하는 비트이다. 적재되어 있으면 `1`, 적재되어 있지 않다면 `0`으로 사용된다. 이걸 다르게 말하자면 접근하는 페이지가 보조기억장치에 있는가 아니면 메모리에 있는가로 설명될 수 있다.
만약 메모리에 적재되지 않지 않은 페이지(비트가 `0`)에 접근한다면, 페이지 폴드(page fault)라는 특별한 인터럽트가 발생하게 된다. 해당 인터럽트가 발생되면 다음과 같은 과정을 통해 실행되게 된다.
- 우선 작업 내역 백업한다.
- 페이지 폴트 루틴 실행이 되며 접근하려는 페이지가 메모리에 적재된다.
- 유효 비트는 1로 변경된다.
- 접근하려는 페이지 접근하게 된다.
2. 보호비트(protection bit)
접근하려는 페이지의 권한을 나타내는 비트이다. 읽기(Read)를 나타내는 `r`, 쓰기(Write)를 나타내는 `w`, 실행(eXecute)을 나타내는 `x`의 조합으로 페이지에 접근할 권한을 제한함으로써 페이지를 보호할 수 있다.
3. 참조비트(reference bit)
접근한 적 있는 페이지를 나타내는 비트이다. 다음 포스팅에서 진행할 페이지 교체 알고리즘을 설명할 때 사용된다.
4. 수정비트 / 더티비트(modifybit / dirty bit)
페이지가 쓰기 작업을 한 적이 있는지 나타내는 비트이다. 이 비트는 메모리와 보조기억장치 간의 효율적인 데이터 동기화를 위해 사용된다.
메모리와 보조기억장치의 특성은 다음과 같다.
- 메모리는 휘발성 저장장치로, 전원이 꺼지면 저장된 데이터가 사라진다.
- 따라서, 메모리에 적재된 정보는 보조기억장치에도 저장되어야 데이터 유실을 방지할 수 있다.
이 특성을 기반으로 CPU의 쓰기 작업과 수정비트의 역할에 대해 알아보자.
CPU는 메모리에 있는 데이터를 읽을 뿐만 아니라 쓰기 작업도 수행한다. 예를 들어, 프로세스 A에서 데이터를 수정하면
- 메모리의 데이터가 먼저 변경된다.
- 동시에 보조기억장치의 데이터도 변경되어야 데이터 일관성이 유지된다.
수정비트는 이 과정을 최적화하기 위해 도입되었다.
- 수정비트가 설정되어 있지 않다면(0): 페이지가 변경되지 않았으므로, 보조기억장치와 메모리 간의 추가 작업이 필요하지 않다.
- 수정비트가 설정되어 있다면(1): 해당 페이지가 메모리에서 변경된 상태이므로, 보조기억장치에 변경 내용을 기록해야 한다.
결국, 수정비트는 보조기억장치에 쓰기 작업을 해줘야 하느냐를 판별하는 용도로 사용이 된다.
계층적 페이징
페이지 테이블은 프로그램의 가상 주소를 실제 물리 주소로 변환하는 데 사용된다. 하지만 페이지 테이블은 프로그램 크기에 비례하여 크기가 커지기 때문에, 다음과 같은 문제가 발생할 수 있다.
- 큰 메모리 사용량: 프로그램의 크기가 크면 페이지 테이블도 커지며, 이를 메모리에 적재하는 것이 부담스러워진다.
- 효율성 저하: 페이지 테이블 전체를 메모리에 유지하려면 많은 메모리 공간이 필요하며, 성능 저하를 유발할 수 있다.
그럴 때 사용하는 기법이 계층적 페이징이다. 계층적 페이징은 페이지 테이블을 다시 페이징하여, 메모리 사용량을 줄이고 효율성을 높이는 기법이다. (페이지 테이블의 크기를 조금이라도 줄이기 위해 사용)
- 페이지 테이블 분할
- 기본 페이지 테이블을 더 작은 단위로 나눈다.
- 각 작은 단위는 하위 페이지 테이블(Sub Page Table)로 관리된다.
- 외부 페이지 테이블(Outer Page Table)
- 나눠진 하위 페이지 테이블 정보를 저장하는 외부 페이지 테이블(Outer Page Table)을 사용한다.
- CPU는 외부 페이지 테이블을 먼저 참조하여, 필요한 하위 페이지 테이블의 위치를 찾는다.
참고
https://fastcampus.co.kr/dev_online_newcomputer
초격차 패키지 : 현실 세상의 컴퓨터공학 지식 with 30가지 실무 시나리오 | 패스트캠퍼스
국내유일, 77시간 분량의 개발자를 위한 한 번에 끝내는 컴퓨터공학 (CS 지식) 강의를 확인하세요. 자료구조,알고리즘부터 디자인패턴, 클린코드까지 ! CS지식의 이론~실습뿐 아니라, 실제 실무에
fastcampus.co.kr
'Knowledge > 컴퓨터구조&운영체제' 카테고리의 다른 글
[운영체제] 가상 메모리 관리 - 3. 페이지 교체 알고리즘 (0) | 2025.01.13 |
---|---|
[운영체제] 가상 메모리 관리 - 2. 요구 페이징과 스래싱 (0) | 2025.01.13 |
[운영체제] 동기화와 교착상태 - 4. 교착상태와 해결 방법 (0) | 2025.01.07 |
[운영체제] 동기화와 교착상태 - 3. 조건 변수와 모니터(동기화 기법) (0) | 2025.01.07 |
[운영체제] 동기화와 교착상태 - 2. 뮤텍트와 세마포어(동기화 기법) (0) | 2025.01.06 |