운영체제 공룡책

[운영체제 공룡책] 13장 File -System Interface

studyingalone 2025. 3. 24. 17:36

13.1 File Concept

  • 컴퓨터는 NVM 장치, HDD, 자기 테이프, 광 디스크와 같은 다양한 저장 매체에 정보를 저장할 수 있다.
  • 운영체제는 저장 장치의 물리적 속성을 추상화하여 논리적 저장 단위인 파일(file)을 정의한다.
  • 파일은 비휘발성 저장 장치에 저장되므로 시스템이 재부팅되어도 데이터가 유지된다.
  • 파일은 관련된 정보를 저장하는 이름이 있는 데이터의 집합이며, 프로그램(소스 코드 및 실행 파일)이나 숫자, 문자, 바이너리 데이터 등 다양한 형태를 가질 수 있다.

13.1.1 File Attributes

파일에는 운영체제가 관리하는 다양한 속성이 있다.

  • 이름(Name): 사람이 읽을 수 있는 문자열 형식의 파일명
  • 식별자(Identifier): 파일 시스템에서 파일을 식별하는 고유 태그(숫자)
  • 유형(Type): 파일의 종류(ex: 실행 파일, 텍스트 파일 등)
  • 위치(Location): 파일이 저장된 장치 및 해당 위치
  • 크기(Size): 파일의 현재 크기 및 최대 허용 크기
  • 보호(Protection): 파일에 대한 접근 권한(읽기, 쓰기, 실행)
  • 타임스탬프 및 사용자 정보: 파일의 생성, 수정, 마지막 사용 시간 기록

13.1.2 파일 작업(File Operations)

  • 파일은 추상 데이터 타입(ADT)이다.
  • 운영체제가 수행할 수 있는 주요 작업
    1. 파일 생성(Create): 파일을 저장할 공간을 할당하고, 디렉터리에 파일 정보를 추가한다.
    2. 파일 열기(Open): 파일을 열면, 운영체제가 파일 핸들(handle)을 반환하여 이후 작업에서 검색 과정을 생략할 수 있다.
      • 프로세스별 테이블: 파일 포인터, 접근 권한 등의 정보를 저장
      • 시스템 전체 테이블: 파일의 위치, 크기, 접근 기록 등을 저장
      • 열기 횟수(Open count): 여러 프로세스가 동일한 파일을 열었을 때 이를 추적하여 마지막 프로세스가 닫을 때 파일을 정리
      • 파일을 열면 시스템은 테이블에 정보를 추가하고, 닫을 때(open count가 0이 되면) 정보를 제거한다.
    3. 파일 쓰기(Write): 열린 파일에 데이터를 기록하며, 쓰기 포인터를 관리한다.
    4. 파일 읽기(Read): 열린 파일에서 데이터를 가져오며, 읽기 포인터를 업데이트한다.
    5. 파일 위치 변경(Reposition, Seek): 파일 내에서 읽기/쓰기 위치를 변경한다.
    6. 파일 삭제(Delete): 디렉터리에서 파일을 제거하고, 할당된 공간을 해제한다.
    7. 파일 내용 삭제(Truncate): 파일의 속성은 유지하면서 내용을 모두 삭제한다.

13.1.3 File Types

  • 운영체제는 파일 유형을 인식하고 지원할지 고려해야 한다.
  • 파일 유형을 알면 운영체제가 해당 파일에 적절한 방식으로 작업할 수 있다.
  • 일반적으로 파일 이름에는 확장자가 포함되며, 확장자를 통해 파일의 유형을 식별할 수 있다.

Common file types


13.1.4 File Structure

  • 파일 유형은 파일의 내부 구조를 나타내기도 한다. 소스 코드, 객체 파일, 실행 파일 등은 특정한 구조를 가져야 한다.
  • 운영체제가 다양한 파일 구조를 지원하면 크기가 커지고 복잡성이 증가한다.
  • UNIX 및 Windows는 최소한의 파일 구조를 지원하는 방식으로 유연성을 높인다.
  • 예를 들어, UNIX에서는 모든 파일을 단순한 바이트 스트림으로 간주하며, 구조 해석은 응용 프로그램에서 처리해야 한다.

13.1.5 Internal File Structure

  • 파일에서 특정 오프셋을 찾는 것은 운영체제에서 복잡한 작업일 수 있다.
  • 디스크 시스템은 일반적으로 일정한 블록 크기(예: 512바이트)를 갖고 있으며, 모든 입출력 작업은 블록 단위로 이루어진다.
  • 따라서 논리적 레코드 크기와 물리적 블록 크기가 일치하지 않는 경우 여러 논리적 레코드를 하나의 물리적 블록에 패킹하는 방식이 사용된다.
  • 파일 크기가 블록 크기의 배수가 아닐 경우 마지막 블록의 일부가 낭비될 수 있는데, 이를 내부 단편화라고 한다. 블록 크기가 클수록 내부 단편화로 인한 낭비도 증가한다.

13.2 접근 방법 (Access Methods)

파일에서 정보를 읽고 사용할 때 여러 가지 접근 방법이 존재한다. 일부 시스템은 하나의 접근 방법만 제공하는 반면, 메인프레임 운영체제와 같은 일부 시스템은 다양한 접근 방법을 지원한다.


13.2.1 순차 접근 (Sequential Access)

  • 가장 단순한 접근 방식으로, 파일 내 정보를 순차적으로 읽고 쓰는 방식이다.
  • 파일 포인터가 자동으로 다음 위치로 이동하며, 주로 텍스트 편집기나 컴파일러가 이러한 방식을 사용한다.
  • 일부 시스템에서는 특정 개수(n)만큼 앞으로 또는 뒤로 이동할 수도 있다. 이 방식은 테이프 저장 방식과 유사하다.

Sequential-access file


13.2.2 직접 접근 (Direct Access)

  • 파일을 고정 길이 블록으로 나누고, 특정 블록을 임의로 읽고 쓸 수 있는 방식이다.
  • 디스크 저장 방식과 유사하며, 블록 번호를 기반으로 접근한다. 예를 들어, 항공사 예약 시스템에서는 특정 항공편 정보를 해당 블록에 저장하여 빠르게 조회할 수 있다.
    • read(n): 특정 블록(n)을 읽음
    • write(n): 특정 블록(n)에 씀
    • position file(n): 파일 포인터를 블록(n) 위치로 이동

13.2.3 기타 접근 방법

직접 접근 방식 위에 인덱스를 추가하여 검색 성능을 향상시킬 수 있다.

  • 인덱스 기법: 책의 색인처럼 특정 블록을 가리키는 포인터를 저장하여 검색 속도를 높임
  • 다단계 인덱스: 인덱스가 너무 클 경우, 1차 인덱스 → 2차 인덱스 → 실제 데이터 블록 순으로 접근
  • ISAM(Indexed Sequential Access Method): IBM의 방식으로, 이중 인덱스를 사용하여 최대 두 번의 직접 접근으로 원하는 데이터를 찾을 수 있음

13.3 디렉터리 구조 (Directory Structure)

디렉터리는 파일 이름을 파일 제어 블록(File Control Block, FCB)으로 변환하는 심볼 테이블(Symbol Table) 역할을 한다. 이를 어떻게 조직하느냐에 따라 파일을 검색, 생성, 삭제, 열거(listing), 이름 변경, 파일 시스템 탐색 등의 기능을 효과적으로 수행할 수 있다


13.3.1 단일 레벨 디렉터리 (Single-Level Directory)

구조:

  • 모든 파일이 하나의 디렉터리에 저장되는 가장 단순한 구조
  • 사용하기 쉽고 구현이 간단함

Single-Level Directory

문제점:

  • 파일 이름이 중복될 수 없음 (모든 파일 이름이 고유해야 함)
  • 사용자가 많거나 파일 개수가 많아지면 관리가 어려워짐
  • 예: 여러 학생이 같은 이름의 과제 파일(prog2.c, assign2.c 등)을 생성할 경우 충돌 발생

13.3.2 이중 레벨 디렉터리 (Two-Level Directory)

구조:

  • 마스터 파일 디렉터리(MFD, Master File Directory): 각 사용자 계정에 대한 포인터를 저장
  • 사용자 파일 디렉터리(UFD, User File Directory): 개별 사용자마다 별도의 디렉터리를 가짐
  • 각 사용자는 자신의 디렉터리 내에서만 파일을 관리하며, 다른 사용자의 파일과 충돌하지 않음

Two-level directory structure

장점:

  • 사용자가 각각의 파일을 독립적으로 관리할 수 있음
  • 파일 이름 충돌 문제 해결 가능

단점:

  • 사용자는 기본적으로 다른 사용자의 파일에 접근할 수 없음 → 협업이 어려움
  • 특정 사용자의 파일을 접근하려면 전체 경로를 입력해야 함
  •  예:
    • 사용자 A의 파일: test.txt
    • 사용자 B의 파일: /userb/test.txt

경로(Path) 개념:

  • 파일을 고유하게 식별하기 위해 경로 이름(Path Name) 사용
  • 운영체제에 따라 경로 표기 방식이 다름
    • Windows: C:\userb\test.txt
    • UNIX/Linux: /home/userb/test.txt
  •  

13.3.3 트리 구조 디렉터리 (Tree-Structured Directories)

트리 구조 디렉터리디렉터리를 계층적으로 구성하는 가장 일반적인 방식이다. 이 구조에서는 루트 디렉터리를 최상위에 두고, 각 파일은 고유한 경로를 가진다.

 

디렉터리의 개념과 역할

  • 디렉터리(또는 하위 디렉터리)는 여러 파일과 하위 디렉터리를 포함할 수 있다.
  • 많은 운영체제에서 디렉터리는 특별한 파일 형태로 취급되며, 파일인지 디렉터리인지 구분하는 비트 값이 존재한다.
  • 디렉터리를 생성하거나 삭제할 때는 운영체제에서 제공하는 특별한 시스템 호출을 사용한다.

Tree-structured directory structure

 

작업 디렉터리(Current Directory)

  • 각 프로세스는 현재 작업 중인 디렉터리(현재 디렉터리)를 가진다.
  • 파일을 참조할 때, 현재 디렉터리에서 먼저 검색한다.
  • 사용자는 시스템 호출을 통해 현재 디렉터리를 변경할 수 있다.
  • 사용자의 초기 디렉터리는 로그인할 때 운영체제가 사용자 계정 정보에서 찾은 디렉터리로 설정된다.

절대 경로 vs 상대 경로

  • 절대 경로(Absolute Path): 루트("/")부터 시작하는 전체 경로를 포함한다.
  • 상대 경로(Relative Path): 현재 디렉터리를 기준으로 특정 파일 또는 디렉터리에 접근하는 방법이다.
  • 예를 들어, /spell/mail/prt/first는 절대 경로이고, 현재 디렉터리가 /spell/mail일 때 prt/first는 상대 경로가 된다.

디렉터리 삭제 정책

  • 디렉터리가 비어 있을 경우, 이를 포함하는 상위 디렉터리에서 해당 항목을 제거하면 된다.
  • 비어 있지 않은 디렉터리는 두 가지 방식으로 삭제할 수 있다.
    1. 수동 삭제: 디렉터리 내 파일과 하위 디렉터리를 먼저 삭제한 후, 디렉터리를 삭제하는 방식.
    2. 재귀 삭제: rm -r과 같이 디렉터리 및 모든 하위 항목을 자동으로 삭제하는 방식.

13.3.4 비순환 그래프(Acyclic-Graph) 디렉터리

두 명 이상의 사용자가 동일한 파일을 공유해야 할 때, 파일을 두 개 복사하는 대신 공유하도록 설계된 구조이다.

 

공유 디렉터리의 필요성

  • 협업 프로젝트를 진행하는 두 프로그래머가 동일한 하위 디렉터리를 공유하고 싶을 때 유용하다.
  • 단순 트리 구조에서는 디렉터리나 파일을 공유할 수 없기 때문에, 비순환 그래프(Acyclic Graph) 구조를 사용한다.

 

공유 파일과 복사본의 차이점

  • 파일을 복사하면 변경 사항이 다른 복사본에 반영되지 않는다.
  • 반면 공유 파일은 단일 파일을 여러 디렉터리에서 접근할 수 있도록 하여, 변경 사항이 즉시 반영된다.

 

공유 파일 및 디렉터리 구현 방식

  1. 링크(Link) 사용
    • UNIX 시스템에서는 심볼릭 링크(symbolic link)나 하드 링크(hard link)를 사용하여 공유 가능.
    • 심볼릭 링크는 파일의 경로를 저장하며, 원본 파일이 삭제될 경우 링크가 깨질 수 있다.
    • 하드 링크는 원본 파일과 동일한 inode를 가리키므로, 원본 파일이 삭제되어도 링크를 통해 접근 가능하다.
  2. 디렉터리 항목 복제
    • 두 디렉터리에 동일한 파일 정보를 복제하는 방식.
    • 하지만 파일이 변경될 경우, 동기화 문제가 발생할 수 있다.

Acyclic-graph directory structure

 

비순환 그래프 디렉터리의 문제점

  1. 다중 경로 문제
    • 동일한 파일이 여러 경로로 접근 가능하여, 파일 이름의 모호성이 발생할 수 있다.
  2. 삭제 문제
    • 공유 파일을 삭제할 때, 모든 참조가 사라지면 공간을 해제해야 한다.
    • 참조 리스트를 유지하여 모든 참조가 제거될 때 파일을 삭제하는 방법이 사용됨.
    • UNIX는 하드 링크에 대해 참조 횟수(Reference Count)를 유지하여 해결한다.

13.3.5 일반 그래프(General Graph) 디렉터리

비순환 그래프 구조에서 링크가 순환(cycle)을 형성하게 되면 일반 그래프 구조가 된다.

General graph director

 

일반 그래프 구조의 문제점

  1. 순환 문제
    • 순환이 발생하면 디렉터리를 탐색할 때 무한 루프에 빠질 수 있다.
    • 특정 개수 이상의 디렉터리를 접근하지 않도록 제한을 두는 방법이 있음.
  2. 파일 삭제 문제
    • 참조 횟수가 0이 되면 파일을 삭제할 수 있는 비순환 그래프와 달리, 순환이 존재하면 참조 횟수가 0이 되지 않는 경우가 발생할 수 있다.
    • 이를 해결하려면 가비지 컬렉션(Garbage Collection)을 수행해야 한다.

가비지 컬렉션(Garbage Collection) 방식

  • 파일 시스템 전체를 탐색하여 접근 가능한 파일을 표시(marking)하고, 접근할 수 없는 파일을 삭제하는 방식.
  • 그러나 이 방식은 매우 비용이 크므로 거의 사용되지 않는다.

순환을 방지하는 방법

  • 운영체제가 링크를 추가할 때 순환 여부를 검사하면 해결할 수 있지만, 이 검사는 비용이 많이 든다.
  • 간단한 해결책은 디렉터리 탐색 시 링크를 무시하는 방식이다.
  • UNIX에서는 디렉터리에 대한 하드 링크를 금지하여 비순환 구조를 유지한다.

13.4 보호 (Protection)

컴퓨터 시스템에 정보를 저장할 때, 우리는 이를 물리적 손상(신뢰성 문제)과 부적절한 접근(보호 문제)으로부터 안전하게 지켜야 한다.

 

17장에서 자세히..


13.5 메모리 매핑 파일 (Memory-Mapped Files)

  • 파일에 접근하는 또 다른 방법으로, 매우 일반적으로 사용되는 방식이 메모리 매핑(Memory-Mapped Files) 이다.
  • 이는 디스크의 파일을 기존 방식(open(), read(), write() 등의 시스템 호출)으로 읽고 쓰는 것이 아니라 가상 메모리 기술을 활용하여 파일을 메모리에 매핑 함으로써 성능을 향상시키는 방법이다.

13.5.1 기본 메커니즘 (Basic Mechanism)

메모리 매핑은 디스크 블록을 물리 메모리의 페이지와 매핑하는 과정으로 이루어진다. 파일에 대한 첫 번째 접근 시 페이지 폴트(Page Fault) 가 발생하여, 파일의 페이지 단위 데이터가 파일 시스템에서 물리 메모리로 읽혀진다. 이후에는 해당 데이터를 메모리를 접근하는 방식과 동일하게 처리할 수 있어 read() 및 write() 시스템 호출을 사용하는 것보다 빠르고 효율적이다.

  • 파일의 변경 사항은 즉시 디스크에 반영되지 않는다. 대부분의 운영체제에서는 파일이 닫힐 때 변경 사항이 디스크에 저장된다.
  • 메모리 부족 상황이 발생하면 임시로 스왑 공간에 저장하여 데이터 손실을 방지할 수 있다.
  • Solaris 같은 운영체제는 모든 파일 I/O를 메모리 매핑으로 처리하여 효율성을 높인다.

Memory-mapped files

 

멀티 프로세스 환경에서는 여러 프로세스가 동일한 파일을 메모리 매핑하여 데이터 공유를 할 수 있다. 즉, 하나의 프로세스가 파일에 변경을 가하면, 같은 파일을 매핑한 다른 프로세스에서도 변경 사항을 확인할 수 있다.