개발자꿈나무
파일 시스템 본문
★ 파일
- 파일 : 하드 디스크나 보조기억장치에 저장된 관련 정보의 집합(관련 있고 의미 있는 정보를 모은 논리적 단위)
- 속성, 메타데이터 : 파일과 관련된 부가 정보
- 항목 (field) : 바이트의 모임으로 데이터 파일을 구성하는 기본적인 구성요소이며 의미있는 데이터의 가장 작은 단위
- 레코드 (record) : 고정 길이 또는 가변 길이로 구성되며 필요에 따라 파일을 구성하는 레코드들은 몇 개가 모여 하나의 블록을 만듦 (파일을 구성하는 요소는 레코드이며, 레코드를 구성하는 요소는 항목)
⭐︎ 파일 속성
- 유형 : 운영체제가 인지하는 파일의 종류
- 크기 : 파일의 현재 크기와 허용 가능한 최대 크기
- 보호 : 어떤 사용자가 파일을 읽고, 쓰고, 실행할 수 있는지
- 생성 날짜 : 파일이 생성된 날짜
- 마지막 접근 날짜 : 마지막으로 접근한 날짜
- 마지막 수정 날짜 : 마지막으로 수정된 날짜
- 생성자 : 생성한 사용자
- 소유자 : 소유한 사용자
- 위치 : 보조기억장치상의 현재 위치
⭐︎ 유형 : 운영체제에 파일 종류를 알려주는 힌트와도 같으며 확장자를 이용하여 알려줌
- 실행 파일 : 없는 경우, exe, com, bin
- 목적 파일 : obj, o
- 소스 코드 파일 : c, cpp, cc, java, asm, py
- 워드 프로세서 파일 : xml, rtf, doc, docx
- 라이브러리 파일 : lib, a, so, dll
- 멀티미디어 파일 : mpeg, mov, mp3, mp4, avi
- 백업/보관 파일 : rar, zip, tar
⭐︎ 파일 연산을 위한 시스템 호출
- 파일을 다루는 모든 작업은 운영체제에 의해 이루어지며, 파일을 다루고자하는 응용 프로그램은 운영체제에 부탁해야함
- 이를 위해 시스템 호출을 제공
* 파일 생성, 삭제, 열기, 닫기, 읽기, 쓰기
⭐︎ 파일의 구조 : 파일을 구성하는 레코드들이 보조기억장치에 배치되는 방식
- 순차 파일(SAM)
- 다음 레코드는 실제로 현재의 레코드 바로 뒤에 저장되어 있음
- 파일의 레코드들이 순차적으로 기록되어 판독할 때도 순차적으로 접근하기 때문에 순차 접근 방식이라고도 함
- 일괄 처리 업무에 사용 - 인덱스 파일(ISAM)
- 레코드는 각 레코드의 키에 따라서 논리적 순서대로 배열
- 시스템은 레코드의 실제 주소가 저장된 인덱스를 관리
- 기본 영역, 색인 영역, 오버플로 영역으로 구성
▶︎ 기본 영역(Prime Area) : 실제 레코드가 기록되는 데이터 영역으로 각 레코드들은 키 값 순으로 저장
▶︎ 색인 영역(Index Area) : 기본 영역에 있는 레코드들의 위치를 찾아가는 색인이 기록되는 영역으로 트랙 색인 영역, 실린더 색인 영역, 마스터 색인 영역으로 분류
▶︎ 오버플로 영역(Overflow Area) : 기본 영역에 빈 공간이 없어서 새로운 레코드의 삽입이 불가능할 때를 대비하여 예비로 확보해둔 영역
* 트랙 색인 영역 : 각 실린더마다 하나씩 만들어지며, 각 트랙에 기록된 데이터의 레코드 키 값 중 최대 키 값과 주소 정보가 기록되는 영역
* 실린더 색인 영역 : 각 파일당 하나씩 만들어지며, 각 트랙 색인의 최대 키 값들로 구성된 영역
* 마스터 색인 영역 : 실린더 색인이 많을 경우 그것을 일정한 크기의 블록으로 구성하고, 해당 레코드가 어느 실린더 색인 영역에 있는지 나타내는 영역 - 직접 파일
- 레코드가 물리적 주소를 통해 직접 액세스됨
- 파일 내의 레코드들이 어떤 일정한 순서를 유지할 필요가 없음
- 레코드에 특정 기준으로 키가 할당되며, 해싱 함수를 이용하여 이 키에 대한 보조기억장치의 물리적 상대주소를 계산한 후 해당하는 주소에 레코드를 저장
★ 디렉터리
- 디렉터리(폴더) : 파일들을 일목요연하게 관리하는 기능
- 1단계 디렉터리(single-level directory)
- 옛날 운영체제에서 사용되던 방식으로 모든 파일이 하나의 디렉터리 아래에서 관리됨
- 가장 간단한 디렉터리 구조로 모든 파일이 각각 고유한 이름을 가져야 함
- 2단계 디렉터리
- 각 사용자에게 다른 디렉터리를 만들어 사용하도록 함
- 각 사용자는 자신의 사용자 파일 디렉터리 (UFD; User File Directory) 를 갖고, 각 UFD는 유사한 구조를 가지면서 오직 한 사용자의 파일만 나타냄
- 트리 구조 디렉터리(tree-structured directory)
- 현대 운영체제에서 사용되는 방식으로 계층을 가진 디렉터리 구조가 만들어짐
- 최상위 디렉터리(루트 디렉터리; /, C:₩) 아래에 여러 서브 디렉터리(자식 디렉터리)가 있는 구조로 시스템 내의 모든 파일은 유일한 경로를 가짐
⭐︎ 절대 경로와 상대 경로
- 경로 : 디렉터리를 이용해 파일 위치, 파일 이름을 특정 짓는 정보
- 절대 경로 : 루트 디렉터리부터 시작하는 경로
- 상대 경로 : 현재 디렉터리부터 시작하는 경로
- 절대 경로가 다르기 때문에 다른 디렉터리에 같은 이름의 파일이 저장될 수 있음
⭐︎ 디렉터리 연산을 위한 시스템 호출
- 파일 연산처럼 디렉터리 연산도 시스템 호출을 제공함
* 디렉터리 생성, 삭제, 열기, 닫기, 읽기
⭐︎ 디렉터리 엔트리
- 운영체제의 입장에서 디렉터리도 조금 더 특별한 정보를 담고있는 하나의 파일로 간주!
- 디렉터리는 보조기억장치에 테이블 형태로 정보를 저장
- 파일 시스템마다 담기는 정보는 차이가 있으나, 공통적으로 파일이름과 위치를 유추할 수 있는 정보가 담겨 있음
cf. 상대 경로 나타내기
.. : 상위 디렉터리
. : 현재 디렉터리
만약 home 아래에 guest 디렉터리가 있고, guest 디렉터리 안에 d.jpg 파일이 있고 현재 디렉터리 위치가 home이라면 ./guest/d.jpg 로 표현할 수 있고 guest/d.jpg로도 가능!
★ 파티셔닝과 포매팅
- 파일과 디렉터리를 생성하고 관리하기 위해선 파티셔닝과 포매팅 작업을 거쳐야 함
- 파티셔닝 : 저장 장치의 논리적인 영역을 구획하는 작업. 서랍 안에 칸막이를 설치하여 영역을 나눈다고 생각하면 쉬움!
- 파티션 : 파티셔닝 작업을 통해 나누어진 영역 하나하나
- 포매팅 : 파일 시스템을 설정하고 새로운 데이터를 쓸 준비를 하는 작업
- 포매팅 때 어떤 종류의 파일 시스템을 사용할지 결정이 남!
★ 디스크의 빈 공간 관리
⭐︎ 비트 벡터
- 빈 공간 리스트는 비트맵 또는 비트벡터로서 구현될 수 있음
- 블록이 비어있으면 0, 블록이 할당되어 있으면 1
⭐︎ 연결 리스트
- 모든 빈 디스크 블록들을 함께 연결
- 첫 번째 빈 블록 안에 다음의 빈 디스크 블록의 포인터를 가지고 있음
★ 파일 할당 방법
- 운영체제는 파일과 디렉터리를 블록 단위로 읽고 씀
- 크기가 작은 파일은 적은 수의 블록에 걸쳐 저장되고, 큰 파일은 여러 블록에 걸쳐 저장이 됨
- 파일을 할당할 때 연속 할당과 불연속 할당 방법이 있고, 불연속 할당에는 연결 할당과 색인 할당 방법이 존재함
* 오늘날까지 사용되는 방식은 불연속 할당!
⭐︎ 연속 할당(contiguous allocation)
- 파일이 저장 장치 내에서 연속적인 공간을 차지하도록 블록을 할당하는 방법
- 파일에 접근하기 위해 디렉터리 엔트리에 파일이름, 첫 번째 블록주소와 블록 단위의 길이 명시
- 구현이 단순하지만 외부 단편화를 야기한다는 치명적인 단점이 존재
- 파일에 접근할 때 필요한 디스크 탐색의 횟수는 최소화될 수 있음
- 그러나 새로운 파일을 위해 빈 공간을 찾는 것은 어려움
- 주기적인 압축이 필요
⭐︎ 연결 할당(linked allocation)
- 외부 단편화 문제를 해결하기 위한 불연속 할당 방법으로 각 블록 일부에 다음 블록의 주소를 저장하여 가리키는 형태로 할당하는 방식
- 디렉터리 엔트리는 마찬가지로 파일이름, 첫 번째 블록주소와 블록 단위 길이를 명시할 수 있고, 마지막 블록 주소를 기록할 수도 있음
- 포인터를 위한 기억공간이 필요
- 반드시 첫 번째 블록부터 하나씩 차례대로 읽어야 한다는 단점이 존재함 -> 직접 액세스 기능을 지원할 수 없음
* 파일의 임의 접근 속도가 매우 느리고, 이는 성능 면에서 상당히 비효율적임 - 하드웨어 고장이나 오류 발생 시 해당 블록 이후 블록은 접근할 수 없다는 문제가 존재함
* 하나의 블록 안에 파일 데이터와 다음 블록 주소가 저장되어 있으므로, 하드웨어가 고장나거나 블록에 하나라도 문제가 발생하면 이후 블록에 접근 할 수 없음 - 연결 할당 방법을 그대로 구현하기보다는 조금 변형하여 FAT 파일 시스템으로 사용되고 있음
⭐︎ 색인 할당(indexed allocation)
- 파일의 모든 블록 주소를 색인 블록이라는 하나의 블록에 모아 관리하는 방법
- 예를 들어 파일 a의 색인 블록은 4번 블록이고, 파일 a의 데이터는 7, 13, 11번 블록에 저장되어 있다면 4번 블록 안에는 순서대로 7, 13, 11이 적혀있음
- 연결 할당과 다르게 임의의 위치에 접근하기 쉬움
- 디렉터리 엔트리에 파일이름과 색인 블록 주소를 명시
- 이를 기반으로 만든 파일 시스템이 유닉스 파일 시스템
Q. 파일 할당에 대한 설명 중 옳지 않은 것은?
1. 연속 할당은 파일 생성 시 연속된 블록에 파일을 할당한다.
2. 연결 할당은 파일에 할당된 모든 블록에 다음 블록의 위치를 나타내는 포인터가 포함된다.
3. 연결 할당의 파일 할당 테이블에는 각 파일의 시작 블록과 함께, 길이 또는 마지막 블록을 나타내는 정보가 기록된다.
4. 블록 단위의 색인 할당은 파일 내용을 저장하는 블록 외에 별도의 색인 블록이 필요하다.
5. 파일에 대한 임의접근은 연결할당이 연속할당보다 성능이 우수하다.
-> 연속할당은 디스크 헤더 이동이 적어서 성능이 우수!
★ 파일 시스템
- USB 메모리 등의 저용량 저장 장치에서 사용되는 FAT 파일 시스템과 유닉스 계역 운영체제에서 사용되는 유닉스 파일 시스템
- 이외에도 다양한 파일 시스템이 존재
⭐︎ FAT 파일 시스템
- 연결 할당의 문제점을 보완하기 위해 다음 블록의 주소들을 테이블 형태로 관리하는 방식
- 파일 할당 테이블(FAT; Faile Allocation Table) : 블록 주소와 다음 블록 주소를 명시하는 테이블
- 디렉터리 엔트리에는 파일 이름과 파일의 첫 번째 블록 주소가 명시(이외에도 파일 속성과 관련한 다양한 정보가 들어있음)
- FAT 파일 시스템 : 이러한 FAT를 이용하는 파일 시스템
- MS-DOS에서 사용되었고, 현재는 USB 메모리 등 저용량 저장 장치용 파일 시스템으로 많이 이용되고 있음
- 블록을 표현하는 비트 수에 따라 FAT12, FAT16 등 다양한 버전이 존재
- FAT는 파티션의 앞부분에 만들어지며, 실행하는 도중 FAT가 메모리에 캐시되면 다음 블록을 찾는 속도가 매우 빨라져 임의 접근에도 유리해짐
⭐︎ 유닉스 파일 시스템
- 색인 할당 기반으로 유닉스 파일 시스템에서는 색인 블록을 i-node(index-node)라고 부름
- i-node에는 파일 속성 정보와 15개의 블록 주소가 저장될 수 있고, 파일 속성 정보도 i-node에 표현
- i-node의 크기는 유효하므로, 이를 해결하기 위해 직접 블록과 간접 블록을 사용
- 유닉스 파일 시스템 저장 방법
- 블록 주소 중 열두 개에는 직접 블록 주소 저장
* 직접 블록 : 파일 데이터가 저장된 블록
* 이것만으로 파일 데이터 블록을 모두 가리킬 수 있다면 추가적인 작업 필요하지 않음 - 열세 번째 주소에 단일 간접 블록 주소 저장
* 단일 간접 블록 : 파일 데이터가 저장된 블록이 아닌 파일 데이터를 저장한 블록 주소가 저장된 블록 - 열네 번째 주소에 이중 간접 블록 주소를 저장
* 이중 간접 블록 : 데이터 블록 주소를 저장하는 블록 주소가 저장된 블록(즉, 단일 간접 블록들의 주소를 저장하는 블록) - 열다섯 번째 주소에 삼중 간접 블록 주소를 저장
* 삼중 간접 블록 : 이중 간접 블록 주소가 저장된 블록