본문 바로가기

운영체제

File System이란?

* 본 내용은 운영체제를 공부하며 추후 복습하기 위해 포스팅하는 게시물입니다.

 

File System이란? File을 저장하고 관리하고 보호하는 시스템을 의미

 

File

  • 이름이 있는 연관된 데이터들의 집합을 의미
  • 운영체제는 다양한 장치를 File이라는 논리적 단위로 보여줌
  • create, delete, read, write, open, close 연산이 존재하며 open을 해야만 read, write가 가능

Directory

  • Directory 하부의 있는 파일들의 일부 metadata를 내용으로 가지고 있는 특별한 파일을 의미

 

Partition(=Logical Disk)

  • 하나의 물리적 디스크를 여러 개의 논리적 디스크로 분할하는게 일반적ex) C 드라이브, D 드라이브
  • 여러 개의 물리적 디스크를 하나의 논리적 디스크로 구성하기도 함(RAID)
  • 보통 Partition을 사용하는 경우는 하나의 File System or Swap Area의 용도

 

Open()

  • 파일을 read 하거나 write 하기 위해서는 open 시스템 콜을 호출해야함
  • 디스크에 존재하는 File의 metadata를 메모리에 할당

예제) 경로 "/a/b/c"에 존재하는 파일을 읽어라

fd = open("/a/b/c");

1) root 디렉토리의 metadata를 커널 메모리에 할당

2) root 디렉토리는 하부의 파일들의 일부 metadata를 가지고 있기 때문에 /a/ 디렉토리의 metadata를 커널 메모리에 할당함

3) 2)번과 마찬가지로 "/a/b/" 디렉토리의 metadata를 커널 메모리에 할당

4) "/a/b/" 디렉토리의 c 파일의 metadata를 메모리에 할당한 후 각 프로세스의 PCB에 c 파일의 metadata를 가리키는 포인터를 테이블에 저장

5) 반환값으로 테이블의 인덱스를 반환

 

Read

  • 파일을 읽어 커널 메모리에 저장함(Buffer Cache)으로써 다른 프로세스가 같은 파일을 요청할 때 디스크에 요청하지 않아도 됨
  • 요청한 프로세스에게 커널 메모리에 저장한 데이터의 사본을 전달
  • 같을 파일을 읽더라도 각 프로세스별로 읽는 부분이 다르기 때문에 offset이라는 metadata를 커널메모리 or PCB에 저장함(운영체제 구현에 따라 다름)

 

File Protection

- 파일을 보호하는 3가지 방법이 존재

 

1) Access Control Metrix

  • 행렬을 이용하여 파일과 사용자 간 접근권한을 표시하는 방법
  • LinkedList를 이용하여 사용자가 가지고 있는 권한이 있는 파일 리스트로 관리할 수 있으며, 반대로 파일에 대한 권한을 가지고 있는 사용자 리스트로 관리할 수 있음 
  • 공간 낭비가 심함

 

2) Grouping

  • 파일에 대한 사용자를 3가지 분류로 분할(owner, group, others)
  • 각 분류별로 파일에 대한 접근권한을 부여(분류별 3bit씩 총 9bit 사용)
  • 하나의 파일에 9bit를 할당하여 권한을 줄 수 있기때문에 효율적

3) Password

  • 파일에 Password를 부여하는 방식
  • 파일 별 Password, 접근권한 별 등 Password에 대한 관리가 어려움


순차 접근(Sequence)

 - 파일을 읽는데 처음부터 읽는방식

 - A, B, C로 구성된 파일에서 C를 읽기 위해서 A, B를 읽은 다음 읽어야함

 

직접 접근(Direct)

 - 파일을 읽는데 임의의 시점부터 읽는방식

 - A, B, C로 구성된 파일에서 C를 읽기 위해서 C를 바로 읽을 수 있음

 

 

디스크에 파일 데이터를 저장하는 방식에는 3가지가 존재한다.

 

* 디스크에는 저장할 수 있는 논리적인 최소단위를 블록이라 함

* 하나의 블록은 하나의 섹터로 구성됨(섹터는 512 byte)

 

1) Continuous Allocation

 - 파일 데이터를 연속적으로 블록에 할당하는 방식

 

장점

  • 파일 데이터가 인접해있기 때문에 빠른 I/O가 가능하다. 빠르게 저장하고 읽어와야하는 Swap Area에 사용된다.
  • 디스크의 데이터를 읽어오는 시간은 header가 seek 하는 시간이 가장 큰 비중을 차지하기 때문에 블록들이 인접하게 할당되었을 경우 header가 블록을 찾을 움직임이 많지 않기 때문에 빠른 I/O가 가능하다. 
  • 직접 접근이 가능하다.

단점

  • 외부조각이 발생할 수 있으며, 파일의 수정에 제한이 있다.(파일은 크기가 변할 수 있기 때문에)
  • 수정될 것을 대비하여 블록을 크게 할당할 경우에는 내부조각이 발생할 수 있다.

 

2) Linked Allocation

 - 블록에 데이터와 다음 블록을 가르키는 포인터를 할당하는 방식

 

장점

  • 조각이 발생하지 않는다.
  • 파일의 수정에 제한이 없다.

단점

  • 순차접근만이 가능하다.
  • 하나의 블록(섹터)이 고장이 발생하여 읽지 못할경우 다음 블록을 읽을 수 없다.
  • 블록의 일부를 다음 블록을 가르키는 포인터로 사용해야 하기 때문에 블록 전체를 데이터 공간으로 사용할 수 없다.

 

3) Indexed Allocation

 - 파일을 구성하는 블록을 가르키는 포인터를 파일의 첫 블록(인덱스 블록)에 할당하는 방식

 - 데이터가 큰 파일은 Multi-Level or Linked Schema를 이용하여 인덱스 블록을 구성할 수 있음

 

 

장점

  • 직접 접근이 가능하다.
  • 조각이 발생하지 않는다.
  • 파일의 수정에 제한이 없다.

단점

  • 크기가 작은 파일(하나의 블록만을 사용하는)의 경우 불필요하게 인덱스 블록을 할당해야 한다.

 

여러 파일시스템이 존재하며 유닉스계열의 파일시스템과 윈도우계열의 파일시스템을 알아본다.

 

유닉스 파일시스템

 - 파일의 metadata를 저장하는 inodeList 영역이 존재한다.

 - 하나의 파일에 하나의 inode가 매칭

 - inode는 고정된 크기이며, inode에 대한 구성은 직접적으로 데이터블록을 가르키는 영역, 한번의 포인터를 이용하는 인덱스 영역, 두번의 포인터를 이용하는 인덱스 영역 등으로 구성되어 있다.

 - 파일의 크기에 상관없이 디스크 공간을 효율적으로 관리한다.

 

FAT(Fast Allocation Table) 파일시스템

 - 파일의 metadata 대부분은 directory가 관리하며, 파일의 위치만 FAT이라는 테이블이 관리한다.

 - FAT 테이블에는 모든 파일에 대한 위치정보가 저장되고 관리된다.

 

 

VFS

 - 여러 파일시스템이 존재하기 때문에 사용자는 같은 기능일지라도 서로 다른 파일시스템의 함수를 호출을 해야하는 문제가 발생

 - 이러한 문제점을 보완하기 위해 추상화를 제공함으로써 해결(JDBC의 API를 생각하면 됨)

 

 

NFS

 - Network를 통해 원격에 존재하는 파일시스템을 사용할 수 있게 함

 - 클라이언트측과 서버측에서 NFS 에 대한 모듈이 존재해야 함