[Computer Science]/[운영체제(OS)]

[운영체제(OS)] 14-1) 파일 시스템

극꼼 2023. 4. 19. 17:20
반응형


다음 2가지 특성을 이유로 파일 시스템을 유지하기 위한 보조저장장치에 대부분 디스크가 사용됩니다.

  • 디스크는 같은 블록에 재기록이 가능
  • 디스크에 있는 임의의 블록의 정보를 직접 접근할 수 있음

<파일 시스템 구조>

쉽게 데이터를 저장하고 찾을 수 있게 되어 있으며, 여러 층으로 이루어져 있고 각 층은 낮은 층의 기능을 사용해 새로운 기능을 만들어 상위층에 제공합니다. 파일 시스템 구현을 위해 계층 구조를 사용하여 코드의 중복을 최소화 하였습니다. 

 

1) 입/출력 제어(I/O control) : 장치 드라이버 루틴들과 인터럽트 핸들러로 이루어져 있고, 메모리와 디스크 시스템 간의 정보 전송을 담당합니다. 장치 드라이버는 번역기 역할을 하며, 입출력 제어기 메모리의 특정 위치의 특정 비트를 설정해서 제어기에 어느 장치에 어떤 일을 수행할지 알립니다.

 

2) 기본 파일 시스템(basic file system) : 적절한 장치 드라이버에 저장장치상의 블록을 읽고 쓰도록 일반적인 명령을 내립니다. I/O 요청 스케줄링을 고려하며, 메모리 버퍼와 캐시를 관리합니다.

 

3) 파일-구성 모듈(file-organization module) : 파일과 상응하는 논리 블록을 알고 있고, 어느 디스크 공간이 비어있는지를 파악하는 가용 공간 관리자를 포함하고 있습니다. 파일-구성 모듈은 요구하는 블록을 제공합니다.

 

4) 논리 파일 시스템(logical file system) : 메타데이터 정보를 관리합니다.

* 메타 데이터 : 파일 내용 자체인 데이터를 제외한 모든 파일 시스템 구조

 

5) 파일 제어 블록(FCB, file control block) : 소유, 허가, 파일 내용의 위치 등의 파일에 관한 정보를 가지고 있습니다. 

 

계층화는 각 파일 시스템이 자신의 논리 파일 시스템과 파일 구조 모듈을 가짐으로서 자칫 오버헤드로 성능을 저하시킬 수 있기 때문에 몇 개의 계층을 사용하고, 각 층이 어떤 작업을 하고, 계층의 사용 여부는 시스템 설계에 주요한 결정 사항입니다.


<파일 시스템 구현>

파일 시스템은 저장장치에 저장된 운영체제를 어떻게 부트시키는지, 블록의 총 수와 가용 블록의 수와 위치, 디렉토리의 구조, 개별 파일에 대한 정보를 디스크 상에 가지고 있습니다.

 

<디스크 상의 구조>

  • 부트 제어 블록 : 시스템이 해당 파티션으로부터 운영체제를 부트시키는 데 필요한 정보를 가지고 있습니다. 디스크에 운영체제가 없다면 제어 블록은 비어있습니다.
  • 볼륨 제어 블록 : 볼륨의 정보(볼륨의 블록의 수와 크기, 가용 블록의 수와 포인터, 가용 FCB(File Control Block)와 포인터)를 포함합니다.
  • 디렉토리의 구조는 파일을 조직화 하는데에 사용합니다.
  • 파일별 FCB는 자세한 파일 정보를 가지고 있습니다.

메모리 내의 정보는 파일 시스템 관리와 캐싱을 통한 성능 향상을 위해 사용됩니다.

<메모리 내의 정보>

  • 메모리 내의 정보는 마운트 시점에 적재 -> 파일 시스템 동작 중에 갱신 -> 마운트가 해제될 때 제거됩니다.
  • 메모리 내 파티션 테이블 : 마운트된 모든 파티션의 정보를 포함합니다.
  • 메모리 내 디렉토리 구조는 최근 접근된 디렉토리의 정보를 가집니다.
  • 범 시스템 오픈 파일 테이블(system wide open file table) : 다른 정보와 더불어 오픈된 각 파일의 FCB 복사본을 가지고 있습니다.
  • 프로세스별 오픈 파일 테이블(per-process open file table) : 프로세스가 연 모든 파일에 대한 정보와, 범 시스템 오픈 파일 테이블 내의 해당 항목에 대한 포인터를 포함합니다.
  • 버퍼 : 파일 시스템이 읽히거나 써질 때 파일 시스템 블록을 저장합니다.

<새로운 파일 생성 과정>

기본적인 파일 시스템과 입출력 제어 시스템에서 처리됩니다.

1) 프로세스는 논리 파일 시스템을 호출

2) 파일 시스템은 새로운 FCB를 할당하고 -> 해당 디렉토리를 메모리로 읽어서 생성될 파일의 이름과 FCB로 디렉토리 갱신 -> 파일 시스템에 다시 입력

3) 논리 파일 시스템은 파일 구성 모듈을 호출하여 디렉토리 입출력을 저장장치 블록 위치로 매핑


<파일 시스템 사용법>

open() 시스템 콜 :

  • 논리적 파일 시스템에 파일 이름을 넘겨줌
  • 범 시스템 오픈 파일 테이블을 검색해서 파일이 다른 프로세스에 의해 사용중인지 확인
    • 사용중 -> 기존의 범 시스템 오픈 파일 테이블을 가리키는 프로세스별 오픈 파일 테이블 항목 생성
    • 사용x -> 주어진 파일 이름을 디렉토리 구조에서 찾음
  • 프로세스별 파일 시스템 테이블 내의 해당 항목에 대한 포인터를 찾아 리턴해줍니다. 모든 파일 연산은 이 포인터를 통해 실행됩니다. 

프로세스가 파일을 닫을 때 프로세스별 테이블 항이 삭제되며, 범 시스템 항목의 오픈 계수는 감소합니다.


<디렉토리 구현>

디렉토리 공간을 어떻게 할당하고 관리하는지에 따라 파일 시스템의 효율, 성능, 신뢰성에 영향을 미칩니다.

 

<디렉토리 구조의 종류>

1) 선형 리스트(Linear List) : 디렉토리를 구현하는 가장 간단한 방법입니다. 파일 이름과 데이터블록에 대한 포인터들의 선형 리스트를 디렉토리에 사용합니다. 파일을 찾기 위해 선형 탐색을 해야하므로 실행 시간이 깁니다.

  • 파일 생성 : 디렉토리를 탐색하여 이름 중복을 확인한 다음 디렉토리의 끝부분에 새로운 항목을 생성합니다.
  • 파일 삭제 : 디렉토리에서 이름을 찾아 그 파일에 할당된 공간을 방출합니다.
  • 파일 재사용 : 항목을 미사용으로 표시하거나, 가용 디렉토리 항목 리스트에 추가합니다.

2) 해시테이블(Hash Table) : 선형 리스트와 해시 자료구조가 함께 사용됩니다. 파일 이름을 제시하면 해시로부터 값을 얻어 값을 포인터로 활용해 해당 리스트에 직접 접근할 수 있어 디렉토리 탐색 시간이 상당히 개선됩니다.

  • 단점 : 해시 테이블이 고정된 크기를 가지고, 해시테이블의 크기에 따라 해시 기능이 제한을 받습니다. 해시테이블의 크기를 넘어서서 파일을 생성하려면 해시테이블을 키우고, 기존의 디렉토리를 새로운 해시값에 맞게 조직해야합니다.
  • 체인 오버플로우 해시 테이블 : 각 해시 항목이 연결 리스트가 되고, 새로운 항목을 연결 리스트에 추가함으로써 충돌을 해결합니다.
반응형