본문 바로가기

프로그래밍/운영체제

[운영체제] File System Implementation

 

파일을 접근하는 방법이 2가지가 있다.

직접 접근은 특정 위치로 접근 한 후 다른 위치로 바로 접근 할 수 있다.

 

a,b,c 가 있다고 가정할때 순차접근은 a를 보고  c를 보고 싶으면 무조건 b도 봐야하는것

직접 접근은 건너뛰고 바로 c를 볼 수 있다. 

 

 

디스크에 파일을 저장하는 방법은 3가지가 있다.

 

연속할당 방법 - 한 디렉토리에 있는 파일을 저장한 방법

디스크에 동일한 크기의 섹터를 나눠서 저장을 한다.

페이징기법과 좀 유사하다.

하나의 파일이 디스크 상에 연속해서 저장되는 방법이다.

 

장점과 단점이 있다면?

 

외부 조각이 생길수있다.

3개의 섹터를 가진 파일을 넣으려고 할때 위 이미지에 17,18번엔 들어갈 수 없게 된다.

 

파일의 크기는 변경될 수 있는데 , 이 방법을 쓰면 크기가 커지는데 제약이있다.

 

대신 이 방법의 장점은 빠른 I/O가 가능하다는 것

대부분의 접근시간은 디스크 헤드가 이동하는 시간이다.

 

디스크에 연속적으로 저장하지않고 빈 위치에 아무렇게나 들어 갈 수 있도록 한다.

시작 위치와 끝 위치를 알고있다.

외부조각이 발생하지 않는다.

 

대신, 직접 접근이 안된다.

파일의 4번째 섹션을 보겠다 하면 , 디렉토리에는 첫번째 섹션만 저장되어있기때문에

1번째부터 타고 들어가야 4번째 위치를 알 수 있다.

순차접근만 가능한 방법..

또, 디스크 헤더가 seek 를 해서 하나씩 찾아야 하는데 순차접근의 시간이 많이 드는게 단점이다.

 

한 섹터가 고장나면 포인터가 유실나서 다른거까지 알 수 없게 된다.

 

한 블록에 이 파일이 어디어디 저장되어있다 는 걸 열거해놓는 방식

4번째 블록을 보고 싶다 하면 인덱스 블록에서 4번째 블록 위치를 찾고 바로 접근 할 수 있다.

 

외부 조각도 안생기고 직접 접근도 가능하다

 

하지만, 단점으로는 아주 작은 파일도 블록이 2개가 필요하다. 공간 낭비 발생

아주 클때 한 블록에 인덱스를 저장하기에 부족하다.

 

해결법 linked scheme, multi-level index

linked scheme 은 인덱스 블록에 실제 파일 위치를 적다가 다 커버 못하겠다 싶으면 

또 다른 인덱스 블록을 가리키게 한다. 

 

여기까지 이론적으로 파일을 디스크에 저장하는 방법을 알아봤다.

그럼 이제 실제 파일 시스템에서 어떤 할당 방법을 쓰는가 를 알아보자

 

 

한 파티션에 파일시스템을 설치한 상황이다.

Unix 파일시스템은 구조가 크게 4가지로 된다.

모든 파일시스템은 Boot block 을 가장 위 0번째에 위치 시킨다.

부팅에 필요한 정보를 가지고 있고, 운영체제가 어디있는지 위치를 알고 있다.

메모리에 운영체제를 올려서 부팅이 정상적으로 되게 한다.

 

Super block 은 총체적인 정보를 담고 있는데,

어디가 빈 블록이고 어디가 실제 파일이 저장된 사용중인 블록인지 구분한다.

 

Inode list 파일의 모든 메타 데이터를 저장한다. 파일 1개당 Inode 1개가 할당된다

그 파일의 메타데이터를 가지고 있다.

 

파일의 이름은 디렉토리가 저장하고있다.

 

파일의 위치 정보는 어떻게 가지고 있냐 하면

UNIX는 기본적으로 Indexed Allocation 을 좀 변형해서 쓰고있다.

 

direct block 과 single ,double triple 로 나눠서 저장한다.

작은 파일은 direct block 으로만 위치를 파악하고

좀 크면 single indirect 를 통해서 가보면 인덱스를 저장하고 있는 블록이 있고 그 블록에 있는 내용을 타고 가면

데이터가있게 된다.

 

또 다른 파일 시스템인 FAT File System 을 알아보자

윈도우즈 에서 일부 사용되고 있다

FAT에 메타데이터의 일부 위치정보만 빼두고 있다.

나머지 정보는 디렉토리가 가지고 있다.

FAT 파일시스템 에서는 디렉토리가 파일의 모든 메타 데이터를 가지고 있다.

 

FAT 파일에 217번으로 가면 2번째 블록은 618에 있구나 하고 알 수 있다.

Linked Allocation 을 활용한 건데,

블록에 접근 하는게 아니라 FAT 만 확인해보면 블록의 위치를 알 수 있다

(직접 접근이 가능하다)

 

 

이제 디스크에서 비어있는 블록은 어떻게 관리하는지 알아보자

비트맵을 이용한 방법

각각의 블록 별로 번호가 있을텐데 그걸 Unix 로 예를들면

Super Block 에다가 비트를 둬서 i 번째 블록이 사용중이냐 비어있느냐를 확인한다.

 

 

2번째 방법 Linked list 방법

비어있는 블록들을 연결을 해놓는 것 

회색들이 비어있는 블록

다만, 연속적인 비어있는 공간을 찾긴 힘들다.

 

Grouping 방법

비어있는 한 블록이 인덱스 역할을 한다.

 

이제 Directory 를 어떻게 구현하는지 알아보자

 

디렉토리 밑에 파일들의 메타데이터를 관리하는 특별한 파일

디렉토리 파일 내용을 어떻게 저장하는가의 방법

 

Linear List 

파일의 이름과 메타데이터를 순차적으로  저장하는것

구현은 간단하지만 , 연산에 시간이 많이 필요하게 된다.

특정 파일을 검색하려면 전부 검색해야된다.

 

그래서 나온게 

Hash table 방식이다.

Hash 테이블은 파일의 이름을 해시 함수로 적용을 해서 그 리턴값을 메타데이터와 묶어서 저장하는 방식

 

 

Unix에서는 inode 에 대부분 저장하고 있었고, FAT 에서는 Fat에 파일의 메타데이터를 저장하고 있었다

 

 

VFS - 파일 시스템 종류에 상관없이 사용자는 동일한 API 를 통해 파일시스템을 접근 할 수 있게 해주는 계층

NFS - 네트워크 파일 시스템

원격 파일 시스템을 접근 할 수도 있다. RPC 원격 접근 프로토콜을 통해 서버쪽을 접근한다.