본 내용은 Operating System Concepts 8th Edition 번역본 책을 읽고 공부한 내용입니다.
목차
1. 파일이란?
1) 파일에 대한 개념
2) 파일이 User에게 주는 효과
3) 파일 연산
4) 파일 접근 방식
5) file과 directory의 공통점과 차이점?
3. Organization of Files
1) 이전에 사용하던 방식
2) multilevel indexed allocation
3. Data Structures for File
1) UNIX FILE SYSTEM
2) 단일/이중/삼중 간접 인덱스
3) Directory 찾아가기
4. 디스크
1) Disk Head Scheduling
2) Redundant Array Of Inexpensive disk
1. 파일이란?
1. 파일에 대한 개념
file system abstraction - OS는 정보에 대한 일관된 논리적 관점을 제공하고, 저장장치의 물리적 특성을 추상화하여 논리적 저장 단위, 즉 파일을 정의한다. 파일은 OS에 의해 물리 장치로 매핑되며, 이들 저장장치들은 일반적으로 비휘발적 성질을 갖기 때문에 전원이 끊어지거나 시스템이 재부팅되어도 저장된 내용들은 영구히 존속된다.
이 때 자료가 파일 안에 존재해야만 보조 저장장치에 기록될 수 있다. 일반적으로 파일은 프로그램과 자료를 나타낸다. 자료 파일은 숫자, 문자, 이진수로 구성되고, 텍스트 파일처럼 자유 형식일 수도 있다. 일반적으로 작성자와 사용자에 의해 그 의미가 정의된 비트, 바이트, 라인, 레코드들의 연속으로 볼 수 있다.
2. 파일이 User에게 주는 효과
파일은 User에게 매우 중요하다. 그 효과들에 대해 알아보자!
- Persistence(지속성) - 데이터의 유지와 보존에 도움이 된다. 사용자가 파일을 생성/수정한 후에도 시스템이 이를 계속해서 저장하고 유지할 수 있어야 한다. 따라서 시스템의 장애나 전원 손실 등의 사건에도 데이터가 안전하게 보호/복구될 수 있도록 한다.
- Ease of Use(사용 편의성) - 사용자는 파일을 쉽게 찾고, 생성하고, 수정할 수 있어야 하며 필요한 경우 파일을 다른 위치로 이동하거나 복사할 수 있어야 한다.
- Efficiency(효율성) - 시스템 자원을 효율적으로 활용하여 파일 및 디렉토리의 생성, 수정, 삭제 등의 작업을 신속하고 경제적으로 수행할 수 있어야 한다.
- Speed(속도) - 파일을 빠르게 열고 저장하며 검색/탐색 작업을 신속하게 수행할 수 있도록 한다.
- Protection(보호) - 데이터의 보안과 무결성을 보장할 수 있어야 한다.
3. 파일 연산
* 대략적인 설명
UNIX MODEL에서 file과 I/O 모두 다 file로 본다.
생성 시 create를 삭제 시 delete를 쓰며, 읽고 쓸 때 read/write, 열고 닫을 때에는 open/close, 소켓에서는 send/receive 명령어와 listen 등이 추가되어 사용된다.
Create
disk에는 inode와 directory name값이 저장된다. 이후 해당 file을 위한 디스크 공간을 할당한다.
Open
unique한 file ID를 할당하고, 해당 파일에 대해 어떤 access가 가능하게 할 것인지 r, w, rw에 대한 모드를 세팅한다.
Close
Delete
disk에서 해당 inode에 대한 link를 끊어버리고 inode에 있는 값들을 전부 지워버린다.
Read
Random access read와 Sequential access read로 나누어진다.
Write
Read와 비슷하다. read는 disk에서 가져오는 것이라면, write는 kernel에서 가져와서 쓰는 것을 의미한다.
4. 파일 접근 방법(Access Methods)
파일이 사용될 때에는 이 정보가 메모리로 적재되어야 한다. 어떤 시스템은 단 하나의 접근 방법만 제공하지만, IBM과 같은 다른 시스템은 많은 접근 방법을 제공한다. 따라서 특정 응용에 맞는 접근 방법을 선택하는 것이 매우 중요한 설계 문제가 된다.
1. 순차 접근(Sequential Access)
파일의 정보가 레코드 순서대로 차례차례 정리된다. 이 접근 모드는 가장 일반적이며 예를 들어, 편집기나 컴파일러는 보통 이러한 형식으로 파일에 접근한다. 디스크 속 파일을 마치 테이프 재생하는 것처럼 접근한다.
파일에 대한 대부분 연산은 읽기와 쓰기이다. 읽기는 파일의 다음 부분을 차례대로 읽어가며, 읽은 후에는 현재 위치를 추적하는 파일 포인터가 자동으로 증가된다. 쓰기 작업은 파일의 끝에 추가하며 새로운 파일의 끝으로 파일 포인터가 이동한다. 오프셋을 맨 앞이나 맨 뒤로 옮길 수도 있고 정수 n개의 레코드만큼 앞뒤로 건너뛸 수도 있다.
2. 직접 접근(Direct Access)
직접 접근의 파일은 고정 길이의 논리 레코드로 구성되고 특별한 순서 없이 빠르게 레코드를 읽고 쓸 수 있다. 이 접근 방법은 파일의 디스크 모델에 기반을 하며 임의의 파일 블록에 임의적(무작위!) 접근이 허용된다. 따라서 읽거나 쓰기 순서에 제약이 없다.
5. file과 directory의 공통점과 차이점?
공통점은 directory 도 file 이다. HDD에 저장되어 있다. 파일/디렉토리 하나가 inode 하나이다.
차이점은 한 file에 있는 내용이 directory 정보일 뿐이다! File은 사용자가 정의한 관련 정보의 논리적 묶음으로 이름지어진 것이지만 Directory는 사용자가 정의한 관련 파일들의 논리적 묶음으로, 파일들의 메타데이터이다.
2. Organizations of Files
1. 이전에 사용하던 방식
연속 할당 : 각 파일이 디스크 내에서 반드시 연속적인 공간을 차지하도록 할당
연결 할당 : 연속 할당의 문제를 해결. 어느 곳에도 산재할 수 있으며, 파일의 첫번째와 마지막 블록을 가리키는 포인터를 가짐. 하지만 link가 한 번 떨어지게 되면 뒤쪽 것들을 모두 잃는다.
색인 할당(index): 페이징 기법과 유사하다. 디스크 블록 주소를 모아놓은 배열인 색인 블록 하나를 가진다.
2. 현재 사용하는 방식
이 방식은 12개의 direct block과 하나의 single, double, triple indirect block을 가지는 방식이다. direct block은 직접적인 data block을 가리키며, indirect block은 index block이다.
single indirect block은 index block이므로 여러 data block의 link를 가지고,
double indirect block은 index block의 link를 가지는 index block이며,
triple indirect block은 index block의 link를 가지는 index block의 link를 가지는 index block... 😬
따라서 한 index block이 256개의 link를 가진다고 가정한다면,
최대 12 + 256 + 256 * 256 + 256 * 256 * 256 = 16843020개의 link를 가질 수 있다. (위에서도 설명했다!!)
따라서 하나의 block이 512 byte라고 가정하면 8623626240 byte의 크기를 저장할 수 있다.
현재에는 이 방식을 택하였다.
3. Data Structures for Files
1. UNIX FILE SYSTEM
우선 아래 정보를 참고하고 손그림으로 간단히 살펴보자!
✓ file 하나가 inode 하나이다!
✓ directory 도 file 이다. HDD에 저장되어 있다. 한 file에 있는 내용이 directory 정보일 뿐이다!
손그림에서 보면, "/usr/ast/mbox/hello.c" 파일을 오픈하려고 한다. 이 때, 이를 fid(index node 값)로 받을 수 있다. 이후 이 파일을 적절한 호출 매개변수를 이용하여 fread(fid, sipe, bif)로 읽어낼 수 있다.
per-process file table에서 #n과 #n+m 프로세스 둘이 모두 open file table에 접근하려고 한다. 이렇게 multi access 하고 있을 때 두 개의 포인터가 모두 한 곳을 가리키는 것을 알 수 있다. 이 open file table의 hello.c 는 active index table의 한 지점을 pointing하고 있다. 그 지점을 따라 내려가면 그 곳은 data block에 대한 inode를 pointing하고 있음을 알 수 있다.
① disk inode
파일의 크기, 소유자, 권한, 생성 일자 등의 정보를 저장하고 있으며, 파일이 실제 데이터 블록을 어디에 저장하고 있는지를 가리키는 포인터도 포함한다.
② active index table
활성 인덱스 테이블은 디스크에 저장된 파일 시스템의 인덱스 정보를 메모리에 유지한다. 이를 통해 파일 시스템의 성능을 향상시킬 수 있다. 이 테이블은 메모리 상에 있으므로 디스크 엑세스보다 훨씬 빠르게 파일 및 디렉토리에 대한 엑세스를 수행할 수 있다.
③ open file table
열린 파일 테이블은 OS에서 열려 있는 파일에 대한 정보를 유지하는 데이터 구조이다. 각 열린 파일은 해당 파일에 대한 디스크 아이노드의 참조, 현재 위치(파일 포인터), 열린 파일의 상태 등에 대한 정보를 가지고 있다. 이 테이블은 프로세스가 파일을 open, write, read하는 작업을 수행할 때 사용되며, 파일 디스크립터를 통해 접근된다.
④ per-process file table
프로세스별 파일 테이블은 각 프로세스마다 유지되는 데이터 구조로, 해당 프로세스에서 열린 파일에 대한 정보를 저장한다. 각 프로세스는 자신의 프로세스별 파일 테이블을 통해 열린 파일에 접근하고 관리할 수 있다. 이는 다중 프로세스 환경에서 각 프로세스가 독립적으로 파일을 열고 조작할 수 있도록 한다.
2. Single/Double/Triple indirect index(단일/이중/삼중 간접 인덱스)
이들은 파일 시스템에서 대용량 파일을 효과적으로 관리하기 위해 사용되는 index 방식이다. single indirect index는 직접 블록에 대한 포인터를 가지고 있고, double indirect index는 간접 블록을 통해 다수의 블록에 대한 포인터를 가지고 있으며, triple indirect index는 double indirect index를 통해 다수의 간접 블록에 대한 포인터를 가지고 있다.
파일 용량이 그리 크지 않다면 direct index 방식으로 data block에 할당하면 되겠지만, 파일 용량이 커지면 single/double/triple indirect index 방식으로 할당할 수 있다. 이들은 각각 10, 11, 12 index table에 존재한다. 이들은 위에 있는 0~9 의 index table을 pointing하지만 data block을 pointing 하지는 않는다!
UNIX 구조에서 위의 data block에 대한 file 할당을 어떻게 실행하는지 보자.
먼저 block 한 개가 1KB라고 하고,
0 1 2 3 4 5 6 7 8 9 10 11 12 index 에 해당하는 inode table이 존재한다.
만약 우리가 11.5KB의 file을 넣으려고 한다면 10KB는 0부터 9까지 넣으면 되지만 남은 1.5KB는 pointing하는 방법으로 data block 하나 자체가 흡사 index table처럼 사용된다.
Q 그럼 indirect index와 single indirect index를 함께 쓰면 최고 몇 KB 의 file을 저장할 수 있을까?
한 block 하나에 128개의 index table을 넣을 수 있다고 하면, 10+128=138KB까지 저장할 수 있다.
Q 이번에는 Triple indirect table이 만들어지는 경우의 상황을 보자.
아래 그림을 보면, inode 구조가 0~12까지 13개로 이루어져 있고 가장 하위 10, 11, 12는 각각 single/double/triple indirect index로 사용된다. 그리고 indirect index 하나에 pointing으로 지정할 수 있는 파일의 갯수는 1KB/4 = 256이다. 여기에서 4는 블록의 고정된 크기이다. 따라서 double indirect index까지 사용하여 저장할 수 있는 최대 파일의 크기는 10+256+256^2에 해당하고, triple indirect index까지 사용하여 저장할 수 있는 최대 파일의 크기는 10+256+256^2+256^3(대락 16기가)에 해당한다.
블록 크기가 1KB(1000byte)이고 하나의 pointer의 크기를 4byte라고 가정하자. 그리고 direct pointers는 10개라고 가정하자(위의 상황과 동일). 따라서 우리는 각 간접 포인터의 블록이 256(1000/4)개의 포인터로 이루어질 수 있음을 파악할 수 있다.
그렇다면 우리가 총 65547KB의 크기를 가지는 hello.c 파일을 디스크에 어떻게 넣는 것이 효율적일까? 우선 10 크기의 direct indexing과 10+256 크기의 single indirect indexing으로는 불가능하다. 그렇다면 double indirect indexing 은? 10+256+256^2=65802 이므로 가능하다!
3. Directory 찾아가기
위에서 directory도 하나의 file, inode라고 설명하였다.
그러면 directory의 근간! root directory는 어떻게 찾아갈 수 있을까? root 는 inode 2번으로 지정되어 있다.
이후 하위 directory까지 나아가는 과정은 어떻게 될까?
먼저 2번의 inode에 들어가게 되고 132번 data block에 들어가면 user/bin/div ..에 해당하는 directory의 index와 name이 들어가 있다. 해당 user(6)에 해당하는 inode에 접근하면 이 inode에도 header와 13개의 ilist가 있다. 이후 또 여기에서 data block에 들어가게 되고.. 이를 반복한다.
4. 디스크 스케줄링
1. Disk Head Scheduling
- FCFS : 큐에 들어온 순서대로
- SSTF: 현재 헤드에서 가장 가까운 트랙의 요청 먼저 처리
- SCAN: 헤드셋의 진행방향에 있는 요청을 처리하고 다시 반대 방향으로 틀어 반대로 가는 , 엘리베이터 기법
- C-SCAN: 항상 한 쪽 방향에서 반대방향으로 진행하며 트랙의 요청 처리
- LOOK / C-LOOK : SCAN / C-SCAN과 같은데 max 값까지만 간다.
2. Redundant Array Of Inexpensive disk
독자적인 disk를 여러 개 붙여놓았다. reliability/redundancy를 위해서 !
- RAID 0 : 왔다갔다 배치하고 살릴 수가 없음
- RAID 1 :mirroring 기법.디스크 백업이 가능한 구조이며 reliable하다.
- RAID 5 :A 1,2,3을 쓰고 그 parity block을 디스크 한 쪽에 적는다. Disk 중 어떤 것이 down되더라도 parity를 이용하여 복구할 수 있다.
- RAID 0-내결함성이없는 스트립 디스크 어레이
- RAID 1-미러링 및 이중화
- RAID 2-메모리 스타일 오류 수정 코드
- RAID 3-비트 인터리브 패리
- RAID 4-블록 인터리브 패리티
- RAID 5-블록 인터리브 분산 패리티
- RAID 6-P + Q 이중화
'CS > OS' 카테고리의 다른 글
[OS] 메모리 관리 (0) | 2023.06.12 |
---|---|
[OS] Deadlock (2) | 2023.06.09 |
[OS] CPU Scheduling (0) | 2023.06.09 |
[OS] 프로세스 동기화 (0) | 2023.04.13 |
[OS] 다중 스레드 프로그래밍 (0) | 2023.04.12 |