# S5FS

- System V File System 

- 하나의 볼륨(하나의 disk drive, 하나의 partition)당 하나의 파일시스템을 갖음

- 하나의 파일시스템은 Stand alone 시스템 : 파일에 대한 모든 컨텐츠와 정보들이 하나의 볼륨안에 저장이 됨

-  하나의 partition에 존재하는 block의 크기는 512 bytes (512, 1024, 2048)

- Sector들의 linear array = block의 linear array

- Boot Area : 0번째 block에 위치하며, Boot Program을 저장하고 있음.

Boot Area에서 Boot Program을 메모리로 로드하여 하드웨어 디바이스를 부팅시킴

- Super Block : 볼륨에 대한 파일시스템의 모든 메타데이터.

- inode list 


=> 전통적인 초창기 모델이므로 성능과 안정상에 문제를 가지고 있음

- 파일의 inode와 data block간의 물리적인 거리가 멀기 때문에 파일에 접근 시 과도한 Seek Operation이 발생

- Data Block의 할당/해제를 반복할수록 free block이 산재하게 되어 sequential block을 읽을 때 과도한 Seek Operation이 발생

- super block이 한곳에만 저장되어 있으므로 손상될 경우 파일시스템을 사용할 수 없음

- 컴퓨터 시스템에서 빈번하게 사용하는 operation에 최적화 되어있지 않음. 중구난방으로 흩어져 있음



# FFS

- UFS : Unix File System

- self-contained file system

-  cylinder group이라는 개념을 도입

: 인접한 cylinder를 묶어서 그룹화, 지역적으로 비슷한 곳에 있는 정보는 같은 cylinder group에 저장

- cylinder group마다 super block을 가짐(super block을 여러개 두어 recoverry를 도모)

- block안에 fragment라는 더 작은 단위를 도입. fragment단위로 allocation

- 하나의 cylinder group에 저장하기 힘든 사이즈가 큰 파일들은 인전 cylinder group으로 넘어감. (48KB 이상이 되면)


<장점>

- seek optimization.  적절한 spreading으로 동일한 파일의 Block들이 멀리 떨어져 저장되는 것을 방지

- lotational Delay optimization.

: seek operation에서 sector를 읽으려면 disk driver에서 read request 만들어서 날려야 할 때, 2 sector가 지나가는 시간이 걸린다고 가정.

0번 sector를 읽고 1번 sector를 읽어야 할 때, 한번 resquest를 하면 2개의 sector가 지나가면 1번 sector를 읽기위해서는 다시 한바퀴를 돌아야 함.

=> 이런 문제를 방지하기 위해 lotational delay를 계산하여 sector에 저장하도록 함

- long file name의 지원. 256characters.

- symbolic links의 도입

- Disk quota 도입


<한계>

- sequential read의 한계

- crash recovery가 느려지는 문제 발생. disk storage의 block size가 굉장히 빠르게 증가. 

=> 적절한 부팅 시스템을 무시하고 시스템을 power off하면 rebooting할 때 파일시스템의 inconsistency를 확인.

=> "fsck", file system check라는 command를 수행하는데 굉장한 시간이 걸림

=> log structured file system을 사용하게 됨


# LFS

: Log-structured File System 


> Crash recovery의 필요

- 성능향상을 위해 inode cache를 가지는 구조에서 문제가 발생하면 disk의 inode의 값과 메모리의 inode값이 일치하지 않게 될 수 있음

- disk에 대한 operation은 transaction과 같아 synchronous write를 수행하게 됨 


> fsck의 수행동작

- 시스템에 존재하는 inode들을 체크하여 used block들을 확인

- used block들의 구조에서 각각의 directory 별로 file contents를 모두 확인하여 파일의 inode를 확인

- inode indexdp mapping된 데이터가 제대로 있는지 확인. 찾을수 없는 파일이나 연결이 안된 디렉토리들... 

- lost + found directory에 보내기


> LFS 구현

- 새로 생성될, 새로 추가될 정보만 파일의 정보 뒤에 붙이게 됨

- log : Operations나 values, redo/undo log, 

- garbage collection : 어느 시점이 되어서 로그가 너무 방대해지면 sequential read operation이 굉장히 느려지게 됨

- group commit

- retrieval


# Disk Scheduling

- Request Queue : disk에 대한 I/O request를 저장하는 queue

- device drivers와 devices 사이에 request Queue가 위치

device driver에 I/O Scheduler가 스케쥴링을 수행

- Request Ordering을 수행하여 시간을 줄임

FIFO/FCFS (x)

SSTF (x)

Scan like Elevator (x)    => 양방향에 위치한 애들만 너무 불리해

Circular Scan (o)


> Flash memory 등의 경우에는 disk보다 더 복잡한 스케쥴링이 필요하게 됨

: bus share, multi processor, 공정의 여러 제약 등 






 

'System > Etc.' 카테고리의 다른 글

git  (0) 2016.01.17
FDT  (0) 2015.11.14
[OS 기초] File System  (0) 2015.11.05
[OS 기초] I/O Device와 Device Driver  (0) 2015.11.05
[OS 기초] Demand paging 3 - Trashing, Working Set  (0) 2015.11.04

# Files and Directories

# File System

# File Structures

# Disk Space Management

# Unix File System

# Disk Scheduling

# Conclusion



# File 

: 이름을 가지는 디스크에 저장되는 바이트의 집합


> Views 

- OS가 보는 File : Block Sequence. Disk는 Block Storage 이므로 Block 단위로 저장 (내부)

- User가 보는 File : Bytes Sequence  (외부)

=> OS의 File System은 User가 보는Bytes 단위를 시스템 OS가 보는 Block 단위로 mapping 해야 함


* Naming 

: Disk 상에 존재하는 File은 addressing할 수 있어야 하는 이유로 인해 외부적으로는 Text Name을 가져야 함. 내부적으로는 File Identify를 가져야 함.

(*OS는 Naming을 File 뿐만아니라 I/O Devices 에도 적용시킴)


* File Descriptors 

: 파일의 내용에 접근하기 위해 필요한 메타데이터들을 저장하는 자료구조. 


* Operations on Files

- create and delete files

- open files for reading and writing 

- seek within a file

- read from and write to a file

- close files 

- create directories to hold groups of files

- List the contents of a directory

- Removes files from a directory


# File Descriptors

- unix에서는 index node라고도 부름

- 파일의 메타데이터를 저장하는 자료구조

- 파일의 크기, 소유자, 소유 그룹, 액세스 타임, 접근 권한, ...

- inode : unix의 file system에서 파일에 대한 메타데이터를 저장하는 자료구조

- i-node의 index :  i-number, file descriptor의 ID. 


> FIle Descriptors의  저장

과거: array의 형태로 만들어 disk에 특정 block을 할당하여 저장.    

=> 과거 disk는 bad block이 많고 취약했기 때문에, single copy로는 데이터 보호를 제대로 할 수 없음

=> File Descriptor들을 디스크의 특정 영역에 모아두면 성능저하가 발생

: 디스크 스토리지 상에서 File Contents와 File Descriptors를 나누면 물리적인 거리가 멀기때문에 Seek Time이 커짐

현재 : data contents 근처로 file descriptors를 가까이 두어 분산시키거나, data recovery를 위해 data의 copies를 여러개로 만듬


-  in memory cache : 성능의 향상을 위해 File Descriptor의 복사본을 Main memory에 유지

=> 부작용이 생길 수 있음. File Desciptor의 값을 수정할 때, Disk와 Main Memory에저장된 File Descriptor의 값이 달라질 수 있음


- 과거, Main Memory의 Cache에 복사한 file descriptor의 값을 안전하게 Disk에 옮기지 않고 시스템을 종료하면,
    시스템 재부팅 시에 OS는 해당 내용을 Disk의 file descriptor의 내용을 재구성해야함.

but,  현재는 디스크의 용량이 굉장히 커져 복구하기가 어렵고, 재부팅이 시스템을 정상화 하게 하는 경우가 많아짐(스마트 폰...)

=> log structured file system으로 진화


# Directories

- bytes sequence

- File 및 sub directories를 가지고있는 entity

- 내부적으로 File과 동일하게 관리

- File과는 다르게 data content로 contains(text file name, descriptor index) 값을 가짐. 

=> file의 text name을 file id로 mapping하기 위한 기본 데이터


> Unix File System의 구조

- tree 구조

- root directory, 하위 디렉토리는 각 leaf가 root로 부터 unique

- root directory의 inode number : 2

* why? http://stackoverflow.com/questions/12768371/why-root-directory-is-always-stored-in-inode-number-two

- name parsing 


# 부가사항

> Working Directory : 현재 위치한 디렉터리

> Link : 선택적으로 필요에따라 back-door path를 지정하는 기능


* inode의 i-number 값은 system wide하게, unique 하게 부여하는 것이 아니라, 볼륨 단위로 부여를 함


- Symbolic Link : 링크시킬 파일의 full path 값을 새로 링크시켜줄 디렉터리에 복사

원본 파일 A에 대해 심볼릭 링크를 생성하면, A라는 가리키는 파일을 생성

( "symbolic_link_file_B -> original_file_A" )

원본파일 A를 삭제하면 A를 가리키던 심볼릭링크파일도 삭제 됨됨(수정도 마찬가지)


- Hard Link : 링크시킬 파일의 contains pair 값을 새로 링크시켜줄 디렉토리에 그대로 복사. 

원본 파일 A에 대해 하드링크를 생성하면, A라는 파일을 가리키는 "이름"을 하나 더 만듬.

즉, 둘 중 하나의 파일을 삭제하더라도 이름 뿐인 녀석을 삭제하였으므로 내용은 그래도 남게 됨. 한 녀석은 그대로 존재하게 됨


=> symbolic link가 더 유연함. i-node의 number는 볼륨 단위로만 unique 하므로 Hard Link에 사용하는 contains pair값은 system wide하게 unique하지 않음.

즉, Hard Link는 같은 볼륨내에서만 사용이 가능

=> symbolic Link는 full path를 가지고 구현하기 때문에 모든 link는 system wide하게 unique 함

즉, 다른 볼륨간에도 사용할 수 있음


# Big Picture

> File System 기능

1. logical file name(logical resource name)을 physical address로 변환하기 위해 naming 기능을 제공

2. 사용자의 데이터를 저장장치로부터 read/write 하는 기능을 제공


> Views on Files

- User

file name + byte offset

: file pointer로 offset을 움직이며 파일 읽기

* file 단위의 sequence of bytes

* 주요 file access 패턴

- sequention access : file pointer를 한 칸씩(bytes) 움직이면서 파일의 내용을 읽기

- random access : file pointer를 임의로 이동하면서 파일의 내용을 읽기


- Kernel 

ino + logical block number

* file안에 존재하는 sequence of block

* bytes단위가 아닌 block 단위로 내용을 읽기

* kernel의 file system은 밑에 device driver와 interface 해야 함

* file descriptor, = index node


- Device Driver

Physical block number

* disk volume 단위로 관리, sector들의 linear sequence

* volume : 단일 file system으로 관리되는 저장 장치 상의 영역

* sector들의 number


- Device

cylinder number

head number

sector number

drive number 이미 minor number로 사용 중


> File System in the Kernel (linux case)


user space            : file I/O    (system call : create, read, write, open, I/O contol)

--------------------------------------------------------------------------------

kernel space         : Virtual File System (VFS)  -> individual한 파일 시스템을 유니폼하게 사용자에게 제공하기 위해 필요


Individual Filesystems(EXT3, EXT4, JFFS2, VFAT, ...)


Buffer Cache(Page Cache) -> 최근 접근한 file의 Data Block의 내용을 Main Memory에 저장해 두는 공간으로 

디스크로 부터 한번 읽어온 파일의 내용에 다시 접근할 때, 빠른 속도를 제공함

(buffer cache도 swapping함. LRU같은 Policy를 적용)


I/O Schedulers


*Request Queue / Response Queue


Block Drivers   ,     Block Driver(FTL)

--------------------------------------------------------------------------------

Storage Media     : Disk ...... Flash



# File Structures

- Sequential access. ex. 방대한 코드를 컴파일 할 때,

- Random access.  ex. 데이터베이스에서 특정 데이터를 읽을 때, demanding paging에서 특정 page를 읽을 때, 

- keyed access. ex. 특정 key로 데이터를 읽을 때, (OS에서는 처리하지 않음)


* 과거 디스크는 fragmentation의 문제가 있음

=>  비연속적인 block단위로 allcation을 수행하여 fragmentation의 문제를 해결


1. Linked File 구조

: 해당 파일 디스크리터에 기록된 파일의 첫번째 블록의 주소를 통하여 파일에 접근

: fragmentation의 문제는 해결

: sequential access는 문제가 없으나, random access의 경우에는 seek time이 굉장히 오래 걸리게 됨

: 1970년대..


2. Indexed File 구조

: Unix의 기본 file 구조

: file descriptor에 파일이 가지고있는 block들에 대한 포인터를 index array로 저장

sequential access, random access 둘다 용이함

: data block들은 file system의 sector array 중 임의의 block을 할당. 각 file의 file descriptor들이 해당 block들을 가리키는 구조

: file descriptor는 일정한 크기를 갖는 descriptor들의 array로 구성. 

=> 그안에 넣을수 있는 index의 갯수가 제한. 한 파일의 크기는 index의 갯수만큼 제한된다는 단점!

=> double indirect block 구조를 사용하여 큰 사이즈의 파일도 수용할 수 있음

 (but, 이중으로 처리하는 이러한 구조는 기존에 비해 데이터를 더 액세스해야하므로 seek time이 증가)


# Related Mechanisms

1. Block buffer cache

2. bit map operation  : 디스크 블락을 할당할 때, 꼭 sequential한 위치에 할당하지 않아도 되지만, seek time을 줄이기 위해 같은 실린더안에 있는 block을 할당하거나 하는 등의 인접한 위치의 block을 할당하는 방법

=>  OS의 File System에선 비어있는 연속된 block의 위치를 bit map을 통해서 알 수 있음

=> block들에게 1bit씩을 할당하여 1이면 이미 할당됨을, 0이면 할당되지 않고 비어있음을 나타내게 함함

=> 소프트웨어적으로도 구현이 가능하나 대부분의 마이크로 프로세서가 해당 기능을 제공


* Bit Map을 사용한 디스크의 free block 관리

: 각 bit가 디스크의 block이 사용 중인지 아닌지를 나타내는 Array. 

 HW/SW String Search 기법을 사용해 연속적인 사용 가능한 block을 쉽게 찾을 수 있음


> File의 구조를 결정하는 요소

: sequention access, random access를 효율적으로 지원해야함

작은 file, 큰 file 모두 효율적으로 지원해야 함


> must have items

1. Naming

2. Protection

3. Reliability

4. Disk Space Management 


# Disk Space Management

: File이 생성되거나 확장될 때, 어떻게 disk sector들을 file에 할당해 줄것인가를 결정

- 오버헤드가 적게

- 파일에 빠른 액세스가 가능하게 등등

- 파일의 각 block들

- matadata : user에게는 보이지는 않지만 커널이 각 파일별로 관리. 

in-memory cache를 유지하고, system이 shutdown될 때는 consistency를 잘 유지해야 함

- crash policies


> Disk space allocation policies

1. contiguous allocation

2. Block-based allocation

3. Extent-based allocation : block들을 그룹으로 묶고 각 그룹에 semantics를 부여함으로써 최적화를 달성하는 정책

=> block 단위로 allocation을 하면 sequential read를 할 때 seek가 많이 발생하므로 큰 단위로 할당해야하는 필요가 있음



# Unix File Systems

- System V file system : s5fs

: 완전 기본적 전통적인 파일시스템

- Berkeley fast file system (FFS) - often called UFS, 1980 년대 s5fs를 개선

- Sun's network file system (NFS) - 분산 operation과 file system을 접목

- Sun's virtual file system (VFS) - 다양한 파일시스템을 지원하기 위한

- Log-structured file system (LFS) 






 

# I/O Hardware

# Device Drivers

# Colision



# I/O Hardware

CPU, Memory, HardDisk, Network card, ...


<Bus>

- System Bus, I/O Bus, 

- Address Bus, Data Bus, Control Bus 

- ISA, PCI, EISA, SCSI ...


> I/O Device 

- Controller, logic

- Register set


> I/O Device 내부의 Registers

- Status Register : 장치의 상태를 보여주는 Register

- Control Register : 장치의 동작을 결정하는 Register

- Data Register : 입출력할 데이터를 잠시 보관하는 Register

- Instruction Register ...


> I/O Device의 Register에 접근하는 두가지 방법

- Memory-Mapped I/O : 별도의 I/O address space를 갖지 않고, Physical address space의 일부를 할당하여 사용

* register를 access 하기위해 load/store 명령어를 사용 (모토롤라...),

- Port-Mapped I/O : 메모리의 주소와는 다른 방식의 주소를 할당하여 사용

* register를 access 하기위해 in/out 명령어를 사용 (Intel processor...), 


> Device Control

- device control = device의 register들을 프로그래밍

- OS는 I/O Bus의 address line에 특정 register의 address를 보낸 후 read/write같은 명령을 보내 수행하게 함


# I/O Devices의 분류

: unix OS는 굉장히 단순화 시키려고 노력하였으며 이런 환경에서 I/O Devices를 특성에따라 모델을 나누게 됨


- Character Devices : 입출력을 Character 단위로 수행. mouse, terminal, ...

- Block Devices : 입출력을 block이라는 임의의 단위로 수행. Disk Drive, Flash Drive, ...

- Network Devices : NIC, ...


> Character Devies


* ex. 


<Mouse driver의 역할 요약>

- Mouse Interrupt 발생 시, Mouse의 Data Register에서 값을 읽어오는 역할

- interrupt를 Event로 바꾸어 주는 역할


<Keyboard Driver의 역할>

- 키보드로부터 들오오는 각 캐릭터들을 Line buffer에게 순서대로 저장

- End-of-Line Character가 들어오면 전체 Line Buffer에 있는 데이터를  OS에게 전달


> Block Devices

- spindle

- arm assembly, arm, read-write head

- Track : 한 디스크 표면에서 스핀들로부터의 거리가 동일한 환형의 저장 공간

- cylinder : 여러장의 디스크를 수직으로 쌓여있는 동일한 반지름의 Track들의 집합

* cylinder 단위의 데이터 접근이 중요한 이유 (왜 cylinder라는 개념이 있는건가?)

: Arm Assembly가 고정된 상태에서 여러 platter에 걸쳐있는 한, 실린더의 트랙들을 동시에 읽을 수 있기 때문

- sector : 각각의 track을 분할하는 디스크 read/write 단위의 영역


> Disk Operation


* Sector : 디스크를 읽을 때 data transfer가 일어나는 최소 unit.

Sector에 접근하기 : cylinder number, track number in the cylinder, sector number in the cylinder


1. read/write head 선택

2. "seek", arm assembly를 해당 cylinder로 이동. (Move heads to the correct track)

* seek time : arm을 목표한 지점(해당 cyliner)까지 이동하는데 걸리는 시간

3. 해당 sector가 돌아올때까지 기다림 (spindle의 회전수에 비례, RPM-Rotation Per Minute)

* Rotational Delay : 디스크가 회전하여 목표한 지점(해당 섹터)이 head에 도착하는 시간


> Disk Performance

- seek time : 0-50 ms (avg 10-20 ms)

- rotational delay : 0-16ms

- typical drive spins at 3600-5400 RPM



> Flash Drive

- NAND flash memory : RAM과 Access pattern이 굉장히 다름. data tranper가 bytes단위가 아닌 block 단위로 일어남

- Page : Read/Write를 수행할 때 대상이되는 Data block. 2KB, 4KB, 8KB

* Page의 일부분은 Data를 저장하는 공간과 Spare Area라는 패리티, 에러처리 등 부수적인 정보 등을 저장하는 공간으로 나뉨

- Block : 64 pages, 128 pages


* Flash Memory > Blocks in a Flash Memory > pages in a Block > Spare areas in a page


* Flash Operations

- read : 하나의 페이지를 통째로 읽어옴

- write/program : flash의 해당 영역을 굽기

- erase : block 지우기. flash는 rom이므로 rewrite할 수 없음. 우선 지우고 다시 써야함.


<특성, 제약사항>

* Erase-before-write : NAND Flash 메모리는 데이터의 덮어쓰기가 불가능 하기 때문에 먼저 Erase로 초기화 한 후 write 해야 함.

* Worn-out : Erase 가능한 횟수가 제한적임

* Wear-leveling : NAND Flash의 한 영역에 Erase가 집중되어 worn-out이 발생하는 것을 막기위해 전체 영역을 고루 사용하도록 조절하는 기술

* read/write의 단위는 page, erase의 단위는  block


- Flash Memory를 Storage로 사용해 file system 구성하려면, Erase-before-write라는 제약조건 때문에 

반드시 Log Structure Architecture가 필요함


> Page단위로 write를 수행하다가 Erase를 수행할 때, 단위가 block으로 page보다 크므로 지우려는 page 외에도 다른 page의 데이터가 모두 지워짐

> 로그를 남겨 관리를 해야함. page remapping after update.

=> Log-structured file system


# Device Drivers

:  I/O Devices의 Control다른 프로그램들이 어떤 하드웨어 디바이스를 잘 사용할 수 있게 컨트롤 해주는 컴퓨터 프로그램

- 하드웨어 적인 측면을 관리하며, 기능을 사용자에게 추상화 시켜 사용하기 편하게 도와주는 역할을 함

Application과 Device, OS와 Device  사이에 위치하며, User들이 Device를 사용하기위해 함수들을 제공


* SW System의 구성

- 정적인 구성요소 : structure(process)

- 동적인 구성요소 : behavior(program)


- Device Drives의 요소

정적 구성요소 : Device Drives를 User Program이 사용하기 위해 호출하는 APIs, Operations...

동적 구성요소 : Interrupt Service Routin. 

=> 즉, Device Drives는 라이브러리이며 어떤 구성요소는 Interrupt에 의해 호출되며, 어떤 구성요소는 User Programs에 의해 호출됨


- UNIX 계열의 Device Drivers


* Unix 

- 시스템의 단순화, portability 높이기.

portability를 높이기
 : machine dependent 
한 부분을 정형화 시켜서 정리해야 함

 : micro processor에 micro architecture specipy한 부분(MMU, context)이나, Memory layout, system bus architecture, Device관련 부분 들


* Unix Device Drivers의 대표적인 5가지 함수

- Open : 디바이스를 initialization. OS관점에서 레지스터와 디바이스 드라이버가 필요한 데이터 스트럭쳐를 잡아주는 역할 등

- Close : release

- read/write

- I/O CTL : I/O Contol


* Type of Unix/Linux Device

- Character Devices : data transfer unit이 캐릭터 단위. 시퀀셜 엑세스에 사용

일반적으로 사람과 상호작용 하므로 보통 slow device.

- Block Devices : 데이터 트랜스퍼 유닛이 블럭단위. 랜덤 엑세스에 사용

* block buffer cache : Large scale의 볼륨을 단위로 high speed가 필요함. 캐시로 CPU에 비해 상대적으로 속도가 느린 block device의 성능을 보완한 것.

- Network Devices


> File System의 역할

1. 디스크에에 있는 데이터를 읽거나 쓸 쑤 있는 여러 기능을 제공

2. File이나 Device 같은 시스템에 존재하는 자원에게 Name Space(simbolic name)를 제공(Unix/Linux에서는 path와 같은 형태..)


> Device File : 일종의 스페셜 파일을 생성하여 파일과 디바이스를 연결시키기

- 일반 데이터 파일로 관리

- /dev 밑에 file의 형태로 존재

- 하나의 디바이스에 여러 이름의 파일을 붙일 수 있음

ex. /dev/psaux, /deb/psmouse = serial mouse


* File의 데이터

- Real Data

- Metadata : file의 특성을 표현하는 부가적인 데이터

: 생성일, 수정일, 엑세스 권한 등


- Device File의 metadata

- Device Type : block, charactor

- Major Number : 어떤 타입의 디바이스인지 나타내는 필드. tty, 

- Minor Number : 대상이 되는 디바이스를 구별하기 위해 디바이스 드라이버에게로 보내는 argument. (Kernel don't care)





+ Recent posts