Computer Science Basics/운영체제

OS - 8. File System

타자치는 문돌이

RAM은 크기가 제한되고, 컴퓨터가 꺼지면 데이터가 사라진다.
그러나 컴퓨터가 꺼져도 유지되고, 크기가 큰 데이터를 저장하면서, 여러 프로세스의 동시 접근 같은 CPU와 RAM의 작동을 감당할 수 있는 저장 방법이 필요하다.
운영체제는 이런 데이터를 파일이라는 단위로 Secondary Storage에 저장해 관리한다.


File

파일은 연관된 정보의 묶음을 Secondary Storage에 기록한 것이다.
사용자의 입장에서 파일은 Secondary Storage에서 가장 작은 할당 단위로, 파일에 데이터를 작성하는 방법 말고 Secondary Storage에 데이터를 기록할 수 없다.

File Name & Extension

우리가 파일 탐색기에서 흔히 보는 파일명은 이름 + 확장자의 구조이다.

Lostark.exe		discord.exe		FinalEssay_진짜_최종.docx

파일에 파일명을 지정해 사용자는 파일이 저장된 Block이나 Sector를 외우는 것이 아니라 사람이 읽기 쉬운 이름을 보고 찾을 수 있다.
프로세스가 파일을 생성하고 이름을 지어주면 다른 프로세스는 이름을 기준으로 파일을 찾는다.
파일명은 OS에 따라 다른 규칙을 가지기도 한다. (주로 255자, 특정 특수문자 사용 불가, 대소문자 구별/인식 불가)

파일이 어떤 유형인지 구별하기 위해 확장자를 사용한다. 확장자로 구별된 유형에 따라 프로그램이 파일을 다르게 읽기도 한다. UNIX 운영체제에서는 확장자를 반드시 붙일 필요가 없지만, C Compiler 같은 몇몇 프로그램은 확장자를 강제하기도 한다.


Access Methods

파일의 데이터에 접근하는 방법은 여러 가지가 있다.

  • Sequential Access : 파일을 순서대로 읽고 쓴다. (Linked List처럼 next->next->next로 접근하는 식)
  • Direct Access : 임의 접근을 허용한다. (Array[2]처럼 데이터에 바로 접근할 수 있음)

File Attributes

파일은 다양한 속성 정보를 가지고 있다.

  • 이름
  • Identifier : 파일을 구분하는 번호
  • Type
  • 위치
  • 크기
  • 보호 : 읽기/쓰기/실행 명령을 실행할 수 있는 사용자를 제어한다.
  • 시간, 날짜, 사용자 등등

File Operations

운영체제는 File Operation을 위한 다양한 System Call을 제공한다.
그중에서 가장 기본이 되는 명령은

  • 생성
  • 삭제
  • 읽기
  • 쓰기

이다.


Protection

파일의 주인은 파일을 누가 어떻게 할 수 있는지 제어할 수 있어야 한다. (뒤에서 다룰 Directory도 마찬가지다)아무나 읽고 수정하고 실행하고 삭제할 수 있으면 안된다.

파일에서

  • 읽기
  • 쓰기
  • 실행
  • 수정
  • 삭제

를 하는 것을 접근이라고 한다. (디렉터리는 내용 보기가 포함된다)이러한 파일의 접근 권한은 사용자에 따라 달라야 할 수도 있다.
이를 구현하기 위해 파일과 디렉터리에 Access-Control List라는 명단을 결합해 파일과 디렉터리에 따른 사용자의 권한을 제어한다.

Windows에서 파일 속성에 들어가면 접근 권한을 설정할 수 있는 탭을 볼 수 있다.

UNIX 기반 운영체제에서는 ls -al 명령어로 확인할 수 있다.

> ls -al

합계 16
drwxrwxr-x 4 ubuntu ubuntu 4096  4월 25 04:38  .
drwxr-xr-x 5 ubuntu ubuntu 4096  4월 25 04:37  ..
-rw-rw-r-- 1 ubuntu ubuntu    0  4월 25 04:38 'File 1'
-rw-rw-r-- 1 ubuntu ubuntu    0  4월 25 04:38 'File 2'
-rw-rw-r-- 1 ubuntu ubuntu    0  4월 25 04:38 'File 3'
drwxrwxr-x 2 ubuntu ubuntu 4096  4월 25 04:38 'Folder 1'
drwxrwxr-x 2 ubuntu ubuntu 4096  4월 25 04:38 'Folder 2'

맨 앞의 drwxrwxr-x와 같은 문자열이 권한을 나타낸다.
맨 앞자리는 디렉터리인지, 파일인지를 나타낸다. d는 디렉터리, -는 파일이다.
다음 3자리는 소유자의 권한, 다음 3자리는 그룹 사용자의 권한, 다음 3자리는 기타 사용자의 권한이다.

  • r--은 읽기,
  • -w-은 쓰기,
  • --e는 실행 권한이다.

Directory

여러 파일을 모아 디렉터리를 만들 수 있다. Windows에서는 폴더라고 한다.

Directory Operation

디렉터리도 파일처럼 운영체제가 Directory Operation을 위한 System Call을 제공한다.
디렉터리의 가장 기본이 되는 명령은

  • 생성
  • 탐색
  • 삭제
  • 내용 보기
  • 이름 변경

이다.


Directory Structure

파일을 생성하면 파일에 대응하는 File Control Block도 같이 생성된다. FCB는 파일 속성 정보를 담고 있다.

기본적으로 디렉터리는 FCB 나 FCB의 포인터를 저장한다.
이걸 사용해 다양한 방식으로 전체 디렉터리와 파일 구조를 구현한다.

파일의 데이터와 디렉터리의 데이터는 모두 Disk에 저장된다.

 

Single Level


모든 파일을 한 디렉터리에 넣는다.
각 파일은 유일한 이름을 가져야 한다는 큰 제약이 있다.

 

Two Level

사용자 별로 디렉터리를 할당해 준다.
다른 사용자는 같은 파일 이름을 가질 수 있다.

 

Tree Structure


Two Level 구조를 일반화한 구조이다. 디렉터리는 하위 디렉터리를 가질 수 있다.
각 사용자는 Current Directory라는 개념을 가지고, 디렉터리를 이동할 수 있다. (Linux의 cd)
파일 이름은 Root를 기준으로 한 Absolute 방식과 Current Directory를 기준으로 한 Relative 방식을 사용할 수 있다.

Tree Structure는 검색과 프로그램 Grouping이 효과적이다.

 

Acyclic Graph

Tree 구조와 유사하나 Link를 사용해 디렉터리나 파일을 공유한다.


이런 구조는

  • Aliasing Problem : 한 파일에 대한 다른 이름이 존재할 수 있다.
  • Dangling Pointer Problem: 공유 중인 파일을 한쪽에서 삭제하면 다른 쪽은 Dangling Pointer가 된다

는 문제점이 있을 수 있다.

Hard Link와 Soft Link

Acyclic Graph 구조의 Link는 두 가지 방법으로 구현할 수 있다.

  • Hard Link : 한 파일을 참조하는 디렉터리의 개수를 기록해 두고, Count가 0일 때만 파일을 삭제한다.
    • Dangling Pointer를 막을 수 있다.
  • Soft Link : Windows의 바로가기와 같이 디렉터리가 파일을 가리키는 파일을 가지고 있는다.
    • Dangling Pointer가 있을 수 있다.

 

General Graph Directory


Link를 자유롭게 만들어 Cycle을 허용하는 그래프 모양의 구조이다.

탐색 시 Cycle로 인해 Infinite Loop가 발생할 수 있고, Self-Referencing으로 영원히 사라지지 않는 파일이 생성될 수 있어 관련 처리가 필요하다.


Disk

파일과 디렉터리는 Disk에 저장된다. Disk의 관점에서 파일 시스템은 어떻게 구현될까?

Partition

디스크는 파티션으로 나눌 수 있다. 말 그대로 디스크에 임의의 영역 구분을 하는 칸막이 역할이다.
각 파티션은 아무것도 없는 Raw 상태이거나 파일 시스템이 포함된 Cooked 상태일 수 있다.


File System

파일 시스템은 디스크에 저장되어 있다.
디스크는 1개 이상의 파티션으로 구성되어 있다.
디스크의 Sector 0부분은 Master Boot Record라고 부르며 디스크에서 가장 먼저 읽힌다.
MBR 바로 뒤에 파티션의 정보를 담는 Partition Table이 저장된다.
각 파티션의 첫 Block은 Boot Block으로 MBR이 로드해 컴퓨터 부팅 때 실행된다.


Mounting

Mounting은 현재 파일 시스템에 추가 파일 시스템을 추가하는 과정이다.
컴퓨터에 새 SSD를 추가해도 가끔 파일 탐색기에 검색되지 않는 경우가 있는데, 이 경우 Mounting이 되지 않은 것이다. 파일 시스템은 사용 전에 항상 Mount 되어야 한다.

OS Kernel을 담고 있는 Root Partition은 Boot Time에 Mount 된다. 다른 파티션은 이후 Boot Time에 자동으로 Mount 되거나 수동으로 Mount 한다.


Virtual File System

파일 시스템은 다양한 포맷이 존재한다. (NTFS, EXT2, EXT4, XFS, APFS 등)
이 포맷에 따라 디스크가 데이터를 저장하는 방법이 다르다.
따라서 디스크 포맷에 따라 디스크 안에 있는 파일을 읽고 쓰는 명령어가 다르다.
그러면 개발자는 파일을 읽는 기능이 포함된 프로그램을 만들 때 모든 포맷을 고려해야 할까?

Virtual File System은 이런 상황에서 다양한 디스크 포맷을 지원하는 Interface의 역할을 한다.
프로그램이 open(), write()와 같은 명령어를 수행하면, 디스크의 포맷을 확인하고 포맷에 맞는 명령어를 수행한다.


Block

파일 시스템은 디스크의 주소를 찾기 위해 여러 개의 Sector의 묶음인 Block이라는 단위를 사용한다.
각 파일은 Block에 할당된다. 메모리와 마찬가지로 파일에 Block을 할당하는 방법도 다양하다.

 

Contiguous Allocation


파일에 연속된 Block을 할당해 주는 방식이다.
시작 Block과 끝 Block만 기억하면 되는 단순한 방식이다.
Random Access가 가능하지만, Dynamic Allocation Problem이 일어나며 낭비되는 공간이 많다.
그리고 파일 크기가 늘어날 수 없다.

 

Linked Allocation

파일을 Block의 연결 리스트 모양으로 할당한다.
Block의 저장 위치는 크게 중요하지 않다.
시작 Block 주소만 기억하면 되는 단순한 방법이지만 Random Access가 불가능하고, Pointer를 저장할 공간이 추가로 필요하다.
Hole도 할당해 주고 연결하면 그만이므로 공간의 낭비(External Fragmentation)가 없다.

 

Indexed Allocation

파일을 여러 Block에 할당하고, 이 Block의 위치를 저장한 Index를 만든다.
시작 Block 대신 Index Block을 저장한다.
Random Access가 가능하고 공간의 낭비(External Fragmentation)가 없다.
크기가 큰 파일일 경우 Index Block이 1개로 부족할 수도 있다.

 

 

OS - 0. Index