📑 본 글은 <혼공컴운>을 읽고 정리한 글입니다.

1. 파일과 디렉터리
운영체제 내부 파일 시스템이 관리하는 존재 : 파일과 디렉터리
1-1. 파일
파일
- 하드 디스크나 보조기억장치에 저장된 관련 정보의 집합
- 의미 있고 관련 있는 정보를 모은 논리적 단위
파일 속성(attribute) / 메타데이터(metadata)
- 파일 관련 부가 정보
- 파일 크기 / 보호(rwx) / 생성 날짜 / 생성자 / last_modified_date 등등
- 파일 유형
- 운영체제가 인식하는 파일 종류
- 흔히 파일 이름 뒤에
확장자(extension)
를 붙여서 표시한다.
- 실행 파일 / 목적 파일 / 소스 코드 파일 등등
파일 연산을 위한 시스템 호출
- 파일을 다루는 모든 작업은 운영체제에 의해 이루어진다.
- 응용 프로그램은 파일을 다루기 위해 운영체제에
시스템 호출
을 해야한다.
- 파일 생성 / 파일 삭제 / 파일 열기 / 파일 닫기 / 파일 읽기 / 파일 쓰기
1-2. 디렉터리
디렉터리(directory) / 폴더(folder)
- 파일을 일목요연하게 관리하기 위한 그룹
- 여러 계층을 가진 트리 구조 디렉터리(tree-structured directory)
최상위 디렉터리(root directory)
⇒ /
경로(path)
- 디렉터리를 이용해 파일 위치, 파일 이름을 특정 짓는 정보
- 모든 파일은 루트 디렉터리에서 자기 자신까지 이르는 고유한 경로를 가지고 있다.
- 절대 경로(absolute path)
- 루트 디렉터리부터 시작하는 경로
/home/sujin/a.sh
⇒ root(/) 아래 home 아래 sujin 아래에 있는 a.sh라는 파일
- 상대 경로(relative path)
- 현재 디렉터리부터 시작하는 경로
- 현재 디렉터리 경로가
/home
라면,
- a.sh의 경로는
sujin/a.sh
이다.(앞에 슬래시 X)
./sujin/a.sh
→ .
은 현재 디렉터리를 말한다.
cd 연산
: change directory
cd ..
→ 상위 디렉토리로 이동
cd sujin
→ sujin 디렉토리로 이동
- if I’m in root directory,
cd ..
→ doing nothing(there’s no parent dir)
디렉터리 연산을 위한 시스템 호출
- 디렉터리를 다루는 모든 작업은 운영체제에 의해 이루어진다.
- 디렉터리 생성 / 디렉터리 삭제 / 디렉터리 열기 / 디렉터리 닫기 / 디렉터리 읽기
머??디렉터리도파일이라고???이게무슨눈칫밥도밥이다같은소리?????
디렉터리는 내부에 해당 디렉터리에 담겨있는 대상과 관련된 정보를 담고 있다.
보조기억장치에 테이블 형태의 정보로 저장된다.
디렉터리 엔트리
- 엔트리 → 디렉터리 파일 속 테이블의 행
- 내용물
- 디렉터리에 포함된 대상의 이름
- 보조기억장치 내에 저장된 위치를 유추할 수 있는 정보 → 파일 할당 방법에 따라 다름
- 생성 시간, 수정된 시간, 크기 등등
..
→ 상위 디렉터리 .
→ 현재 디렉터리
- 자기 직속 파일이나 디렉터리들만 테이블에 저장한다.
2. 파일 시스템
파일 시스템은 파일과 디렉토리를 보조장치에 어떻게 저장 or 접근하는걸까?
2-1. 파티셔닝과 포매팅
새 하드 디스크나 SSD 사용하기 전에 해야할 작업 2가지 소개해드리겠음
파티셔닝(partitioning)
- 저장 장치의 논리적인 영역을 구획하는 작업 like 칸막이
**파티션
** : 파티셔닝 작업을 통해 나누어진 영역
포매팅(formatting)
파일 시스템
을 설정 : 어떤 방식으로 파일을 저장하고 관리할 것인지
- 새로운 데이터를 쓸 준비를 하는 작업
- 저수준 포매팅 : 공장에서 수행되는 물리적인 포매팅
- 고수준 포매팅 : 파일 시스템을 생성하는 포매팅 ← pick!
파일시스템에는여러종류가있고,파티션마다다른파일시스템을설정할수있다.
이제 파일과 디렉터리 생성할 수 있다.
2-2. 파일 할당 방법
블록(block)
- 운영체제가 파일과 디렉터리를 관리하는 단위(Read / Write)
- 하드 디스크의 가장 작은 저장 단위는
섹터
/ 블록은 섹터 여러 개 묶은 것
- 파일을 저장하면 보조저장장치 내 하나 이상의 블록에 걸쳐 저장된다.
파일 할당 방법
- 연속 할당(contiguous allocation)
- 연속적인 블록에 파일을 할당하는 방식
- 디렉터리 엔트리 내 주소 추정 부분 =
첫 번째 블록 주소 + 길이
- External Fragmentation 야기 {우리는 짝꿍!}
- 불연속 할당 ← 운체 pick!
- 연결 할당(linked allocation) >> FAT 파일 시스템으로
- 각 블록 일부에 다음 블록의 주소 저장 → Linked List
- 파일이 여러 블록에 흩어져 저장되어도 오케이입니다.
- 디렉터리 엔트리 내 주소 추정 부분 =
첫 번째 블록 주소 + 길이[마지막 블록 주소]
- Random Access 속도 매우 느림(첫 번째 블록부터 차례대로 읽어야 함)
- 하드웨어 고장이나 오류 발생 시 걍 망함 (HDD - 매우 정교하고 고장에 예민한 장치임)
- 색인 할당(indexed allocation) >> 유닉스 파일 시스템으로
- 파일의 모든 블록 주소를
색인 블록(index block)
에 모아서 관리한다.
- 색인 블록은 자기 파일의 블록 주소만 저장한다.
- 파일마다 하나씩 가지고 있음.
- if traverse, 색인 블록에 저장된 주소에 차례로 접근한다.
- Random Access도 가능 - 색인 블록의 i번째 항목이 가리키는 블록에 접근
- 디렉터리 엔트리 내 주소 추정 부분 =
색인 블록 주소
2-3. 파일 시스템 살펴보기
FAT 파일 시스템
- USB 메모리, SD 카드 등의 저용량 저장 장치에서 사용함
- 연결 할당 +
다음 블록의 주소들을 한데 모아 테이블 형태로 관리
- 디렉터리 엔트리 내 주소 추정 부분 =
첫 번째 블록 주소
- 파일 속성 정보/metadata → 디렉터리 엔트리에 저장
- FAT(File Allocation Table)
- {모든 블록 주소 : 다음 블록 주소} mapping
- 파티션에 하나의 FAT로 승부하는 것
- 파티션의 앞부분에 만들어진다.
- FAT 파일 시스템의 파티션 구성 = FAT 영역 | 루트 디렉터리 영역 | 데이터 영역(서브 디렉터리 & 파일)
- 실행하는 도중 메모리에 캐시될 수 있다. ⇒ 연결 할당 방식보다 random access 성능 개선됨
FAT파일시스템이파일을읽는과정
/home/minchul/a.sh
에 접근해보겠습니다.
- root dir 보기 → home dir 주소 GET
- home dir 보기 → minchul dir 주소 GET
- minchul dir 보기 → a.sh의 주소 GET
- FAT으로 가자!
- 시작 주소부터 9 - 8 - 11 - 13 접근
유닉스 파일 시스템
- 유닉스 계열 운영체제에서 사용함
i-node
: 유닉스 파일 시스템의 색인 블록
- 파일 속성 정보와 15개의 블록 주소 저장 가능
- 파일마다 i-node가 있고, 각자 번호가 부여됨
- 파일의 모든 것을 담고 있다.
- 파티션의 앞부분에 만들어진다.
- 유닉스 파일 시스템의 파티션 구성 = i-node 영역 | 데이터 영역(디렉터리 & 파일)
- 파일 속성 정보/metadata → i-node에 저장
- 디렉터리 엔트리 내 주소 추정 부분 =
i-node 번호
i-node는 15개의 블록 주소를 저장 가능 → 더 큰 파일은 어떡함?
- 블록 주소 중 12개는 직접 블록 주소(direct block)를 저장한다.
- 12개로 모자라면 13번째 주소에 단일 간접 블록 주소(single indirect block)를 저장한다.
- 이거로도 모자라면 14번째 주소에 이중 간접 블록 주소(double indirect block)를 저장한다.
- 이거로도?? 15번째 주소에 삼중 간접 블록 주소(triple indirect block)를 저장한다.
- 블록 주소가 저장된 블록 주소가 저장된 블록 주소가 저장된 블록ㅋㅋ...
유닉스파일시스템이파일을읽는과정
i-node에 파일 속성은 생략하고 블록 주소만 명시함
/home/minchul/a.sh
에 접근해보겠습니다.
유닉스 파일 시스템은 루트 디렉터리의 i-node
를 항상 기억하고 있다.
- root dir의 i-node = 2 보기 → 1번 블록 보기 → home dir의 i-node GET
- home dir의 i-node = 3 보기 → 210번 블록 보기 → minchul dir의 i-node GET
- minchul dir의 i-node = 8 보기 → 121번 블록 보기 → a.sh의 i-node GET
- a.sh의 i-node = 9 보기
- 98 - 12 - 13 접근
쏠쏠한 관련 상식
✅ 저널링 파일 시스템
- 파일 시스템을 변경하는 도중에
시스템 크래시
가 발생했을 때 빠르게 복구하기 위한 방법
- 시스템 크래시 : 작업을 하던 도중 갑자기 전원이 나가거나 치명적인 오류로 인해 컴퓨터가 강제 종료되는 상황
- 저널링(journaling) 기법이라는 작업 로그를 사용한다.
- 파티션에 로그 영역을 만든다. ⇒ 로그 영역 | i-node 영역 | 데이터 영역(디렉터리 & 파일)
- 저널링 기법 사용 과정
- 작업 직전 파티션의 로그 영역에 변경사항에 대한 로그를 남긴다.
- 로그를 남긴 후 작업을 수행한다.
- 작업이 끝나면 로그를 삭제한다.
- if 시스템 크래시가 발생하면, 파일 시스템 전체를 검사할 필요 없이 로그 영역에 남긴 로그만 검사하면 됨
요새는 이거 다 지원함.
✅ 마운트(mount)
- 저장 장치 간 접근할 수 있도록 파일 시스템을 편입시키는 작업
- 컴퓨터 ← USB 메모리 mount