교수님 : 사실 Chapter 2는 굳이 안해도 되는 내용이예요. 뒤에 가면 다 배우게 될 내용을 소개하는 챕터이기 때문에...
??? : (그럼 왜...)
그래도 해야죠.
OT에서 확인할 수 있듯이, 그리고 이 강의에서 활용되는 교재 『운영체제 - 아주 쉬운 세 가지 이야기』 의 이름만 봐도 알 수 있듯이, 운영체제 OS는 크게 세 가지 속성으로 설명할 수 있다. Virtualization(가상화), Concurrency(병행성), Persistence(영속성)이다.
가상화는 말 그대로 존재하지 않는 것을 존재한다고 생각하는 것이다. 대표적인 것이 CPU Virtualization을 통한 Scheduling, Memory Virtualization을 통한 Paging, Address Translation 등이 있다.
사실 Chapter 1에서 다룬 Multi-Programming과 같은 내용이다. 일반적으로 유저는 제한된 CPU를 갖고 있지만, 운영체제는 Time Sharing 기법을 통해 유저로 하여금 CPU가 무한히 많다고 느끼게 만든다.

메모리 가상화 역시 유저는 제한된 크기의 메모리를 갖지만, 운영체제를 통해 각각의 프로세스가 자신만의 가상 주소 공간을 가진다고 생각하게 만든다. 일반적으로 DRAM이라 부르는 실제 메모리는 1바이트의 주소를 갖는 배열 형태로 생겼다. 이것은 당연히 제한된 용량, 크기를 갖는다. 하지만 운영체제는 각각의 유저(또는 프로세스)가 실제 메모리를 연속 주소 공간(또는 연속 세그먼트 모음)으로 생각할 수 있게 한다. 이때 이 역할을 하는 것은 다름 아닌 CPU이다. 그 원리는 무엇일까?
가끔 프로그램을 설치하거나 레지스트리를 등록할 때, 해당 PC가 32bit CPU(또는 프로세서)인지, 64bit CPU인지 알아야하는 경우가 있다. 이것이 바로 가상 메모리 용량과 관련이 있는 것이다. 32bit CPU를 예로 들어보자. 32bit CPU는 메모리에서 크기의 주소를 표현할 수 있다는 의미이다. 이때, 주소 하나당 크기는 1byte라고 했으므로 가상 메모리의 총 용량은 byte = GB인 것이다. 그래서 실제로 32bit CPU를 갖는 PC는 8GB나 16GB의 DRAM을 설치한다한들 최대 4GB의 성능을 낼 수 밖에 없다. 가상 메모리를 그림으로 표현하면 다음과 같다.

그리고 여기서 운영체제는 Address Translation의 역할을 수행한다. 가상 메모리와 실제 메모리가 서로 독립적이기 때문에 둘의 주소는 다를 수 밖에 없다. 하지만 Address Translation을 통해 CPU로 가상화한 가상 메모리의 주소를 실제 DRAM의 주소로 변환하여 접근할 수 있는 것이다. 그러면서도 하나의 실행 중인 프로그램 내의 메모리 레퍼런스는 다른 프로세스의 주소 공간에 영향을 주지 않는다. 실제 메모리는 OS에서 관리하는 공유되고 제한된 리소스이다.
운영체제는 한 프로세스를 먼저 실행한 다음, 그 프로세스가 끝나기 전에 다른 프로세스를 실행하는 것을 반복하며 많은 작업을 동시에 처리한다. 이 과정에서 임의의 데이터가 여러 프로세스에 공유되는 상황, 즉 동시 접근은 종종 오류를 발생시킨다. 다음 그림을 참고하자.

프로세스 A, B는 카운터에 있는 값을 가져와서 1씩 증가시키는 작업을 수행한다. 따라서 그림처럼 A, B 모두 작업을 완료하면 처음에 6이었던 값은 8이 되어야한다. 하지만 B가 A를 통해 저장된 7을 가져오지 않고, A의 저장보다 B의 로드가 먼저 수행되면서 두 프로세스의 작업이 끝나도 7의 값이 남아있는 것이다.
당신이 볼일을 보러 공중화장실을 갔다고 상상해보자. 만약 화장실 칸이 사용 중이라면, 당신은 어떤 선택을 할 것인가. 설마 문을 따고 들어가서 자리를 빼앗진 않겠지. 어지간히 급하지 않은 이상 앞에서 기다릴 것이다. 이게 동시성과 관련된 약간은 더러운 비유이다. 출처는 교수님
아무튼 비유에서도 알 수 있듯이 이런 경우에는 속도가 느려지도라도 안정성을 보장할 수 있게, 한 프로세스가 기다리는 것이 더 나은 방법이다. 이 문제는 최신 멀티스레드 프로그램에서도 나타날 수 있는 문제이다. 따라서 우리는 보호, 잠금이나 동기화가 필요하다.
DRAM과 같은 장치들은 일시적으로 데이터를 저장해두는 휘발성 메모리이다. 그렇기 때문에 데이터를 지속적으로 저장하려면 HDD나 SSD와 같은 하드웨어와 파일 시스템과 같은 소프트웨어가 필요하다. 파일 시스템은 사용자가 생성한 모든 파일을 저장하는 역할을 담당한다. 그리고 이러한 파일 시스템의 모든 작업을 운영체제가 수행하는 것이다. 갑작스러운 컴퓨터 종료나 시스템 충돌에도 데이터 손실이 없어야 하기에 영속성(Persistence) 역시 운영체제의 중요한 역할이다. 다음은 여러 파일 시스템 중 JFS(Journaling File System)을 나타낸 그림이다.

운영체제의 설계 목표는 다음과 같다.
추상화 구축
고성능 제공
애플리케이션 간 보호
높은 신뢰성
추가적인 목표
OT가 2주에 걸쳐 진행된 듯한 기분..!