XI 파일 시스템
Part 04 저장장치 관리
Chapter 11 파일 시스템
1. 파일과 파일 시스템
① 파일 시스템의 개요
- 파일 시스템 File System : 파일 테이블을 사용하여 파일과 파일의 집합체인 디렉터리를 관리
- 블록 Block : 저장장치의 단위. 저장장치에서는 파일을 일정 크기로 묶어서 관리한다.
가상 메모리에서 메모리 관리자가 메모리 매핑 테이블을 사용하여 가상 주소를 물리주소로 변환하듯이 저장장치에서는 파일 관리자가 파일 테이블을 사용하여 파일의 생성, 수정, 삭제 등을 수행한다. 운영체제마다 파일 시스템이 조금씩 다른데, 윈도우의 경우 XP 이전의 초기 버전에서는 FAT: File Allocation Table 을 사용했고, 현재는 NTFS: New Technology File System 을 사용한다. UNIX 에서는 아이노드 Inode, Index node 파일 시스템을 사용한다.
② 파일 시스템의 기능
③ 파일의 분류와 확장자
④ 파일이름과 파일 연결 프로그램
파일 이름은 ‘파일이름. 확장자’의 형태로 구성된다. 윈도우에서 실행 파일을 더블클릭하면 프로세스가 생성되며 실행되고 데이터 파일을 더블크릭하면 해당 파일을 사용하는 응용 프로그램이 실행된다. 이러한 프로그램을 연결 프로그램이라고 한다. 실행 파일과 데이터 파일은 둘 다 더블클릭하면 실행되기 때문에 데이터 파일을 실행 파일로 착각하기 쉽다. 그러나 데이터 파일이 필요로 하는 응용 프로그램을 운영체제가 실행하는 것이지 데이터 파일 자체가 실행되는 것은 아님을 유의하도록 하자.
⑤ 파일 속성과 파일 작업
파일 속성은 각 파일 헤더에 기록되며, 운영체제는 이러한 파일 헤더를 파일 테이블에서 관리한다.
다음은 파일 속성의 종류를 정리한 것이다.
파일을 지우거나 이름을 바꾸는 것과 같이 파일을 변경하는 일을 파일 작업 또는 파일 연산 File Operation 이라고 한다. 파일 작업은 파일 자체를 변경하는 것과 파일 내용을 변경하는 것으로 나눌 수 있다.
파일 내용을 변경하는 작업은 프로세스 입장에서 수행하는 것으로, 다음과 같이 주로 함수 형태로 이루어진다.
파일에 접근하려면 open()이나 create() 함수를 사용하여 운영체제로부터 이용 권한을 획득하고, 작업이 끝나면 close() 함수를 사용하여 파일 작업이 끝났다는 것을 운영체제에 알려야 한다.
파일 크기, 만든 날짜, 접근 권한과 같은 파일 속성은 모든 파일에 공통으로 적용된다. 파일 속성과 달리 파일마다 자신에게 필요한 정보를 따로 정의하여 사용할 수 있는데, 이는 파일 헤더 Header 에 기록된다. 모든 파일에 공통으로 적용되는 정보인 파일 속성은 파일 테이블에 위치하고 해당 파일에 필요한 정보를 가지고 있는 파일 헤더는 파일의 맨 앞에 위치한다.
⑥ 저장장치 관리 기법
저장장치를 사용하기 위해서는 파티션, 포맷, 조각 모음과 같은 관리 기법이 필요하다.
- 파티션 Partition : 저장장치를 2개 이상의 묶음으로 나누는 것을 파티션을 나눈다고 하며 파티션은 디스크를 논리적으로 분할하는 작업이다. 논리적으로 구분되어 있는 공간이자, 파일 테이블이 달려있는 논리적인 디스크라고 볼 수 있다. [디스크의 논리적 구간]
파티션을 나누어서 관리하기 불편하고 복잡한 상황을 방지하기 위해 유닉스는 여러 개의 파티션을 통합하는 기능을 가지고 있다. 여러 개의 파티션을 하나로 통합한다는 것은 저장장치나 파티션의 개수에 상관없이 하나의 파일 시스템만 가진다는 의미다.
- 마운트 Mount : 유닉스에서 여러 개의 파티션을 하나로 통합하는 기능
유닉스는 이 마운트 기능을 통해 하드디스크가 몇 개든 간에 하나로 보는 것이 가능하다.
- 포맷 Format: 저장장치의 파일 시스템을 초기화하는 작업
포맷 화면으로 [할당 단위 크기]에서 블록의 크기를 설정할 수 잇다.
그러나 한 페이지의 크기를 너무 크게 하면 내부 단편화가 발생한다. 작은 파일을 저장하면 낭비되는 공간이 생긴다. 블록의 크기를 크게 잡으면 속도는 빨라지지만 내부 단편화가 발생하고, 작게 만들면 속도는 빨라지지 않지만 내부 단편화가 발생하지 않는다.
- 빠른 포맷 : 내용은 그대로 두고 테이블만 지운다.
- 느린 포맷 : 내용 모두 0으로 만들고 테이블도 지운다.
- 조각 모음 : 단편화된 작업을 하나로 모아주는 작업
파티션을 나누고 포맷한 후 하드디스크를 사용하다 보면 점점 느려지는 경우가 많다. 하드디스크를 처음 사용할 때는 데이터가 앞에서부터 차곡차곡 쌓이지만 파일을 저장했다 지우기를 반복하면 중간중간 빈 공간이 생긴다. 이를 조각화 또는 단편화라고 한다. 하드디스크에 이런식으로 조각이 많이 생기면 큰 파일이 여러 조각으로 나뉘어 저장된다. 이를 읽으려면 하드디스크의 여러 곳을 돌아다녀야 하므로 성능 저하로 이어진다. 이러한 문제를 방지하기 위해 주기적으로 조각 모음을 해주어야 한다.
⑦ 파일 구조
파일은 하나의 덩어리다. 파일 구조는 이 덩어리를 어떻게 구성하느냐에 따라 순차 파일 구조, 인덱스 파일 구조, 직접 파일 구조로 나뉜다. 일반 파일은 기본적으로 순차 파일 구조다.
- 순차 파일 구조 Sequential File Structure : 순차 파일은 레코드를 논리적인 처리 순서에 따라 연속된 물리적 공간으로 기록하는 것
파일 디스크립터가 계속 전진하는 방식으로 특정 위치로 파일 디스크립터를 옮기기 위해서는 ‘lseek()’ 명령어를 사용한다. 특정 데이터로 이동할 때 직접 접근이 어렵기 때문에 데이터 검색에는 적합하지 않은 방법이다.
- 인덱스 파일 구조 Index File Structure : 인덱스 테이블을 추가해서 순차 접근과 직접 접근이 가능한 파일 구조
인덱스 파일 구조는 순차적으로 이동해야 하는 순차 파일 구조의 단점을 해결한 것이다. 현대의 파일 시스템은 인덱스 파일 구조다. 순차 파일 구조로 파일을 저장하고, 인덱스 테이블을 보고 원하는 파일에 직접 접근한다.
- 직접 파일 구조 Direct File Structure : 저장하려는 데이터의 특정 값에 어떤 관계를 정의하여 물리적인 주소로 바로 변환하는 파일 구조.
특정 함수로 직접 접근이 가능한 것이 직접 파일 구조이며, 이때 사용하는 함수를 해시 함수 Hash Function 라고 한다. 직접 파일 구조는 해시 함수를 이용해 주소를 변환하기 때문에 데이터 접근이 매우 빠르다. 하지만 전체 데이터가 고르게 저장될 수 있는 해시 함수를 찾기가 쉽지 않다는 단점이 있다.
2. 디렉터리의 구조
① 디렉터리의 개념
디렉터리 Directory : 관련 있는 파일을 하나로 모아놓은 곳, 파일의 이름과 파일의 위치 정보와 같은 파일 정보를 가진 것
디렉터리는 여러 층으로 구성할 수 있는데 최상위에 있는 디렉터리를 루트 디렉터리라고 한다.
② 디렉터리 파일
디렉터리도 파일이다. 일반 파일에는 데이터가 담겨 있고 디렉터리에는 파일 정보가 담겨 있다. 또한, 디렉터리에도 일반 파일과 마찬가지로 헤더가 있다. 디렉터리 헤더에는 디렉터리 이름, 만든 시간, 접근 권한 등의 정보가 기록되어 있다. ‘..’ 2개의 마침표 파일은 자신의 바로 위인 상위 디렉터리를 가리킨다. ‘.’ 마침표 하나는 자기 자신의 디렉터리 위치를 가리킨다.
③ 경로
경로는 파일이 전체 디렉터리 중 어디에 있는지를 나타내는 정보다. 한 디렉터리에는 같은 이름을 가진 파일이 존재할 수 없지만, 서로 다른 디렉터리에는 같은 이름의 파일이 존재할 수 있다. 경로는 절대 경로와 상대 경로가 있다.
절대 경로 Absolute Path : 루트 디렉터리를 기준으로 파일의 위치를 나타내는 방식
상대 경로 Relative Path : 현재 위치를 기준으로 파일의 위치를 나타내는 방식
디렉터리를 이동할 때는 cd: change directory 명령을 사용한다.
④ 디렉터리 구조
초기 파일 시스템의 디렉터리는 1단계 구조였다. 당시에는 파일이 많지 않아 많은 디렉터리가 필요하지 않았기에 구조가 단순했다. 1단계 디렉터리 구조는 매우 단순하지만 파일이 많아지면 사용하기 불편하여 다단계 디렉터리 구조가 등장하게 되었다.
- 다단계 디렉터리 구조 : 파일 시스템에서 디렉터리의 높이가 2 이상인 디렉터리 구조
자료구조에서 트리는 순환이 없는 그래프라고 정의한다. 그러나 오늘날의 디렉터리 구조에는 순환이 있다. 기본적으로는 트리 구조이지만 디렉터리와 디렉터리를 연결하는 링크가 있기 때문이다.
- 바로가기 링크 : 다른 디렉터리에 있는 파일이나 다른 디렉터리로 바로 갈 수 있는 지름길 역할
유닉스에서는 ln 명령어를 통해 윈도우의 바로가기와 같은 링크를 만들 수 있다.
⑤ 마운트
파티션은 논리적인 디스크 분할로, 하나 또는 여러 개의 디스크를 파티션으로 나누어 사용할 수 있다. 즉, 디렉터리를 옮겨다닐 때마다 파티션을 옮겨다니는 것이라 볼 수 있다. 윈도우의 경우 C 드라이브, D 드라이브, E 드라이브와 같이 문자를 붙여 각 파티션을 구분한다. 그러나 이렇게 파티션이 사용자에게 노출되면 사용이 불편하다. 초기 윈도우에서는 파일 시스템의 최대 디스크 크기가 제한되었기 때문에 파티션을 나누어 파티션마다 서로 다른 파일 테일블을 사용해야 했다.
반면에, 유닉스의 경우 서버용으로 만들어진 운영체제이므로 파일 테이블의 크기에 제한이 없다. 또한 하나의 파일 테이블로 여러 개의 디스크 혹은 파티션을 통합하여 관리할 수 있다. 유닉스에서는 하나의 파일 테이블에 여러 개의 파티션을 붙여서 사용하는데, 이렇게 여러 개의 파티션을 통합하는 명령어가 ‘마운트’다. 이때 /mnt를 ‘마운트 연결 지점 Mounting Point’ 라고 부른다. 마운트를 사용하면 디렉터리를 이동할 때마다 다른 파티션으로 넘어가지만 사용자는 이를 알지 못한다. 사용자에게는 한 파티션으로 보이기 때문에 몇 개의 파티션이 합쳐져 있는지 모르는 것이다. 마운트를 사용하면 파티션이 몇 개이든 하나로 통합할 수 있다. 외부 저장장치도 마운트로 파티션에 붙이고 마운트 해제 un-mount 로 분리할 수 있다.
3. 디스크 파일 할당
① 할당 방식
일반적으로 하나의 파일은 여러 개의 블록을 사용하는데, 여러 개의 블록을 어떻게 연결하는지에 따라 연속 할당과 불연속 할당 방식으로 구분된다. 연속 할당은 연속된 공간이 없을 때는 불가능하므로 실제로 쓰지 않는다.
- 연속 할당 Contiguous Allocation : 파일을 구성하는 데이터를 디스크상에 연속적으로 배열하는 간단한 방식
- 불연속 할당 Non-contiguous Allocation : 비어 있는 블록에 데이터를 분산하여 저장하고 이에 관한 정보를 파일 시스템이 관리하는 방식
불연속 할당 방식에는 대표적으로 연결 리스트를 이용한 연결 할당과 인덱스를 이용한 인덱스 할당이 있다.
② 연결 할당과 인덱스 할당
- 연결 할당 Linked Allocation : 파일에 속한 데이터를 연결 리스트로 관리하는 방식. 체인으로 연결한 것처럼 보여서 체인 할당 Chained Allocation 이라고도 한다. Linked List를 통해 모든 블록을 연결한다. 파일 테이블에는 시작 블록에 대한 정보만 저장하고, 나머지 데이터는 시작 블록부터 연결하여 저장한다. 파일의 맨 끝에 해당하는 블록에는 링크 대신 널 Null 을 삽입한다.
- 인덱스 할당 Indexed Allocation : 인덱스를 이용한 디스크 할당 방식. 테이블의 블록 포인터가 데이터 블록이 아닌, 데이터의 인덱스를 담고 있는 인덱스 블록을 연결한다. 인덱스 블록은 실제 데이터의 위치에 관한 정보를 순서대로 보관하고 있다. 유닉스는 인덱스 할당 방식을 사용하여 크기에 제한이 없다.
③ 빈 공간 관리
디스크에 파일을 저장할 때마다 모든 테이블을 뒤져서 빈 공간을 찾는 것은 비효율적이다. 디스크의 내부 단편화를 줄이고 빈 공간을 효율적으로 관리하기 위해 파일 시스템은 빈 블록의 정보만 모아놓은 빈 공간 리스트 Free Block List를 유지한다. 파일이 사용했던 공간을 일일이 지우려면 시간이 많이 걸린다. 파일 시스템에서는 파일 테이블의 헤더를 삭제하고, 사용했던 블록을 빈 공간 리스트에 등록하는 것을 파일 삭제로 간주한다.
- 빈 공간 리스트 Free Block List : 빈 블록의 정보만 모아놓는 리스트
블록 내용을 지우지 않고 빈 공가 리스트에 삽입하는 것은 해당 블록에 새로운 데이터를 덮어쓰지 않는 한 원래 데이터를 복구할 수 있는 여지를 남긴다. 어떤 데이터를 지우고 새로운 데이터를 디스크에 넣을 때 방금 지워진 블록에 할당하는 것이 아니라 리스트에 있던 블록 중 맨 앞에 있는 블록에 할당한다. 이러한 특징 때문에 디스크 복구나 휴지통에서 삭제한 파일을 되살리는 일이 가능하다.