본 글은 책 "혼자 공부하는 컴퓨터 구조+운영체제" 의 Chapter 15. 파일시스템 부분을 읽고 정리한 내용입니다.
파일
- 하드 디스크나 SSD 같은 보조기억장치에 저장된 관련 정보의 집합, 관련있는 정보를 모은 논리적 단위
파일을 이루는 정보
- 이름
- 파일을 실행하기 위한 정보
- 파일 관련 부가 정보 (속성, 메타데이터)
파일 속성과 유형
속성 이름 |
의미 |
유형 |
운영체제가 인지하는 파일의 종류 (텍스트, 실행, 음성) |
크기 |
현재크기 & 허용 가능한 최대 크기 |
보호 |
어떤 사용자가 파일을 읽고/쓰고/실행할 수 있는지 |
생성 날짜 |
... |
마지막 접근 날짜 |
|
마지막 수정 날짜 |
|
생성자 |
|
소유자 |
|
위치 |
|
* 속성 이름 자체가 의미를 담고 있는 내용인 경우는 생략
파일 유형
파일 연산을 위한 시스템 호출
- 파일을 다루는 모든 작업은 운영체제에 의해 이뤄지고 응용프로그램은 파일을 조작할 수 없음
파일 연산을 위한 시스템 호출
디렉토리
- 파일들을 정리하기 위해 사용되고 윈도우에서는 폴더라고 부름
옛 운영체제에서는 하나의 디렉토리만 존재했음 (single-level directory)
이후, 여러 계층을 가진 tree-structured directory가 생겨남
최상위 디렉토리(root directory, '/'로 표현) 아래 여러 서브 디렉토리가 있을 수 있음
절대 경로와 상대 경로
- 절대 경로: 루트 디렉토리에서 자기 자신까지 이르는 고유한 경로
- 상대 경로: 현재 디렉토리부터 시작하는 경로
- 현재 디렉토리 경로가 /home이라면 a.sh의 상대 경로는 minchul/a.sh
디렉토리 연산을 위한 시스템 호출
디렉토리 엔트리
- 많은 운영체제에서 디렉토리를 그저 ‘특별한 형태의 파일’로 간주
- 디렉토리는 보조기억장치에 테이블 형태의 정보로 저장되는데 각각의 행을 디렉토리 엔트리라고 함
파일 시스템에 따라 디렉터리 엔트리에 파일 속성을 명시하는 경우도 있음
파일 이름 |
위치를 유추할 수 있는 정보 |
생성 시간 |
수정된 시간 |
크기 |
|
|
|
|
|
예시
home 디렉토리는 대략 다음과 같이 구성됨
파일 이름 |
위치를 유추할 수 있는 정보 |
.. (상위 디렉토리) |
|
. (현재 작업 디렉토리) |
|
minchul |
|
guest |
|
minchul 디렉토리 엔트리에는 디렉토리에 포함된 파일들의 이름(a.sh, b.c, c.tar)과 이들의 위치를 알 수 있는 정보들이 포함되어있음
파일 시스템
- 파일과 디렉토리를 보조기억장치에 일목요연하게 저장하고 접근할 수 있게 하는 운영체제 내부 프로그램
파티셔닝과 포매팅
- 보조기억장치를 사용하려면 파티션을 나누는 작업과 포맷 작업을 거쳐야 함
- 파티셔닝: 저장 장치의 논리적인 영역을 구획하는 작업 (일종의 칸막이로 영역을 나누는 작업)
- 파티션: 파티셔닝 작업으로 나눠진 영역 하나하나
- 포매팅: 파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지를 결정하고 새로운 데이터를 쓸 준비를 하는 작업
Windows에서 USB의 파일 시스템 예시
- 포매팅 할 때 파일 시스템이 결정됨
- 파일 시스템은 여러 종류가 있고 파티션마다 다른 파일 시스템을 설정할 수도 있음
파일 할당 방법
- 운영체제는 파일과 디렉토리를 블록(block) 단위로 읽고 씀
- 하나의 파일이 보조기억장치에 저장될 떄 하나 이상의 블록에 걸쳐 저장됨
- 하드 디스크의 가장 작은 저장단위는 섹터지만 운영체제는 하나 이상의 섹터를 블록이라는 단위로 묶어 관리
파일을 보조기억장치에 할당하는 방법
- 연속 할당
- 불연속 할당
연속 할당(contiguous allocation)
- 가장 단순한 방식
- 블록을 3, 2, 5개 차지하는 정도의 크기를 가진 파일 a, b, c가 있다면 아래처럼 할당
- 연속으로 할당된 파일에 접근하기 위해서는 파일의 첫번째 블록 주소와 블록 단위의 길이만 알면됨
- 연속 할당을 사용하는 파일 시스템에서는 디렉토리에 엔트리에 파일 이름과 더불어 첫번째 블록 주소와 블록 단위의 길이를 명시
장점
단점
단점 예시
위의 사진과 같이 파일이 연속할당방식으로 저장된 상황에서 파일 D, F가 삭제 된다면?
- 블록은 총 11개가 남지만, 크기가 블록 7개 이상을 사용하는 파일은 할당될 수 없음
연결 할당(linked allocation)
- 불연속 할당의 종류
- 파일을 이루는 데이터를 linked list로 관리
- 4개의 블록으로 구성된 a라는 파일이 있다고 할 때
- 10→5→13→2 순으로 블록이 연결되어 있고 2번 블록에는 다음 블록이 없다는 특별한 표시자(-1)를 기록
- 디렉토리 엔트리에는 파일 이름과 함께 첫번째 블록 주소와 블록 단위의 길이를 명시
길이가 아닌 마지막 블록의 주소를 기록할 수도 있음
단점
1. 반드시 첫번째 블록부터 하나씩 차례대로 읽어야 함
- 파일 내 임의의 위치에 접근하는 속도(random access 속도)가 매우 느려 성능면에서 비효율적
2. 하드웨어 고장이나 오류 발생 시 해당 블록 이후 블록은 접근할 수 없음
- 하나의 블록 안에 파일 데이터와 다음 블록 주소가 모두 포함되어 있다보니, 파일을 이루는 블록에 하나라도 문제가 발생하면 이후 블록에 접근할 수 없음
색인 할당(indexed allocation)
- 파일의 모든 블록 주소를 색인 블록(index block)이라는 하나의 블록에 모아 관리하는 방식
색인 할당 예시
- 파일 a의 색인 블록은 4번 블록
- 파일의 데이터는 7, 13, 11 블록이 저장되어 있다고 가정
- 파일 a에 순차적으로 접근하고 싶다면 생인 블록에 저장된 주소로 차례대로 접근하면 됨
- 임의의 위치에 접근하고 싶다면 색인 블록의 i번째 항목이 가리키는 블록에 접근하면 됨
- 디렉토리 엔트리에는 파일 이름과 색인 블록 주소를 명시
색인 할당을 기반으로 만든 파일 시스템이 유닉스 파일 시스템
파일 시스템 살펴보기
대표적인 파일 시스템 2가지
- FAT 파일 시스템: USB, SD 카드등의 저용량 저장 장치에 사용됨
- 유닉스 파일 시스템:유닉스 계열 OS에 사용됨
FAT 파일 시스템 (File Allocation Table)
- 연결 할당 기반 파일 시스템의 단점을 보완
- 단점의 근본적인 원인은 블록 안에 다음 블록의 주소를 저장했기 때문
각 블록에 포함된 다음 블록의 주소들을 한데 모아 테이블 형태로 관리하면? 파일 할당 테이블(FAT)!
- 파일의 첫번째 블록 주소(4번블록)만 알면 4→8→3→5 순으로 파일의 데이터가 담긴 모든 블록에 접근할 수 있음
- 이렇게 FAT을 이용하는 파일 시스템이 바로 FAT 파일 시스템
- MS-DOS에서 사용되었고 최근까지 저용량 저장 장치용 파일 시스템으로 많이 사용됨
- 버전에 따라 FAT12, 16, 32가 있으며 숫자는 블록을 표현하는 비트수를 의미
FAT(FAT12) 파일 시스템을 사용하는 파티션 도식도
- FAT 영역: FAT가 저장되고 파티션의 앞부분에 만들어짐
- 루트 디렉토리 영역: 루트 디렉토리가 저장되는 영역
- 데이터 영역: 서브 디렉토리와 파일들을 위한 영역
FAT가 메모리에 캐시될 경우 느린 임의 접근 속도도 개선 가능
FAT파일 시스템의 디렉토리 엔트리
시작 블록을 통해 FAT에서 해당 파일의 내용들에 접근할 수 있음
- 속성은 읽기전용/숨김 파일/시스템 파일/ 일반 파일/ 디렉토리 등을 식별하기 위한 항목
아래 디렉토리 구조를 이루는 FAT 파일 시스템에서 /home/minchul/a.sh 파일을 읽는 과정
/home/minchul/a.sh 에 접근하는 과정
- 루트 디렉토리에서 home 디렉토리는 몇번 블록에 있는지 살펴봄 → 3번 블록
- 3번 블록을 읽어 home 디렉토리 내용을 살펴보고 minchul 디렉토리가 몇번 블록에 있는지 살펴봄 → 15번
- 15번 블록을 읽어 a.sh 파일의 첫번째 블록 주소를 확인 → 9번
- FAT을 통해 9→8→11→13 블록 순서로 a.sh 파일 내용에 접근 가능
유닉스 파일 시스템
- 색인 할당 기반의 파일 시스템
- 색인 블록 == i-node
- 파일의 속성 정보와 15개의 블록 주소가 저장될 수 있음
- 파일마다 i-node를 가지고 있고 i-node 마다 고유한 번호가 부여되어있음
UNIX 파일 시스템을 사용하는 파티션 도식도
- 파티션 내에 i-node 영역에 i-node들이 있고 데이터 영역에 디렉토리와 파일들이 있음
문제: i-node의 크기는 유한한데 블록을 20개, 30개, 그 이상 차지하는 파일은?
첫째, 블록 주소 중 12개에는 직접 블록 주소를 저장
- i-node가 가리킬 수 있는 열다섯 개의 블록 주소 중 처음 12개에는 파일 데이터가 저장된 블록 주소를 직접 명시
- direct block: 파일 데이터가 저장된 블록
둘째, ‘첫째’ 내용으로 충분하지 않다면 13번째 주소에 단일 간접 블록 주소를 저장
- 단일 간접 블록(single indirect block): 파일 데이터가 저장된 블록 주소가 아닌 파일 데이터를 저장한 블록 주소가 저장된 블록을 의미
셋째, ‘둘째’ 내용으로 충분하지 않다면 14번째 주소에 이중 간접 블록 주소를 저장
- 이중 간접 블록(double indirect block): 데이터 블록 주소를 저장하는 블록 주소가 저장된 블록
넷째, ‘셋째’ 내용으로 충분하지 않다면 열다섯 번째 주소에 삼중 간접 블록 주소를 저장
삼중 간접 블록: 이중 간접 블록 주소가 저장된 블록
unix 파일 시스템의 디렉토리 엔트리도 파일 이름과 i-node 번호로 구성됨
UNIX 파일 시스템의 디레고리 엔트리
예시
- 유닉스 파일 시스템에서 /home/minchul/a.sh 파일을 읽는 과정
- 루트 디렉토리 위치는 루트 디렉토리의 i-node를 통해 확인
- 유닉스 파일 시스템은 루트 디렉토리의 i-node를 항상 기억하고 있음
- 2번 i-node가 루트 디렉토리의 i-node라고 가정
- i-node 2를 통해 루트 디렉토리 위치 파악 → 1번 블록
- 1번 블록을 읽으면 루트 디렉토리 내용을 알 수 있음 → home 디렉토리의 i-node 번호는 3
- i-node 3에 접근하여 home의 디렉토리 위치 파악 →210번 블록
- 210번 블록을 읽으면 home 디렉토리 내용을 알 수 있음 → minchul의 i-node 번호는 8
- i-node 8에 접근하면 minchul 폴더의 위치 파악 → 121번 블록
- 121번 블록을 읽으면 minchul 디렉토리 내용을 알 수 있음 → a.sh 파일의 i-node 번호는 9번
- i-node 9에는 98, 12, 13 블록이 있음
⇒ 결론적으로 a.sh 파일을 읽기 위해 98→12→13 블록에 접근하면 됨, i-node를 통해 위치 정보를 알고, 블록을 통해 내용을 알 수 있음