파일 시스템?
- 컴퓨터에서 파일이나 자료를 쉽게 발견할 수 있도록, 유지 및 관리하는 방법
- 저장매체에는 수많은 파일이 있기 때문에, 이런 파일들을 관리하는 방법
특징
- 커널 영역에서 동작
- 파일 CRUD 기능을 원활히 수행하기 위한 목적
- 계층적 디렉터리 구조를 가짐
- 디스크 파티션 별로 하나씩 둘 수 있음
역할
- 파일 관리
- 보조 저장소 관리
- 파일 무결성 메커니즘
- 접근 방법 제공
목적
- 하드디스크와 메인 메모리 속도차를 줄이기 위함
- 파일 관리
- 하드디스크 용량 효율적 이용
구조
- 메타 영역 : 데이터 영역에 기록된 파일의 이름, 위치, 크기, 시간정보, 삭제유무 등의 파일 정보
- 데이터 영역 : 파일의 데이터
파일(File)?
- 컴퓨터는 정보들을 자기 디스크, 자기 테이프, 광 디스크와 같은 다양한 저장 매체에 저장할 수 있다.
- 운영체제는 저장장치의 물리적 특성을 추상화하여 논리적 저장 단위, 즉 파일 을 정의한다.
- 파일은 운영체제에 의해 물리 장치들로 맵핑되고, 일반적으로 비휘발적 특성을 지니기 때문에, 전원이 끊어진 상황에서도 정보들을 영구히 보존할 수 있다.
- 사용자의 입장에서 파일은 논리적 보조 저장장치의 가장 작은 할당 단위
- 파일은 일반적으로 프로그램과 자료로 나누어진다.
- 프로그램 : 소스 프로그램, 목적 프로그램
- 자료 : 숫자,문자,이진수, 자유 형식이거나 정해진 형식 등, 저장할 수 있는 모든 것이 자료가 될 수 있음
파일 속성
- 사용자의 편의를 위해 파일에 이름을 부여하고, 하나의 문자열로 나타낸다.
- 시스템에 따라 대소문자를 구분하기도, 안하기도 한다.
- 일단 파일이 만들어지면 그 파일은 프로세스, 사용자, 시스템으로부터 독립하게 된다.
- 한 사용자가 파일을 생성하고, 다른 사용자가 복사하거나 e-mail로 첨부하여 보낼 수 있다.
- 일반적으로 파일의 속성은 아래와 같다.
- 이름 : 사람이 읽을 수 있는 형태로 유지되는 유일한 정보
- 식별자 : 파일 시스템 내에서 파일을 식별하는 고유의 번호 PK
- 타입 : 여러 타입의 파일을 제공하는 시스템을 위해 필요
- 위치 : 장치 내에서 파일의 위치를 가리키는 포인터
- 크기 : 파일의 현재 크기
- 보호 : 접근 제어 정보
- 시간, 날짜, 사용자 식별 : 생성, 최근 변경, 최근 사용 등에 대한 정보
- 모든 파일에 대한 정보는 보조 저장장치에 상주하는 디렉토리 구조 내에 유지된다.
- 파일과 디렉터리 모두 비휘발적 성질을 가져야 하므로, 저장 장치 상에 저장되고, 필요할 때 조금씩 메모리로 가져와야 한다.
파일 연산
- 운영체제가 파일을 관리하기 위해 사용하는 시스템 콜과 그것들의 조합.
- 파일 연산의 종류는 아래와 같다.
- 파일 생성 : 사용할 수 있는 공간을 찾고 파일을 할당한다, 또한 파일이 디렉터리에 만들어져야 한다.
- 파일 쓰기 : 파일 이름과 기록될 정보를 명시하는 시스템 콜을 호출한다. 시스템은 파일 내의 다음 쓰기가 일어날 위치를 가리키는 쓰기 포인터를 유지하고 있어야 한다. 쓰기 포인터는 쓰기가 일어날 때마다 갱신된다.
- 파일 읽기 : 파일 이름과 피일이 읽혀 들어갈 블록의 위치를 명시하는 시스템 콜을 호출한다. 다음 읽기가 일어날 파일 안의 위치를 기록하는 읽기 포인터를 유지해야 한다. 프로세스는 일반적으로 파일 읽기 나 파일 쓰기 중 한 가지를 하고 있기 때문에, 대부분의 시스템은 한 개의 현재 파일 위치 포인터 를 가진다. 읽기,쓰기 연산 모두 이 포인터를 이용하여 공간을 절약하고, 복잡성을 감소시킨다.
- 파일 안에서의 위치 재설정 : 디렉터리에서 적합한 항목을 탐색하고, 현재 파일 위치를 주어진 값으로 설정한다.
- 파일 삭제 : 지명된 파일을 디렉터리에서 찾는다, 발견하면 파일이 차지하는 공간을 방출하고 디렉터리 항목을 삭제한다.
- 파일 절단 : 파일의 내용을 지우고, 속성만을 남긴다.
- 위에 있는 6개의 연산은 파일 조작에 필요한 최소한의 연산이다.
- 새로운 정보를 추가하는 첨가(appending) 나 재명명(renaming) 등이 더 있다.
- 운영체제는 모든 열린 파일에 대한 정보를 갖는 열린 파일 테이블(open file table) 을 유지한다.
- 시스템 콜 open()은 전형적으로 열린 파일 테이블의 항목에 대한 포인터를 리턴한다.
- 여러 프로세스가 동시에 파일을 열 수 있는 환경에서는 open()과 close() 연산의 구현은 더 복잡한데, 보통 운영체제는 프로세스별 테이블과 범 시스템 테이블을 사용한다.
- 프로세스별 테이블 : 파일 포인터, 접근 권한
- 범 시스템 테이블 : 프로세스에 독립적인 정보들 : 디스크 상의 파일 위치, 접근 날짜, 크기
오픈 파일 테이블
- 프로세스가 open()을 호출한 경우 오픈 파일 테이블에 범 시스템 테이블 에 있는 정보를 가리키는 새로운 포인터가 생긴다.
- 일반적으로 오픈 파일 테이블은 파일을 연 프로세스 수를 가리키는 오픈 계수 (open count)를 각 파일에 연관지어 둔다.
- close() 콜은 이 오픈 계수를 감소시키고 계수가 0이 되면 해당 정보를 테이블에서 제거한다.
- 열린 파일들을 관리하기 위해 필요한 몇 가지 정보는 아래와 같다.
- 파일 포인터 : 가장 최근의 읽기/쓰기 위치를 가리킨다. 파일을 오픈한 프로세스 당 하나가 만들어진다.
- 파일 오픈 계수 : 파일의 총 열린 횟수와 닫힌 횟수를 추적하며 계수값이 0이면 테이블에서 해당 항목을 제거한다.
- 파일의 디스크 위치 : 대부분의 파일 연산은 데이터를 변경하도록 요구, 매 연산마다 디스크에서 읽는 것을 피하기 위해 메모리에 저장한다. (한 번 메모리에 저장해 두었다가 파일을 닫을 때 다시 디스크로 옮긴다는 것 같다.)
- 접근 권한 : 각 프로세스는 한 파일을 하나의 접근 모드로 연다. 이 정보는 프로세스별 테이블에 저장된다.
파일의 잠금
- 몇몇 운영체제는 열려진 파일을 잠금 할 수 있는 기능을 제공한다. 한 프로세스가 파일을 잠그면 다른 프로세는 접근 불가.
- 강제적 파일 잠금 : 어떤 프로세스가 배타적 잠금을 획득한 경우, 운영체제는 다른 프로세스가 파일에 접근하는 것을 차단한다. 잠금의 무결성이 보장된다.
- 권고적 파일 잠금 : 프로세스들은 잠금의 상태를 찾을 수 있고 무엇을 해야 할지 결정한다. 잠금이 적절히 획득되고 해제되는 것에 대한 보장은 소프트웨어 개발자의 몫이다.
- 파일 잠금의 사용은 동기화처럼 특별히 주의해야 한다. 두 개 이상의 프로세스가 파일 잠금을 얻으려고 하다가 교착 상태에 빠질 수 있으므로 특별한 대책이 필요하다.
파일 타입
- 운영체제는 파일 타입을 인식하여 합당한 연산을 실행할 수 있다.
- 확장자
- 파일 이름의 한 부분으로 하여금 파일의 타입을 나타내도록 하는 것.
- 대체로 마침표를 이용하여 파일 이름과 확장자를 구분한다.
- 확장자를 이용하여 연산의 유형을 표시할 수 있다.
- 확장자 자체는 솔직히 있어도 되고 없어도 된다. 다만 구분과 표시를 위해 사용할 뿐이다.
- binary object 파일의 경우 출력하려고 한다면 쓰레기값들을 만들어낸다
- binary object 파일의 경우 실행 파일이기 때문
파일 구조
- UNIX, MS-DOS의 경우 파일의 형태, 구조에 대하여 최소한의 파일 구조를 둔다.
- UNIX의 경우 파일을 단순히 8 바이트의 단순한 집합으로 인식하여, 이 내부구조를 운영체제가 해석하지 않는다.
- 시스템 차원에서의 지원이 없는 대신 응용 프로그램들이 각자의 프로그램에 사용된 파일 구조에 대해 적절한 해석과 운용을 책임진다.
- 프로그램을 로딩하고 수행할 수 있는 실행 파일은 운영체제가 읽을 수 있도록 지원해야 한다.
파일의 내부 구조
- 디스크 시스템의 경우 보통 섹터에 의해 결정되는 블록 크기를 가진다.
- 어떠한 경우든 파일은 일련의 블록으로 간주된다.
- 여러 개의 논리 레코드를 하나의 물리 레코드(블록)에 담기도 하는데 이를 팩킹이라고 한다.
- 기본적인 I/O 기능은 블록 단위로 실행되며, 그렇기 때문에 내부 단편화 문제가 발생할 수 있다.
접근 방법
- 파일에 접근하여 데이터를 읽는 방법
순차 접근(Sequential Access)
- 가장 간단한 접근 방법
- 대부분 연산은 read와 write
- 현재 위치를 가리키는 포인터에서 시스템 콜이 발생할 경우 포인터를 앞으로 보내면서 read와 write를 진행.
- 뒤로 돌아갈 땐 지정한 offset만큼 되감기를 해야 한다.
- 테이프 모델 기반
직접 접근(Direct Access)
- 특별한 순서 없이, 빠르게 레코드를 read, write 할 수 있음
- 디스크 모델에 기반을 두며 이는 무작위 파일 블록에 대한 임의 접근(Random Access)를 허용하기 때문
- 직접 접근의 경우 읽기나 쓰기의 순서에 제약을 가하지 않는다.
- 대규모 정보를 즉각적으로 접근하는 데 유용하여 데이터베이스에 이용
- 현재 위치를 가리키는 cp 변수만 유지하면 직접 접근 파일을 가지고 순차 파일 기능을 쉽게 구현이 가능
기타 접근
- 직접 접근 파일에 기반을 두고 색인을 구축한다.
- 크기가 큰 파일을 입출력 탐색할 수 있게 도와준다.
디렉터리와 디스크 구조
- 통상 수천 수만 수십억 개의 파일을 하드디스크, 광학 디스크,반도체 디스크를 포함한 임의 접근장치에 저장하는 방법
- 볼륨 : 파일 시스템을 포함하고 있는 임의의 개체, 각 볼륨을 논리적인 가상 디스크로 취급될 수 있다. 하나 이상의 운영체제를 저장하고 부팅, 실행시킬 수 있다. 섹터들의 집합으로 연속공간이 아니어도 볼륨으로 볼 수 있다.
- 디바이스 디렉터리(디렉터리) : 그 볼륨에 있는 모든 파일에 대한 이름, 위치, 크기, 타입과 같은 정보를 기록한다.
- 파티션 : 연속된 저장 공간을 하나 이상의 연속되고 독립적인 영역으로 나누어서 사용할 수 있도록 정의한 규약
1단계 디렉터리
- 가장 간단한 구조
- 파일이 많아지거나 다수의 사용자가 사용할 경우 심각한 제약이 따른다.
- 각 파일들은 서로 유일한 이름을 가진다. 서로 다른 사용자라 하더라도 같은 이름을 사용할 수 없다.
2단계 디렉터리
- 사용자에게 개별적인 디렉터리를 만들어줌
- UFD(User File Directory) : 자신만의 사용자 파일 디렉터리
- MFD(Master File Directory) : 사용자의 이름과 계정번호로 색인되어 있는 디렉터리
- 특정한 파일을 참조할 시 사용자의 UFD 에서만 탐색하므로 파일 이름이 충돌하는 문제가 사라짐
- 다른 사용자의 파일에 접근해야 하는 경우는 단점
트리 구조 디렉터리
- 2단계 구조 디렉터리를 확장한 다단계 트리 구조
- 사용자들이 자신의 서브디렉토리를 만들어서 파일을 구성할 수 있게 함
- 트리 구조는 하나의 루트 디렉터리를 가지며 시스템의 모든 파일은 고유 경로를 가진다.
- 디렉터리의 각 항목은 한 비트를 사용하여 일반 파일인지 (0) 디렉터리 파일인지(1)를 구분
- 각 프로세스는 현재 디렉터리를 가지고 있음
- 디렉터리의 경로명을 지정할 때에는 절대경로명과 상대경로명 두 가지가 있음
비순환 그래프 구조
- 사이클이 없는 그래프는 디렉터리들이 서브디렉터리와 파일들을 공유할 수 있도록 허용
- 트리 구조의 디렉터리를 자연스럽게 일반화한 방식
- 절대경로명/상대경로명을 이용하여 링크 라고 불리는 새로운 디렉터리 항목을 만들 수 있음
- 단순한 트리 구조보다는 융통성이 있는 대신에 더 복잡함
- 파일을 삭제할 때 대상이 없는 포인터(dandling pointer) 를 남김
- 참조되는 파일에 참조 계수를 두어 계산한다.
- 참조 계수가 0이 되면 현재 파일을 참조하는 링크가 존재하지 않으므로 파일을 삭제할 수 있다.
그래프 구조 디텍터리
- 디렉터리에서 순환이 허용되는 겨우 무한 루프에 빠질수도 있음
- 순환이 발생하지 않도록 하위 디렉터리가 아닌 파일에 대한 링크만 허용하거나 가비지 컬렉션을 이용하여 전체 파일 시스템을 순회하고, 접근 가능한 모든 것을 표시
- 디렉토리를 순회할 때 링크가 있으면 우회하여 순환을 피할 수도 있음
출처
https://github.com/gyoogle/tech-interview-for-developer
https://noep.github.io/2016/02/23/10th-filesystem/
'CS > Operating System' 카테고리의 다른 글
[Operating System] 메모리(Memory) (0) | 2024.04.21 |
---|---|
[Operating System] 페이지 교체(Page Replacement) 알고리즘 (0) | 2024.04.21 |
[Operating System] 페이징(Paging)과 세그먼테이션(Segmentation) (0) | 2024.04.21 |
[Operating System] 세마포어(Semaphore) & 뮤텍스(Mutex) (0) | 2024.04.21 |
[Operating System] Race Condition(경쟁 상태) (0) | 2024.04.08 |