본문 바로가기

CS BASIC/운영체제(Operation System)

[운영체제] 파일 시스템(File System)

개요(Overview)

 

오늘은 파일 시스템(File System)에 대해서 알아보도록 하겠습니다.

지난 포스팅에서는 컴퓨터 메모리의 효율적을 사용을 위한 다양한 가상화 관리 기법에 대해 알아보았는데요.

오늘은 이러한 실행중인 프로그램이 주로 사용하는 주기억장치(=실기억장치)와 다르게,
주로 비교적 큰 규모의 데이터를 다루는 파일 시스템(File System)에 대해서 알아보도록 하겠습니다.

 


 

1. 파일(File)이란?

파일(File)이라는 개념은 현대 사회에서 누구나 알고 있는 보편적인 상식이 되었는데요.

이러한 파일에 대해서 개념적 정의를 굳이 해보자면, 이름을 가진 하나의 데이터의 집합을 의미합니다.

보통 디스크나 테이프와 같은 보조 기억장치에 저장되는 것이 특징이고,

이러한 파일은 보조 기억장치에서 이루어지는 다양한 데이터의 읽고 쓰는 작업의 기본 단위가 되기 때문에 무척 중요한 기준점이 됩니다.

 

1.1. 파일(File)과 항목(Item)

 

컴퓨터 시스템에서는 파일(File)을 단위로 할 때, 아래와 같은 작업이 가능합니다.

 

작업 설명
open 파일을 참조할 수 있도록 준비
close 파일일을 다 시 open 하기까지 그 파일을 참조할 수 없도록 막음
create 새로운 파일을 생성
destory 파일 제거
copy 파일을 복자
rename 파일의 이름을 변경
list 파일의 내용을 프린트하거나 화면에 디스플레이

 

 

그리고 이러한 파일을 단위로 하는 작업 외에도 파일의 내부를 구성하는 요소

이른바, 항목(item)을 단위로 이루어지는 작업은 아래와 같습니다.

 

작업 설명
read 데이터 항목을 파일로부터 읽어 들인다.
write 데이터 항목을 파일에 기록한다.
update 파일 내의 항목을 갱신한다.
insert 새로운 항목을 추가한다.
delete 데이터 항목을 파일에서 삭제한다.

 

파일 시스템은 보조 기억장치, 특히 디스크 장치를 관리하는 일과 관련이 깊습니다.

파일은 보통 데이터와 프로그램으로 구성되는데, 이것은 작성자에 의해 정의된 상호 관련이 있는 정보의 집합체로 정의됩니다.

즉, 파일이란 일반적으로 작성자와 사용자에 의해 그 의미가 정해지는 각종 데이터, 비트(bits), 바이트(Bytes), 행(Line) 또는 어떤 레코드(Record)의 연속체로 볼 수 있습니다.

 

하나의 파일은 이름(name), 형태(type), 작성자, 파일 길이(크기) 등의 자기 자신을 표현할 수 있는 데이터를 가질 수 있습니다.

따라서, 이를 바탕으로 정리하자면 파일 시스템은 다음과 같은 기능을 수행합니다.

 

①     사용자가 파일을 생성, 수정, 삭제할 수 있도록 해야 한다.

②     다른 사용자와 파일을 공동으로 사용할 수 있도록 적절한 제어 방법을 제공해야 한다.

③     파일 공유를 위하여 판독 액세스(read acess), 기록 엑세스(write access), 수행 엑세스(procedure access) 또는 이들을 적당히 조합한 것 등 여러 가지 엑세스 제어 방법을 제공한다.

④     사용자가 자신의 응용 분야에 적합한 형태로 파일을 구성할 수 있도록 한다.

⑤     본의 아닌 사고 또는 고의적인 정보나 손실이나 파괴를 방지하기 위하여 백업(backup)과 복구(recovery)를 위한 기능이 준비되어 있어야 한다.

⑥     사용자와 장치 간의 독립성(device independence)을 유지하기 위하여, 사용자가 물리적 장치 이름을 사용하는 대신 기호화된 이름(symbolic name)을 사용하여 해당 파일을 참조 할 수 있도록 한다.

⑦     정보가 안전하게 보호되고 비밀이 보장될 수 있도록 파일 시스템은 정보의 암호화와 해독을 할 수 있는 기능을 가져야 한다.

⑧     사용자가 이용하기에 편리하도록 인터페이스를 제공해야 한다.

⑨     파일 시스템은 사용자의 데이터와 이들 데이터에 관련된 작업에 대하여 물리적 구조가 아닌 논리적 구조를 제공한다. 따라서, 사용자는 데이터가 저장되어 잇는 특정 장치, 데이터의 기억된 형태, 데이터 전송 방식 등에 대해 관여할 필요가 없게 된다.

 


 

1.2. 블록화(blocking)와 버퍼링(buffering)

 

물리적 레코드(physical record)나 블록(block)은 기억 매체에 출력되거나 기억 매체로부터 입력되는 정보의 단위입니다.

논리적 레코드는 사용자 관점에서 취급되는 자료 집단의 단위입니다.

 

이러한 물리적 레코드와 논리적 레코드는 자기 테이프나 디스크 등의
어떤 경우에도 그 크기가 반드시 일대일로 대응되는 것은 아닙니다.

 

물리적 레코드가 단 하나의 논리적 레코드로 구성되어 있을 때,
이 파일을 블록화 되지 않은  레코드(unblocked record)로 구성된 파일
이라고 합니다.

 

반면에, 여러 개의 논리적 레코드가 하나의 물리적 레코드를 구성하면
이 파일을  블록화된 레코드(blocked record)로 구성된 파일
이라고 합니다.


고정 길이 레코드(fixed length record)
로 구성된 파일에서의 레코드 길이는 모두 같으며,
블록의 크기는 일반적으로 레코드 크기의 정수배
입니다.

 

반면에 가변길이 레코드(variable length record)로 구성된 파일에서의 레코드 길이는 다양하며
최대 크기는 블록의 크기와 동일할 수 있습니다.

 

버퍼링(buffering)이란, 주로 CPU의 레지스터와 주 기억장치 사이의 성능 차이로 인한 시간의 차이를 줄이기 위해 고안된 장치입니다. 이는 주로 소프트웨어로서 구현되는 편이며, 서로 다른 특징을 갖는 하드웨어 장치 간의 간극을 좁혀서 사용자에게 보다 안정적인 사용이 가능하도록 도와줍니다.

 

이러한 버퍼링(buffering) 기술로 인해서 다양한 계산 작업과 입출력 작업들을 병행으로 처리하는 것이 가능해졌습니다.

 

버퍼링 기술을 구현하기 위해서 실제로 주기억장치에 파일의 물리적 블록 여러 개를 동시에 기억할 수 있는 기억 공간을 다수 마련해 두는데, 이러한 기억 공간을 버퍼(buffer)라고 부릅니다.

 

버퍼를 사용한 가장 일반적인 기법은 이중 버퍼(double buffering) 기술로 두개의 버퍼를 사용하는 방식이고, 그 원리는 다음과 같습니다.

 

현재 수행중인 프로세스가 생성하는 레코드들을 두 퍼버 중의 하나에 기록합니다.

 첫 번째 버퍼가 전송되고 있는 동안에 수행중인 프로세스는 계쏙 레코드를 생성하여 다른 두 번째 버퍼에 기록합니다. 이 과정에서 두번째 버퍼가 첫번째 버퍼로의 전송이 끝내면, 비어 있는 두 번째 버퍼로의 전송을 시작합니다.

 이처럼 두 버퍼를 번갈아 이용함으로써 프로세스가 생성하는 레코드 들의 입출력 작업과 프로세스의 연산 작업을 병행으로 처리할 수 있게 되었습니다.

 

 


 

1.3. 파일의 구조

파일의 구조는 파일을 구성하는 레코드들이 보조 기억장치에 배치되는 방법으로,

이것은 파일을 액세스(접근)하는 방법과 밀접한 관계를 가집니다.

파일 시스템에서 파일의 구조에 널리 사용되는 구성 방식은 다음과 같이 총 4가지가 있습니다.

 

1) 순차 파일(Sequential File)

파일에 저장할 레코드를 물리적 순서에 따라 저장하는 방식입니다.

현재 레코드를 기준으로 다음 레코드는 물리적으로 현재의 레코드 바로 뒤에 저장되어 있음을 의미하는 방식을 말합니다.

이러한 방식은 본래 순차적으로 데이터를 저장하는 성질을 가진 자기 테이프에 저장된 파일에서 주로 사용되던 방식입니다.

디스크 파일도 순차적으로 구성될 수 있지만, 순차 디스크 파일의 레코드들까지 연속적으로 저장될 필요는 없습니다.

 

2) 직접 파일(Direct File)

레코드가 직접 액세스 기억 장치(DASD, Direct Access Storage Device)물리적 주소를 통해 직접 액세스 하는 방식입니다.

사용자는 특정 응용 작업에 적합한 순서로 레코드들을 직접 액세스 기억 장치에 저장하는 방식입니다.

파일을 이와 같은 방식으로 구성하기 위해서는 그 파일을 저장할 직접 엑세스 기억 장치의 상세한 물리적 구조에 대한 지식을 필요로 합니다.

직접 액세스 파일 내의 데이터를 찾는데 해싱(hashing) 기법에 활용되기도 합니다.

 

3) 색인 순차 파일(Indexed Sequential File)

레코드들은 각 레코드의 키 값에 따라 논리적 순서대로 배열되는 방식입니다.

파일 시스템에서 어떤 주요 레코드의 실제 주소가 저장된 색인(index)를 관리하는 방식으로, 색인 순차 레코드는 키 값 순서에 따라 순차적으로 액세스 될 수도 있고,

시스템에 의해 생성된 색인의 검색을 통해 직접 액세스 될 수도 있습니다.

색인 순차파일은 보통 디스크와 같은 직접 액세스 기억장치(DASD)에 저장되는 방식입니다.

 

4) 분할된 파일(Partioned File)

아래의 그림은 여러 개의 순차적인 서브 파일(Sequential Subfile)로 구성된 파일입니다.

이 파일을 구성하는 각각의 순차 서브 파일을 멤버(Member)라고 합니다. 각 멤버의 시작 주소는 파일의 디렉토리에 저장됩니다.

이 구성 방식은 프로그램의 라이브러리나 마이크로 라이브러리를 저장할 때 사용되는 방식입니다.

 

 

<fig 1.1.  분할형 파일>

 

 


 

1.4. 저장 공간의 할당

 

보조 기억 장치 내의 파일을 저장하기 위해서는 공간을 할당하고 회수하는 과정에 대한 문제가 존재합니다.

이는 이전에 다루었던 가변 분할 다중 프로그래밍 시스템에서 주 기억장치의 메모리 할당 문제와 비슷한 양상을 보입니다.

 

만일 파일을 연속적 기억 공간에 저장한다면 그 파일에 크기에 맞는 기억 공간을 확보해야 하며,

이와 같이 할당과 회수를 반복하는 과정에서 보조 기억장치 상의 공간이 비어 있지만 사용할 수 없는
여러 작은 공간들이 증가하는 단편화(fragmentaion) 현상이 발생
할 수 있습니다.

 

따라서, 이로 인해 한 파일에 할당해야 할 디스크의 공간이 충분하지 못해 분산된 블록으로 전체 기억공간에 흩어지는 현상이 발생할 수 있으며, 할당을 계속할 경우에는 파일이 너리 퍼져 있는 블록들에 분산되어 저장되는 문제가 발생할 수 있습니다.

 

이러한 문제를 해결하기 위해서는 주기적으로 집약(compaction)을 수행해야 합니다.

 

이렇게 함으로써 파일들은 해당 기억 장치 상의 인접한 공간을 차지하게 되고,
가용 공간(free area)의 집합은 한 개의 큰 블록이나 블록의 그룹이 되도록 결합될 것입니다.

 

집약을 수행하는 동안 파일 시스템은 잠깐 쉬게 되는 것이 보통이나, 어떤 시스템에서는 동적으로 수행하기도 합니다.

 

하나의 기억 장치에 수백 명의 사용자 파일이 담긴 시스템에서는 집약이 별 효과가 없을 수 있습니다.

 

그 이유는 매번 사용자가 프로세스에 입출력을 요구하면 그 때마다 사용자 프로세스는 다른 프로세스에게 중앙처리장치(CPU)를 넘겨주어야 하고, 그 프로세스는 멀리 떨어진 트랙에 대한 또 다른 입출력을 요구함으로써 찾고자 하는 데이터에 대한 연속적인 입출력 요구가 디스크상의 바로 인접한 것이더라도 전체적인 탐색 시간(seek time)이 길어지기 때문입니다.

 

따라서, 파일 시스템을 설계하는 데에는 사용자의 수, 각 사용자가 소유하는 평균 파일의 수, 사용자의 평균 사용 시간, 그 응용 시스템의 특성 등 사용자들에 관한 지식이 요구되며 이러한 요소들을 파일의 조직과 구조를 결정하는데 중요하게 차지하고 있습니다.

 


 

1.4.1. 연속 할당

 

연속 할당(continuous allocation) 기법에서는 파일이 보조 기억장치의 연속된 공간을 할당 받습니다.

그러므로, 사용자는 만들려고 하는 파일을 저장할 공간의 크기를 미리 정해주어야 합니다. 만약 보족 기억 장치의 남아 있는 공간들 중에서 그 크기보다 큰 연속된 공간이 없을 경우에는 그 파일은 생성될 수 없습니다.

연속할당 기법을 쓰면 논리적으로 연속된 레코드들이 물리적으로 서로 인접하여 보조 기억장치에 저장되므로, 논리적으로 연속된 레코드들이 전체 디스크에 퍼져있는 경우보다는 액세스 시간이 훨씬 감소됩니다 .

 

연속 할당 시스템에서는 디렉토리(Directory)에 각 파일의 시작 주소와 파일의 길이만을 유지하면 되므로, 파일 디렉토리를 구현하기 쉬운 편입니다.

 

그러나, 연속 할당 기법은 다음과 같은 몇 가지 단점이 존재합니다.

 

 

단편화(fragmentation)와 집약(Compaction)

파일이 디스크에서 제거되면 그 파일이 차지하고 있던 공간은 회수되어 다른 새로운 파일을 저장하는데 사용됩니다.

그러나 새로 생성되는 파일의 크기가 전에 저장되어 있는 파일의 크기와 같지 않은 경우가 대부분이므로 가변분할 다중프로그래밍 시스템에서 단편화와 같은 문제, 즉 보조 기억장치 내의 인접한 빈 공간을 합병(coalesce)해야 하는 문제가 발생할 수 있습니다.

그리고, 새로운 파일을 넣을 수 있을 만큼 큰 기억 장소를 만들기 위해 주기적으로 집약(compaction)을 해야 한다는 단점이 있습니다.

 

기억공간의 낭비와 이동에 따른 비용

파일의 크기가 시간이 지남에 따라 커지거나 작아지는 경우에도 역시 연속 할당이 어려운 경우에 해당됩니다.

 

왜냐하면 사용자는 파일의 크기가 증가할 경우에 대비하여 실제 파일이 필요한 크기 보다도 훨씬 큰 기억 공간을 요구하게 될 것이므로 기억 공간이 낭비되는 경우가 많습니다.

 

또한, 만약 할당한 공간보다 파일의 크기가 더 커지는 경우에는 그 파일을 저장할 수 있는 다른 공간으로 옮겨야 하는 불편함이 있습니다.

 


 

1.4.2. 불연속 할당

파일은 크기가 시간이 지남에 따라 커지거나 또는 작아지는 경향이 있습니다.

또한 사용자는 미리 어떤 파일이 크기를 얼마나 필요로 할지 예측하기 어렵습니다.

그렇기에 연속 할당 시스템은 일반적으로 보다 동적인 불연속 할당 시스템으로 교체되고 있습니다.

 

연속 할당을 대체할 불연속 할당 기법은 다음과 같이 크게 두 가지가 있습니다.

 

1) 연결 리스트를 이용한 불연속 할당

연결 리스트(Linked List)를 이용한 불연속 할당에서는 동일 파일에 속해 있는 섹터(Sector)들이 서로 연결 리스트의 형태를 취하면서 다른 것과의 연결을 위한 포인터를 가지고 디스크 전체에 분산시킵니다.

디렉토리에는 처음 해당 파일이 시작하는 시작 주소 및 마지막 주소에 대한 포인터가 있습니다.

 

또한, 가용공간 리스트(Free Space List)를 통해서 보조 기억장치 상에서 가용상태에 있는 모든 섹터에 대한 항목을 가지고 있습니다.

이는 어떤 파일이 더 확장되어야 할 때, 가용 공간 리스트로부터 가용 섹터를 요구하게 하고, 반대로 파일이 줄어들 때에는 가용 공간 리스트에 해당 섹터를 반환하게끔 강제합니다.

 

그리고 이러한 프로세스로 인해서 연속 할당과 같은 집약(compaction) 과정이 필요 없습니다.

 

 

<fig 1.2. 연결 리스트를 통한 불연속 할당 >

 

 

그러나 이러한 연결 리스트를 통한 불연속 할당 기법은 다음과 같은 문제를 가집니다.

 

먼저 파일의 블록들이 디스크 전체에 분산되어 있으므로 논리적으로 연속된 블록들 간의 검색에 긴 시간이 필요하고, 연결 리스트 구조를 유지하는데 필요한 시간이 추가적으로 필요합니다.

또한, 연결 리스트 내에 있는 포인터들은 파일 데이터를 위한 가용 공간을 줄인다는 단점도 가지고 있습니다.

 


2) 색인 블록 방법을 이용한 불연속 할당

 

연결 리스트 기법은 가용 공간의 단편화와 파일 크기의 문제점을 해결할 수 있었으나,

파일이 기억 장소에 분산되어 있으며 포인터 또한 분산될 수밖에 없다는 근본적인 한계를 가지고 있습니다.

 

그렇기에 이를 개선하기 위하여 색인 블록 기법에서는 각 파일마다 하나의 색인 블록(indexed block)을 두고 여기에 파일 블록 항목이 분산되어 있는 주소에 대한 포인터를 모아두고 관리합니다.

이에 따라 각 파일의 색인 블록은 고정된 수의 항목들을 가지고 있으며, 각 항목은 블록 식별자와 블록 포인터를 가지는 형태를 취합니다.

 

<fig 1.3. 색인 블록을 이용한 불연속 할당>

 

색인 블록 기법은 단편화 문제가 없이 해당 블록에 대한 직접 액세스가 가능합니다.

그러나, 이 방법은 연결 리스트 방법보다 기억 장소의 낭비를 많이 초래할 수 있습니다.

 

예컨대, 두 개의 섹터를 가지는 파일에 대해서 연결 리스트 방식에서는 두 개의 포인터만을 필요로 하지만

색인 블록 방법에서는 두 포인터만을 사용하는 블록의 나머지 부분은 낭비되기 때문입니다.

 


 

1.5. 백업(Backup)과 복구(Recorvery)

 

디스크가 물리적으로 파괴(Crash)되거나, 번개가 치는 재난 상황, 전원 장치의 불안정, 화재, 홍수 등의 천재지변 또는 사람에 의한 범죄 등으로 인해 저장된 정보를 손실되고 파괴될 수 있습니다.

 

이러한 정보의 손실은 고의적이든 아니든 발생 가능성은 존재하므로 일반적으로 운영체제나 특히 파일 시스템은 이러한 불의의 사고 상황을 염두에 두고 설계하게 됩니다.

 

데이터를 항상 유용하게 보존하는 한 방법은 주기적으로 백업(backup)을 받아두는 것입니다.

 

주기적으로 시스템의 파일을 하나 이상 복사하여 안전한 장소에 보존하여 두는 주기적 백업은 이러한 위험을 방지하는 가장 일반적인 기법입니다.

 

또 다른 방법은 다른 디스크에 한 파일에 대한 모든 트랜잭션을 기록하여 저장하는 방법입니다.

자료를 중복하여 저장하는 작업은 상당한 비용이 필요하지만,

일단 데이터가 손실, 파괴될 경우에는 현재까지 수행한 작업을 재건할 수 있기 때문입니다.

 

주기적으로 데이터를 백업하는 방법으로 인한 단점은 다음과 같습니다.

 

-       백업 시 다른 작업을 중단해야 한다.

-       백업 시간이 많이 소요될 수 있다.

 

복구(Recovery)는 위에서 설명한 이유 등으로 파일이 파괴되었을 때,

백업을 받아둔 파일을 이용하여 재건하는 작업을 일컫는 말입니다.

 


참고 자료

  • 김완규, 고정국, 진광윤, 최신형, 하성권, 허덕행 | 핵심 운영 체제론 | 두양사