파일 파일(File)이란 관련된 정보가 모여있는 단위라고 할 수 있다. 파일은 보조기억 장치에 저장되고, OS의 파일 시스템(File System)에 의해 관리된다.
기본적으로 애플리케이션은 파일을 직접 다룰 수 없다. 따라서 OS에 System Call로 요청해야 한다.
파일 생성 / 삭제 / 열기 / 닫기 / 읽기 / 쓰기 syscall들이 존재한다.
파일 시스템은 OS 내부 프로그램이며, 파일 별로 메타데이터를 관리한다.
메타데이터에는 파일 유형(확장자), 크기, 보호, 생성 날짜, 마지막 접근 날짜, 생성자, 소유자, 경로 등이 있다
디렉터리는 내부에 담겨 있는 대상과 관련된 정보를 관리하는 파일이다. 트리 구조로 관리한다. 최상단을 루트 디렉터리라고 부른다.
Windows에선 폴더라고 부른다
루트 디렉터리 : /
디렉터리에서 파일들을 관리하기 때문에, 파일들에는 경로가 존재한다. 경로에는 절대 경로와 상대 경로가 존재한다.
절대 경로 : 루트 디렉터리에서 목표 파일까지 이르는 고유한 경로
상대 경로 : 현재 디렉터리에서 목표 파일까지 이르는 경로
OS는 디렉터리 연산을 위한 syscall 또한 제공한다.
디렉터리 생성 / 삭제 / 열기 / 닫기 / 읽기
디렉터리를 표현할 때는 디렉터리 엔트리라는 테이블 꼴의 자료구조로 관리된다. 각 행에는 파일과 그 파일 이름과 메타데이터가 저장된다
Unix 계열에서는 파일 이름과 i-node 번호만 저장된다
파일 시스템
이번에는 파일 시스템은 어떻게 보조기억 장치에 저장 / 접근할까?에 대해서 알아보고 FAT과 UNIX 파일 시스템에 대해서 알아보도록 하자.
파티셔닝과 포매팅
그 전에 우선 파티셔닝 partitioning과 포매팅 formatting에 대해서 알아보도록 하자.
우리가 보조기억장치를 사용하려면 파티셔닝과 포매팅을 필수적으로 수행해야 한다. 파티셔닝은 보조기억 장치를 논리적인 구획으로 나누는 작업을 말한다.
포매팅은 파일 시스템을 설정하여 어떤 방식으로 파일을 저장 / 관리할지 결정한 후 새로운 데이터를 쓸 준비하는 작업을 말한다.
흔히 말하는 포맷은 저장장치를 비우는 작업이라고 생각하는데, 정확한 표현은 아니다.
각 파티션마다 다른 파일 시스템을 설정할 수도 있다.
쉽게 말해서 파티셔닝은 커다란 서랍을 여러 층으로 나누어, 속옷 칸, 양말 칸, 하의 칸 등으로 나누는 작업이라고 볼 수 있고, 포매팅은 각 칸들의 구조를 내용물에 알맞도록 다른 구성으로 만드는 작업이다.
파일을 보조기억장치에 할당하는 방법 OS는 파일과 디렉터리를 블록 block 단위로 읽고 쓴다. 이는 매우 중요한 개념이다. 예를 들어 RDBMS의 조회 성능은 주로 Disk I/O 횟수와 관련 있는데, 원하는 레코드들이 한 block에 들어있으면 Disk I/O 횟수가 줄어들어 훨씬 좋은 성능을 낼 수 있다.
페이지와 프레임도 일종의 블록이라고 볼 수 있으며, 하나의 파일은 여러 블록들(최소 1개)에 의해 저장된다.
파일을 보조기억 장치에 할당하는 방법에는 크게 연속 할당 contiguous allocation, 불연속 할당이라는 2가지가 존재한다.
연속 할당 : 블록들에 이어서 파일을 할당하는 방식이다.
구현이 간단하나 파일의 크기가 늘고 줄면서 외부 단편화가 발생한다.
연속 할당의 외부 단편화 문제를 해결하기 위해 연결 할당 linked allocation이라는 방식이 등장했다. 이 방식은 블록들 마다 다음 블록에 대한 참조(pointer)를 가지고 있어, 외부 단편화 문제를 해결한다.
그러나, 첫번째 블럭부터 차례차례 읽어야 해서 random access에 불리하며, 중간에 물리적으로 파손되어 중간 블록에 문제가 생기면 그 이후 블록부터는 참조할 수 없다는 문제가 발생한다.
FAT File Allocation Table은 블록마다 다음 블록의 주소를 저장하는 방식이 아닌, 각 블록들의 다음 블록들을 테이블 형태로 저장해서 관리해 연결 할당의 문제를 해결한다.
오늘 날 USB 메모리, SD 카드 등 저용량 저장 장치에서 주로 사용되며 실행 도중에 FAT이 메모리에 캐시되어 성능 향상에도 도움이될 수 있다.
파일의 모든 블록 주소를 색인 블록 indexed allocation이라는 하나의 블록에 모아 관리하는 방식이다. 원하는 데이터를 찾을 때는 index block 주소만 알면 되므로 random access에 강하다는 특징이 있다.
색인 할당을 사용하는 파일 시스템에서는 디렉터리 엔트리에 파일 이름과 함께 색인 블록 주소를 명시한다.
파일을 보조기억장치에서 읽는 방법
UNIX 파일 시스템은 색인 블록 방식을 기반으로 만든 파일 시스템이다.
UNIX 파일 시스템에서는 색인 블록을 i-node 혹은 index-node라고 부른다. 파일마다 i-node를 가지고 있고, 각 i-node마다 번호를 가지며, 파티션 내에는 i-node들이 존재하는 공간이 따로 존재한다.
i-node가 가리키는 블록에는 다음과 같이 2가지가 있다
직접 블록 : 파일 데이터가 저장된 블록
간접 블록 : 파일 데이터가 저장된 블록주소를 저장하는 블록
이 블록들을 타고 가면서 원하는 블록들을 조회할 수 있다
그 밖에
위의 FAT나 UNIX 파일 시스템 외에도 NT 파일시스템(NTS, Windows), ext 파일 시스템(Linux) 등이 존재한다.
추가로, 파일 시스템의 경우 물리적 훼손에 취약한데, 이를 백업하는 저널링이라는 방법이 있다. 저널링은 작업 직전에 로그 영역에 변경 사항에 대해 로그를 남기고, 복구하는 방법이다. MySQL의 binlog와 비슷한 느낌이라고 볼 수 있을 것 같다.
마운트는 한 저장 장치의 파일 시스템에서 다른 저장 장치의 파일 시스템에 접근할 수 있도록 파일 시스템을 편입시키는 작업을 말한다.