* '혼자서 공부하는' 컴퓨터구조+운영체제 이지만, 혼자보단 여럿이하면 더 좋으니 혼공 학습단 13기와 함께합니다 :)
[6주차 학습목록] (๑╹o╹)✎
Ch14. 가상 메모리
01. 연속 메모리 할당
02. 연속 메모리 할당
03. 페이지 교체와 프레임 할당
Ch15. 파일 시스템
01. 파일과 디렉터리
02. 파일 시스템
Ch14. 가상 메모리
14-1. 연속 메모리 할당
프로세스에 연속적인 메모리 공간 할당하는 방식을 연속 메모리 할당 방식이라고 한다.
스와핑
메모리에서 실행되지 않는, 사용되지 않는 일부 프로세스들을 임시 보조기억장치 일부 영역으로 내보내고, 실행할 프로세스를 메모리로 들여보내는 메모리 관리 기법을 스와핑(swapping)이라고 한다.
이런 프로세스들이 쫓겨나는 보조기억장치의 일부 영역을 스왑 영역(swap space)이라고 한다.
그리고 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것을 스왑 아웃(swap-out)이라고 하고,
그와 반대로 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨 지는 것을 스왑 인(swap-in)이라고 한다.
* 스와핑을 이용하면 프로세스들이 요구하는 메모리 주소 공간의 크기가 실제 메모리 크기보다 더 큰 경우에도 프로세스들을 동시에 실행할 수가 있다고 한다! :0
* 스왑 영역 확인하는 명령어(in 유닉스, 리눅스, macOS)
-- free, top 명령어 등을 사용하면 스왑 영역의 크기를 확인 할 수 있다.
[root@localhost ~]# free -h
메모리 할당
비어 있는 메모리 공간에 프로세스를 연속적으로 할당하는 방식에는 대표적으로
최초 적합, 최적 적합, 최악 적합 3가지 방식이 있다.
1. 최초 적합(first fit) 방식
- 운영체제가 메모리 내의 빈 공간을 순서대로 검색하다가 적재할 수 있는 공간을 발견하면 그 공간에 프로세스를 배치하는 방식 즉, 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식
- 프로세스가 적재될 수 있는 공간을 발견하는 즉시 메모리 할당 -> 검색 최소화 -> 빠른 할당 가능
2. 최적 적합(best fit) 방식
- 운영체제가 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 작은 공간에 프로세스를 배치하는 방식
- 적재하려고 하는 프로세스의 크기에 맞게 가장 fit하게 담을 수 있는 빈 공간에 적재하는 것!
3. 최악(worst fit) 적합
- 운영체제가 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 큰 공간에 프로세스를 배치하는 방식
외부 단편화
연속 메모리 할당은 얼핏 당연하게 느껴질 수 있지만, 이것은 외부 단편화(external fragmentation)라는 문제를 가지고 있기에 효율적으로 메모리를 사용하는 방법은 아니다.
프로세스들이 메모리에 연속적으로 할당되는 환경에선 프로세스들이 실행되고 종료되기를 반복하며 메모리 사이 사이에 빈 공간들이 생긴다. 프로세스 바깥에 생기는 이러한 빈 공간들은 분명 빈 공간이다.
하지만, 그 공간보다 더 큰 프로세스를 적재하기에는 어려운 상황이 생기다보니, 이는 결국 메모리 낭비로 이어진다.
이렇게 프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해 메모리가 낭비되는 현상을 외부 단편화라고 한다.
이러한 외부 단편화 문제를 해결할 수 있는 대표적인 방법으로는 메모리를 압축(compaction)하는 방법이 있다.
압축이란, 여기저기 흩어져 있는 빈 공간들을 하나로 모으는 방식을 말한다. 이는 메모리 내에 저장된 프로세스를 적당히 재배치 시켜서 여기저기 있는 작은 빈 공간들을 하나씩 큰 빈 공간으로 만든다.
하지만, 이 압축 방식에는 작은 빈 공간들을 하나로 모으는 동안 시스템은 하던 일을 중지해야 하는 것, 메모리에 있는 내용을 옮기는 작업은 많은 오버헤드를 발생시키는 것 등과 같은 여러가지의 단점이 있다.
그래서 압축 방법 외에 또 다른 외부 단편화를 해결할 수 있는 방법인 '페이징 기법'이 등장했다!
14-2. 페이징을 통한 가상 메모리 관리
먼저, 가상 메모리를 알아보자.
가상 메모리(virtual memory)란, 실행하려는 프로그램 일부만 메모리에 적재해서 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술이다.
이 가상 메모리를 관리하는 기법에는 크게 1) 페이징과 2) 세그멘테이션이 있다.
* 이 둘 중 페이징 기법이 요즘 현대 대부분의 운영체제가 사용하는 기법이라고 한다.
페이징(paging)
- 메모리의 물리 주소 공간을 프레임 단위로 자르고, 프로세스의 논리 주소 공간을 페이지 단위로 자른 뒤 각 페이지를 프레임에 할당하는 가상 메모리 관리 기법
* 물리 주소 공간을 자르는 단위 : 프레임(frame) / 논리 주소 공간을 자르는 단위 : 페이지(page)
메모리의 빈 공간들과 적재하려는 프로세스를 같은 조각 단위들로 일정하게 잘라서 프로세스의 각 조각들을 메모리 빈 공간에 불연속적으로 적재를 시키는 것이 페이징이라고 생각해본다,,
앞서 배운 스와핑! 그 스와핑을 이 페이징 기법에서도 사용할 수가 있다.
페이징 기법을 사용하는 시스템에서는 프로세스 전체가 아닌 페이지 단위로 스왑 아웃과 스왑 인이 이루어진다.
페이징 시스템에서의 스왑 아웃은 페이지 아웃(page out), 스왑 인은 페이지 인(page in)이라고 부른다.
- 페이지 아웃(page out) : 메모리에 적재될 필요가 없는 페이지들 --> 보조기억장치
- 페이지 인(page in) : 메모리 <-- 실행에 필요한 페이지들
페이지 테이블
이렇게 좋은 점만 있을 줄 알았던 페이징 기법에서도 어려움은 존재한다. 프로세스를 이루는 페이지가 메모리에 불연속적으로 배치되어 있어서 실행 명령을 내리는 CPU 입장에선 '다음 명령을 내릴 명령어의 위치'를 찾기가 어렵다.
이 점을 해결하기 위해 페이징 시스템은 불연속적으로 배치되어 있는 물리 주소(실제 메모리 내의 주소)는 어떻게 할 수가 없지만, 논리 주소(CPU가 바라보는 주소)는 연속적으로 배치되도록 만들면서 물리 주소와 논리 주소를 서로 매칭시킬 수 있는 이정표인 페이지 테이블(page table)을 이용한다.
프로세스마다 각자의 페이지 테이블이 존재한다. 그 페이지 테이블은 아래와 같이 표현되는데, 이 테이블의 페이지 번호를 이용해서 페이지가 적재된 프레임을 찾을 수가 있게 된다.
* 페이징은 외부 단편화 문제를 해결할 수 있다고 했다. 하지만, 반대로 내부 단편화(internal fragmentation)라는 문제를 만들어 낼 수가 있다. 그러면 이 내부 단편화란 무엇인가?
예를 들어 페이지의 크기가 10KB라고 하고 프로세스의 크기가 108KB라고 하자.
즉, 프로세스를 자르는 단위가 10KB인 것이고, 108KB 프로세스를 10KB 단위로 자르면 10KB 단위 딱 맞도록 자른게 10개, 그리고 8KB가 1개가 된다. 이 8KB는 페이지 10KB에 들어는 가지만 그 페이지 안에 2KB라는 빈 공간이 남을 것이다.
이렇게 페이지 내에 남는 공간으로 인해 메모리 낭비가 되는 것을 내부 단편화라고 한다.
* 이러한 내부 단편화는 외부 단편화에 비해 작은 크기로 발생하는 편인 것 같다,,
* 페이지 크기 확인하는 리눅스 명령어
[root@localhosst~]# getconf PAGESIZE
- PTBR(: Page Table Base Register)
프로세스마다 각자의 페이지 테이블이 있고, 그 페이지 테이블들은 메모리에 적재되어 있다.
이러한 각 프로세스마다의 페이지 테이블이 적재된 주소를 가리키는 레지스터가 CPU 내에 있는데,
그 레지스터를 페이지 테이블 베이스 레지스터(PTBR: Page Table Base Register)라고 부른다.
이렇게 페이지 테이블을 메모리에 두게 되면 메모리 접근 시간이 두 배로 늘어나는 단점이 있다.
CPU는 메모리에 있는 페이지 테이블에 한 번 접근하고, 그 테이블을 통해서 프레임에 한 번 더 접근하여 총 두번의 메모리 접근이 필요하게 된다.
- TLB(: Translation Lookaside Buffer)
이러한 접근 시간이 두 배로 늘어나는 문제를 해결하기 위해
CPU 옆에 TLB(Translation Lookaside Buffer)라는 페이지 테이블의 캐시 메모리가 있다.
이 TLB에는 페이지 테이블의 일부 내용을 저장되어 있는데, 참조 지역성 근거로 최근에 사용된 페이지 위주로 저장이 되어 있다.
- TLB 히트(TLB hit) : CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있는 경우
- TLB 미스(TLB miss) : CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 없는 경우
--> 페이지 테이블에 한번 더 접근해야 한다.
페이징에서의 주소 변환
하나의 페이지 또는 프레임은 여러 주소를 포함하고 있기에 특정 주소에 접근하기 위해선
아래의 2가지 정보가 필요하다.
1) 어떤 페이지(프레임)에 접근하고자 하는지,
2) 접근하고자 하는 주소가 그 페이지(프레임)에서 얼마나 떨어져 있는지
그러다 보니 페이징 시스템에선 모든 논리 주소가 기본적으로 페이지 번호(page number)와 변위(offset)로 이루어져 있다. 따라서, 논리 주소 <페이지 번호, 변위>는 페이지 테이블을 통해서 물리 주소 <프레임 번호, 변위>로 변환이 된다.
- 페이지 번호 : 접근하려는 페이지 번호
- 변위 : 접근하려는 주소가 프레임의 시작 번지에서 얼만큼 떨어져 있는지에 대한 값
페이지 테이블 엔트리(PTE : Page Table Entry)
- 페이지 테이블 엔트리 : 페이지 테이블의 각 행
* 비유하자면, DB 테이블에서 각 컬럼이 아닌 각 행을 생각하면 된다,, ( •̀֊•́ ) ̖́-
이 페이지 테이블 엔트리에 담겨있는 정보에는 페이지 번호, 프레임 번호뿐만 아니라 그외 유효 비트, 보호 비트, 참조 비트, 수정 비트와 같은 다른 중요 정보들 또한 담겨있다.
유효 비트(valid bit)
- 해당 페이지가 메모리에 적재되어 있는지의 여부를 판단하는 비트
- 1인 경우 : 페이지가 메모리에 적재되어 있는 것을 의미
- 0인 경우 : 페이지가 메모리에 적재되어 있지 않는 것을 의미 (= 보조기억장치에 적재되어 있음을 의미)
* CPU가 유효 비트가 0인 페이지에 접근하려고 하면, 페이지 폴트(page fault)라는 예외(Exception)가 발생한다!!
보호 비트(protection bit)
- 페이지에 접근할 권한을 제한하여 페이지를 보호하는 비트
- 이 비트를 통해 해당 페이지가 읽고 쓰기가 모두 가능한 페이지인지, 읽기만 가능한 페이지인지를 알 수 있다.
- 1인 경우 : 읽기, 쓰기가 모두 가능한 페이지임을 의미
- 0인 경우 : 읽기 전용 페이지임을 의미
* 읽기(Read) - r / 쓰기(Write) - w / 실행(eXecute) - x 로 3개의 비트의 조합으로 더 상세하게 구현할 수도 있다!
의미 | 보호 비트 | ||
r | w | x | |
읽기만 가능한 페이지 | 1 | 0 | 0 |
쓰기만 가능한 페이지 | 0 | 1 | 0 |
읽기/실행이 가능한 페이지 | 1 | 0 | 1 |
읽기/쓰기/실행이 가능한 페이지 | 1 | 1 | 1 |
참조 비트(reference bit)
- 페이지에 접근한 적이 있는지의 여부를 판단하는 비트
- 1인 경우 : 접근한 적 있는 페이지임을 의미
- 0인 경우 : 접근한 적 없는 페이지임을 의미
수정 비트(modified bit)
- 페이지에 데이터를 쓴 적이 있는지 없는지의 여부를 판단하는 비트
- 1인 경우 : 수정된 적 있는 페이지임을 의미
- 0인 경우 : 수정된 적 없는 페이지임을 의미
- 있어야 하는 이유?
: 페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야 하는지, 안 해도 되는지를 판단하기 위해 존재한다.
* 알면 좋은 점
[ 페이징의 이점 - 쓰기 시 복사 ]
페이징의 이점은 외부 단편화 문제를 해결한다는 점 외에도 다양하지만 그 중 대표적인 점은 프로세스 간 페이지를 공유할 수 있다는 점이다. 그 대표적인 예시가 쓰기 시 복사(copy on write)이다.
앞서 한번 얘기가 나왔던 fork라는 것을 기억,,하시는지요,,? (feat.10장 멀티프로세스,,)
프로세스를 fork하여 동일한 프로세스 두 개가 복제되면 코드 및 데이터 영역을 비롯한 모든 자원이 복제가 되어서 메모리에 적재된다. 유닉스 or 리눅스 같은 운영체제에서 이 fork 시스템 호출을 하면 부모 프로세스의 복사본이 자식 프로세스로 만들어진다. 이는 부모 프로세스의 메모리 영역이 다른 영역에 자식 프로세스로서 복제가 되고, 각 프로세스의 페이지 테이블은 자신의 고유한 페이지가 할당된 프레임을 가리키게 되는데, 이 작업은 프로세스의 생성 시간을 늦추는 것뿐만 아니라 불필요한 메모리 낭비의 문제들을 야기한다.
반면에 쓰기 시 복사는 부모 프로세스와 동일한 자식 프로세스가 생성이 되면, 자식 프로세스로 하여금 부모 프로세스와 동일한 프레임을 가리킨다. 따라서, 부모 프로세스의 메모리 공간을 복사하지 않아도 동일한 코드 및 데이터 영역을 가리킬 수가 있다. 그래서 만약 부모와 자식 프로세스가 쓰기가 아닌 그저 읽기 작업만 한다면 그냥 메모리 복제 없이 그저 읽기 작업을 수행할 수가 있게 된다.
근데, 만일 읽기 작업뿐만 아니라 쓰기 작업 등을 실행해야 한다면,,,?
프로세스 간에는 자원을 공유하지 않는다고 했으므로 부모 혹은 자식 프로세스 둘 중 하나라도 페이지에 쓰기 작업을 하는 순간 해당 페이지가 별도의 공간으로 복제가 된다. 그리고 각 프로세스는 자신의 고유한 페이지가 할당된 프레임을 가리키게 된다. 이것을 바로 '쓰기 시 복사'라고 한다!
(즉, 읽기만 하는 경우에는 메모리 복제 없이 가능한데 쓰기를 하려는 순간 페이지를 복사하여 사용하는 것이다!)
--> 이를 통해 프로세스의 생성 시간을 줄이는 것뿐만 아니라 메모리 공간 절약도 가능하게 된다.
Ch14-3. 페이지 교체와 프레임 할당
요구 페이징(demand paging)
- 요구 페이징 : 페이지가 필요할 때만 메모리에 적재하는 기법
요구 페이징 시스템이 안정적으로 작동하려면 페이지 교체와, 프레임 할당 이 2가지를 해결해야 한다.
요구 페이징 기법으로 페이지들을 적재하다 보면 언젠가 메모리가 가득 차게 되는데, 이러한 메모리에 적재된 많고 많은 페이지 중 어떤 페이지를 내보내는 것이 최선인지 결정하는 방법을 페이지 교체 알고리즘이라고 한다.
페이지 교체 알고리즘
페이지 교체 알고리즘을 제대로 이해하기 전에 먼저 페이지 폴트 횟수를 알아야 한다.
이 페이지 폴트 횟수는 페이지 참조열(page reference string)을 통해 알 수가 있다.
페이지 참조열이란, CPU가 참조하는 참조 페이지들 중 연속된 페이지를 생략한 페이지를 의미한다.
중복된 페이지를 참조하는 행위는 페이지 폴트를 발생시키지 않기 때문에 연속된 페이지를 생략하는 것입니다.
페이지 교체 알고리즘을 평가할 때 유의깊게 생각해야 할 점은 페이지 폴트의 발생 횟수이기에 페이지 폴트가 일어나지 않을 연속된 페이지에 대한 참조는 고려하지 않는다. 이 페이지 교체 알고리즘의 대표적인 알고리즘을 알아보자.
FIFO 페이지 교체 알고리즘(First-In First-Out Page Replacement Algorithm)
- 적재된 페이지부터 순서대로 교체하는 알고리즘
최적 페이지 교체 알고리즘(optimal page replacement algorithm)
- 앞으로의 사용 빈도수가 가장 낮은 페이지를 교체하는 알고리즘
- 가장 낮은 페이지 폴트율을 보장
LRU 페이지 교체 알고리즘(LRU: Least Recently Used Page Replacement Algorithm)
- 가장 오랫동안 사용하지 않은 페이지를 교체하는 알고리즘
스래싱과 프레임 할당
페이지 폴트가 자주 발생하는 이유에는 나쁜 페이지 교체 알고리즘만 있는 것은 아니다.
프로세스 사용할 수 있는 프레임 수가 적어도 페이지 폴트는 자주 발생하고, 반대로 프레임 수가 많으면 일반적으로 페이지 폴트 빈도는 감소한다. 이처럼 프레임이 부족하면 CPU는 페이지 폴트가 자주 발생할 수밖에 없다. 이렇게 되면 실행의 맥이 딱 끊기고, CPU의 이용률도 떨어지게 된다. 이처럼 프로세스가 실제 실행되는 시간보다 페이징에 더 많은 시간을 소요하여 성능이 떨어지는 문제를 스래싱(thrashing)이라고 한다. 즉, 지나친 빈번한 페이지 교체로 인하여 CPU 이용률이 낮아지는 문제를 의미한다.
스래싱이 발생하는 근본적인 원인은 각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않았기 때문이다. 따라서 운영체제는 각 프로세스들이 무리 없이 실행하기 위한 최소한의 프레임 수를 파악하고 프로세스들에 적절한 수만큼 프레임을 할당해 줄 수 있어야 한다.
이 프레임을 할당해주는 방식에는 크게 2가지로 볼 수 있다.
- 균등 할당(equal allocation) : 모든 프로세스에 균등하게 프레임을 배분하는 방식
- 비례 할당(proportional allocation) : 프로세스의 크기에 비례하게 프레임을 배분하는 방식
- 프로세스 실행하는 과정에서 배분할 프레임을 결정하는 방식에는 다음과 같이 2가지 방식이 있다.
1) 작업 집합 모델(working set model) 기반 프레임 할당
: * 작업 집합의 크기만큼만 프레임을 할당하는 방식
* 작업 집합(working set) : 실행 중인 프로세스가 일정 시간 동안 참조한 페이지의 집합
2) 페이지 폴트율(PFF:Page-Fault Frequency) 기반 프레임 할당
: 페이지 폴트율에 상한선과 하한선을 정하고, 그 내부 범위 안에서만 프레임을 할당하는 방식
Ch15. 파일 시스템
15-1. 파일과 디렉터리
우리는 일상적으로 컴퓨터를 이용할 때는 파일 단위로 이용한다.
파일
- 파일(file) : 하드 디스크나 SSD같은 보조기억장치에 저장된 관련 정보의 집합(의미 있고 관련 있는 정보를 모은 논리적 단위)
- 속성(attribute) or 메타데이터(metadata) : 파일의 이름과 파일을 실행하기 위한 정보, 파일 관련 부가 정보 등 파일의 부가 정보
파일의 속성에는 형식, 위치, 크기 등 다양한 정보가 있다.
파일 속성과 유형
운영체제마다 파일 속성은 조금씩 다르지만 대표적인 속성의 종류는 다음의 표와 같다.
속성 이름 | 의미 |
유형 | 운영체제가 인지하는 파일의 종류를 나타낸다. |
크기 | 파일의 현재 크기와 허용 가능한 최대 크기를 나타낸다. |
보호 | 어떤 사용자가 해당 파일을 읽고, 쓰고, 실행할 수 있는지를 나타낸다. |
생성 날짜 | 파일이 생성된 날짜를 나타낸다. |
마지막 접근 날짜 | 파일에 마지막으로 접근한 날짜를 나타낸다. |
마지막 수정 날짜 | 파일이 마지막으로 수정된 날짜를 나타낸다. |
생성자 | 파일을 생성한 사용자를 나타낸다. |
소유자 | 파일을 소유한 사용자를 나타낸다. |
위치 | 파일의 보조기억장치상의 현재 위치를 나타낸다. |
위의 속성 중 파일 유형은 운영체제가 인식하는 파일의 종류를 나타낸다.
파일의 유형을 알리기 위해 가장 많이 사용하는 방식은 파일 이름 뒤에 붙는 확장자(extension)를 이용하는 것이다.
파일 유형 | 대표적인 확장자 |
실행 파일 | 없는 경우, exe, com, bin |
목적 파일 | obj, o |
소스 코드 파일 | c, cpp, cc, java, asm, py |
워드 프로세서 파일 | xml, rtf, doc, docx |
라이브러리 파일 | lib, a, so, dll |
멀티미디어 파일 | mpeg, moc, mp3, mp4, avi |
백업/보관 파일 | rar, zip, tar |
파일을 다루는 모든 작업은 운영체제에 의해서 이루어진다. 운영체제는 다음과 같이 6가지의 파일 연산을 위한 시스템 호출을 제공한다.
1. 파일 생성 2. 파일 삭제 3. 파일 열기 4. 파일 닫기 5. 파일 읽기 6. 파일 쓰기
디렉터리
- 디렉터리(directory) : 파일들을 관리하기 위해 한 곳에 모아두는 곳(윈도우 운영체제에선 폴더라고 부른다.)
현재의 우리 대부분의 컴퓨터는 트리 구조 디렉터리(tree-structured directory)로 이루어져 있다.
이러한 트리 구조 디렉터리에서 최상위 디렉터리를 루트 디렉터리(root directory)라 부르고 슬래시(/)로 표현을 한다.
그러다 보니 자연스레 생긴 개념이 바로 경로(path)이다. 경로란 디렉터리를 이용해 파일 위치, 파일 이름을 특정 짓는 정보이다.
이 경로에는 절대 경로와 상대 경로가 있다.
- 절대 경로(absolute path) : 루트 디렉터리부터 시작하는 경로
- 상대 경로(relative path) : 현재 디렉터리부터 시작하는 경로
운영체제가 파일 연산을 위한 시스템 호출을 제공하는 것과 같이, 디렉터리 연산을 위한 시스템 호출도 제공한다.
디렉터리 연산에는 다음과 같이 5가지가 대표적으로 있다.
1. 디렉터리 생성 2. 디렉터리 삭제 3. 디렉터리 열기 4. 디렉터리 닫기 5. 디렉터리 읽기
15-2. 파일 시스템
파일 시스템에는 다양한 종류가 있고, 하나의 컴퓨터에서 여러 파일 시스템을 사용할 수가 있다.
이번에는 파일 시스템이 파일과 디렉터리를 보조기억장치에 어떻게 할당하고, 접근하는지에 관한 이론적인 내용을 알아보고 대표적인 파일 시스템인 FAT 파일 시스템과 유닉스 파일 시스템을 알아보자.
파티셔닝과 포매팅
- 파티셔닝(partitioning) : 저장 장치의 논리적인 영역을 구획하는 작업
하드디스크나 SSD처럼 용량이 큰 저장 장치를 하나 이상의 논리적인 단위로 구획하는 것이다. 그리고 이렇게 파티셔닝 작업을 통해서 나눠진 영역 하나하나를 파티션(partition)이라고 한다.
- 포매팅(formatting) : 파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지를 결정하고, 새로운 데이터를 쓸 준비를 하는 작업(흔히들, 우리가 생각하는 그 포맷이 맞다)
그러하다 보니 포매팅을 할 때 파일 시스템이 결정되고, 이렇게 포매팅까지 완료가 되어 파일 시스템을 설정했다면 파일과 디렉터리를 생성할 수 있게 된다.
파일 할당 방법
하드 디스크의 포매팅까지 잘 끝났다고 하면, 이제 이 저장 장치에 사용할 파일을 저장할 수가 있게 된다.
운영체제는 파일과 디렉터리를 블록(block) 단위로 읽고 쓴다.
운영체제는 하나 이상의 섹터를 블록이라는 단위로 묶은 뒤 블록 단위로 파일과 디렉터리를 관리한다.
이 블록에 우리가 사용하는 파일을 할당을 해야하는데 그 할당하는 방법은 다음과 같다.
- 파일 할당
1) 연속 할당(contiguous allocation)
- 파일이 저장 장치 내에서 연속적인 공간을 차지하도록 블록을 할당하는 방법
- 장점 : 그저 연속적으로 저장하는 방식으로 구현이 단순함
- 단점 : 외부 단편화를 야기함
2) 불연속 할당
2-1) 연결 할당(linked allocation)
- 각 블록 일부에 다음 블록 주소를 저장하여 각 블록이 다음 블록을 가리키는 형태로 할당하는 방법
- 장점 : 외부 단편화 문제를 해결함
- 단점 : (1) 반드시 첫번째 블록에서부터 하나씩 차례대로 읽어야 함(-> 임의 접근속도가 매우 느림)
(2) 하드웨어 고장이나 오류 발생 시 해당 블록 이후 블록은 접근할 수 없음
2-2) 색인 할당(index allocation)
- 파일의 모든 블록 주소를 색인 블록(index block)이라는 하나의 블록에 모아 관리하는 방법
파일 시스템 살펴보기
위에서 블록에 파일을 할당하는 방법 중 불연속 할당에서 연결할당을 기반으로 만든 파일 시스템은 FAT 파일 시스템이고, 색인 할당을 기반으로 만든 파일 시스템은 유닉스 파일 시스템이다.
USB 메모리, SD카드 등의 저용량 저장 장치에 사용되는 파일 시스템은 FAT 파일 시스템이고, 유닉스 계열 운영체제에서 사용되는 것은 유닉스 파일 시스템이다.
- FAT 파일 시스템
: * FAT를 이용하는 연결 할당 기반 파일 시스템
* 파일 할당 테이블(FAT:File Allocation Table): 각 블록에 포함된 다음 블록의 주소들을 한데 모아 관리하는 테이블
- 유닉스 파일 시스템
: * 색인 할당 기반 파일 시스템
* 색인 할당 : 색인 블록을 기반으로 파일의 데이터 블록들을 찾는 방식
(이때, 유닉스 파일 시스템에선 색인 블록을 i-node(=index-node)라고 부른다.)
[과제]
- 필수과제
01) 400p
01. 메모리 할당 방식에 대한 설명으로 올바른 것을 다음 보기에서 찾아 써 보시오.
[보기] 최초 적합, 최적 적합, 최악 적합
(1) : 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식
(2) : 프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식
(3) : 프로세스가 적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식
답)
(1) : 최초 적합
(2) : 최악 적합
(3) : 최적 적합
(1)은 설명에서부터 알 수 있듯, '최초'로 발견한 적재 가능한 빈 공간에 배치하는 방식인 최초 적합 방식이다.
(2)는 프로세스가 적재될 수 있는 가장 큰 공간에 배치한다는 말은 아래 예시를 들어 이해해보자.
20MB를 적재 시켜야하는 상황에서 적재가 가능한 빈 공간이 100MB/50MB/25MB가 있을 때 가장 큰 공간인 100MB에 배치시키는 방식이 (2)번 방식이다. 100MB에 20MB를 적재 시키고 남는 빈 공간은 80MB이나 되는데 이 공간은 어디 다른데에 사용을 할 수가 없게 된다. 따라서 이는 너무 비효율적이고 딱 fit하게 맞는 방법은 아니다.
이렇게 공간이 많이 남기도록 배치시키는건 최적이 아닌 최악의 방법이므로, 최악 적합 방식이 (2)가 된다.
(2)의 예시에 따라 (3)은 25MB에 적재를 시킬 것이다. 이 방법은 25MB 공간에 20MB를 적재시키니, 남는 공간은 5MB밖에 안되므로 가장 fit하게 잘 적재시킨다. 따라서 최악이 아닌 최적 적합 방식이 이에 해당한다.
'Studying > 혼공학습단' 카테고리의 다른 글
[혼공컴운]혼공학습단 13기 활동 회고록 (2) | 2025.02.23 |
---|---|
[혼공컴운]5주차_Ch.12 - 13 (0) | 2025.02.18 |
[혼공컴운]4주차_Ch.09 - 11 (0) | 2025.02.13 |
[혼공컴운] 3주차_Ch.06 - 08 (0) | 2025.02.03 |
[혼공컴운] 2주차_Ch.04 - 05 (0) | 2025.01.20 |