본문 바로가기
Computer Science/운영체제

Operating System - Ch14-15: File system

by NCTP 2022. 6. 19.

ㅇ본 글은 Operating System Concepts 10판을 기준으로 작성되었습니다...!

 

 

 

이번 챕터에서는 File system에 대해 알아보자.

 

File System Implementation

파일 시스템의 구현은 크게 두 가지로 나뉜다.

 

- In-memory structure: 운영체제가 시작되서 해당 프로세스가 파일을 접근할 때 필요한 구조.

- On-disk structure: 전원이 꺼져도 Secondary storage가 데이터를 저장하기 위해 필요한 구조.

 

In-memory structure

특정 프로세스가 파일에 접근하기 위해 open을 수행하면 file descriptor가 반환이 된다. 이것을 가지고 read/write을 하게 된다. open할 때 경로가 포함되어 있는 파일이름을 지정하면 디렉토리 구조에 따라 디스크에 접근을 할 수 있다. 

 

프로세스가 파일을 w/r하는 주체지만, 실제로 이를 처리하는 것은 운영체제다. 따라서 프로세스들이 system call로 운영체제에게 부탁을 하게 된다. 운영체제는 관리를 위해 file table을 유지를 하고, 프로세스는 자신이 오픈한 파일들에 대해서 per-process file descriptor table을 유지한다. 물론 여기에 저장되어 있는 정보 역시 운영체제의 file table에도 저장되어 있다. 프로세스가 파일에 대해 w/r을 운영체제에 요청하면 운영체제가 disk controller에게 명령을 보내서 수행을 한다.

 

File table(system-wide open-file table): 모든 프로세스들이 요청한 오픈되어있는 파일의 정보를 다 가지고 있는 테이블.

 

Virtual File System

여러 파일 시스템의 공통적인 부분을 Virtual File System이라 한다. 상속의 개념이라면 Virtual File System이 부모 클래스가 될 것. 운영체제는 Virtual File System에 상이한 부분을 가진 파일 시스템들을 묶어서 관리한다.

 

Layered File System

층(Layer)이 따로 나뉘어져있는 파일 시스템

On-Disk Structure

 

  하드디스크가 있으면 메인 섹터0에 마스터 부트 레코드(MBR)가는 것이 있다. 여기에는 boot loader가 저장되어있다. 만약 로드할 운영체제가 여러가지라면 P1에는 윈도우즈, P2에는 맥, P3에는 리눅스 이런 식으로 저장할 수 있다. 이 때 MBR 안의 boot loader가 어떤 파티션에 저장된 운영체제를 로드할 것인가를 선택하게 된다. 

  파티션 안에는 그럼처럼 파일 시스템이 구성되어 있다. 포맷을 하면 아무런 파일이 들어가 있지 않은 상태인데, 이후 파일을 저장을 하고 읽고 쓰고 실행을 하려면 저정도 구조는 만들어주어야 한다. 포맷하는 데에 시간이 걸리는 이유가 이 시스템을 만들기 위해서이다.

  -boot block: 부팅에 필요한 것들을 저장하는 곳 (윈도우즈에서는 boot sector) boot block은 부팅이 될 수 있는 파티션에만 존재한다.

  -super block: file system 전체에 대한 정보를 지닌 곳(시스템 크기, 블록의 수 등등...) (윈도우즈에서는 master file table)

  -bitmaps block: 존재하는 디스크 블록들이 사용 중인지에 대한 정보를 저장하는 곳 

  -i-nodes block: 파일 하나하나에 대한 정보(FCB)를 저장하는 곳, 파일 하나당 하나씩 가지고 있다.

  -root dir: root directory를 기준으로 계층적인 디렉토리 구조가 만들어진다.

  -files & directories

File Control Block (FCB)

 

Directory Implementation

디렉토리는 어떠한 파일들이 존재하는지에 대한 정보를 담도록 구현되야 한다.

- In the directory entry: 디렉토리 내에 파일들의 이름과 그에 대한 FCB등 모든 정보를 싹 다 집어넣는 구현방식

- In the separate data structure: 디렉토리에 파일 이름을 저장하고 이름을 통해 파일의 FCB에 접근하도록 구현하는 방식 (Unix)

- A hybrid approach: 둘 다 사용하는 방식 (Windows)

 

Allocation Methods

파일들이 사용하는 블럭들을 어떻게 디스크에 배치하고, 관리하는 방법

- Contiguous allocation: 파일 하나에 대한 블럭들을 연속적으로 배치하는 방법. 장점으로는 디렉토리가 파일 이름과 시작 위치, 길이만 알면 되고, 디스크는 한번에 많이 읽어올수록 성능이 좋아지므로 효율이 좋다. 단점으로는 Fragmentation이 방생한다. CD-ROMS같은 데이터의 변화가 없는 매체에서 사용된다.

- Linked allocation: Linked-list처럼 블록마다 포인터를 두고 마지막에는 Null을 넣는 방법. 장점으로는 contiguous allocation의 단점인 external fragmentation이 사라진다. 파일 크기가 가변적이어도 제약이 없고, 디렉토리가 파일 이름과 파일 시작 위치만 가지고 있으면 된다. 단점으로는 contiguous allocation보다 효울성이 떨어진다. 포인터 하나에 문제가 생기면 전체에 문제가 가므로 신뢰성 문제를 지닌다.

- Indexed allocation: 포인터를 두지 말고 블록에게 인덱스를 부여하여 인덱스를 통해 관리를 하는 방법. direct-access에도 문제 없고, index가 날아가도 특정 파일만 날아가고 다른 파일들은 안전하다. 특정 블록가 인덱스들을 저장하고 있고, 이를 index block( = i-nodes)이라 부른다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글