시작하기 앞서
이 글은 웹 백엔드 주니어 개발자가 인프런의 그림으로 쉽게 배우는 운영체제 강의를 들으며 공부한 내용을 러프하게 정리한 글입니다.
이전 글
러프한 운영체제 기초 1편: 러프한 운영체제 기초 1편 | 프로세스와 약간의 쓰레드
러프한 운영체제 기초 2편: 러프한 운영체제 기초 2편 | CPU 스케줄링과 교착 상태
러프한 운영체제 기초 3편: 러프한 운영체제 기초 3편 | 메모리
가상메모리
- "RAM은 결코 충분하지 않다,"라는 고민에서 시작된 기법으로 물리 메모리 크기의 한계를 극복하기 위해 나온 기술임
- 컴퓨터에 실제로 가용한 메모리를 추상화하여 사용자들에게 하여금 매우 큰 메모리로 보이게 만드는 기법
- 가상메모리의 핵심은 프로세스를 메모리에 올릴 때 프로세스 전체를 메모리에 올리는 것이 아니라 필요한 부분만 쪼개 메모리에 올리는 것
- 프로세스는 실행될 때 실행에 필요한 일부분만 메모리에 올라가고 나머지는 하드디스크의 스왑 영역에 위치하게 됨
- 가상 메모리 시스템을 구현하기 위해서는 MMU(Memory Management Unit, 메모리 관리자)라고 불리는 특수한 메모리 관리 하드웨어가 필요하며(과거에는 MMU가 별도의 하드웨어였지만 최근의 아키텍처에서는 프로세서와 같은 칩에 회로로 삽입된다고 한다) MMU는 메모리 상의 가상주소를 물리주소로 변환하고 메모리를 보호하는 기능을 수행함
- MMU는 가상주소와 물리주소를 일대일 매핑 테이블로 관리해 잘게 쪼개진 프로세스를 관리함
- MMU는 가상메모리를 위한 메모리를 일정한 비율로 나누어 각각의 프로세스에게 할당하는데 이 때 메모리를 나누는 방법은 메모리가 프로세스에게 주소를 할당하는 방식과 같은 가변 분할 방식과 고정 분할 방식으로 나뉨
- 가변 분할 방식(세그멘테이션)
- 고정 분할 방식(페이징)
- 세그멘테이션에는 '외부 단편화', 페이징에는 '내부 단편화'의 문제가 있기 때문에 각각의 단점을 보완한 세그멘테이션-페이징 혼용 기법을 사용하기도 함
- 세그멘테이션-페이징 혼용 기법
세그멘테이션 (배치정책)
- 세그멘테이션에서의 프로세스는 함수나 모듈 등의 세그먼트 집합으로 여겨짐 (메인코드, 전역데이터, 힙, 라이브러리, 스택 등을 세그먼트라는 단위로 나누어 프로세스를 바라봄)
- 각각의 세그먼트는 역할(함수, 모듈 등)의 단위로 나누어지기 때문에 크기가 일정하지 않음 (cf. 페이징은 일정한 크기에 따라 프로세스를 나누기 때문에 크기가 일정)
- MMU는 세그멘테이션 테이블을 가지고 있어 이를 토대로 가상메모리 상의 논리 주소를 물리 주소로 변환함
세그멘테이션의 물리 주소 변환 과정
- 세그멘테이션 테이블에는 Base Address와 Bound Address 정보가 저장됨 (index = 세그먼트 번호 / value = Base Address, Bound Address)
- Bass Address: 세그먼트 시작 주소
- Bound Address: 세그먼트의 크기
- CPU에서 논리 주소를 전달 (CPU: 논리 주소 0x123번지의 물리 메모리 주소 알려줘!)
- MMU 논리 주소가 몇번 세그먼트인지 판별 (MMU: 세그먼트 3번이군!)
- MMU 내의 Segment Table Base Register를 이용, 물리 메모리 내의 세그멘테이션 테이블을 찾음 (MMU: 물리메모리 n번지에 있는 세그멘테이션 테이블 가져 와야지!)
- 세그먼트 번호를 index로 하는 Base Address와 Bound Address를 찾음 (MMU: 세그먼트 3번이니 3번 index 참조! Base Address는 6400, Bound Address는 500이군!)
- CPU에서 가져온 논리 주소와 Bound Address의 크기를 비교 (MMU: 123과 500 크기 비교!)
- 만약 논리 주소가 Bound Address보다 작다면 논리 주소와 Bass Address를 더해 물리 주소를 계산 (MMU: 123 < 500이니 논리 주소와 Bass Address를 더하자! 123 + 6400 = 6523!)
- 만약 논리 주소가 Bound Address보다 크다면 메모리를 침범했다고 여기고 에러를 발생 (MMU: 메모리 침범! 에러!)
세그멘테이션의 장점
- 메모리를 가변적으로 분할할 수 있음
- 각각의 영역을 모듈로 처리할 수 있어 공유와 각 영역에 대한 메모리 접근 보호가 편리함 (관리가 쉬움)
세그멘테이션의 단점
- 가변 분할 방식의 단점인 '외부 단편화'가 발생
페이징 (배치정책)
- 세그멘테이션의 외부단편화를 개선시키기 위해 고안
- 메모리 할당 시 정해진 크기만큼 나누어 관리하기 때문에 외부 단편화가 발생하지 않음
- 세그멘테이션은 세그먼트(작업단위? 논리적인 연관성을 가진 집합체?)의 크기별로 메모리를 나누어 할당하는 방식, 페이징은 메모리를 일정한 크기만큼 나누어 할당하는 방식
페이지와 프레임
- 페이지: 논리주소공간에서 일정한 비율로 나눈 메모리의 단위
- 프레임: 물리주소공간에서 일정한 비율로 나눈 메모리의 단위
- 논리주소공간에서는 페이지, 물리주소공간에서는 프레임이라고 부른다.
세그멘테이션의 물리 주소 변환 과정
- MMU는 페이지 테이블을 가짐
- key: 페이지
- valuse: 프레임
- CPU에서 논리 주소를 전달 (CPU: 논리 주소 0x0번지의 물리 메모리 주소 알려줘!)
- MMU는 논리주소가 몇번 페이지인지, 오프셋이 얼마인지 판별 (MMU: 논리주소 0x0번지는 페이지 0이고 오프셋은 0이군!)
- 페이지 넘버 = 논리 주소 / 페이지 크기
- 오프셋 = 논리 주소 % 페이지 크기
- MMU 내의 PTBR(Page Table Base Register)을 이용, 물리 메모리 내의 페이지 테이블을 조회함
- 페이지 번호를 인덱스로 프레임 번호를 조회 (MMU: 페이지 0이면 프레임 3번이네!)
- 오프셋을 이용해 물리주소로 변환 (MMU: 3번 프레임에 오프셋 0을 더하니 3!)
페이징의 장점
- 외부단편화가 발생하지 않음
페이징의 단점
- 내부단편화가 발생 <- 그러나 세그멘테이션의 외부단편화만큼 많은 단편화가 발생하지 않기 때문에 세그멘테이션보다 페이징 기법을 많이 사용한다고 함
- 세그멘테이션처럼 논리적인 단위로 크기가 나뉘지 않기 때문에 공유와 각 메모리에 대한 접근 보호가 어려움. 페이징의 크기를 얼마나 할 것이냐가 페이징에서는 매우 중요한 이슈
계속....
'운영체제' 카테고리의 다른 글
[리눅스 운영체제] 사용자 모드와 커널 모드 (0) | 2023.02.28 |
---|---|
러프한 운영체제 기초 3편 | 메모리 (0) | 2022.04.13 |
러프한 운영체제 기초 2편 | CPU 스케줄링과 교착 상태 (0) | 2022.03.18 |
러프한 운영체제 기초 1편 | 프로세스와 약간의 쓰레드 (0) | 2022.03.09 |