운영체제 - 파일 시스템
파일
- 운영체제가 컴퓨터 시스템을 편리하게 사용하기 위해 저장 정보를 일관된 논리적 관점으로 제공하는 기능
- 저장장치의 물리적 특성을 추상화 하여 논리적으로 저장하는 단위이다.
- 보조저장장체에 기록된 관련 정보의 집합
파일 속성
이름, 식별자, 유형, 위치, 크기, 보호, 타임스탬프, 사용자 식별
모든 파일에 대한 정보는 디렉터리 구조에 의해 유지된다. 디렉터리 항목은 파일 이름과 고유 식별자로 구성된다
파일 연산
- 생성
- 파일을 저장할 수 있도록 파일 시스템 내 공간을 찾아야 한다
- 새로 생성된 항목이 디렉터리에 만들어져야 한다
- 열기 : 생성과 삭제를 제외한 모든 연산 하기저에 open해야 한다
- 읽기 : 읽기 위해 파일 핸들과 파일이 읽혀야 할 블록 위치(메모리 내)를 사용하는 시스템 콜 사용한다. 순차적 읽기나 쓰기를 위해 파일 안에 위치를 저장하는 파일 위치 포인터가 있다.
- 위치 재 설정 : 파일 내 위치를 주어진 값으로 재설정 한다
- 삭제 : 지정된 파일을 디렉터리에서 찾고 디렉터리 항목 삭제한다. 하드링크(하나의 파일에 여러개 디렉터리 항목)가 있는 경우 마지막 링크 삭제 될 때 까지 유지한다
- 절단: 내용은 지우지만 파일 속성을 남기고 싶을 때 사용
운영체제는 모든 열린 파일에 대한 정보를 갖는 열린 파일 테이블을 유지한다.
특정 파일 연산 요구시 테이블의 인덱스로 해당 파일을 찾는다
운영체제는 프로세스 별 테이블과 범 시스템 테이블 두 단계 내부 테이블을 사용한다
- 프로세스별 테이블 : 각 프로세스가 연 모든 파일을 기록한다. 테이블에 저장된 내용은 프로세스가 어떻게 사용하는 가의 대한 정보
- 범 시스템 테이블 : 프로세스에 독립적인 정보, 디스크상의 파일 위치, 접근 날짜, 파일 크기와 같은 공유 정보를 가진다. 프로세스별 테이블이 범 시스템 테이블 참조한다
열린파일
열린 파일 테이블은 파일을 연 프로세스 수를 가리키는 열린 계수를 각 파일과 연관해 두고 있다
파일 포인터 : 가장 최근의 읽기/쓰기 위치를 추적
파일 열린 계수 : 열린 파일을 수를 추적한다 파일 열릴 시 +1 닫힐시 -1
파일 위치 : 시스템 내의 파일을 찾기 위한 정보
접근 권한 : 각 프로세스는 한 파일을 하나의 접근 모드로 연다
파일락
공유락 : 여러 프로세스가 동시에 락을 획득할 수 있다
베타적 락 : 한번에 한 프로세스만 락을 획득 할 수 있다
강제적 락 : 어떤 프로세스가 베타적 락을 획득하면 운영체제가 다른 프로세스가 잠겨진 파일 접근을 막는다. 락의 무결성을 보장해준다
권고적 락 : 락이 적절히 획득되고 해제되는 것을 보장하지 않는다. 즉, 락의 무결성을 보장하지 않음
파일 유형
파일은 이름과 확장자로 나눈다. 확장자를 어플리케이션이 동작하는 파일에 대한 힌트로 사용한다
ex) 실행 유형(exe,bin), 목적(obj,o), 소스코드(c,java), 배치(bat, sh) 등등
모든 운영체제는 프로그램을 로딩하고 실행할 수 있는 실행 파일 구조를 지원해야 한다.
* 디스크 시스템
보통 섹터의 크기에 의해 결정되는 블록 크기를 가진다. 모든 디스크 I/O는 한 블록 단위로 수행되며 모든 디스크 블록들은 동일한 크기를 가진다.
논리 레코드의 크기, 물리 블록 크기 패킹 기술로 각 물리 블록내에 몇개의 논리 블록이 들어갈지 결정한다
모든 파일 시스템은 내부 단편화 문제를 가지고 있으며 블록 크기가 커질수록 내부 단편화가 커진다
파일 접근 방법
파일이 사용될때 정보가 접근되어 컴퓨터 메모리로 읽혀야 한다
순차접근 : 레코드 순으로 차레로 읽는 접근 방법
직접접근 : 임의의 파일 블록에 임의의 접근을 할 수 있는 방법. 파일 블록의 번호는 0부터 시작하는 상대 블록 번호이다
색인 : 파일 포인터를 색인 테이블에서 찾아 접근하는 방법
디렉터리 구조
파일 이름을 상응한 파일 제어 블록으로 바꿔 주는 심볼 테이블이다
디렉터리 연산
- 파일 찾기 : 디렉터리를 탐색
- 파일 생성 : 파일을 디렉터리에 추가
- 파일 삭제 : 디렉터리에서 파일 삭제
- 디렉터리 나열 : 존재하는 파일을 나열한다
- 파일의 재명명: 파일의 이름을 변경
- 파일 시스템 순회: 여러 디렉토리를 순회해 파일을 볼 수 있게 해주는 기능
경로 : 상대 경로, 절대 경로
1단계 디렉터리 : 모든 파일이 다 같이 한개의 디렉터리 밑에 있음
2단계 디렉터리 : 사용자 별로 디렉터리를 나눈다
트리 구조 디렉토리 : 임의의 높이를 갖는 트리 구조 - 일반 사용자는 서브 디렉토리를 얼마든지 만들 수 있음
비순환 그래프 디렉터리 : 트리 구조는 파일 또는 디렉터리의 공유를 허용하지 않지만 비순환 그래프는 파일들을 공유할
수 있도록 허용하는 구조. 똑같은 파일이나 서브디렉터리가 서로 다른 서브 디렉터리에 있을 수 있다.
일반 그래프 디렉터리 : cycle이 생겨 무한 루프에 빠질 수 있으므로 가비지 수집으로 사이클이 생기지 않도록 한다
보호와 접근
보호 : 파일 시스템이 파괴될 경우를 대비해 규칙적인 간격으로 복사본을 만들어 유지한다.
접근 : 파일 접근 유형을 제한하여 접근이 허용되게 하거나 거부한다.
접근 유형
읽기, 쓰기, 실행, 추가, 삭제, 리스트, 속성 변경 등이 있다.
사용자에 따라 접근 권한을 다르게 하는 접근 제어 리스트를 둘 수 있다.
* 리눅스
ex) -rw-rw-r--, drwx------ 처음 비트 d 면 디렉토리를 나타냄, 각 필드 3게의 비트로 구성 rwx 비트(읽기, 쓰기, 실행 제어)로 구성되어 있다. 각 필드의 순서는 소유자-그룹-모든사용자 순이다
메모리 사상
보조기억장치에 있는 데이터를 메모리에 올리는 것, 프로세스가 공유 가능
파일 시스템
쉽게 데이터를 저장하고 찾을 수 있게 함으로써 저장장치를 효율적이고 편리하게 사용할 수 있게 한다
- 파일 시스템이 사용자에게 어떻게 보여야 할 지 정의
- 논리 파일 시스템을 물리적인 저장장치로 사상하는 알고리즘과 데이터 구조 만들기
- 파일 시스템 계층 구조 사용
입출력 제어
장치 드라이버 루틴과 인터럽트 핸들러로 이루어져 있음, 메모리와 디스크 시스템 간의 정보 전송을 담당한다.
장치 드라이버는 제어기에 어느 장치에 어떤 일을 수행할지 알린다
기본 파일 시스템
논리 블록 주소를 기반으로 드라이브에 명령을 내린다. 또한 I/O 요청 스케줄링을 고려한다.
다양한 파일 시스템, 디렉터리 및 데이터 블록을 저장하는 메모리 버퍼와 캐시를 관리한다(버퍼링)
파일-구성 모듈
파일과 상응하는 논리 블록 정보를 제공한다
논리 파일 시스템
메타 데이터 정보를 관리한다. 메타 데이터는 파일 내용 데이터를 제외한 모든 파일 시스템 구조를 말한다.
파일 구조는 파일 제어 블록(FCB)을 통해 유지된다(inode)
파일 시스템 구조
디스크
- 부트 제어 블록 : 운영체제를 부트시키는 데 필요한 정보
- 볼륨 제어 블록 : 볼륨의 블록의 수, 블록 크기, 가용 블록의 수와 포인터등
- 디렉터리 구조 : 파일 조작화하는데 사용
- 파일별 FCB에 자세한 파일 정보를 저장한다
메모리
- 메모리 내 파티션 테이블은 마운트 된 모든 파티션 정보를 가진다
- 메모리 내 디렉터리 구조는 최근 접근된 디렌터리 정보를 가진다
- 범 시스템 오픈 파일 테이블은 다른 정보와 오픈된 각 파일의 FCB 복사본을 가진다
- 프로세스별 오픈 파일 테이블은 프로세스가 연 모든 파일에 대한 정보와 범 시스템 오픈 파일 테이블 정보를 포함
- 버퍼는 파일 시스템이 읽히거나 써질 때 파일 시스템 블록을 저장한다
새로운 파일 생성
- 프로세스 논리 파일 시스템 호출(논리 파일 시스템은 디렉터리 구조와 포맷을 알고 있음)
- 파일 시스템은 새로운 FCB 할당 및 해당 디렉터리 메모리로 읽는다
- 디렉터리 갱신하고 파일 시스템에 다시 쓴다
파일 읽기
- open() 시스템콜이 논리적 파일 시스템에 파일 이름을 넘긴다
- 파일이 이미 다른 프로세스에 사용되는지 확인하기 위해 범 시스템 오픈 파일 테이블 검색한다
- 사용 중 일시, 프로세스별 오픈 테이블 항목이 생성된다(파일 offset, 접근 모드 포함)
- 파일이 오픈 되지 않았을 시, 디렉토리 구조에서 찾아 해당 파일의 FCB를 범 시스템 오픈 테이블에 넣는다
- 디렉토리 구조를 캐싱한다
디렉터리 구현
선형리스트(쉽지만 느리다), 해시 테이블(해시함수 성능에 영향 받는다)
할당방법
연속할당
각 파일이 저장장치 내에서 연속적인 공간을 차지하도록 한다
한 파일의 연속 할당은 디스크 주소(블록 단위)와 길이로 정의된다.
파일의 길이 n블록이고 블록 b에서 시작한다면, 파일은 b, b+1, b+2, … ,b+n을 차지한다.
연결 할당
파일을 디스크 블록의 연결 리스트모양으로 할당하는 방법
파일의 디스크 블록들이 디스크 내에 흩어져 있다.
디렉토리는 파일의 첫번째와 마지막 블록에 대한 포인터를 가진다.
개선
파일 할당 테이블(FAT, File Allocation Table) 사용
FAT : 파일이나 디렉토리의 위치 정보(포인터)를 저장하는 테이블
디스크 헤드가 FAT정보를 읽어 임의의 블록 위치를 알아낼 수 있어, Direct access 도 가능.
FAT 테이블은 각 디스크 블록마다 항목을 가지고 있고, 디스크 블록 번호를 인덱스로 찾는다.
색인 할당
하나의 색인 블록을 두고, 이 색인 블록에 포인터들을 모아두어 직접 접근을 가능하게 한 방법
각 파일들은 디스크 블록 주소를 모아 높은 배열인 색인(index) 블록을 가진다.
색인 블록의 i번째 항목은 파일의 i번째 블록을 가리킨다.
디렉토리는 색인 블록의 주소를 가지고 있다.
색인 블록을 작게 만들경우 큰 파일에 대한 포인터 확보가 어렵다
개선 기법
- 연결 기법 : 파일 크기가 크면 어러개 색인 블록을 연결한다
- 다중 수준 색인 : 계층화 한다
- 결합 기법 : 15개의 포인터를 유지하는 데 12개는 직접적인 블록의 주소를 3개는 간접 블록을 나타낸다
가용 공간 관리
저장 장치 공간이 제한 되어 있기 때문에 공간을 재사용해야 한다. 따라서 시스템은 가용공간을 리스트로 유지하고 관리한다. 새로운 파일을 만들려면 가용 공간 리스트를 탐색하여 새로운 파일을 위한 공간을 할당 받는다
비트 벡터
각 블록은 1비트로 표현된다. 블록이 비어 있으면 비트는 1이 되고 할당 되어 있으면 비트는 0이 된다
가용 블록을 찾는 일이 간편하고 효율적이다. 다만 비트 벡터 그 전체가 메인 메모리 내에 존재하지 않으면 비효율적이다. 디스크의 크기가 커질 수록 비트 맵의 크기도 커진다.
연결 리스트
모든 가용 블록을 연결시키는 방법
그루핑
n개중 n-1개는 실제 비어있는 블록 주소 나머지 1개는 다음 가용 블록들를 저장하는 주소를 가진다
* + 계수(연속된 비어있는 블록 주소 압축 표현), 공간맵
* Free-behind : 페이지 요청되자마자 버퍼에서 페이지를 제거하는 것
* read-ahead : 요구된 페이지와 몇 개의 뒤이은 페이지를 읽어 캐싱하는 것
복구
일관성 검사(fsck)
파일 시스템의 문제가 있는 지 검사하는 것
로그 구조 파일 시스템
대표적으로 데이터 베이스, 로그 기반 복구 기술 적용.
태스크의 수행단위 : 트랜잭션, 변경이 로그에 기록되는 것 : commit
스냅숏
트랜잭션은 모든 데이터와 메타데이터 변경을 새로운 블록에 기록. 트랜잭션이 완료되면 기존의 구조가 새로운 블록을 가르키도록 갱신
파일 시스템 내부 구조
파일시스템
tmpfs, objfs, ctfs, lofs, procfs, ufs, zfs
마운팅
파일 시스템은 프로세스들에 의해 사용되기 전에 마운트 되어야 한다.
디렉터리 구조는 다양한 볼륨으로 부터 만들어 질 수 있는데, 각 파티션이 마운트되어야 이용가능하다
마운트 과정
- 운영체제에 장치 이름과 파일 시스템에 부착할 수 있는 파일 구조 내의 위치(또는 마운트 포인트)를 준다
- 운영체제는 장치가 유요한 파일 시스템을 포함하는지 확인한다
- 운영체제는 파일 시스템이 지정된 마운트 포인트에 마운트 되었음을 디렉터리 구조에 기록한다