47_파일 시스템 구현 (File System Implementation)
운영체제는 파일에 접근을 요구하는 프로세스를 위해 open(), close() 시스템 호출을 구현하며 디스크와 메모리 상에 존재하는 여러 구조가 파일 시스템을 구현하는데 사용된다.
디스크상의 구조는 다음과 같다.
- 부트 제어 블록(boot control block) : 볼륨 당 하나씩 존재하며 시스템이 그 파티션으로부터 운영체제를 부트 시키는 데 필요한 정보를 가지고 있다. 디스크가 운영체제를 가지고 있지 않다면 부트 제어 블록은 비어 있다. 부트 제어 블록은 일반적으로 한 파티션의 첫 번째 블록이다. UFS에서는 부트 블록, NTFS에서는 파티션 부트 섹터라 불린다.
- 볼륨 제어 블록 (volume control block) : 볼륨 당 존재하여 볼륨(파티션)의 블록의 수, 블록의 크기, 자유 블록의 수와 포인터, 자유 FCB와 포인터 같은 파티션 정보를 포함 한다. UFS에서는 수퍼블록, NTFS에서는 마스터 파일 테이블에 정보가 저장된다.
- 디렉토리 구조는 파일을 조직화 하는데 사용된다. UFS에서는 디렉토리 구조에 파일 이름 및 해당 inode 번호가 저장된다. NTFS에서는 마스터 파일 테이블에 이러한 정보가 저장된다.
- FCB는 파일 허가, 소유, 크기, 자료 블록의 위치 등을 포함하여 자세한 파일 정보를 가지고 있다. UFS에서 이는 inode라 불린다. NTFS에서 이 정보는 실제적으로 마스터 파일 테이블 안에 저장되며 파일마다 한 행을 가지고 관계 데이터베이스 구조를 사용한다.
메모리 내의 정보는 파일 시스템 관리와 캐싱을 통한 성능 향상을 위해 사용된다.
- 메모리 내 파티션 테이블은 각 장착된 파티션 정보를 포함한다.
- 메모리 내 디렉토리 구조는 최근 접근된 디렉토리 정보를 가진다.(파티션이 장착된 디렉토리의 경우는 파티션 테이블에 대한 포인터를 포함할 수 있다.)
- 범 시스템 오픈 파일 테이블(system wide open file table)은 다른 정보와 더불어 열려진 각 파일의 FCB의 복사본을 가진다.
- 프로세스 별 오픈 파일 테이블(per-process open file table)은 다른 정보 뿐만 아니라 범 시스템 오픈 파일 테이블 내의 해당 항목에 대한 포인터를 포함한다.
새로운 파일을 생성하기 위해서는 논리 파일 시스템을 호출 한다. 논리 파일 시스템은 디렉토리 구조의 포맷을 알고 있으며 일단 새로운 파일이 생성되면 입/출력을 위해 사용된다.
파일을 사용하려면 파일이 반드시 열려야 하며 open() 호출은 파일 시스템에 파일 이름을 넘겨준다. open() 시스템 호출은 먼저 그 파일이 다른 프로세스에 사용중인지 범 시스템 오픈 파일 테이블을 찾으며 이 알고리즘은 오버헤드를 줄이는데 도움이 된다. 또한 디렉토리 연산의 속도를 향상 시키기 위해 통상 디렉토리 구조의 일부는 메모리에 캐싱한다.
파일이 발견되면 FCB가 메모리 내의 범 시스템 오픈 파일 테이블에 복사된다. 이 테이블은 FCB와 프로세스의 수도 저장한다. 범 시스템 오픈 파일 테이블 안에는 테이블의 항목에 대한 포인터와 몇 개의 다른 필드를 갖는 프로세스별 항목이 만들어 진다. 이 필드들은 파일 안의 현재 위치(다음 read() 또는 write() 연산이 시작되는 위치)를 가리키는 포인터와 파일이 열린 접근 모드 등을 포함 한다.
Open() 호출은 프로세스 별 파일 시스템 테이블 내의 해당 항목에 대한 포인터를 찾아 돌려준다. 그 후 모든 파일 연산은 이 포인터를 통해 실행 된다. 일단 해당 FCB를 디스크에서 찾으면 시스템은 파일 이름을 더 이상 사용하지 않기 때문에 파일 이름은 오픈 파일 테이블의 한 부분이 아니다. 그러나 같은 파일에 대한 차후 open() 연산을 빠르게 하기 위해 캐시될 수 있다. 유닉스에서는 파일 기술자라 부르고 Windows에서는 파일 핸들이라 부른다.
파일을 닫지 않는 이상 모든 파일 연산은 오픈 파일 테이블에서 이루어진다. 프로세스가 파일을 닫을 때 프로세스 별 테이블 항목이 삭제되며 범 시스템 항목의 오픈 계수는 감소 된다. 사용자가 열었던 모든 파일을 닫으면 갱신된 메타데이터 정보가 디스크 기반 디렉토리 구조에 복사되며 범 시스템 오픈 파일 테이블에서 그 항목이 삭제 된다.
이런 구조들은 캐싱 기법을 사용함으로써 실제 자료 블록을 제외한 오픈 파일에 대한 모든 정보는 메모리 내에 존재 한다. 디스크 입/출력 작업을 줄일 수 있다.
사용자는 지역 디스크의 여러 파일 시스템이나 네트워크를 통하여 이용 가능한 파일 시스템에 접근할 수 있다. 구현 세부 사항으로부터 기본 시스템 호출 기능을 격리시키기 위해 자료 구조와 프로시저가 사용 된다. 일반적으로 파일 시스템 인터페이스, VFS 인터페이스, 지역 파일 시스템 으로 세 가지 주요한 계층으로 구성되어 있다.
파일 시스템 인터페이스는 open(), read(), write(), close() 호출과 파일 기술자에 기반을 둔 인터페이스이다.
가상 파일 시스템(VFS, Virtual File System)은 VFS 인터페이스를 명확하게 정의함으로써 파일 시스템의 일반적 연산을 구현과 분리 시킨다. VFS 인터페이스에 대한 다른 구현들이 같은 기계 상에 공존할 수 있으므로 다른 형태의 파일 시스템을 지역적으로 장착함으로써 투명한 접근을 가능하게 한다. 또한 전체 네트워크에 걸쳐 파일을 유일하게 표시할 수 있는 기법을 제공한다. vnode라는 전체 네트워크에서 파일을 유일하게 만들어주는 수치 지정자(designator)를 포함하고고 있다. VFS는 특정 파일 시스템 고유의 연산을 활성화시킴으로써 파일 시스템 유형에 따른 지역 요청들을 처리하며 원격 요청에 대해서는 NFS 프로토콜 프로시저를 호출 한다. 파일 핸들은 연관된 vnode들로부터 구성되며 이들 프로시저에 매개변수로 전달 된다.
[참고자료]
Operating System Concepts / 홍릉과학출판사
'SW Engineering > OS Concept' 카테고리의 다른 글
49_파일 할당 방법 (Allocation Method) (0) | 2015.07.16 |
---|---|
48_디렉토리 구현 (Directory Implementation) (0) | 2015.07.16 |
46_파일 시스템 구조 (File System Structure) (0) | 2015.07.16 |
45_파일 시스템 마운팅(File System Mounting)과 파티션 마운팅(Partition Mounting) (0) | 2015.07.16 |
44_디렉토리 구조 (Directory Structure) (0) | 2015.07.16 |