CS/컴퓨터운영체제

OS-0606: File system imporved, Disk Management(L32, 33)

goliot 2023. 6. 6. 14:32
반응형

#(L32)Disk Hardware

- Seek time - 헤드 포지션을 잡는 시간

- Rotational delay - 헤드 밑에 원하는 섹터가 오는 시간

 

#Disk Access time

- 일반적 수치:

    > 트랙 당 32~64섹터

    > 1KB당 섹터

- 데이터 전송 속도는 초당 헤드 아래로 회전하는 바이트 수

    > 1KB/섹터 * 32섹터/회전 * 120회전/초 = 4MB/s

- 디스크 I/O 시간 = seek+rotation delay+transfer

    > seek = avg 5ms

    > rotation = avg 4ms

    > 1KB = 0.25ms

    > I/O = 9.25ms/KB, 100KB/s정도

- 반면 메모리 접근은 20MB/s(200배 빠름)

 

#Selecting the Sector size

- read/write 헤드는 회전하는 동안 헤드와 동기화해야함

    > 디스크 회전 속도 측정 위해 섹터 사이에 100~1000bit 필요

- 섹터가 1B인경우

    > 디스크 유용한 데이터는 전체 디스크의 1% 차지

    > 이전과 비교해 전송속도는 1/1000이므로 100B/s

- 섹터가 1KB인경우

    > 디스크 유용한 데이터 90%

    > 속도 100KB/s

- 섹터 1MB

    > 거의 모든 공간이 유용한 데이터

    > 속도 4MB/s(전체 디스크 전송 속도 -> seek, rotation delay 더이상 중요하지 않음)

 

#Evolution of UNIX Disk Management

- Berkeley BSD 4.0 UNIX:

> 블록 사이즈 1024B

> 성능 약 두배

    > 각 블록 액세스는 두배의 데이터를 가져와 seek overhead 줄음

    > inode의 direct만 사용할 수 있어 추가 공간 절약

> 파일 시스템 처음 생성시

    > free list가 정렬됨, 이로 인해 175KB/s 의 전송속도

    > 수 주 지나면서 데이터와 빈 블록이 무작위화되어 전송속도 30KB/s로 감소

        > 최대의 4%

- 왜 블록이 커졌을까

    > internal fragmentation을 야기

    > 대부분의 파일은 작고, 아마 1블록

- 작은 파일의 존재는 큰 파일의 성능을 저하시킴

    > 그러나 큰 파일의 오버헤드를 줄이기 위해 큰 블록 필요

    > 큰 블록은 작은 파일의 fragmentation 증가시킴

 

#Improving Performance with good block management

- OS는 일반적으로 비트맵(비트의 배열) 을 사용해 빈 블록 추적

    > 1: 빔, 0: 할당됨

- 디스크가 가득 차면 잘 작동하지 않음

    > 해결: 디스크의 10%정도 여유공간으로 유지, 사용자에게 알리지 않음

 

#(L33)Improving Performance using a disk cache★

- 성능 향상을 위해 OS가 디스크 블록 캐시를 관리

    > 주 메모리 일부를 캐시로 사용

    > OS가 디스크에서 파일 읽을 떄, 해당 블록들을 캐시로 복사

    > OS가 디스크에서 파일 읽기 전에 캐시 확인해 블록 있는지 확인 후(있으면 캐시 복사본 사용) 디스크에서 파일 읽음

- 블록의 대체 정책:

    > 페이지와 동일한 옵션을 사용

        > FIFO, 시계/두 번째 기회를 사용한 LRU

    > 정확한 LRU를 구현하는 것은 간단

        > OS는 블록을 읽을 때 업데이트 해야 할 모든 내용과 함께 '시간을 기록'하기만 하면 됨

    > 그러나, sequential access는 LRU성능을 저하시킴

        > 해결: 큰 순차적으로 액세스되는 파이레 대한 뒤쪽에 있는 블록을 캐시에서 제거(가장 옛날에 대화한 블록)하여 블록을 읽을 때 이전 블록을 캐시에서 제거

 

#Improving performance with disk head scheduling

- 디스크 요청의 순서를 변경

    > 도착하는 순서대로

    > seek 거리를 줄이는 순서

- 예시:

    > 헤드가 트랙 30에 도달하기 위해 낮은 번호의 트랙에서 이동한 경우

    > 요청 큐: 61, 40, 18, 78

 - 알고리즘:

    > FCFS(FIFO) = 30-61-40-18-78 로 헤드 움직임

    > SSTF(가장 짧은 시크 시간(거리) 우선) = 30-40-61-78-61-18

    > SCAN(0~100~0~100~반복) = 30-40-61-78-18

    > C-SCAN(0~100, 0~100, 0~100 반복) = 30-40

    > LOOK(90에서 찾는다고 가정하면 0~90~0) = 30-40-61-78-18

    > C-LOOK

 

#Improving Disk Performance

- 일부 구조를 메모리에 유지

   > 활성 inode, file table

- 효율적인 빈 공간 관리: bitmap

- 디스크 블록의 신중한 할당

    > 가능하면 연속 할당

    > 직/간접 블록

    > 블록 크기의 적절한 선택

    > 실린더 그룹

    > 디스크 공간 일부를 여유 공간으로 유지

- 디스크 관리

    > 디스크 블록 캐시

    > 디스크 스케줄링

 

#Disk management

- Disk formatting

    > 물리적 포메팅: 디스크를 헤더, 데이터영역, 트레일러로 나눔

    > 대부분 디스크는 사전 포멧되어 있지만, 특수 유틸리티를 사용해 다시 포메팅 할수도

    > 포메팅 후 디스크를 파티션으로 나눈 다음 파일 시스템의 데이터 구조를 기록해야함(논리적 포메팅)

- boot block(0번)에는 컴퓨터용 "bootstrap" 프로그램이 포함됨

    > 시스템에는 이 프로그램을 로드하는 부트스트랩 로더가 있는 ROM도 포함됨

- 디스크 시스템은 불량 블록을 무시

    > 디스크가 포멧되면 스캔이 불량 블록을 감지하고 디스크 시스템에 해당 블록을 파일에 할당하지 말라고 알림

    > 디스크가 사용되는 동안에도 이 작업을 수행할 수 있음

- swap space management

    > 일반 파일 시스템의 스왑 스페이스

    > 별도의 파티션에 스왑 스페이스 -> 디스크 한쪽에 파티션 따로 만들어 스왑 전용으로 사용

        > 하나의 큰 파일 - 전체 파일 시스템, 디렉토리 등이 필요하지 않음

        > 블록을 할당/해제하는 관리자만 필요(속도 최적화)

- 디스크 신뢰성(reliability)

    > 데이터는 일반적으로 영적구으로 간주됨

    > Disk striping = 데이터를 블록으로 분할하여 연속적인 블록을 별도의 드라이브에 저장

    > Mirroring = 전체 디스크의 "그림자" 또는 "미러" 복사본 유지

    > Stable storage = 업데이트 중에 데이터가 손실되지 않음 -> 각 논리적 블록에 대해 두 개의 물리적 블록을 유지하고, 쓰기가 성공하려면 두 블록이 동일해야 

 

*RAID(Redundant Array of Independent Disks)(0, 1, 5 만 알면 됨)

https://en.wikipedia.org/wiki/Standard_RAID_levels

-> 독립된 디스크를 여러개 두고 일부 중복된 데이터를 나눠 저장

- 0 = 디스크 2개, 오류검출(패리티) 없는 strip된 세트

- 1 = 디스크 2개, 오류 검출(패리티) 없는 mirroring된 세트

- 5 = 디스크 4개, 패리티가 배분되는 striping된 세트

 

반응형