본문 바로가기

운영체제

[운영체제] Mass Storage Structure (2차 저장 장치)

하드 디스크 구조

 

<옆에서 본 모습>

- Platter의 양면에 자석을 입혀서 사용 가능

- 이론적으로 Platters 하나 당 head 2개 붙을 수 있음

- 각 head는 Spindle이라는 축에 붙어 있음

- Spindle은 회전함

 

 

<위에서 본 모습>

- head가 왔다갔다가 하면서 안쪽 바깥쪽의 데이터를 읽음

- Platter는 시스템이 켜진 순간부터 기본적으로 계속 돌고 있음

- head가 특정 위치에 가면 그 위치부터 원이 하나 생김 -> track

- 한 track 안에 데이터가 다 적혀 있으면 head를 움직이지 않고도 데이터를 다 읽을 수 있음

- Seek Time: 가장 오래 걸리는 시간, head가 움직이는 시간

- Rotation Delay: head가 원하는 위치로 갔을 때 원하는 데이터가 올 때까지 기다리는 시간

 

- Spindle이 고정되어 있으므로 head는 여러 개의 Platter 상에 동일 위치에 존재

- 여러 개의 head가 만들어낸 원들 -> 원통 모양: cylinder

- head가 한 번 움직임에 따라 모든 Platter위의 track들의 집합을 한 번에 읽을 수 있음

- 하드 디스크의 가장 작은 물리적 데이터 단위: sector 

  • 디스크에서 데이터를 읽고 쓰기 위해 필요한 정보

- cylinder 결정 = head 위치

- Platter의 surface = track 위치

- track 내 sector 번호

=> CHS가 결정되면 하나의 sector 가 도출되어 하드디스크는 chs 체계라고 함

- transfer size: 한 번에 읽어들이는 데이터의 양

- memory address: 데이터를 I/O 하기 위해서 memory 상 주소를 알아야 함

 

  • 운영체제는 디스크를 어떻게 바라보는가?

- 운영체제는 물리적 구조 이런 거 모르고 하나의 I/O 단위인 block 단위의 저장 매체다 정도만 알고 있음 => LBA: Logical Block Address

- LBA # - sector 매핑되어야 함 -> 어떻게 매핑할 지는 하드디스크 제조 업체가 결정

 

Disk Scheduling

  • Seek time: head의 움직임, os가 어떻게 줄여볼 수 있음
  • Rotational latency: 회전 속도가 빠르면 줄어듦, 하드 디스크에서 결정돼서 나오니까 os 가 뭘 할 수 없음
  • Seek time은 Seek distance와 비례

=> 웬만하면 seek 발생을 막자(같은 track에서 읽을 수 있도록 하자), seek 이 발생해도 짧게 짧게 하자

  • LBA 번호가 연속적이면 하드 디스크 내에서도 연속적이지 않을까? -> 웬만하면 LBA가 연속적이면 좋겠다
  • LBA가 연속적이지 않으면 가까이 있는 거 먼저 처리하면 좋겠다

1. FCFS; First Come First Served => 640 cylinder만큼 head가 움직임

 

2. SSTF; Shortest Seek Time First

- 가까이 있는 요청을 먼저 처리하게 되면서 먼저 들어왔지만 멀리 있는 놈들은 계속 기다려야 됨 -> fairness, starvation 문제(CPU Scheduling에서의 SJF 알고리즘과 유사)

- 내가 언제 서비스받을 수 있는지를 예측할 수가 없음 -> unpredictable performance

 

3. SCAN

- FCFS보다는 seek time을 줄이면서 SSTF의 문제점을 완화시키는 방법

- 왔다갔다 해서 elevator algorithm이라고도 함

- 현재 진행하는 방향에 있는 모든 요청을 처리하면서 움직이겠다

- 한 번 왔다갔다(swing)하는 내에 반드시 요청이 처리됨(upper bound 제공) -> starvation, 예측 불가능성 해결

- 더 이상 request가 없는 상황에서도 무조건 끝까지 감; 단점이라면 단점

- 0번과 199번의 경우 한 번 swing할 때 서비스를 받는 횟수가 한 번밖에 안 됨 

 

4. C-SCAN; Circular SCAN

- 서비스받는 기회의 불균형 문제(양끝)를 해결하기 위한 방법

- 한 방향으로만 움직임, 돌아올 때는 중간에 멈춰서 읽지 않으니까 재빨리 돌아옴

- 돌아올 때 아무 의미 없이 seek 하니까 좀 아깝지

 

5. C-LOOK

- C-SCAN 변형

- 전진 방향의 request 가 없음에도 전진하는 문제를 해결하기 위한 방법

- 지나온 쪽에는 request가 있는데 전진 방향에는 없으면 돌아와버림

 

  • Arm Stickiness Problem

- SCAN, C-SCAN, SSTF 가 가지는 문제

- 매우 희박

- 현재 head가 읽는 cylinder에 request가 계속 들어오면 head를 움직이지 않아도 됨

-> 6번이 계속 서비스받지 못하게 됨, starvation

 

Disk Management

  • logical formatting: 파일 시스템을 초기화하는 것, 디스크 내 데이터는 냅두고 파일의 메타 데이터만 지우는 것
  • physical formatting= Low-level formatting
    • 하드 디스크를 sector 단위로 다 자름 -> head와 trailer를 붙임
    • head/trailer에는 ECC(Error Correction Code)가 있어서 sector를 읽어들일 때 에러가 발생했는지 검사
    • spare sector를 만들어 놓음, LBA와 매핑되지 않은 여유 공간, os는 사용하지 못하고 하드디스크 내부의 controller만 알고 있음
      • ECC check로 bad sector(일반적으로는 자성이 약해졌거나, 물리적으로 긁혔거나) 가 발생하면 또 에러날 가능성이 커서 그 sector는 더이상 사용하지 않게 하고  spare sector와 LBA 번호로 매핑시켜버림
  • partition: 물리적 디스크를 논리적 기능으로 만들어주는 것
    • os가 독립적인 디스크처럼 관리
  • Power-up: 메인보드의 ROM에 부팅을 하기 위한 아주 짧은 코드가 있음; small bootstrap loader
    • 전기가 들어오자마자 저 loader가 sector 0를 load
    • sector 0 에는 부팅 과정 전체를 담고 있는 full bootstrap loader가 있음 -> os가 담겨있는 디스크의 부분을 읽어들임

RAID(Redundant Array of Inexpensive/Independent Disks)

  • 값싼 디스크들을 여러 개 묶어서 하나의 비싼 디스크처럼 보이게 하는 것
  • 여러 개의 디스크를 동시게 구동시킴으로써 엄청나게 큰 용량과 속도도 빠르게 만듦
  • 신뢰성 문제; N개의 디스크를 동시에 가동시킬 때 하나만 고장나도 디스크 전체가 고장나는 것
  • Redundancy를 구현하는 가장 단순한 방법 - Mirroring=shadowing
    • 각각의 디스크의 쌍둥이를 하나 더 만들겠다
    • 전체 용량의 반밖에 사용하지 못하지만 디스크가 고장나더라도 쌍둥이 디스크에서 데이터를 읽을 수 있기 때문에 신뢰성 증가
  • 데이터를 어떻게 분할하느냐에 따라 성능이 달라짐
  • RAID에서 파일 별로 데이터를 분할하는 것은 아무 의미가 없고, 파일 내부의 데이터를 자름 
  • Bit-level striping: bit 단위로 자르는 것
    • 한 바이트를 읽을 때 최대 8개의 디스크에서 읽을 수 있지만 seek overhead가 엄청나게 큼
    • 대부분 안 씀
  • Block-level striping: block 단위로 자르는 것
  • RAID Levels
    • RAID Level 0: Block striping; non-redundant 
      • 데이터 잃어버려도 상관없다
      • 중요하지 않은 데이터, 좋은 성능 필요한 상황
    • RAID Level 1: Mirrored disks with block striping
    • RAID Level 2,3 는 Bit-level striping 사용, 폐기 처분된 기법이라 몰라도 됨
    • RAID Level 4: Block striping, parity block
      • 각 디스크의 동일 위치 block에 대한 parity block을 parity 디스크에 저장
      • 데이터를 쓸 때마다 parity block에도 데이터를 써줘야 됨
      • 한 번의 write가 최소 2개의 디스크에 write해야 함
    • RAID Level 5: 모든 디스크에 parity block을 흩뿌리자
      • bottle neck 없어짐

  • RAID Level 선택 기준
    • 성능: 초당 I/O, bandwidth, ...
    • failure 발생 시 성능
    • 고장난 디스크 rebuilding
    • 0은 개인이 사용하거나 백업을 잘 하는 경우
    • 2,3은 별루
    • 4 쓸 바에 5 씀
    • 1 아니면 5 씀

'운영체제' 카테고리의 다른 글

[운영체제] I/O Systems  (0) 2024.06.11
[운영체제] File System  (0) 2024.05.29
[운영체제] Virtual Memory(2)  (0) 2024.05.13
[운영체제] Virtual Memory (1)  (0) 2024.05.06
[운영체제] Memory Management (2)  (0) 2024.03.24