CS

[CS] - File System

jyu_seo_ 2026. 2. 19. 10:49

File System이란?

파일,디렉토리를 운영체제에서 관리하는 것입니다.

파일 및 파일의 메타데이터, 디렉토리 정보등을 관리한다.

파일의 저장 방법을 결정하고 파일을 보호합니다.

File이란?

일반적으로 비휘발성으로 보조기억장치(하드디스크,SSD 등)에 저장되어 집니다.

운영체제는 다양한 저장 장치를 file이라는 동일한 논리적 단위로 볼 수 있게 해준다.

주로 파일 생성,읽기,수정,이동(lseek), 삭제 및 partition

파일의 metadata를 메모리에 올려놓는(Open/close)등의 조작을 할 수 있습니다.

File Attribute(metadata)

  • 파일 자체의 내용이 아니라 파일을 관리하기 위한 각종 정보들을 나타냅니다.
    • 파일 이름 / 유형 / 저장된 위치 / 파일 size / 소유자 등
    • 접근 권한(읽기/쓰기/실행)
    • 시간(생성/변경/사용)

File Protection

  • 각 사용자가 파일에 대해 어떠한 권한이 있는지 확인합니다.
  • Access Control 방법
    • Access control Matrix
      • 파일을 주체로 권한이 있는 사용자들을 묶어 놓는 방법입니다.

  • Grouping
    • 전체 사용자를 owner,group,public의 세 그룹으로 구분합니다.
    • 각 파일에 대해 접근 권한을 3비트씩으로 표시합니다.
      • 각각 owner,group,public입니다.
      • rwx l r- l r- (111,100,100)
  • password
    • 파일마다 암호를 두는 기법입니다.(directory에 두는것도 가능)
    • 접근 권한별로 암호가 달라야 합니다.
      • 이는 암기문제로 인한 문제로 이어질수 있고,
      • 암호를 다른곳에 적어두는 등의 보안 사고등이 발생할 수 있습니다.

Directory란?

파일의 메타데이터 중의 일부를 보관하는 일종의 특별한 파일입니다.

디렉토리에 속한 파일 이름 및 파일 Attribute 등을 보관합니다.

주로 파일 검색, 파일 생성, 파일 삭제 및 Directory 내 파일 목록, Directory 내 파일 변경,

파일 시스템 탐색(계층 구조 읽기)을 수행 할 수 있습니다.

디렉토리의 구현

  • Linear list 방식

  • 파일의 이름과 metadata를 미리 정해진 bit씩을 정해서 저장하는 방법입니다.
  • 디렉토리에 어떤 파일이 있는지 찾으려고 하면 파일의 이름이 시작되고 종료되는 위치로 찾아보면 됩니다.
  • 하지만 파일을 찾을때 일일히 다 찾아봐야 하니까 상당히 비효율적 입니다.

 

  • Hash Table 방식

 

  • Linear list 방식에서 파일의 이름을 정해놓은 해시 함수를 통해 도출을 합니다.
  • 도출된 값으로 파일 이름 대신 해당하는 메타데이터들과 파일이름을 넣어놓는 방법입니다.
  • 해시값의 충돌이 발생할 수 있다.
  • 1 < F(file name) < N, F는 해시 함수

 

  • 긴 이름의 파일 저장 방법

  • 파일의 길이가 긴 경우 파일의 일부에 존재시키는 방법입니다.
  • ex:) file name entry가 4일 때, aaabb 파일 명이 올 경우
    • 3자리까지 표기한 후(aaa)마지막 자리에는 포인터의 위치를 두어 파일의 마지막에 마저 이름을 저장하고 \O로 끝났다는것을 알려줍니다
    • 포인터는 해당 위치로 이동하여 거꾸로 읽습니다. \0 ⬅️ b ⬅️ b

 

  • File의 metadata 보관 위치
    • 디렉토리에 직접 보관하는 방법이 있습니다.
    • 디렉토리에 포인터를 두고 다른 곳에 보관하는 방법이 있습니다.
      • Inode, FAT

Partition이란?

오른쪽 그림처럼 저장장치의 구역을 나누어 사용함

 

비교적 큰 보조기억장치(하드디스크나 SSD 등)를 원하는 크기로 나누어 드라이브를 논리적으로 여러 부분으로 분할하는 것입니다.
반대로 물리적인 디스크 여러개를 하나의 파티션으로 구성하기도 합니다.
파티션을 나눈뒤 각각의 파티션에 file system을 깔거나 swapping 용도로도 사용할 수 있습니다.

 

그런데 이렇게 파티셔닝을 한다거나 여러개의 SSD(보조기억장치)들을 사용하게 되었을때 파일시스템에서는 어떻게 연결을 해둘까? 방법은 아래와 같이 File System의 Mounting을 사용한다!

 

File System의 Mounting

 

  • 서로 다른 disk(파티션)에 데이터를 읽어야 하는 경우 연결을 하는 방법입니다.
  • 위 사진과 같이 최상위 disk로 설정한 root에 다른 disk의 루트를 연결하는 방법입니다.

OPEN() 동작과정

아까 파일의 metadata를 메모리에 올려놓는 Open/Close 과정이 진행된다고 했다.

어떻게 하여 실제 메인메모리에 파일의 데이터가 올라올 수 있는지 아래의 그림과 함께 흐름을 파악해 보겠다.

 

1. System call(open)

  • Process A의 코드에서 d_directory = open("a/b") 시스템 콜을 전달하여 b파일의 메모리주소를 요청합니다.

2. a 디렉토리의 메타데이터를 가져온다.

  • root metadata를 통해 root content에 접근하여 a(directory)의 metadata를 가져옵니다.

3. B 메타데이터를 가져온다.

  • a metadata를 확인하여 a content에 접근하여 b(file)의 metadata를 가져옵니다.
  • 가져온 b metadata process A PCB 파일 디스크립터 테이블에저장합니다.
  • 해당 파일 디스크립터 테이블에 저장한 b_directory를 process A에게 전달합니다. 

4. System call(read)

  • read() 시스템 콜을 전달하여 b_directory의 메타데이터로 b파일을 읽기위한 요청을 합니다.
  • OS는 해당 파일의 파일 디스크립터(b_directory)를 통해 파일 시스템 버퍼(cache)에서 데이터를 찾습니다.
  • 없을 경우 b metadata 정보로 b Content에 접근하여 가져옵니다.

5. 커널 버퍼 캐시에 저장하고 이를 Process  A에게 복사하여 줍니다.

  • 이를 복사하여 요청하였던 b 파일에 대한 데이터를 Process A에게 전달해줍니다.

 

마무리 하며

 

사실 여태까지의 운영체제들의 동작방식을 살펴보았을 땐 주로 방어적으로 코딩을 하며 약간의 성능보다는 안정성을 택하는 경향을 많이 봐왔기 때문에 저로써는 "이렇게까지 하는 구나.." 싶은 적도 있었습니다.

때문에 이번에도 연속 할당 방법에서 나온 단점들로 미루어 보았을 때 스왑메모리와 Realtime 시스템 같은 곳에서도 "에이 또 이런 단점들이 있으면 OS는 다른 방법들을 사용하겠네!" 라고 생각하였지만, 연속 할당의 빠른점을 사용하는 면에서 "그래도 확실한 장점이 있으면 이런 선택도 하는 구나" 라고 개인적으로는 살짝 놀랐던 것 같습니다.

 

그리고 이번에 OS를 학습하느라 파일시스템까지도 학습하였지만 파일시스템만으로도 책 한권이 나올 정도로 학습할것이 많은 주제인 것을 깨달았고, 현재는 파일시스템의 개념과 간단한 동작원리만 이해한 다음 우선순위가 높은 학습목표들이 끝나고 나면 아직 지식이 부족하여 이해가 안되었거나 더 궁금했던 부분들을 파일시스템 책을 사서 꼭 다시 학습 해봐야겠다고 생각이 되었습니다.