파일 시스템
01. 파일과 디렉터리
파일 시스템이란,
파일과 디렉터리를 관리하는 운영체제 내의 프로그램.
파일과 디렉터리를 다루는 프로그램
시스템에서 파일을 효율적으로 관리할 수 있도록 하는 체제.
하드드라이브, SSD(Soild State Drive) , USD 와 같은 저장 장치에 있는 파일을 구성하고 관리하는데 사용하는 구조.
보조 기적 장치에 저장된다.
저장 장치에 데이터를 저장, 액세서 및 구성하는 방법을 정의한다.
사용자 영역이 아닌 커널 영역에서 동작한다.
[ 사용자 영역: 프로그램이 동작하기 위해 사용 메모리 영역. (코드, 데이터, 스택)
커널 영역: 메모리 공간 중에서 유저 영역을 제외한 나머지 영역.
커널: 운영체제의 자원. CPU, 메모리, 파일 등을 관리함.]
파일의 읽기, 쓰기, 삭제 등의 기능을 빠르고 원활하게 수행하기 위한 목적
파일과 디렉터리 : 보조기억장치의 데이터 덩어리
파일:
보조기억장치에 저장된 관련 정보의 집합.
의미있고 관련 있는 정보를 모은 논리적 단위.
관련 있는 정보들을 한 데 모아놓은 단위가 파일.
파일을 이루는 정보 : 파일을 실행하기 위한 정보 + 부가정보 (속성, 메타 데이터)
메타데이터: 파일의 위치, 형식 등 파일을 이루는 정보
유형? 확장자. 유형은 운영체제가 인식하는 파일의 종류를 나타냄. 실행파일, 목적 파일, 소스코드 파일, 워크 프로세서 파일, 라이브러리 파일 등..
운영체제에게 파일의 유형을 알려주기 위한 힌트 같은 문자열이 파일의 유형이다.
어떤 응용 프로그램도 임의로 파일에 접근, 조작 할 수 없고 운영체제만이 가능하다.
시스템 호출을 통해 운영체제에게 부탁한다.
파일 연간을 위한 시스템 호출:
1. 파일 생성
2. 파일 삭제
3. 파일 열기
4. 파일 닫기
5. 파일 읽기
6. 파일 쓰기
등..
디렉터리: 파일 시스템서 디스크 상의 파일들을 효율적으로 관리하기 위해 사용하는 방법
트리구조: 1단계 디렉터리가 아니라 여러 개의 계층. 파일과 폴더를 파일과 디렉터리를 관리하는 구조
트리로 관리하다 보니 경로 라는 개념이 생겼다.
특정 파일에 접근하기 위한 정보를 경로 라고 한다.
같은 디렉터리안에서는 동일 이름 파일이 존재 할 수 없지만, 서로 다른 디렉터리에서는 동일 이름 파일이 존재 가능하다.
디렉터리에서는 두가지 경로가 있다.
절대 경로: 루트 디렉터리부터 시작하는 경로.
상대 경로: 현재 디렉터리부터 시작하는 경로.
/ 는 디렉토리간 구분자이다.
어떤 프로그램도 디렉터리 연산을 수행 할 수 없고 OS 가 해야한다.
디렉터리 엔트리: 어떤 내용을 저장하는지에 따라 다르고 굳이 파일과 디렉터리를 크게 구분 짓지 않는다.
디렉터리를 표현하는데 쓰이는 자료구조이다.
파일 시스템
파일 시스템이란 파일과 디렉터리를 보조 기억 장치에 할당하고 접근하기 위한 운영체제의 내부 프로그램
파티셔닝과 포매팅을 해야 파일 시스템을 통해 파일과 디렉터리에 접근 할 수 있다.
파티셔닝: 저장 장치의 논리적인 영역을 구획하는 작업
마구잡이로 저장하는 것이 아니라, 목적에따라 저장한다. 칸막이 같은 개념
보조 기억 장치의 영역을 나누는 작업
하드 디스크나 SSD 처럼 용량이 큰 저장장치를 하나 이상의 논리적인 단위로 구획하는 작업이다.
하나의 디스크 내 영역이 나눈다.
나누어진 작업들을 파티션 이라고 한다.
포매팅: 파일 시스템을 설정. 어떤 방식으로 파일을 관리할 것인지 결정. 새로운 데이터 쓸 준비를 하는 작업
포매팅 할 때 파일 시스템이 결정 된다.
종류: 저수준, 논리적 포매팅이 있다.
파티셔닝과 포매팅이 완료되면 파일과 디렉터리의 생성이 가능해진다.
운영체제는 하나 이상의 섹터를 블록이라고 하는 단위로 묶은 후, 블록 단위로 파일과 디렉터리를 정리한다.
파일을 보조기억 장치에 할당하는 방법 두가지: 연속 할당, 불연속 할당
연속 할당: 가장 단순하다.
보조 기억 장치 내 연속적인 블록에 파일을 할당한다
단점: 외부 단편화를 야기한다. -> 해결방법은 불연속 할당
불연속 할당 - 연결 할당
연결 할당은 각 블록의 일부를 다음 블록의 주소 일부를 저장( = 다음 블록의 주소를 저장한다) 해서 각 블록이 다음 블록을 가리키는 형태로 할당하는 방식이다.
외부 단편화를 해결하지만, 임의 접근 속도가 느리다. 임의의 위치에서 파일을 읽는 속도가 상대적으로 느림.
-> FAT 시스템이 해결
색인 할당
색인 블록만 읽어도 접근 할 수 있다. 연결 할당보다 임의 접근이 용이하다.
FAT
연결 할당 기반.
연결 할당 방식의 단점이 발생하는 근본적인 이유: 모든 블록 안에 다음 번지 블록 주소를 기록했기 때문이다.
블록 하나가 고장나면 고장난 이후 블록엔 접근 할 수 없다.
만약 모든 블록의 주소를 한 곳에 모아 테이블 형태로 관리한다면? -> 이게 FAT 파일 시스템. 테이블을 사용
블록 주소를 한 테이블에 모아 관리한다.
기존 연결 할당 방식의 문제점: 파일 임의 접근이 느리다. 반드시 첫 블록부터 하나씩 읽어야 하기 때문에.
FAT파일 시스템에선 FAT 데이터 자체가 메모리에 캐시 될 수 있기 때문에
FAT 이 만약 보조기억장치가 아니라 메모리 일부가 있을 수 있다면 FAT을 확인하기 위해 보조기억 장치를 참조하지 않아도 된다.
그렇기 때문에 메모리에 캐시될 경우, 이 FAT 자체가 메모리에 캐시 될 경우엔 임의 접근 속도 또한 개선 할 수 있다.
FAT이 메모리에 캐시 될 경우, 느린 임의 접근 속도 개선 가능 -> 이런 방식을 통해 연결할당 방식의 기본 문제점들을 해결할 수 있다.
FAT 파일 시스템의 파티션 모습. 포맷시 이런 형태가 된다.
예약 영역: 이미 정해져 있는 일정 데이터들을 저장하는 공간.
FAT : FAT 영역이라고 하는 특별한 영역에 저장되게 됨
Root directory: 루트 디렉토리가 저장됨
데이터 영역: 각종 서브 디렉터리와 파일들을 저장하기 위한 영역
디렉터리 엔트리에는 파일의 속성 또한 명시 될 수 있다.
파일의 속성까지도 디렉터리 엔트리에 표기하는 파일 시스템이 FAT 파일이다.
왼쪽 디렉터리 내용은 오른쪽 파티션 내에 다음과 같이 저장되어 있다 (가정)
-1: 더 이상 읽을 블록이 없다.
/home/minchul/a.sh 을 읽기 위해선
가장 먼저 루트 디렉터리에 접근 해야함
홈 디렉터리는 3번 블록에 있다 - 민철은 15번 블록 - A.shell의 첫번째 블록 주소는 9번 – 9번 블록을 읽어요
9번다음 8번, 11번, 13번, 13 번은 -1. 더 이상 없다.
9-8-11-13 경로이다.
이것이 연결할당 기반의 FAT 파일 시스템
불연속 할당 중 색인 할당 기반 파일 시스템
Inode만 읽어도 파일의 속성, 저장 위치가 15개의 블록에 걸쳐 확인 할 수 있음.
inode마다 숫자 있음
Inode는 유닉스 파일 시스템에서는 파티션 내에 특정 영역에 모여 저장되어 있다.
데이터영역: 디렉터리 , 파일 모여 있다.
문제점: 15개의 블록 주소보다 더 큰 파일을 저장할 경우
30개의 블록 크기는?
삼중간접블록: 이중간접블록들의 주소저장. …..
단일 간접 블록들의 주소를 저장한 것이 이중 간접 블록, 이중 간접 블록들의 주소를 저장하는게 삼중 간접 블록
마지막 주소에 삼중간접블록의 주소를 저장.
유닉스 파일 시스템에선 inode만 알아도 파일의 속성, 파일의 저장 위치들까지 파일의 크기가 아무리 커도 전부 다 알 수 있다. 사실상 inode는 파일 이름 빼고 모든 것을 가지고 있다.
그렇기 때문에 유닉스 파일 시스템에서는 inode 가 파일 관리의 중추적인 핵심
유닉스 파일 시스템에선 디렉터리 엔트리에 inode의 번호, 파일 이름만 저장되어도 됨
이 inode에는 파일 속성은 제외하고, 저장되어 있는 블록 주소만 명시했음
왼: 디렉터리 구조
오: 파티션
유닉스 파일 시스템에서는 FAT 파일 시스템과는 달리 파티션에서 루트 디렉터리를 읽기 위한 영역이 따로 명시되어 있지는 않아도 루트에 접근하기 위한 노드가 몇 번째 노드인지 항상 기억하고 있음
가장 먼저 2노드에 접근함으로써 루트 디렉토리의 위치를 파악한다. – 현재 루트는 1번 블록에 저장되어 있다. 1번 디렉토리를 읽으면 루트 디렉토리의 내용을 알 수 있다.
루트를 보니 홈 디렉터리의 inode는 3번 inode에 저장되어 있다는 것을 알 수 있음
3번 inode에 접근해 홈디렉터리의 위치를 파악하면 된다.
홈 d는 현재 210번 블록에 있음
210번 블록을 읽으면 홈 디렉터리 안에 어떤 내용이 있는지 알 수 있다.
민철 d의 inode는 현재 8번에 저장
Inode 8에 접근하면 민철 디렉터리의 데이터의 현재 데이터 저장 위치를 알 수 있다. 현재 민철 디렉터리는 121 번 블록에 저장되어 있다.
121번을 읽으면 민철 디렉터리에 저장되어 있는 데이터의 내용들을 읽을 수 있다. A.shell은 9inode에 저장되어 있다.
9inode에 접근함으로써 a.shell을 읽을 수 있다.
9inode에는 98,12,13
/home/min/a.sh 을 읽기 위해선
98블록, 12블록, 13블록을 읽어 들인다.
'CS' 카테고리의 다른 글
가상 메모리 (0) | 2024.03.10 |
---|---|
메인 메모리 (0) | 2024.03.10 |
CPU 스케줄링 (1) | 2024.03.07 |
동기화 기법- 뮤텍스락, 세마포어, 모니터 (1) | 2024.03.06 |
교착상태 Deadlock (0) | 2024.03.04 |