출처 - https://github.com/jmxx219/CS-Study (opens in a new tab)
파일 시스템
파일이란
- 컴퓨터는 데이터를 저장 매체에 저장하는데, OS는 데이터를 편리하게 사용하기 위해 파일이라는 개념으로 관리한다.
- 파일은 OS에 의해서 물리 장치(하드디스크, CD-ROM 등)에 저장되고, 관리된다.
- 일반적으로 파일은 프로그램과 데이터를 의미한다.
- 파일은
OS
마다 다른 속성을 갖지만 일반적으로 파일은 이름, 크기, 유형, 위치, 생성 시간, 접근 권한 등의 속성을 갖는다.
파일 디스크립터
- 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 정수 값
- 유닉스 시스템에서는 모든 것을 파일이라고 한다.
- 디바이스, 디렉토리, 소켓, 파이프 등 모든 객체를 파일로 관리
- 프로세스가 실행 중에 파일을 오픈하면 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않은 가장 작은 값을 할당해준다.
- 그 다음 프로세스가 열려있는 파일에 시스템 콜을 호출하여 접근할 때, 파일 디스크립터 값을 사용해서 파일을 지칭할 수 있다.
- 각 프로세스 별로
Open file descriptor table
이 존재하고, 이 테이블의 엔트리에는 파일의 offset, flag, 접근 모드, inode 레퍼런스를 가지고 있다.
파일 시스템
- 파일 시스템은 디스크에서 쉽게 파일을 저장하고, 찾고, 인출할 수 있게 함으로써 보다 효울적으로 파일을 다룰 수 있게 해준다.
- 파일 시스템은 크게 데이터를 저장하는 파일 그리고 파일을 관리하는 디렉토리로 구성된다.
디렉토리 구조
- 디렉토리는 파일 이름을 디렉토리의 파일 컨트롤 블록으로 매핑하는 테이블이다.
- 디렉토리는 여러 구조를 가질 수 있고 싱글 레벨부터 멀티 레벨까지 다양하게 구성할 수 있다.
javac *.java
자바 파일을 컴파일을 하는 명령어로, 디스크에 컴파일과 관련된 프로그램을 매핑되어 있는
javac
를 호출하여 프로그램을 실행시키는 것이다.새로운 프로그램을 설치하고 터미널에서 실행했을때(ex:
java
등) 환경 변수 PATH 에 등록하는 이유도 파일 위치를 매핑하기 위해서이다.
파일 할당
- 디스크는 물리적으로 섹터로 구성되어 있고, 섹터는 블록으로 구성되어 있다. 파일은 각 블록에 할당된다.
- 메모리 할당 이슈가 있는 것처럼, 파일도 블록에 어떻게 할당한 것인지에 대한 이슈가 있다.
Contiguous Allocation
설명
- 파일을 연속적인 섹터에 할당하는 방법
- 연속적인 메모리 할당과 비슷한 방식으로 파일을 할당한다.
장점
- 파일을 쉽게 할당 가능
단점
- 파일을 삭제하면 빈 공간이 생기고, 이 빈 공간을 활용하기 위해서는 파일을 압축해야 한다.
- 외부 단편화가 발생할 수 있다.
Linked Allocation
설명
- 파일을 불연속적으로 블록에 할당하고, 각 블록을 순차적으로 링크드 리스트로 연결하는 방법
장점
- 외부 단편화와 압축 이슈는 해결
단점
- 파일의 i번째 블록을 찾기 위해서는 첫 번째 블록부터 순차적으로 탐색하는 오버헤드방생
- 파일의 중간 블록이 고장나면 파일의 나머지 블록에 접근 불가.
Indexed Allocation
설명
- 파일의 모든 블록의 위치를 인덱스 블록에 저장하는 방식
- 인덱스 블록은 디스크의 한 섹터에 저장되고, 파일의 i번째 블록을 찾기 위해서는 인덱스 블록에 접근하여 i번째 블록의 위치를 찾을 수 있다.
장점
- 외부 단편화가 발생하지 않는다.
- 직접 데이터 접근이 가능하다.
단점
- 인덱스 블록 + 데이터 블록 이기 때문에 작은 크기의 파일의 경우 메모리 낭비될수 있다.
- 너무 큰 파일의 경우 하나의 블록으로 index저장이 어려울수 있다
- index 블록을 연결 리스트로 여러개를 만드는 linked scheme방법으로 해결가능.
파일 시스템 구조
파일 시스템은 계층 구조로 구성되어 있다.
-
devices
- 장치(하드디스크, CD-ROM 등)를 관리하는 계층
-
I/O control
- 메모리와 디스크 시스템 사이에 정보 전송을 담당하는 계층
-
Basic file system
- 적절한 디바이스 드라이버에게 디스크 상의 물리 블록을 읽고 쓰도록 명령을 내리는 계층
-
File organization module
- 파일의 논리 블록과 물리 블록을 매핑하는 계층
-
Logical file system
- 메타 데이터 정보를 관리하는 계층
- 메타데이터는 파일의 내용 자체인 데이터를 제외한 모든 파일시스템 구조를 말한다 (파일의 이름, 유형, 크기, 생성 시간, 접근 권한 등의 속성)
Logical file system
계층은inode
를 사용하여 메타 데이터를 관리한다.
Unix 파일 시스템 구조
설명
-
Boot block
- 컴퓨터의 부팅과 관련한 정보가 들어있는 디스크
- 0번 블록에 부팅에 필요한 정보를 메모리에 올리면 복잡한 로직 없이 부팅할수 있기 때문에 모든 파일 시스템에는 부트 블록이 가장 위에 있다.
-
Super block
- 파일 시스템과 관련된 모든 정보가 있는 파티션
- 비어있는 블록의 위치, 실제 사용중인 블록 위치 등
-
Inode list
- 파일 이름을 제외한 모든 메타 데이터를 저장하는 영역
- 사진의 빨간 상자의 모든 항목이 inode로 매핑된 파일의 메타데이터가 들어있다.
- direct block은 파일 내 블록에 집적 접근할 수 있는 블록 위치를 저장하는 영역으로 블록 별 위치 정보를 저장하기 때문에 모든 데이터에 직접접근이 가능해진다.
- single/double/triple indirect블록은 파일 크기가 클 경우 다른 파일에 저장하게 되는데 파일을 연결할때 사용하는 주소이다
Inode의 추가적인 내용
파일 시스템에서의 블록에 대해서 자세하게 보면 아래 그림과 같이 구성되어 있다.
파일 시스템에서의 블록은
super block
, 그 파일의 메타 데이터는inode block
, 그리고 실제 데이터를data block
으로 구성됨을 볼 수 있다.이렇게 계층화를 하여 파일 시스템을 구성하는 이유는 아래
inode
구조를 보면 알 수 있다.inode block
구성을 보면data block
의 위치를 가리키는 포인터가 존재한다.- 이 포인터는
direct pointer
,indirect pointer
,double indirect pointer
로 구성되어 있다.- 핵심은 블록의 크기가 최대 4KB 이다.
- 블록의 크기가 제한되어있기 때문에
direct pointer
,indirect pointer
,double indirect pointer
로 나누어 확장하여 관리한다
direct pointer
- 파일의 데이터 블록을 가리키는 포인터
inode
에는 12개의direct block
이 존재한다.direct block
는 파일의 데이터 블록을 가리키는 포인터이기 때문에, 파일의 크기가 4KB 이하일 경우에는direct pointer
만 사용하게 된다.
indirect pointer
indirect pointer
는 데이터 블록을 가리키는 포인터이기 때문에, 파일의 크기가 4KB를 넘어서는 경우에 사용된다.
double indirect pointer
double indirect pointer
는indirect pointer
를 가리키는 포인터이기 때문에, 파일의 크기가 4MB를 넘어서는 경우에 사용된다.
- 이 포인터는
이렇게 블록 크기를 넘어서면
indirect pointer
를 사용하고,indirect pointer
의 개수가 부족하면double indirect pointer
를 사용하는 방식으로 파일의 크기를 확장할 수 있다.
FAT 파일시스템 구조(File Allocation Table)
설명
-
Block block
- Unix 파일 시스템과 동일
-
FAT
- 메타데이터 중 파일의 위치정보만 저장하고 나머지는 Root directory에 저장
- 위치 정보가 있기때문에 contents에 직접 접근 가능
- 부팅과 함께 메모리에 올라가기 때문에 파일에 접근할때 디스크에 접근하는 것이 아닌 메모리내에서 Linked Allocation처럼 위치 탐색이 가능
-
Root directory
- 위치를 제외한 나머지 메타데이터를 저장
-
Data block
- 파일 자체 정보를 갖고있는 블록