728x90
CS
이것이 컴퓨터 과학이다.
Chapter 2. 운영체제
가상 메모리
- 물리 주소와 논리 주소
- CPU와 프로세스는 메모리의 하드웨어 상 실제 주소인 물리 주소(Physical address)가 아니라 다른 주소 체계를 이용한다. 바로 논리 주소이다. 논리 주소(logical address)는 프로세스마다 부여되는 0번지부터 시작하는 주소 체계를 말한다.
- CPU와 프로세스가 사용하는 주소 체계는 물리 주소가 아니라 논리 주소이기 떄문에 중복되는 물리 주소의 번지 수는 존재하지 않지만, 중복되는 논리 주소의 번지 수는 얼마든지 존재할 수 있다.
- 메모리 관리 장치(Memory Management Unit)은 CPU와 메모리 사이에 위치하며, CPU가 이해하는 논리 주소를 메모리가 이해하는 물리 주소로 변환하는 역할을 한다.
- 스와핑과 연속 메모리 할당
- 스와핑
- 메모리에 적재된 프로세스들 중에는 현재 실행되고 있지 않은 프로세스도 있다. 이러한 프로세스들은 임시로 스왑 영역(swap space)라는 보조기억장치의 일부인 영역으로 쫒아내고, 프로세스를 쫒아낸 자리에 생긴 메모리 상의 빈 공간에 다른 프로세스를 적재하여 실행하는 메모리 관리 방식을 스와핑(swapping)이라고 한다.
- 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것을 스왑 아웃(swap-out), 반대로 스왑 영역에 있는 프로세스가 다시 메모리로 옮겨오는 것을 스왑 인(swap-in)이라고 한다. 스왑 아웃 되었던 프로세스가 다시 스왑 인될 때는 스왑 아웃되기 전의 물리 주소와는 다른 주소에 적재될 수 있다.
- 연속 메모리 할당과 외부 단편화
- 프로세스에 연속적인 메모리 공간을 할당하는 방식을 연속 메모리 할당이라고 한다. 연속 메모리 할당은 외부 단편화라는 문제를 내포한다.
- 프로세스들이 메모리에 연속적으로 할당되는 환경에서는 프로세스의 실행과 종료를 반복하며 메모리 사이 사이에 빈 공간이 생긴다. 프로세스 바깥에 생기는 빈 공간들은 분명 빈 공간이 맞지만 그보다 큰 프로세스를 적재하기 어려운 상황을 초래하고, 이는 메모리 낭비로 이어진다. 이러한 현상을 외부 단편화(external fragmentation)라고 한다.
- 스와핑
- 페이징을 통한 가상 메모리 관리
- 스와핑과 연속 메모리 할당은 2가지 문제를 내포한다. 하나는 적재와 삭제를 반복하며 프로세스들 사이에 반생하는 외부 단편화이고, 또 하나는 물리 메모리보다 큰 프로세스를 실행할 수 없다는 문제이다. 프로세스를 반드시 연속적으로 메모리에 할당해야 한다면 메모리보다 큰 프로그램은 적재할 수 없다. 이러한 문제를 해결하는 운영체제의 메모리 관리 기술이 바로 가상 메모리이다.
- 가상 메모리는 실행하고자 하는 프로그램의 일부만 메모리에 적재해, 실제 메모리보다 더 큰 프로세스를 실행할 수 있도록 만드는 메모리 관리 기법이다. 보조기억장치의 일부를 메모리처럼 사용하거나 프로세스의 일부만 메모리에 적재함으로써 메모리를 실제 크기보다 더 크게 보이게 하는 기술이다.
- 페이징
- 페이징(paging)은 프로세스의 논리 주소 공간을 페이지(page)라는 일정한 단위로 나누고, 물리 주소 공간을 페이지와 동일한 크기의 프레임(frame)이라는 일정한 단위로 나눈 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법이다. 이때, 프로세스를 구성하는 페이지는 물리 메모리 내에 불연속적으로 배치될 수 있다.
- 페이징 기법에서도 스와핑이 사용될 수 있다. 페이징을 사용하는 시스템에서는 프로세스 전체가 스왑 아웃/스왑 인 되는것이 아니라 페이지 단위로 스왑 아웃/스왑 인된다.
- 페이지 테이블
- 페이지 테이블에는 페이지 번호와 실제로 적재된 프레임 번호가 대응되어 있다. 덕분에 CPU는 페이지 테이블의 페이지 번호만 보고도 적재된 프레임을 찾을 수 있다. 프로세스마다 각자의 페이지 테이블 정보를 가지고 있으므로, CPU가 서로 다른 프로세스를 실행할 때는 각 프로세스의 페이지 테이블을 참조하여 메모리에 접근한다.
- 페이지 테이블을 구성하고 있는 각각의 행들을 테이블 엔트리(PTE)라고 한다. 운영체제마다 차이는 있지만, 페이지 테이블 엔트리에 포함되는 대표적인 정보로는 페이지 번호와 프레임 번호, 유효 비트, 보호 비트, 참조 비트, 수정 비트를 꼽을 수 있다.
- 유효 비트는 해당 페이지에 접근이 가능한지 여부를 알려준다. 유효 비트는 페이지가 메모리에 적재되어 있다면 1, 페이지가 메모리에 적재되어 있지 않다면 0이된다. CPU는 보조기억장치에 저장된 페이지에 곧장 접근할 수 없으므로 보조기억장치에 저장된 페이지에 접근하려면 보조기억장치 속 페이지를 메모리로 적재한 뒤에 접근해야 한다. 만일 CPU가 메모리에 적재되지 않은 페이지, 즉 유효 비트가 0인 페이지에 접근하려고 하면 페이지 폴트(Page fault)라는 예외가 발생한다.
- 페이징이 외부 단편화 문제를 해결할 수 있지만, 내부 단편화라는 또 다른 문제를 야기할 수 있다. 페이지 하나의 크기보다 작은 크기로 발생하게 되는 메모리 낭비를 내부 단편화라고 한다.
- 각 프로세스의 페이지 테이블은 메모리에 적재될 수 있다. 따라서 어떤 프로세스를 실행하려면 이 프로세스의 페이지 테이블이 메모리에 적재된 위치를 알아야 한다. 특정 프로세스의 페이지 테이블이 적재된 메모리 상의 위치를 가리키는 레지스터를 페이지 테이블 베이스 레지스터라고한다. PTBR은 프로세스마다 가지는 정보이므로 각 PCB에 기록되며, 다른 프로세스로의 문맥 교환이 발생할 때 변경된다.
- 모든 프로세스의 페이지 테이블이 메모리에 적재되어 있을 경우, CPU는 페이지 테이블에 접근하기 위해 한 번, 실제 프레임에 접근하기 위해 한 번, 이렇게 총 두 번 메모리에 접근해야 한다. 따라서 메모리에 접근하는 시간이 두 배로 늘어날 수 있다. 이를 해결하기 위해 TLB라는 페이지 테이블의 캐시 메모리가 사용된다. TLB는 페이지 테이블의 캐시이므로 참조 지역성의 원리에 근거해 자주 사용할 법한 페이지 위주로 페이지 테이블의 일부 내용을 저장한다.
- 페이지 테이블의 크기는 생각보다 작지 않다. 프로세스의 크기가 커지면 자연히 페이지 테이블의 크기도 커지기 때문에 프로세스를 이루는 모든 페이지 테이블 엔트리들을 메모리에 두는 것은 큰 메모리 낭비이다. 그래서 등장한 방법 중 하나가 계층적 페이징이다. 계층적 페이징은 페이지 테이블을 페이징하는 방식으로, 여러 단계의 페이지를 둔다는 점에서 다단계 페이지 테이블 기법이라고도 부른다. 계층적 페이징은 다음 그림처럼 프로세스의 페이지 테이블을 여러 개의 페이지로 자르고, CPU와 가까이 위치한 바깥 쪽에 페이지 테이블을 하나 더 두어 잘린 페이지 테이블의 페이지들을 가리키게 한다.
- 페이지 교체 알고리즘
- 메모리에 프로세스를 적재할 때 처음부터 모든 페이지를 적재하지 않고, 메모리에 필요한 페이지만을 적재하는 기법을 요구 페이징(demand paging)이라고 한다.
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.12.08 CS (2) | 2024.12.08 |
---|---|
24.12.07 CS (1) | 2024.12.07 |
24.11.29 C++ (0) | 2024.11.29 |
24.11.28 면접 후기 (1) | 2024.11.28 |
24.11.27 서버, AWS (0) | 2024.11.27 |