운영체제는 어떤 식으로 메모리를 관리할까??
연속 메모리 할당
- 운영체제의 가장 기본적인 메모리 관리 방식
: 메모리 내에 프로세스들을 연속적인 메모리 공간에 할당시키는 방식이다.
이 연속메모리할당에서 어떤식으로 Process들을 배치할 수 있을까
연속메모리 할당의 문제점
연속메모리 할당의 해결법 ⇒ 페이징
스와핑
: 메모리 내의 현재 사용되지 않는 Process들을 보조기억장치의 일부 영역(=Swap 영역)으로 쫓아내고, 그렇게 생긴 빈 공간에 새 Process를 적재하는 기술이다.
- Swap out: 사용되지 않는 Process를 보조기억장치의 스왑 영역으로 옮기는 과정
- Swap in: Swap 영역에 있던 Process가 다시 메모리로 적재시키는 과정
스와핑을 썼을때의 이점
- 지금 당장 사용될 Process만을 메모리에 적재할 수 있다.
- 실제 메모리 크기보다 프로세스들이 요구하는 메모리 공간이 클 경우에도 해당 Process를 처리할 수 있다.
연속 메모리 할당 방식
- 프로세스는 메모리 내 빈 공간에 적재되어야 한다.
- 메모리 내 빈 공간에 아래와 같이 20MB 메모리 공간을 요구하는 Process를 적재시킨다고 가정하겠다.
- 연속 메모리에 Process를 적재시키는 방법은 3가지로 나눌 수 있다.
- 최초 적합 / 최적 적합 / 최악 적합
최초 적합
: 운영체제가 메모리 내의 빈 공간을 순차적 검색 진행 → 적재할 수 있는 공간을 발견 → 그 공간에 바로 프로세스를 배치하는 방식
⇒ 검색 최소화, 빠른 할당 가능
최적 적합
: 운영체제가 빈 공간을 모두 검색해본 뒤, 적재 가능한 가장 작은 공간에 할당하는 방식
최악 적합
: 운영체제가 빈 공간을 모두 검색해본 뒤, 적재 가능한 가장 큰 공간에 할당하는 방식
연속 메모리 할당의 문제점
- 메모리를 효율적으로 사용할 수 없다.
- 외부 단편화(external fragmentation) 문제 발생
- 프로세스를 연속적으로 메모리에 할당하는 방식(연속 메모리 할당)
외부 단편화
외부 단편화 발생 과정
- 메모리가 200MB인 공간에 아래 프로세스가 연속 메모리 할당으로 인해 실행 및 종료되었다고 가정하자
- 프로세스 A: 50MB - 실행 중
- 프로세스 B: 30MB - 실행 완료(후 종료)
- 프로세스 C: 100MB - 실행 중
- 프로세스 D: 20MB - 실행 완료(후 종료)
- 그렇다면, 위 그림에서 새로운 50MB 프로세스를 처리할 수 있을까? - 그렇지 않다.
- 즉, 빈 공간의 총합은 50MB이지만, 그에 달하는 프로세스를 처리할 수 없는 문제를 외부단편화이다.
외부 단편화 정의
: 프로세스를 할당하기 어려울 만큼 작은, 메모리 공간들로 인해 메모리가 낭비되는 현상
: 작은 메모리 공간들은 외부 단편화를 발생시키기에 유의미한 지표다.
근본적인 문제: 각기 다른 크기의 프로세스가 메모리에 연속적으로 되기 때문이다!
외부 단편화 해결 방법
1. 메모리 압축 (compaction)
: 여기저기 흩어져 있는 빈 공간들을 하나로 모으는 방식이다.
즉, 프로세스를 적당히 재배치 시킴으로써, 흩어져있는 작은 빈 공간들을 하나의 빈 큰 공간으로 만드는 기술이다.
외부 단편화를 해결하기 위한 메모리 관리 기술 중 하나
메모리 압축 문제점
- 실행 중인 Process 재배치 / 흩어져 있는 빈 메모리 공간을 압축 → CPU 오버헤드 발생 → CPU 성능 저하
2. 가상 메모리 기법, 페이징
: 실제 물리적인 메모리보다 큰 주소 공간을 프로세스에 제공한다. 이를 통해 여러 프로세스가 동시에 실행될 때 물리적인 메모리 용량에 제약받지 않고 메모리를 효율적으로 관리할 수 있다.
가상 메모리 관리 기법에 대해 더 자세히 알아보도록 한다.
가상 메모리
: 실행하고자 하는 프로세스의 일부만을 메모리에 적재함으로써, 실제 물리 메모리보다 큰 프로세스를 실행할 수 있게 하는 기술이다.
페이징(paging)
: 프로세스를 일정한 크기로 자르고, 이를 메모리에 불연속으로 할당하는 기술이다.
: 연속 메모리 할당의 외부 단편화 문제를 해결할 수 있는 기술이다.
가상 메모리 관리 기법 중 하나
불연속적으로 페이지가 메모리에 할당되어 있기 때문에
메모리의 프레임에 프로세스를 이루는 페이지가 어디에 위치해있는지 CPU가 일일이 알기 어렵다.
즉, CPU가 “다음에 실행할 명령어 위치”를 찾기가 어려워진다.
이 문제에 대해서는 관련 용어와 swaping 이후 소개하겠다.
페이징(paging) 관련 용어
- 페이지(page): 프로세스의 논리 주소 공간을 자를 때의 일정한 단위
- 프레임(frame): 메모리의 물리 주소 공간을 일정한 크기(페이지와 동일한 크기)로 나눈 블록
- 즉, page를 frame에 할당하는 가상 메모리 관리 기법이 바로 paging이다.
paging에서의 swaping
- paging에서도 swap in, swap out이 발생할 수 있다.
- 프로세스 단위가 아닌, 페이지 단위의 swap in(page in), swap out(page out)이 발생한다.
- 즉, 프로세스를 실행하기 위해서는 모든 page가 적재될 필요는 없는 것이다.
- 이로 인해 물리 메모리보다 큰 프로세스도 (일부 페이지만 가지고 와서) 실행할 수 있는 것이다!
페이지 테이블 (page table)
프로세스를 이루는 페이지 문제점
→ 메모리의 어디 프레임에 적재되어 있는지 CPU가 일일히 확인하기 어렵다.
→ 왜냐하면, 프로세스가 메모리에 불연속적으로 배치되어 있기 때문이다.
즉, CPU 입장에서 “다음에 실행할 명령어의 위치”를 찾기가 어려워진다.
위와 같은 프로세스의 페이지 문제점을 해결하는 방법이 바로 페이지 테이블이다!
페이지 테이블이 뭐지??
- 물리 주소(실제 메모리 내 주소)에 페이지가 실제로 불연속적으로 배치되더라도,
- 논리주소(CPU가 바라보는 주소)에는 마치 연속적으로 배치되어있는 것처럼 보이게 하는 방법
쉽게 말해서, 페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표 역할을 하는 것이 바로 페이지 테이블이다.
이를 통해, 물리적으로는 분산되어 저장되어 있더라도 CPU 입장에서 바라본 논리주소는 연속적으로 보여 CPU의 연산 속도를 늦추지 않도록 할 수 있는 것이다.
페이징 문제점 - 내부 단편화
- 특정 프로세스의 총 크기가 페이지(일정한 단위)의 배수가 아닐 수도 있다.
- 특정 프로세스를 페이지 단위로 나누었을 시, 여분의 페이지 범위가 남을 경우 프로세스의 특정 페이지 내 논리 주소 공간의 낭비가 발생한다. 이를 바로 내부 단편화라고 한다.
- 예를 들어, 페이지 크기: 5KB 이고, 프로세스 크기: 112KB일 때는 3KB 내부 단편화가 발생하는 것이다.
- 참고) 하나의 페이지 크기보다 작은 크기로 발생한다 따라서, 낭비되는 메모리가 외부 단편화보다는 내부 단편화가 적게 발생한다.
- 쉽게 말해서, 프로세스를 메모리에 페이징을 시킬 때, 페이지 크기와 프로세스 크기 간 불일치로 인해 발생하는 것이 내부 단편화이다.
PTBR
- CPU 연속적인 논리 주소 접근을 위해 각 프로세스마다 페이지 테이블이 존재한다고 소개했다.
- 프로세스마다의 페이지 테이블들만을 모아둔 곳(Register)을 바로 “Process Table Base Register(PTBR)이다.
- 즉, PTBR은 각 프로세스의 페이지 테이블이 적재되어 있는 위치(주소)를 가리키고 있다.
예를 들어)
CPU가 프로세스 A를 실행하고 있다고 가정해보겠다.
⇒ 그렇다면, CPU 입장에서 프로세스 A를 이루고 있는 페이지들이 현재 (실제 메모리 내) 어떤 프레임에 적재되어있는지 알아야 한다.
⇒ 이를 위해, 페이지 테이블을 참조해야 한다.
⇒ CPU는 페이지 테이블을 참조하기 위해서 PTBR을 확인하는 것이다.
그런데, PTBR이 가리킨 곳 즉, 페이지 테이블이 저장되어 있는 곳은 어디라면 좋을까??
페이지 테이블 저장 위치 - 메모리??
- 페이지 테이블이 메모리에 적재되어있으면, 메모리 접근 시간이 2배로 들게된다.
- 페이지 테이블에 접근하기 위해 메모리 접근 - 1번
- 프레임에 접근하기 위해 메모리 접근 - 1번
TLB
PTBR의 메모리 접근 시간이 2배로 발생하는 문제점을 해결하기 위한 방법
: 메모리 내 현재 자주 참조되고 있는 페이지 테이블의 일부를 저장하는 캐시 메모리이다.
⇒ 이를 통해, 자주 참조되고 있는 페이지 테이블에 대해서는 메모리 접근을 하지 않고, 이 캐시 메모리인 TLB를 참조함으로써, 메모리 접근 시간이 2배로 발생하는 문제점을 해결할 수 있는 것이다!
TLB 관련 용어
- TLB 히트: CPU가 접근하려는 논리주소가 TLB에 있다. - 메모리 접근 1번만 발생
- TLB 미스: CPU가 접근하려는 논리주소가 TLB에 없다. - 메모리 접근 2번 발생
페이징에서의 주소 변환
- 페이지 테이블을 통해서 어떻게 논리주소가 물리주소로 변환이 될까??
- 그를 위해서는 페이징 시스템 상 논리주소가 어떻게 이루어져있는지를 먼저 알아야한다.
페이징 시스템 상 특정 주소로의 접근
- 페이징을 사용하는 시스템에서 특정 주소로 접근하려면 어떤 주소가 필요할까??
- 먼저, 어떤 페이지 or 어떤 프레임에 접근하고 싶은지를 알아야한다.
- 이후, 접근하려는 주소가 기준(페이지 or 프레임)에서 얼마나 떨어져 있는지를 알아야 한다.
- 예를 들어) CPU가 n+2번지에 접근하고 싶다고 가정해보겠다.
- 어떤 프레임? → 프로세스 A 페이지 1
- 접근하려는 주소는? → 2만큼 떨어진 주소
페이징 시스템에서의 논리주소
- 페이징 시스템 상 논리주소는 페이지 번호(page number), 변위(offset) 2가지로 이루어져있다.
- 페이지 번호: 접근하고자하는 페이지 번호
- 변위: 그 페이지에서 얼마나 떨어져있는지
페이징에서의 주소 변환
- [페이지 번호, 변위]로 이루어진 논리주소 → 페이지 테이블을 통해 → [프레임 번호, 변위]로 변환되는 것이다!
- 페이지 단위와 프레임 단위는 같기 때문에 두 주소변환 간 변위는 당연히 같다.
예를 들어)
- CPU가 프로세스를 처리하기 위해 프로세스 내 페이지를 확인했다.
- 현재 실행되어야 할 논리주소가 [5,2] 인 곳을 접근해야 한다.
- 논리주소(페이지번호, 변위)를 통해 페이지 테이블을 확인
- 프레임 번호 1과 맵핑 되어 있음을 확인
- 물리 주소 공간 내 1번 프레임에 접근 한 뒤, 변위(2)에 맞춰 물리 주소 접근
페이지 테이블의 각각의 행 - PTE
- PTE(Page Table Entry)는 페이지 테이블의 각각의 행을 뜻한다.
- 페이지 번호, 프레임 번호
- 사실, 페이지 테이블에는 이 2가지 외에도 다른 정보들이 담길 수 있다. (운영체제마다 다름)
- 추가적인 PTE에는 “유효비트”라는 것이 있다. - 확장개념으로 생각하면 쉬운 거 같다:)
유효 비트
- 현재 페이지가 swap 영역으로 쫓겨나있는지, 아닌지를 나타낸다.
- 이로써, 현재 페이지가 메모리(주기억장치)에 있는지 보조기억장치에 있는지 나타내는 것이다.
- 즉, “현재 해당 페이지에 접근가능한지에 따른 여부”가 바로 유효비트인 것이다.
유효 비트가 0인 페이지에 접근하려고 하면??
→ ‘page fault’라는 인터럽트가 발생한다.
page fault : 현재 접근하려는 페이지가 메모리에 적재되어있지 않을 때 발생하는 인터럽트다.
자세히 과정을 들여다보면 아래와 같다.
- 유효 비트0인 곳에 접근
- CPU가 기존 작업 내역을 백업한다.
- page fault 처리 루틴을 실행
- page 처리 루틴으로 원하는 페이지를 메모리로 가져온 뒤, 유효 비트를 1로 변경
- page falut를 처리해야, CPU가 이제 해당 페이지에 접근 가능하다.
- page fault를 처리했다 == CPU가 접근하고자하는 페이지를 메모리로 적재완료했다.
보호 비트
- 페이지 보호 기능을 위해 존재하는 비트다.
- 즉, 페이지에 접근할 권한을 제한해서, 페이지를 보호하는 비트다.
- 다양한 형태로 존재가능하다.
참조 비트
- CPU가 이 페이지에 접근한 적이 있는지 여부를 알려주는 비트이다.
수정 비트 (=dirty bit)
- CPU가 이 페이지에 데이터를 수정한 적이 있는지 여부를 알려주는 비트다.
- 존재 이유: 이 페이지가 메모리에서 보조기억장치로 swaping될 때를 위해 존재한다.
- 자세히 말해서, 메모리(주기억장치) 내에서 CPU가 페이지를 변경했을 때, swap out 될 때 보조 기억장치 내 해당 페이지도 덮어쓰기를 해야할 필요를 판단하기 위해서이다.
정리
연속 메모리 할당 문제점
- 외부 단편화: 프로세스를 할당하기 어려울 만큼 작은, 메모리 공간들로 인해 메모리가 낭비되는 현상
- 물리 메모리보다 큰 프로세스 실행 불가
- 최악 적합으로 인해 메모리를 효율적으로 사용 불가
외부 단편화 해결 방법
- 메모리 압축 기법: 프로세스를 적당히 재배치 시킴으로써, 흩어져있는 작은 빈 공간들을 하나의 빈 큰 공간으로 만드는 기술
- 가상 메모리 (페이징): 실행하고자 하는 프로세스의 일부만을 메모리에 적재함으로써, 실제 물리 메모리보다 큰 프로세스를 실행할 수 있게 하는 기술
페이징 (paging)
: page를 frame에 할당하는 가상 메모리 관리 기법
- 페이지(page): 프로세스의 논리 주소 공간을 자를 때의 일정한 단위
- 프레임(frame): 메모리의 물리 주소 공간을 일정한 크기(페이지와 동일한 크기)로 나눈 블록
프로세스 페이징 처리 - 페이지 테이블
- 프로세스가 페이지 단위로 불연속적으로 메모리 내 물리주소에 적재되기 때문에, 메모리는 어디 프레임에 적재되어 있는지 알기 힘들다. 즉, “다음에 실행할 명령어”를 실행하기에 시간이 걸린다.
- 이러한 해결점을 해결하기 위한 방법
- 쉽게 말하면, CPU의 연속적인 논리 주소 접근을 위한 것
페이징 문제점
- 내부 단편화: 특정 프로세스를 페이지 단위로 나누었을 시, 여분의 페이지 범위가 남을 경우 프로세스의 특정 페이지 내 논리 주소 공간의 낭비가 발생하는 문제
PTBR, TLB
- 프로세스마다의 페이지 테이블들만을 모아둔 곳(Register)을 바로 “Process Table Base Register(PTBR)이다.
- PTBR은 메모리에 저장된 페이지 테이블의 위치를 가리킨다. 이 때문에 프로세스 내 페이지를 처리하기 위해 2번의 메모리 접근이 발생하게 되는데 이를 해결하기 위한 캐시 메모리가 TLB이다.(1번의 메모리 접근)
페이징 시스템에서의 논리주소 변환
- 페이지 번호, 변위로 이루어져 있다.
- 페이지 번호로 이루어진 논리주소에서, 페이징 테이블을 거쳐, 프레임 번호로 이루어진 물리주소로 변환된다.
- 두 변위는 동일하다.
PTE
- 페이지 테이블의 각 행을 뜻한다.
- PTE 에는 페이지 번호, 프레임 번호 뿐만 아니라 유효, 보호, 참조, 수정(=dirty) bit가 있다.
- PTE는 운영체제에 따라 다를 수 있다.
'OS' 카테고리의 다른 글
OSI 7 Layer (0) | 2023.07.22 |
---|---|
여러 대의 컴퓨터가 통신하려면?? feat.Router (0) | 2023.07.20 |
TCP/UDP (0) | 2023.07.19 |
TCP/IP (0) | 2023.07.16 |
Process Thread (0) | 2023.07.12 |