디스크 관리

hongo·2024년 3월 27일
0

운영체제

목록 보기
8/10
post-thumbnail

디스크 구조!

  • 플래터 : 하나 이상의 디스크 집합
  • 스핀들 : 모든 플래터를 연결하며 플래터를 회전시킨다.
  • 트랙 : 플래터위의 동심원. 한 디스크에 하나 이상의 트랙이 존재한다.
  • 실린더 : 여러 개의 플래터에서 같은 위치의 트랙들을 실린더라고 한다.
  • : 헤드가 원하는 실린더를 가리킬 수 있게 이동시킨다.
  • R/W헤드 : 플레터에서 데이터를 읽어오거나 쓴다.
  • 섹터 : 트랙 내부에 쪼개진 공간으로, 디스크에서 표현할 수 있는 가장 작은 단위이다. 보통 512byte 차지. Header, Data, Trailer로 이루어져 있으며, Header와 Trailer에는 섹터 넘버나 ECC등 부가 정보가 들어가 있다.

ECC(Error Correction Code)?
섹터의 데이터에 오류가 발생했는지 감지하고 일정 수준까지 오류를 복구하는 데 사용된다.
읽기 과정에서 계산된 ECC 값과 저장된 ECC 값을 비교하여 데이터 무결성을 검사한다.

데이터를 읽고 써오는 플로우

  • 사용자 프로세스에서 read()/write() 요청이 들어오면 커널 모드로 전환하여 OS에게 전달한다.
  • OS는 파일매니저에게 RW 요청을 전달한다.
  • 파일 매니저는 RAM의 I/O버퍼를 확인하고, 해당 데이터가 존재하면 바로 반환한다.
  • I/O버퍼에 데이터가 없다면, 파일매니저는 FAT를 통해 사용자가 원하는 레코드가 어느 클러스터에 있는지 찾는다.
  • 파일 매니저는 해당 클러스터에 대한 RW요청을 디바이스 드라이버에게 전달한다.
  • 디바이스 드라이버는 RW요청을 디스크 컨트롤러가 이해할 수 있는 형태로 변환해서 디스크 컨트롤러에게 전달한다.
  • 디스크 컨트롤러는 하드디스크에서 데이터를 RW한다.
  • 디스크 컨트롤러가 작업을 완료하면 인터럽트를 발생한다.
  • 디스크 드라이버는 인터럽트를 처리한다. 이 때 읽은 데이터는 I/O버퍼에 저장한다.
  • OS는 버퍼에서 읽은 레코드를 사용자 프로세스에서 사용할 수 있게 해당 프로세스의 메모리에 저장한다.
  • 다시 사용자 모드로 전환하여 사용자 프로세스가 일을 수행한다.

OS가 직접 하드디스크에서 R/W를 하지 않는 이유
CPU의 속도와 비교했을 때 디스크에서 R/W하는 작업이 느림. OS가 직접 디스크에서 읽어오려면 CPU는 R/W요청을 보내고 하드 디스크에서 읽어올때까지 기다려야함.
그래서 파일매니저한테 R/W요청 맡기고 다른 프로세스 실행하다가, 인터럽트 발생하면 그 때 디스크에서 읽어온 데이터를 처리한다.

섹터와 Logical Block

물리적인 단위인 섹터는 논리적인 단위인 Logical Block과 일대일로 매핑된다. Logical Block은 일차원배열로 관리되며 디스크 컨트롤러는 Logical Block을 참조해 원하는 데이터를 읽고 쓴다.

  • 0번째 섹터는 항상 0번째 Logical Block과 매핑되며, 부팅에 대한 정보를 담고 있다.

디스크 관리

  • Physical Formatting : 하드 디스크에서 물리적으로 섹터 단위로 나누는 과정.
  • Partitioning : 디스크를 하나 이상의 실린더 그룹으로 만드는 과정.그렇게 나눠진 실린더 그룹(파티션)은 독립적인 디스크 공간처럼 사용된다. OS는 이를 논리적인 디스크로 바라본다.
  • Logical formatting : 실린더 그룹(파티션)에 파일시스템을 생성하는 과정. 파일 시스템은 파일과 디렉토리를 구성하고 관리하는 데 사용되는 구조와 규칙을 정의한다. 이 과정에서 FAT, inode등이 생성.
  • Booting : 파일시스템에 있는 운영체제를 메모리에 올려 부팅하는 과정. (ROM에 있는 small bootstrap loader → sector0(boot block)에 있는 full boostrap loader → OS를 메모리에 올림)

디스크 AccessTime

  • SeekTime : 헤드를 목표 실린더로 옮기는 데 걸리는 시간 (가장 많은 시간을 소요)
  • Rotational Latency : 헤드가 원하는 섹터에 도달하기 위해 플래터를 회전하는 시간
  • Transfer Time : 데이터 읽고 쓰는 시간

실린더 할당이 중요!
SeekTime이 가장 오래 소요되므로, 하나의 파일을 저장할 때 트랙1, 트랙2, 트랙3에 각각 저장하는 것보다 각각 다른 플래터의 같은 트랙1에 저장하는 게 더 효율적이다.
디스크 RW속도를 높이려면 SeekTime = SeekDistance를 줄이는 게 핵심.

디스크 스케줄링

FCFS

말해뭐해 들어온 순서대로 디스크에서 찾아서 반환한다~

SSTF(Shortest Seek Time First)

현재 헤더 위치에서 가장 가까운 요청을 처리.
starvation 확률업!

SCAN

암을 디스크 끝쪽에서 반대 끝쪽으로 이동시키며, 가는 길에 있는 요청들을 처리.
실린더 위치에 따라 처리 속도가 다름. 맨 끝에 있는 실린더 개손해

C-SCAN


암을 디스크 한 쪽에서 반대 끝쪽으로 이동시키며 가는 길에 있는 요청들을 처리. 단, 끝쪽으로 이동하면 곧바로 처음 위치로 이동시킴.
SCAN처럼 실린더 위치에 따라 처리 속도가 달라지지 않음. 대시 처음 위치로 이동할 때 아무것도 처리안하니까 성능은 좀 더 나쁘긴 함.

N-SCAN

SCAN과 동일하게 움직이나, 가는 길에 들어온 요청들은 처리하지 않는다. 첫 위치에서 시작하기 전에 들어온 요청들에 대해서만 처리. 이동중에 들어온 요청은 다음 이동 때 처리.

LOOK

SCAN과 동일하게 움직이나, 요청이 없다면 맨 끝까지 이동하진 않음.

C-LOOK

C-SCAN과 동일하게 움직이나, 요청이 없다면 맨 끝까지 이동하진 않음.

스왑 공간 관리

스왑 : 사용 가능한 메모리 공간이 작아질 때, 메모리 공간에 있던 프로세스들을 디스크의 스왑 공간으로 잠시 옮기는 방법.

  • 파일 시스템 내부에 저장할 수도 있으나, 별도의 파티션을 만들어서 관리하는 게 좋다.(보통 파일 시스템에 저장되는 것보다 많은 용량의 차지하기 때문)
  • 왜 많은 용량을 차지? 메모리에 있던게 잠시 스왑공간에만 존재하는 것이기 때문에 어차피 금방금방나감. 그래서 공간 효율성보다는 속도 효율성을 따지는 게 더 좋다.
  • 메모리에서 쫓겨나는 페이지는 수MB에서 수GB까지로 크기 차이가 나는 편.
  • 스왑 공간은 넉넉하게 잡아두는 것이 좋다. 시스템을 운영하다가 스왑 공간이 부족해지면, 결국 프로세스들을 중단시켜야 하기 때문.

RAID(Redundant Array Of Independent Disks)

여러 개의 디스크를 묶어서 사용하는 것. 여러 개의 물리적인 디스크를 하나의 논리적인 단위로 결합한다.

이거 왜 하나요?

  • 디스크 처리 속도 향상 : 여러 디스크에 분산적으로 저장해서, 병렬로 읽어오는 게 가능. 더 빨리 읽어옴.
  • 신뢰성 향상 : 여러 디스크에 중복적으로 저장하면, 디스크 하나가 망가져도 다른 디스크를 참조하면 됨.

주요 RAID 레벨

RAID 0 (스트라이핑):

데이터를 여러 디스크에 분산저장하여 높은 읽기/쓰기 성능을 제공한다.

RAID 1 (미러링):

데이터를 여러 디스크에 중복적으로 저장한다. 한 디스크가 망가져도 다른 디스크에서 참조할 수 있다.
쓰기 성능은 단일 디스크와 유사하지만, 읽기 성능은 병렬 처리로 향상가능.

RAID 5 (스트라이핑 + 분산 패리티):

데이터와 패리티 정보를 여러 디스크에 분산 저장.
한 디스크에 장애가 발생해도 패리티 정보를 이용하여 데이터를 복구할 수 있다.
읽기 성능은 우수하지만, 쓰기 성능은 패리티 계산으로 인해 저하될 수 있다.

RAID 10 (미러링 + 스트라이핑):

데이터를 미러링하고 스트라이핑하여 높은 성능과 데이터 보호 기능을 동시에 제공한다.
비용이 높지만, 가장 안정적이고 고성능인 RAID 구성.

참고

0개의 댓글