본문 바로가기

Domain/운영체제

[운영체제] 6. File System Basic

정규 장치와 프로토콜

장치(Device)

  • 인터페이스: Command, status, data 레지스터로 구성된다. 
  • 내부: 로직을 담당하는 controller, special chips, SW(firmware)와 메모리를 담당하는 I/O buffer로 구성된다.

 

프로토콜(Protocol): 장치간의 상호작용의 순서를 의미한다

Idle check → data → command → finish check

위의 순서를 제공하는 메커니즘으로 Programmed I/O, interrupt, DMA 등이 존재한다.

 

Interrupt를 이용한 CPU의 부하 감소

Interrupt

장치가 Idle 상태가 될 경우 CPU에게 알리게 된다. 따라서 해당 쓰레드는 sleep 상태로 overlapping이 가능하다.

 → CPU의 부하가 줄어들지만 interrupt를 처리하기 위한 메커니즘이 필요하다.(sleep 큐 관리, Context switch)

Polling

CPU가 장치의 상태를 계속해서 확인한다. 해당 쓰레드는 running 상태로 overlapping이 불가능하다.

 → CPU의 부하가 크다. 다만, 특별한 관리가 필요하지 않다. 빠른 수행이 보장된다면 나쁘지 않다.

 

좌측이 polling, 우측이 interrupt

 

DMA를 통해 더 효율적인 데이터 이동

DMA(Direct Memory Access)

장치가 메모리에 직접 접근하여 데이터 복사 작업을 CPU 대신 수행하여 ovelapping이 가능하다.

 

Programmed I/O

CPU가 데이터 복사 작업을 수행한다. 병목 현상이 발생한다.

좌측이 PIO, 우측이  DMA

 

Device Drvier

커널에 존재하는 장치(device)를 추상화하는 소프트웨어 집합으로 두개의 층으로 이루어진다.

  • 관리계층(Manage): 장치 레지스터, 인터럽트, DMA
  • 일반 인터페이스 지원(Support generic interface): 파일 개념 (open, read, write)

 

장치의 종류

1. Character device: 터미널과 같은 유저가 직접 접근 가능한 장치. 

System call Driver Devices

 

2. Block device: 디스크와 같이 유저가 file system을 통해 접근 가능한 장치.

System call File system Block layer Driver Devices

 


하드 디스크 드라이버(Hard Disk Drivers)

 

하드 디스크의 기본 구조

  • 많은 sector가 모여 표면에 존재하는 수많은 track이 되고, 이런 표면이 두개가 양면으로 되어 platter가 된다.
  • Head: 데이터를 감지한다. 표면당 한개씩 존재하여 arm에 부착되어 있다.
  • Cylinder: 각 표면의 같은 위치의 트랙 집합으로 seek time 없이 데이터를 접근할 수 있다.
  • 데이터 접근: seek time + rotation time + transfer time


I/O Time & I/O rate

I/O time = seek time + rotation time + transfer time
I/O rate = (Size of transfer)/ (I/O time)

예시 워크로드

  1. 랜덤: 디스크 상의 임의의 위치에 존재하는 작은 사이즈의 데이터를 접근하여 읽는 것을 반복
  2. 연속: 연속적으로 100MB의 데이터를 읽음

연속적인 접근이 랜덤한 접근 보다 성능이 매우 좋다. 연속적인 접근을 하는 프로그램을 만드는게 성능상 유리하다.


Disk Scheduling

I/O request를 검사하고 다음 스케쥴링할 I/O 작업을 결정한다.

 

Disk scheduler의 종류

  1. FCFS(First Come First Service): 간단하지만 긴 seek time이 유발된다.
  2. SSTF(Shortest seek time first): seek time은 최적이지만 불공평하다.
  3. SCAN: 트랙을 가로질러 앞, 뒤로 움직이며 스케쥴링한다.
  4. C-SCAN: 한 방향으로만 움직여 SCAN보다 형평성이 좋다.
  5. SPTF(Shortest positioning time first): seek time과 rotation time을 모두 고려한 스케쥴링 기법이다.


Files and Directories

File

디스크에 영속적으로 저장되는 문자열로 각 파일은 다양한 데이터의 형태를 갖고 있지만 OS 입장에서는 모두 문자열이다. 파일은 절대경로, 상대경로로 이름을 가지며 파일별로 inode가 존재한다.

 

Directory

계층화를 생성하는 특수한 파일로 <파일명, inode_number>를 쌍으로 갖고 있다.

 

 

* 파일 시스템의 데이터의 종류

  1. User date: 유저가 직접 작성한 데이터
  2. Metadata: 파일시스템이 파일을 관리하기 위해 작성한 데이터

 

Hard link & Soft Link

Hard link 현재 존재하는 파일을 다른 이름으로 접근 가능하다. 새로운 이름을 기존 파일의 inode와 연결하는 방식이다.

Soft link 새로운 이름과 함께 inode로 새로이 만든다. 해당 inode는 기존의 파일을 가리킨다. 다른 파일시스템 간의 link가 가능하다는 장점이 있지만, dangling reference가 발생한다.

Dangling reference: 실제 존재하지 않는 파일을 참조하는 포인터

 

파일 시스템 생성과 마운트

파일시스템은 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제를 가리키는 말이다. 파일 시스템은 디렉토리와 파일의 조합으로 메타데이터는 superblock과 bitmap 등이 존재한다.

 

API의 종류

1. mkfs: 파일 시스템을 생성하는 API

2. fdisk: 디스크를 여러개의 파티션으로 분할하는 API. 각 파티션은 서로 다른 파일 시스템을 만들 수 있다.

3. mount: 여러 파일 시스템을 정해진 형식의 디렉토리 트리의 형태로 연결하여 유저가 사용할수 있게 만든다.

 

파일 시스템의 레이아웃

  • Superblock: 파일 시스템을 관리하기 위한 메타데이터로 파일 시스템당 한개만 존재한다.
  • Bitmap: 파일 시스템 내부의 가용 공간을 관리하기 위한 메타데이터로 데이터와 inode bitmap이 존재한다.
  • Inode: 파일을 관리하기 위한 메타데이터로, 파일 당 하나의 inode가 존재한다
  • Userdata: 유저가 직접 작성한 데이터가 저장되는 공간이다.

간단한 파일 시스템

 

inode

파일에 대한 정보를 저장하는 부분과, userdata의 블럭의 위치를 저장하는 부분으로 나눈다. 블럭을 가리키는 방식은 multi-level indexing 방식으로 작은 파일을 빠르게 접근 가능하며 큰 파일도 지원한다.

 

예제. hello.c(7KB) 파일을 root 디렉토리 밑에 새로 만들고, 해당 파일을 컴파일하여 a.out(70KB)가 새로 생성될 경우

inode와 data의 위치를 찾는 방법

inode

디렉토리는 <파일명, inode_number>의 쌍으로 구성되고 이때의 inode_number는 inode table의 인덱스이다. 블럭당 inode의 개수로 나눈 결과로 나온 몫과 나머지로 참조한다.

 예시. inode_number=33/16= 2....1 2번 inode 블럭의 1번 위치에 존재

 

Userdata 

inode를 찾고, current_offset을 블럭의 크기로 나누어 나온 몫과 나머지로 참조한다.

 예시. current_offset=5000/4096=1... 904, 해당 파일의 inode의 1번 다이렉트 포인터의 904번 위치에 존재.

 

 

 

 * Pre-allocation: 데이터 블럭을 할당할 때 실제 필요한 블럭보다 많은 블럭을 할당하는 방식. 파일 크기가 커지더라도 순차적으로 접근이 가능하다는 장점이 있다.

Cache and Buffering

1. Cache

자주 접근하는 파일이나 디렉토리를 DRAM에 저장하여, 디스크의 접근을 최소화한다.

2. Buffering(Delayed write)

여러 write 작업을 합쳐 하나의 write 작업으로 바꾸거나, write 작업들의 순서를 조절하여 seek overhead를 줄인다. 임시적인 파일은 write를 피하기도 한다.

※ 문제점: 전원이 나갈 경우 데이터 손실 → fsync(), Direct I/O로 해결