Disk system
HDD의 기초! 디스크 시스템에 대해 알아보자.
- 데이터는 disk에 저장.
- disk는 어떻게 생겼을까?


- 이 원판을 disk pack이라고 함.
- 데이터 영구 저장 장치.
- 비휘발성.
- 구성
- sector
- 데이터, 저장 판독의 물리적 단위.
- track
- Platter 한 면에서 중심으로 같은 거리에 있는 sector들의 집합
- cylinder
- 같은 반지름을 갖는 track의 집합.
- platter
- 양면에 자성 물질을 입힌 원형 금속판 데이터의 기록/판독이 가능한 기록 매체.
- surface
- Platter의 윗면과 아랫면.
- 데이터가 저장된 걸 읽는 기능(판독)도 필요함. → disk drive.
- Disk pack에 데이터를 기록하거나 판독할 수 있도록 구성된 장치
- 구성
- Head
- 디스크 표면에 데이터를 기록/판독.
- Arm
- Head를 고정/지탱.
- Positioner
- (boom) Arm을 지탱 Head를 원하는 원하는 track으로 이동.
- Spindle
- Disk pack을 고정
- (회전축) 분당 회전 수 (RPM, Revolutions Per Minute). 높을수록 빨리 돌아 정보를 빨리 읽을 수 있음.
디스크 드라이브에 원하는 정보를 찾으려면?
Disk Address
- Physical disk address (물리 주소)
- Sector (물리적 데이터 전송 단위)를 지정
- 파일로 저장하면 찾는 건 OS의 역할임. 하지만 OS가 모든 종류의 하드 디스크를 알기 어려운데 (회사, 기기가 다 달라서) 디스크마다 가지는 physical 특징을 알 수 없음.
- 그래서 OS는 추상적으로 block들의 집합이라 생각함. 이 block 번호는 logical address가 됨.

- Logical disk address: relative address
- Disk system의 데이터 전체를 block들의 나열로 취급.
- Block에 번호 부여.
- 임의의 block에 접근 가능.
- 하지만 결국 block 번호를 physical address로 변환해야 함. 어떻게? → (disk driver) 프로그램 사용. 이 드라이버가 os가 바라보는 logical한 address를 실제 하드웨어가 가진 address로 변환해주는 역할을 함.
- 이를 그림으로 나타내면
- 원하는 데이터를 access 하는 과정.
- Seek time
- 디스크 head를 필요한 cylinder로 이동하는 시간.
- Rotational delay
- 1) 다음, 필요한 sector가 head 위치로 도착하는 시간.
- Data transmission time
- 2) 다음, 해당 sector를 읽어서 전송(or 기록)하는 시간.

Data access time = Seek time + Rotational delay + Data transmission time
File system
- 사용자들이 사용하는 파일들을 관리하는 운영체제의 한 부분.
- File system의 구성
- Files
- 연관된 정보의 집합.
- Directory structure
- 시스템 내 파일들의 정보를 구성 및 제공 (파일을 폴더, 디렉토리에 넣듯).
- Partitions
- Directory들의 집합을 논리적/물리적(ex.
disk
,c:// drive
)으로 구분.
File
- 파일이란 보조 기억 장치(disk)에 저장된 연관된 정보들의 집합.
- 보조 기억 장치 할당의 최소 단위.
- 실린더 몇 번의, 섹터 몇 번의, surface 어디에 저장하라고 안 함.
- 물리적으로 정의하면 bytes 들의 집합(Sequence of bytes).
- 내용에 따른 분류
- Program file
- Source program, object program, executable files
- Data file
- 형태에 따른 분류
- Text (ascii) file
- Binary file
- 다양한 속성을 가짐. (File attributes)
- Name
- Identifier
- Type
- Location
- Size
- Protection
- access control information
- User identification (owner)
- Time, date
- creation, late reference, last modification

- 파일에 대한 연산도 있음 (File operations).
- Create
- Write
- Read
- Reposition
- Delete
- Etc.
- OS는 file operation에 대한 system call(사용자가 사용할 수 있는 기능들의 집합)을 제공해야 함. OS를 만들 때 고려해야 할 점임.
- 어떻게 파일에 접근할까?
- Sequential access (순차 접근)
- File을 record(or bytes) 단위로 순서대로 접근
- E.g., fgetc()
- Directed access (직접 접근)
- 원하는 Block을 직접 접근
- E.g., lseek(), seek()
- Indexed access
- Index를 참조하여, 원하는 block를 찾은 후 데이터에 접근.
- 배열의 index 찾는 형태와 비슷함.
Directory Structure
- 폴더임.
- 왜 폴더에 넣을까? → 분류, 보관하려고!
- 디렉토리도 마찬가지로 다양한 연산이 가능함.
- Search for a file
- Create a file
- Delete a file
- List a directory
- Rename a file
- Traverse the file system
Partitions (minidisks, volumes)

- Virtual disk.
- 물리적인 디스크를 논리적으로 나누거나 합친 가상 디스크.
알면 좋은 용어 하나!
Mounting
- 초기(현재) 파일 시스템에 신규 파일 시스템을 붙일 수 있음. 이 때 붙이는 걸
mounting
이라 함. mounting하는 지점을mount point
라 부름.

Directory Structure
- 흔히 말하는 폴더.
- logical한 directory structure를 여러가지 형태로 생각해볼 수 있음.
- Flat (single-level) directory structure
- 2-level directory structure
- Hierarchical (tree-structure) directory structure
- Acyclic graph directory structure
- General graph directory structure
Flat Directory Structure
- 파일 시스템 내에 하나의 directory만 존재. 한 폴더 안에 모든 파일이 존재.
- Single-level directory structure
- ex) 초창기 mp3. 기기 내 노래만 담을 수 있는 형태.
- 문제
- File naming
- File protection (덮어쓰기)
- File management
- 다중 사용자 환경에서 문제가 더욱 커짐

2-Level Directory Structure
- 사용자 마다 하나의 directory 배정
- 구조
- MFD (Master File Directory)
- UFD (User File Directory)
- 문제
- Sub-directory 생성 불가능
- File naming issue
- 사용자간 파일 공유 불가. 하나를 공유하더라도 파일 전체를 access 해야 함.

Hierarchical Directory Structure
- Tree 형태의 계층적 directory 사용 가능.
- 사용자가 하부 directory 생성/관리 가능 (폴더 안에 새로운 폴더 생성 가능).
- OS 입장에서 System call이 제공되어야 함.
- 해당 형태가 등장하며 나온 용어들.
- Home directory (가장 상위), Current directory.
- Absolute pathname(home에서 현재 위치), Relative pathname (현재부터 목표위치)
.
은 현재,..
은 상위.ls ~
는 최상위 홈으로 감.
- 대부분의 OS가 사용.

Acyclic Graph Directory Structure
- graph 개념 등장.
- Hierarchical directory structure 확장.
- 원형이 될 수 없는 (무한 루프를 허용하지 않는) 형태의 구조.
- Directory안에 shared directory, shared file를 담을 수 있음
- Link의 개념 사용 (바로가기)

General Graph Directory Structure
- Acyclic Graph Directory Structure의 일반화
- Cycle을 허용
- 문제
- 무한 루프. 따라서 프로그램을 만들 때 File 탐색 시, Infinite loop를 고려해야 함.

File Protection
- file에 대한 부적절한 접근 방지.
- 다중 사용자 시스템에서 더욱 중요함.
- 접근 제어가 필요한 연산.
- Read
- Write
- Execute
- Append
- 파일 보호 기법 (system size 및 응용 분야에 따라 다를 수 있음).
- password 기법
- 각 file들에 PW 부여.
- 비현실적.
- 사용자들이 파일 각각에 대한 PW를 기억해야 함.
- 접근 권한 별로 서로 다른 PW를 부여 해야 함.
- access matrix 기법
범위(domain)
와개체(object)
사이의접근 권한
을 명시.- (user) (file, 접근 대상) (access right) ⇒ 파일마다 사용자 그룹의 권한을 적어놓는 것.
- 구현
- Global table
- 시스템 전체 file 들에 대한 권한을 table로 유지 (통째로 저장).
- 단점 : large table size (overhead).
- 🤔 빈 영역은 저장하지 않을 수 있을까?
- Access list & capability list
- Access list
- 열(파일)을 리스트로 표현.
- 각 object에 대한 접근 권한을 나열.
- 실제 OS에서 많이 사용됨.
- 파일을 access할 때마다 체크해야 하는 overhead가 있어 capability list 등장.
- object를 많이 접근하는 경우 느림.
- capability list
- 행(도메인)을 리스트로 표현.
- 각 domain에 대한 접근 권한 나열.
- kernel 등 시스템이 capability list 자체를 보호 해야 한다는 단점. 보호하지 않으면 보안이 위험.
- object에 대한 접근에 유리하지만 object 별 권한 관리(취소 등)가 어려움.
- Lock key mechanism
- access list와 capability list를 혼합한 개념.
- Object는 Lock을, Domain은 Key를 가짐.
- 여전히 시스템이 key list를 관리해야 한다는 단점이 있음.
- access list + capability list
- 많은 OS가 사용함.
- object에 대한 첫 접근 → access list 탐색.
- 접근 허용 시, capability 생성 후 해당 프로세스에게 전달. 이후 접근 시에는 권한 검사 불필요 (ex 출입증)
- 마지막 접근 후 → capability 삭제.







File System implementation
파일 시스템을 직접 구현해보자!
Allocation methods
어떻게 디스크 공간을 파일에게 할당하는가
Free space management
디스크의 빈 공간을 어떻게 관리하는가
Allocation methods
- continuous allocation
- 연속된 공간 할당.
- 한 file을 디스크의 연속된 block에 저장.
- 장점
- 효율적인 file 접근, 순차 또는 직접 접근.
- 단점
- 새로운 file을 위한 공간 확보가 어려움.
- external fragmentation (넣을 공간은 있지만 연속된 곳이 없어 넣지 못하게 되는 것).
- 파일이 커져야 하는 경우를 고려해야 하기 때문에 file 공간 크기 결정이 어려움.
- 연속된 공간 할당이 어렵다면 연속되지 않게 하면 됨!

- noncontinuous allocation
- linked allocation
- file이 저장된 block들을 linked list로 연결.
- directory는 각 file에 대한 첫 번째 block에 대한 포인터를 가짐.
- 구현이 간단, no external fragmentation.
- 단점
- 직접 접근에 비효율적.
- 포인터 저장을 위한 공간 필요.
- 사용자가 포인터를 실수로 건드리는 등 신뢰성에 문제가 있음.
- 가장 많이 쓰는 건 File Allocation Table (FAT)임. 각 block의 시작 부분에 다음 블록 번호를 기록하는 방법으로 MS-DOS, Windows 등에 사용됨.
- indexed allocation
- file이 저장된 block의 정보(pointer)를 index block에 모아둠.
- 직접 접근에 효율적, 순차 접근에 비효율적.
- file 당 index block을 유지함 → space overhead, index block 크기에 따라 파일의 최대 크기 제한.
- unix 등에 사용됨.



프로그램을 만들 때 allocation 방식을 선택해 효율적으로 관리할 수 있음.
Free space management
- bit vector
- 시스템 내 모든 block들에 대한 사용 여부를 0, 1 즉 1 bit flag로 표시. 0이면 빈공간임.
- simple & efficient
- bit vector 전체를 메모리에 보관(space overhead)해야 하기 때문에 대형 시스템에 부적합함.

- linked list
- linked list 형태로 관리. 시작점에서 다음 공간을 찾아감.
- link라는 공간을 갖고 있어야 하고, 탐색 시간이 비효율적임. 일일히 하나씩 따라가는 것은 부담임.

- grouping
- n개의 빈 block을 그룹으로 묶고, 그룹 단위로 linked list로 연결.
- 연속된 빈 block을 쉽게 찾을 수 있음.

- counting
- 연속된 빈 block들 중 첫 번째 block 주소와 연속된 block된 수의 table로 유지.
- 하단은 예시.
- continuos allocation 시스템에 유리하나 공간이 번갈아 가며 비어있다면 오히려 비효율적일 수 있음.
빈 공간 시작 | 시작점부터 개수 |
0 | 6 |
8 | 3 |
- 프로그램이 데이터를 어떤 형태로 자주 접근하는 가에 대해 고민하고 정해야 함.