thumbnail
혼자 공부하는 컴퓨터 구조 + 운영체제 - 메모리 할당과 파일 시스템
Aug 20, 2023

혼공단 10기 6주차 학습 기록 fin.

가상 메모리

스와핑(Swapping)

스와핑을 이용하면 프로세스가 요구하는 메모리 공간 크기가 실제 메모리 공간보다 큰 경우에도 프로세스를 동시에 실행할 수 있다.

Swapping

스와핑이란, 메모리에 적재된 프로세스들 중 대기 상태인 프로세스나 오랫동안 사용되지 않는 프로세스를 임시로 보조기억장치 영역으로 보내고 남은 빈 공간에 다른 프로세스를 적재하여 실행하는 방식을 말한다. 여기서 보조기억장치 영역을 스왑 영역(swap space)이라고 하며, 스왑 영역으로 옮겨지는 것을 스왑 아웃(swap-out), 스왑 영역에서 다시 메모리로 옮겨오는 것을 스왑 인(swap-in)이라 한다.

메모리 할당

메모리의 빈 공간에 프로세스를 연속적으로 할당하는 방식에는 세 가지가 있다. 각 방식의 특징과 연속적인 메모리 할당이 어떤 문제점을 가져오는지 알아보자.


메모리 할당 방식

최초 적합(First Fit)

최초 적합 방식은 메모리 내 빈 공간을 순서대로 탐색하다가 적재할 수 있는 공간을 발견했을 때 즉시 메모리를 할당하는 방식이다. 검색을 최소화할 수 있으므로 빠른 할당이 가능하다는 장점이 있다.


최적 적합(Best Fit)

최적 적합 방식은 메모리 내 빈 공간을 모두 검색한 후, 프로세스를 적재할 수 있는 공간들 중 가장 작은 곳에 배치하는 방식이다. 예를 들어, 적재할 프로세스의 크기가 30MB라고 가정했을 때 남은 빈 공간이 각 30MB, 20MB, 40MB라면 이 중 가장 작은 20MB 메모리 공간에 프로세스를 할당한다.


최악 적합(Worst Fit)

최악 적합 방식은 최적 적합과 반대로 메모리 공간 중 가장 큰 곳에 프로세스를 배치하는 방식이다. 앞선 예시에 따르면 가장 큰 메모리 공간은 40MB이므로 프로세스는 해당 공간에 할당된다.


연속적으로 메모리를 할당하는 방식은 어떻게 보면 당연하게 생각될 수도 있지만 실은 효율적인 메모리 사용 방법이 아니다.

외부 단편화

위 그림에서처럼 프로세스 A, B, C, D가 메모리에 적재된 상황에서 각 10MB, 20MB 공간을 차지하는 프로세스 A, C가 스왑 아웃되어 메모리를 떠났다고 가정해 보자. 그러면 총 30MB의 빈 공간이 생긴다. 이때 30MB 크기의 새로운 프로세스 E를 메모리에 적재할 수 있을까?

답은 NO다. 총합이 30MB라 할지라도 어느 한 곳도 온전한 30MB의 공간이 아니기 때문에 프로세스를 배치할 수 없는 것이다. 이렇게 프로세스를 할당하기 어려운 작은 빈 공간들로 인해 낭비되는 현상을 외부 단편화(External Fragmentation)라고 한다.


효율적으로 메모리를 사용하기 위해서는 이러한 외부 단편화 문제를 반드시 해결해야만 하는데, 사용할 수 있는 대표적인 방법 중 하나가 메모리 압축(compaction)이다. 압축을 하면 메모리 내 프로세스들을 적절하게 재배치시켜 이곳저곳 흩어져 있는 빈 공간을 하나의 큰 공간으로 만들 수 있다.

그러나 압축 방식 역시 단점은 존재한다. 빈 공간들을 하나로 모으는 과정을 시행하는 동안 시스템은 하던 일을 중지해야 하며, 메모리에 있는 내용을 옮기는 작업은 많은 오버헤드를 발생시킬 수 있고 오버헤드를 최소화하면서 압축하는 방법에 대한 명확한 해답이 존재하지 않는다는 것이다.


가상 메모리 관리

연속 메모리 할당 방식은 외부 단편화 문제도 있지만 물리적인 메모리 크기보다 더 큰 프로세스를 실행할 수 없다는 단점도 존재한다. 이를 해결하기 위해 실행하려는 프로그램의 일부만 메모리에 적재해 실제 물리 메모리 크기보다 큰 프로세스를 실행할 수 있게 하는 가상 메모리(Virtual Memory) 기술을 사용할 수 있다.

페이징(Paging)

가상 메모리 관리 기법으로 가장 많이 쓰이는 방법은 페이징이다. 페이징은 메모리 물리 주소 공간을 프레임(frame) 단위로 자르고 프로세스 논리 주소 공간을 페이지(page) 단위로 잘라 페이지를 프레임에 할당하는 방법이다. 이 방법을 사용하면 한 프로세스를 실행하기 위해 프로세스 전체가 메모리에 적재될 필요 없이, 실행에 필요한 일부 페이지만을 메모리에 적재하고 필요하지 않은 부분은 보조기억장치에 남길 수 있다. 그래서 물리 메모리 공간보다 더 큰 프로세스를 실행할 수 있게 되는 것이다.

요구 페이징(Demand Paging)

프로세스들이 한정된 메모리를 효율적으로 이용하기 위해서는 기존 메모리에 적재된 불필요한 페이지는 선별하여 보조기억장치로 보내고 프로세스에 적절한 페이지를 할당할 수 있게 해야 하는데, 여기서 필요한 페이지만을 골라 메모리에 적재하는 기법을 요구 페이징이라고 한다.

요구 페이징 과정

  1. CPU가 특정 페이지에 접근하는 명령어 실행
  2. 해당 페이지가 현재 메모리에 있을 경우, 페이지가 적재된 프레임에 CPU 접근
  3. 해당 페이지가 현재 메모리에 없을 경우, 페이지 폴트 발생
  4. 페이지 폴트를 처리하기 위해 해당 페이지를 메모리로 적재
  5. 반복

어떤 페이지도 메모리에 적재하지 않은 채 실행하는 것을 순수 요구 페이징(Pure Demand Paging) 기법이라고 한다. 순수 요구 페이징은 프로세스 첫 명령어 실행부터 페이지 폴트가 일어나며 페이지가 어느 정도 적재된 이후부터는 페이지 폴트 발생 빈도가 떨어진다.

페이지 교체 알고리즘

실행에 필요한 페이지를 적재하기 위해 메모리에 적재된 페이지를 보조기억장치로 내보내는 과정에서 내보낼 페이지를 결정하는 방법을 페이지 교체 알고리즘이라고 한다. 기본적으로 페이지 폴트가 적게 일어나는 알고리즘이 좋은 알고리즘이라고 평가되며, 페이지 폴트 횟수는 페이지 참조열(page reference string)을 통해 확인할 수 있다.


페이지 참조열(page reference string)

1 1 3 3 3 2 2 5 5
CPU가 위와 같은 순서로 페이지에 접근했다고 가정했을 때, 페이지 참조열은 연속된 페이지를 생략한 열인 1 3 2 5가 된다.


FIFO 페이지 교체 알고리즘(First-In First-Out Page Replacement Algorithm)

FIFO 페이지 교체 알고리즘은 메모리에 먼저 적재된 순서대로 교체되는 방식이다.

FIFO 페이지 교체 알고리즘

페이지 참조열이 위 그림과 같을 때 페이지 폴트가 발생한 횟수, 즉, 중복되지 않는 페이지가 교체되는 횟수는 7번이다.


최적 페이지 교체 알고리즘(Optimal Page Replacement Algorithm)

최적 페이지 교체 알고리즘은 앞으로의 사용 빈도가 낮은 페이지 순서대로 교체하는 것으로, 타 교체 알고리즘에 비해 페이지 폴트 발생 빈도가 가장 낮다.

최적 페이지 교체 알고리즘

이론상 최적 페이지 교체 알고리즘이 알고리즘 중에서 가장 활용 빈도가 높을 것 같지만 현실에서 오랫동안 사용되지 않을 페이지를 예측하기에는 사실상 불가능에 가까워 실제로 운영체제에서는 사용되지 않는다. 대신에 다른 페이지 교체 알고리즘의 이론상 성능을 평가하기 위한 지표로써 최적 페이지 교체 알고리즘의 페이지 폴트 횟수를 하한선으로 간주하고 다른 알고리즘의 페이지 폴트 횟수를 비교해 알고리즘을 선택하도록 돕는다.


LRU 페이지 교체 알고리즘(LRU; Least Recently Used Page Replacement Algorithm)

가장 오랫동안 사용되지 ‘않을’ 페이지를 알아내기는 어렵지만 오랫동안 사용되지 ‘않은’ 페이지를 알아내는 것은 쉽다. LRU 페이지 교체 알고리즘은 최근에 사용되지 않은 페이지를 토대로 앞으로도 사용되지 않을 것이라 예상하여 교체 페이지를 결정하는 알고리즘이다.

LRU 페이지 교체 알고리즘

LRU는 마지막으로 사용된 페이지 시간을 바탕으로 최근에 가장 사용이 적었던 페이지 순서대로 교체한다.

스래싱(Thrashing)

페이지 폴트 빈도수를 결정하는 것은 페이지 교체 알고리즘만 있는 것은 아니다. 프로세스가 사용할 수 있는 프레임 수에 따라서도 페이지 폴트 발생 빈도가 달라지는데, 당연히 프레임 수가 적을수록 페이지 수용 공간이 적다는 의미이므로 페이지 폴트가 자주 발생한다.

CPU가 쉴 새 없이 프로세스를 실행해도 모자랄 판에 페이징에 시간을 너무 쏟게 되면 CPU 이용률은 그에 비례하여 낮아질 수밖에 없다. 이처럼 프로세스가 실제 실행되는 시간보다 페이지 교체에 많은 시간을 소요하여 성능이 저해되는 것을 스래싱이라고 한다.


파일 시스템

파일(File)과 디렉터리(Directory)

파일은 보조기억장치에 저장된 관련 정보의 집합을 의미한다. 모든 파일에는 이름, 파일을 실행하기 위한 정보, 속성과 같은 부가 정보가 포함되어 있다.

파일

파일 속성 중 유형(종류)은 운영체제가 인식하는 파일 종류를 나타낸다. 파일 이름 뒤에 붙는 확장자(extension)를 확인하면 어떤 목적을 가진 파일인지 쉽게 알 수 있다. ex) .png, .exe 등


디렉터리는 흔히들 알고 있는 폴더이다. 디렉터리 안에 또 다른 디렉터리나 파일 등을 포함할 수 있으며 이를 트리 구조 디렉터리(tree-structured directory)라고 표현한다. 최상위 디렉터리는 보통 루트(root)라고 부르며 디렉터리 내 파일을 찾기 위해 우리는 경로(path)를 이용한다.

경로에는 루트 디렉터리에서부터 파일이 위치한 곳을 나타내는 고유 경로인 절대 경로(absolute path)와 현재 파일이 위치한 디렉터리에서 파일이 위치한 곳까지의 경로를 나타내는 상대 경로(relative path)가 있다.

경로

디렉터리, 파일 구조가 위와 같을 때, file의 절대 경로와 상대 경로는 다음과 같다.

절대 경로: /home/study/file.pdf
상대 경로: /study/file.pdf

파티셔닝(Partitioning)과 포매팅(Formatting)

새 하드 디스크나 SSD를 사용한다고 해보자. 한 번도 사용된 적이 없는 보조기억장치는 파일을 생성하거나 저장하기 전에 두 가지 작업을 거쳐야 한다.

먼저, 저장장치를 논리적인 단위로 구획하는 파티셔닝 작업이다. 파일을 나누어 저장하기 위해서 파티셔닝 작업은 반드시 필요하며 여기서 나누어진 영역 하나하나를 파티션(partition)이라고 한다.

그 후, 어떤 방식으로 파일을 저장하고 관리할 것인지 결정하고, 새 데이터를 작성할 준비를 하는 포매팅(formatting) 작업이 필요하다. 포매팅 작업을 할 때 어떤 종류의 파일 시스템을 사용할지 결정할 수 있다.

파일 할당

운영체제는 디렉터리와 파일을 블록(block) 단위로 읽고 쓰며, 하나의 파일이 저장될 때는 여러 개의 블록에 걸쳐 저장된다. 어떻게 파일이 저장되고 관리되는지 알아보자.


연속 할당(Contiguous Allocation)

연속 할당

연속 할당은 말 그대로 연속적인 블록에 파일을 할당하는 방식이다. 연속 할당된 파일에 접근하기 위해서는 파일의 첫 번째 블록 주소와 블록 단위길이만 알면 된다.

구현이 단순하다는 장점이 있으나 외부 단편화가 발생한다는 치명적인 단점도 존재한다.


연결 할당(Linked Allocation)

연결 할당

연결 할당은 연속 할당의 단점을 해결하기 위해서 파일을 저장한 블록 일부에 다음 블록의 주소를 저장하여 할당한다. 데이터를 연결 리스트로 관리하기에 파일이 여러 블록에 흩어져 있어도 관리하기가 편하다.

그러나 첫 번째 블록부터 순서대로 읽어야 하기 때문에 임의 접근(random access) 속도가 느리다는 것과 블록에 오류 발생 시 해당 블록 이후 블록은 접근할 수 없다는 단점이 존재한다.


색인 할당(Indexed Allocation)

색인 할당

색인 할당은 파일의 모든 블록 주소를 색인 블록이라는 블록에 모아서 관리하는 방식이다. 연결 할당과 달리 파일 내 임의의 위치에 접근하기 쉽다.


기본 미션

p.400

1. 메모리 할당 방식에 대한 설명으로 올바른 것을 다음 보기에서 찾아 써 보세요.

[보기] 최초 적합, 최적 적합, 최악 적합

  • ( 1 ): 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식
  • ( 2 ): 프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식
  • ( 3 ): 프로세스가 적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식

정답:

(1) 최초 적합
(2) 최악 적합
(3) 최적 적합


선택 미션: 프로세스가 사용할 수 있는 프레임이 3개 있고, 페이지 참조열이 ‘2313523423’일 때 LRU 페이지 교체 알고리즘으로 이 페이지를 참조한다면 몇 번의 페이지 폴트가 발생하는가?

LRU 페이지 교체 알고리즘은 오랫동안 사용하지 않은 페이지 순서대로 교체하는 알고리즘이다. 페이지 참조열이 2313523423인 경우,

LRU 페이지 교체 알고리즘

위 그림에 따라 6번의 페이지 폴트가 발생하게 된다. 페이지가 초기에 적재될 때 발생하는 페이지 폴트의 횟수를 카운팅하지 않으면 3번의 페이지 폴트가 발생한다.


References

book - 혼자 공부하는 컴퓨터 구조 + 운영체제

Table Of Contents
nxnaxx blog © 2022-2023 Powered By Gatsby.