본문으로 건너뛰기

제 IV 편: 영속성

I/O 장치, 파일 시스템, 데이터 무결성

📄️ 제36장: I/O 장치

본론 (영속성)에 들어가기에 앞서 먼저 입력/출력 장치의 개념을 소개하고 운영체제가 이 장치들과 상호 작용하는 방법을 알아보자. 당연하겠지만, I/O는 컴퓨터 시스템에서 상당히 중요한 부분이다. 입력이 전혀 없는 프로그램이나 (늘 같은 결과를 출력하는), 출력이 없는 프로그램을 생각해 보라 (실행이 어떤 의미가 있겠는가?). 컴퓨터 시스템을 유용하게 쓰려면 입력과 출력이 모두 필요하다는 것은 분명하다. 그러므로 우리가 해결해야 할 문제는 다음과 같다.

📄️ 제37장: 하드 디스크 드라이브

이전 장에서 I/O 장치에 대한 전반적인 개념을 다루었고 운영체제가 I/O 장치라는 괴물과 어떻게 상호작용하는지 살펴보았다. 이 장에서 특정 장치에 대해서 좀 더 자세히 살펴보기로 한다. 바로 하드 디스크 드라이브이다. 이런 드라이브들이 수 세기 동안 컴퓨터 시스템의 영구적인 데이터 저장소였으며 (곧 살펴볼) 파일 시스템 기술은 거의 대부분 하드 디스크 드라이브의 동작에 기반을 두고 개발되었다. 그러므로 디스크를 관리하는 파일 시스템 소프트웨어를 구현하기 전에 디스크의 상세한 동작을 이해하는 것이 중요하다. 여기서 논의하는 대부분의 내용은 Ruemmler와 Wilkes [RW94] 그리고 Anderson, Dykes와 Riedel [ADR03]이 쓴 탁월한 논문에 나와 있다.

📄️ 제38장: Redundant Arrays of Inexpensive Disks (RAID)

우리가 디스크를 사용할 때 때때로 더 빨랐으면 하는 바램이 있다. I/O 작업은 느리기 때문에 전체 시스템의 병목이 되기도 한다. 우리가 디스크를 사용할 때 용량도 더 많았으면 한다. 점점 더 많은 데이터가 온라인으로 접근되도록 저장되고, 따라서 우리의 디스크는 점점 더 가득 차게 된다. 우리가 디스크를 사용할 때 때때로 디스크가 더 안정적으로 동작하기 바란다. 디스크가 고장날 경우, 백업이 되어 있지 않다면 소중한 데이터를 잃어버리고 만다.

📄️ 제39장: 막간: 파일과 디렉터리

지금까지 운영체제를 구성하는 두 개의 핵심 개념을 살펴보았다. CPU를 가상화한 "프로세스"와 메모리를 가상화한 "주소 공간"이다. 이 개념들은 서로 협력하여 응용 프로그램들이 서로 독립된 세계에서 실행될 수 있도록 해준다. 각자의 프로세서 (또는 프로세서들)를 갖고 있는 것처럼 해주며 각자의 메모리가 있는 것처럼 만들어 준다. 이러한 환상이 시스템을 다루는 프로그램 개발을 더욱 쉽게해준다. 데스크탑과 서버에서 뿐만 아니라 모바일폰을 포함한 프로그래밍이 가능한 모든 플랫폼 등에서 광범위하게 사용되고 있다.

📄️ 제42장: 크래시 일관성: FSCK와 저널링

이제까지 본 바와 같이, 파일 시스템은 그 기본 개념들을 구현하는 데 필요한 각종 자료 구조들을 관리한다. 이 자료 구조에는 파일, 디렉터리, 그 외에 각종 메타데이터들이 있다. 여타 자료 구조와는 다르게 (예를 들어 실행 중인 프로그램들이 사용하는 메모리 상의 자료 구조) 파일 시스템의 자료 구조는 안전하게 저장되어야 한다. 즉, 장시간 사용 후에도 유지되어야 하며 전력 손실에도 하드 디스크나 플래시 기반 SSD 장치의 데이터는 손상없이 유지되어야 한다.

📄️ 제44장: 데이터 무결성과 보호

우리가 지금까지 살펴본 파일 시스템의 기본적인 기술들 이외에도 몇 가지 더 다루어야 할 주제들이 있다. 이번 장에서는 신뢰성을 다시 한 번 다루도록 하겠다 (RAID를 설명한 장에서 저장 시스템의 신뢰성에 대해서 학습을 했다). 이 장에서는 구체적으로 저장 장치가 기본적으로 신뢰할 수 없다는 전제 하에 파일 시스템이 데이터의 안전성을 보장하는 방법에 대해 살펴볼 것이다.