profile image

L o a d i n g . . .

가상 메모리

이전 글에서도 정리한 내용이 있어 최대한 핵심만 정리했다.

연속 메모리 할당

프로세스에 연속적인 메모리를 할당하는 방식을 연속 메모리 할당 방식이라고 한다.

스와핑

스와핑은 메모리에서 사용되지 않는 일부 프로세스를 보조기억장치로 내보내고 실행할 프로세스를 메모리로 들여보내는 메모리 관리 기법이다.

이 때 프로세스들이 쫓겨나는 보조기억장치의 일부 영역을 스왑 영역이라고 한다.

개발자가 알아야 할 운영체제 지식

유닉스/리눅스/macOS에서는 free, top 명령어 등을 통해 스왑 영역의 크기를 확인할 수 있다.

페이징을 통한 가상 메모리 관리

가상 메모리는 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술이다. 이를 가능케 하는 가상 메모리 관리 기법에는 크게 페이징세그멘테이션이 있지만, 여기선 현재 대부분 운영체제가 사용하는 페이징 기법을 다룬다.

페이징이란

메모리와 프로세스를 일정한 단위로 자르는 것.
페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 자르고, 메모리 물리 주소 공간을 프레임이라는 페이지와 동일한 크기의 일정한 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법이다.

개발자가 알아야 할 운영체제 지식개발자가 알아야 할 운영체제 지식

한 프로세스를 실행하기 위해 프로세스 전체가 메모리에 적재될 필요가 없다!
프로세스를 이루는 페이지 중 실행에 필요한 페이지만 메모리에 적재하고, 당장 실행에 필요하지 않은 페이지들은 보조기억장치에 남겨둘 수 있다. 이와 같은 방식을 통해 물리 메모리보다 더 큰 프로세스를 실행할 수 있다.

또한 외부 단편화 문제를 해결할 수 있다.(프로세스들이 메모리에 연속적으로 할당되는 환경에서는, 프로세스들이 실행되고 종료되기를 반복하며 메모리 사이에 빈 공간이 생긴다. 그리고 그 공간이 작아 프로세스를 할당하기 어려운 상황이 생기게 되고, 결국 메모리 낭비로 이어진다. 이를 외부 단편화라고 한다.)

개발자가 알아야 할 운영체제 지식

페이지 테이블

CPU 입장에서는 프로세스가 메모리에 불연속적으로 배치되면 '다음에 실행할 명령어 위치'를 찾기가 어렵다.
이를 해결하기 위해 페이징 시스템은 프로세스가 (실제 메모리 내의 주소인)물리 주소에 불연속적으로 배치되더라도 (CPU가 바라보는 주소인)논리 주소에는 연속적으로 배치되도록 페이지 테이블을 이용한다.

프로세스들이 메모리에 분산되어 저장되어 있더라도 CPU는 논리 주소를 그저 순차적으로 실행하면 된다.

개발자가 알아야 할 운영체제 지식

프로세스마다 각자의 페이지 테이블을 가지고 있고, 각 프로세스의 페이지 테이블들은 메모리에 적재되어 있다. 그리고 CPU 내의 페이지 테이블 베이스 레지스터(PTBR Page Table Base Register) 는 각 프로세스의 페이지 테이블이 적재된 주소를 가리키고 있다.

개발자가 알아야 할 운영체제 지식

각 프로세스들의 페이지 테이블 정보들은 각 프로세스의 PCB에 기록된다. 그리고 프로세스 문맥 교환이 일어날 때, (다른 레지스터와 마찬가지로) PCBR의 내용 또한 변경된다.

TLB

이렇게 페이지 테이블을 메모리에 두면 문제점이, 메모리 접근 시간이 두 배로 늘어나는 것이다.
메모리에 있는 페이지 테이블을 보기 위해 한 번, 그렇게 알게 된 프레임에 접근하기 위해 한 번, 총 2번의 메모리 접근이 필요하기 때문이다.

이 문제를 해결하기 위해 CPU 옆에 TLB라는 페이지 테이블의 캐시 메모리를 둔다.
TLB는 페이지 테이블 캐시이기 때문에, 페이지 테이블 일부 내용을 저장한다. 참조 지역성에 근거해 주로 최근 사용된 페이지 위주로 가져와 저장한다.

개발자가 알아야 할 운영체제 지식개발자가 알아야 할 운영체제 지식

페이지 교체와 프레임 할당

페이징 폴트
일반적으로 프로세스를 이루는 모든 페이지가 메모리에 있지 않다. 일부 페이지는 보조기억장치(스왑 영역)에 있는 경우가 많다. CPU가 메모리에 적재되어 있지 않은 페이지로 접근하려고 하면 페이지 폴트가 발생한다.

요구 페이징
프로세스를 메모리에 적재할 때 처음부터 모든 페이지를 적재하지 않고 필요한 페이지만을 메모리에 적재하는 기법을 요구 페이징이라고 한다. 실행에 요구되는 페이지만 적재하는 기법이다.
이런 요구 페이징 시스템이 안정적으로 작동하려면 필연적으로 페이지 교체, 프레임 할당 문제를 잘 해결해야 한다.

페이지 교체
요구 페이징 기법으로 페이지들을 메모리에 적재하다 보면 언젠가 메모리가 가득 차게 된다. 이 때 당장 실행에 필요한 페이지를 적재하기 위해 메모리에 적대된 페이지를 보조기억장치로 내보내야 한다. 여기서 내보낼 페이지를 결정하는 방법을 페이지 교체 알고리즘이다.

프레임 할당
나쁜 페이지 교체 알고리즘 외에도 프로세스가 사용할 수 있는 프레임 수가 적어도 페이지 폴트는 자주 발생한다. (사실 근본적으로 프레임이 부족하면 페이지 폴트가 자주 발생할 수 밖에 없다.) 페이지 폴트가 자주 발생하여 프로세스가 실제 실행되는 시간보다 페이지 교체에 더 많은 시간을 소요해서 성능이 저해되는 문제를 스레싱이라고 한다.

스래싱이 발생하는 근본적인 원인으로 각 프로세스가 필요로 하는 프레임 수가 보장되지 않는다는 문제를 볼 수 있다. 따라서 운영체제는 각 프로세스들이 무리 없이 실행하기 위한 최소한의 프레임 수를 파악하고 프로세스들에 적절한 수만큼 프레임을 할당해 줄 수 있어야 한다.

프레임 할당 방식에는 균등 할당(모든 프로세스들에 균등하게 프레임 할당), 비례 할당(프로세스 크기에 비례해 프레임 할당), 작업 집합 모델 사용(실행 중인 프로세스가 일정 시간동안 참조한 페이지의 집합을 작업 집합이라고 한다. CPU가 과거에 주로 참조한 페이지를 작업 집합의 포함한다면, 운영체제는 작업 집합의 크기만큼만 프레임을 할당하는 방식이다), 페이지 폴트율 기반 프레임 할당 방식이 있다.

파일 시스템

파일과 디렉토리

파일

파일이란 하드 디스크나 SSD와 같은 보조기억장치에 저장된 정보의 집합, 의미있고 관련 있는 정보를 모은 논리적 단위를 의미한다.

운영체제는 파일의 확장자를 통해 파일의 유형을 파악할 수 있다.

개발자가 알아야 할 운영체제 지식

파일을 다루는 모든 작업은 운영체제에 의해 이뤄진다. 그 어떤 응용 프로그램도 임의로 파일을 조작할 수는 없으며, 파일을 다루려면 운영체제에 부탁해야 한다.(시스템 콜을 통해서 운영체제에 부탁한다.)

디렉토리

디렉토리를 이용하여 여러 개의 파일 또는 디렉토리를 묶어 관리가 가능하다.

파일 시스템

파일 시스템은 파일과 디렉토리를 보조기억장치에 일목요연하게 저장하고 접근할 수 있게 하는 운영체제 내부 프로그램이다.

파티셔닝과 포매팅

  • 파티셔닝은 하드 디스크나 SSD 처럼 용량이 큰 저장 장치를 하나 이상의 논리적인 여러 단위로 구획하는 작업을 의미한다.
  • 포매팅은 파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지 결정하고, 새로운 데이터를 쓸 수 있게 하는 작업을 의미한다.

파일 시스템에는 여러 종류가 있고, 파티션마다 다른 파일 시스템을 설정할 수도 있다.

개발자가 알아야 할 운영체제 지식

파일 할당 방법

운영체제는 파일과 디렉토리를 블록 단위로 읽고 쓴다. 즉 하나의 파일이 보조기억장치에 저장될 때는 하나 이상의 블록에 걸쳐 저장된다.

개발자가 알아야 할 운영체제 지식

파일을 보조기억장치에 할당하는 방법은 아래 그림과 같다.

개발자가 알아야 할 운영체제 지식

연속 할당

보조기억장치 내 연속적인 블록에 파일을 할당한다.

개발자가 알아야 할 운영체제 지식

연결 할당

각 블록 일부에 다음 블록의 주소를 저장. 즉, 파일을 이루는 데이터를 연결 리스트로 관리한다.

개발자가 알아야 할 운영체제 지식

색인 할당

파일의 모든 블록 주소를 색인 블록(index block)이라는 하나의 블록에 모아 괸리한다.
파일 A의 색인 블록은 4번 블록이고, 파일 A의 데이터는 7, 3, 11번에 저장되어 있다고 했을 때 아래의 그림처럼 표현할 수 있다.

따라서 색인 블록만 알면 해당 파일 데이터에 접근할 수 있다. 그래서 색인 할당을 사용하는 파일 시스템에서는 디렉토리 엔트리에 파일 이름과 더불어 색인 블록 주소를 명시한다.

개발자가 알아야 할 운영체제 지식

파일 시스템 살펴보기

FAT 파일 시스템

USB 메모리, SD 등의 저용량 저장장치에서 사용된다.
연결 할당의 단점을 보완한 파일 시스템이다.

연결 할당의 단점으로, 파일을 구성하는 블록들 중 하나라도 문제가 발생하면 그 이후의 블록에는 접근이 불가능하다.
그 원인은 블록 안에 다음 블록의 주소를 저장했기 때문이다.

개발자가 알아야 할 운영체제 지식

하지만 각 블록에 포함된 다음 블록 주소들을 한데 모아 테이블 형태로 관리하면 이 문제를 해소할 수 있다. 이 테이블을 파일 할당 테이블(FAT, File Allocation Table) 이라고 한다.

개발자가 알아야 할 운영체제 지식

아래 그림을 보면 FAT 파일 시스템에서의 /home/minchul/a.sh 파일을 읽는 과정을 살펴볼 수 있을 것이다.

디렉토리 구조

유닉스 파일 시스템

유닉스 계열 운영체제에서 사용된다.
색인 할당 기반이다. 유닉스 파일 시스템에서는 이 색인 블록을 i-node라고 한다.

다만 i-node의 크기는 유한하다. i-node는 기본적으로 15개 블록 주소를 저장할 수 있다. 이럴 경우 블록을 15개 이상 차지하는 큰 파일들은 i-node 하나만으로 파일의 데이터 블록을 모두 가리킬 수 없다.
유닉스 파일 시스템에서 이 문제를 해결하는 방법은 다음과 같다.

1. 블록 주소 중 열 두개에는 직접 블록 주소를 저장한다.
파일 데이터가 저장된 블록을 직접 블록 direct block 이라고 한다.


2. 12개의 블록 주소만으로 충분하지 않다면, 열 세번째 주소에 간접 단일 블록 주소 single indirect block를 저장한다.

3. 그래도 충분하지 않다면 열 네번째 주소에 이중 간접 블록 주소 double indirect block를 저장한다.

4. 그래도 충분하지 않다면 열 다섯번째 주소에 삼중 간접 블록 주소 triple indirect block를 저장한다.

 


 드디어 🧑🏻‍💻혼자 공부하는 컴퓨터구조+운영체제 정리가 끝이 났다.
이렇게 정리해두니 뿌듯하기도 하고, 지식 정리에 도움이 많이 되었다.
개발자 업무를 시작하며 컴퓨터에 대해 잘 알아야할 필요성을 느껴 정리한 내용인만큼, 개발자로서의 역량을 쌓는데 도움되길 바란다😁

복사했습니다!