Operating System: Chapter 01 - 서론
1.1. 운영체제가 할 일
컴퓨터 시스템은 하드웨어, 운영체제, 응용 프로그램 및 사용자로 구분할 수 있다.

- 하드웨어는 중앙처리장치(CPU)와 메모리 입출력 장치(I/O) 장치로 구성되어, 기본 계산용 자원을 제공한다.
- 응용 프로그램은 사용자의 계산 문제를 해결하기 위해 이들 자원이 어떻게 사용될지를 정의한다.
- 운영체제는 다양한 사용자를 위해 다양한 응용 프로그램 간의 하드웨어 사용을 제어하고 조정한다.
1.1.1. 사용자 관점
랩톱/PC 등의 환경에서는 한 사용자가 자원을 독점하도록 설계되었으며, 사용자가 수행하는 작업을 최대화하는 것이다.
최근에는 스마트폰 및 태블릿과 같은 모바일 장치와 상호 작용한다.
이러한 장치는 일반적으로 셀룰러/무선 통신 기술을 통해 네트워크에 연결된다.
가전제품이나 자동차 내의 내장형 컴퓨터는 사용자 관점이 존재하지 않거나 매우 작다.
1.1.2. 시스템 관점
컴퓨터의 관점에서 운영체제는 하드웨어와 가장 밀접하게 연관된 프로그램이며, 운영체제를 자원 할당자(Resource Allocator)로 볼 수 있다.
운영체제는 제어 프로그램으로써 컴퓨터의 부적절한 사용을 방지하기 위해 사용자 프로그램의 수행을 제어하며, 입출력 장치의 제어와 작동에 깊이 관여한다.
1.1.3. 운영체제의 정의
운영체제에는 항상 실행 중인 커널, 응용 프로그램 개발을 쉽게 하고 기능을 제공하는 미들웨어 프레임워크 및 시스템 실행 중에 시스템을 관리하는 데 도움이 되는 시스템 프로그램이 포함된다.
1.2. 컴퓨터 시스템의 구성
현대의 범용 컴퓨터 시스템은 하나 이상의 CPU와, 구성요소와 공유 메모리 사이의 액세스를 제공하는 공통 버스를 통해 연결된 여러 장치 컨트롤러로 구성된다.

- 각 장치 컨트롤러는 특정 유형의 장치(디스크 드아리브, 오디오 장치 또는 그래픽 디스플레이 등)를 담당한다.
- 컨트롤러에 따라 둘 이상의 장치가 연결될 수도 있다. (USB 허브 등)
- 장치 컨트롤러는 일일부 로컬 버퍼 저장소와 특수 목적 레지스터 집합을 유지 관리하며, 제어하는 주변 장치와 로컬 버퍼 저장소 간에 데이터를 이동한다.
일반적으로 운영체젠에는 각 장치 컨트롤러마다 장치 드라이버가 있다.
장치 드라이버는 장치 컨트롤러의 작동을 잘 알고 있고, 나머지 운영체제에 장치에 대한 일관된 인터페이스를 제공한다.
CPU와 장치 컨트롤러는 병렬로 실행되며, 메모리 컨트롤러는 공유 메모리를 질서 있게 액세스하기 위해 메모리에 대한 액세스를 동기화한다.
1.2.1. 인터럽트 (Interrupts)
1.2.1.1. 개요
하드웨어는 어느 순간이든 시스템 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킬 수 있다.
CPU가 인터럽트되면, CPU는 하던 일을 중단하고 즉시 고정된 위치(인터럽트 서비스 루틴)로 실행을 옮긴다.
인터럽트 서비스 루틴의 실행이 완료되면, CPU는 인터럽트되었던 연산을 재개한다.
인터럽트는 적절한 서비스 루틴으로 제어를 전달하며, 인터럽트 고유의 핸들러(handler)를 호출한다.
인터럽트는 빈번하게 발생하므로 빠르게 처리하기 위해 인터럽트 루틴에 대한 포인터들의 테이블을 이용하여 중간 루틴 없이 간접적으로 호출할 수 있다.
인터럽트가 요청되면, 인터럽트를 유발한 장치를 위한 인터럽트 벡터가 인터럽트 요청과 함께 주어진 고유의 유일한 장치 번호로 색인된다.
인터럽트 루틴이 처리기의 상태를 변경해야 한다면, 인터럽트 루틴은 반드시 현재의 상태를 저장하여야 하며, 복귀하기 전에 상태를 복원해야 한다.
인터럽트 서비스 후, 저장되어 있던 프로그램 카운터를 적재하고, 인터럽트에 의해 중단된었던 연산이 재개된다.
1.2.1.2. 구현
장치 컨트롤러는 인터럽트 요청 라인에 신호를 선언하여 인터럽트를 발생(raise)시킨다.
CPU는 인터럽트를 포착(catch)하여 인터럽트 핸들러로 디스패치(dispatch)한다. 핸들러는 장치를 서비스하여 인터럽트를 지우고(clear), 원래의 흐름으로 복원한다. (return_from_interrupt 명령어)
최신 운영체제에서는 더욱 정교한 인터럽트 처리 기능이 필요하며, CPU 및 인터럽트 컨트롤러 하드웨어에 의해 제공된다.
- 대부분 CPU에는 2개의 인터럽트 요청 라인(마스킹 불가능/마스킹 가능 인터럽트)이 있다.
- 실제 컴퓨터에는 인터럽트 벡터의 주소 개수보다 많은 장치가 있으므로, 인터럽트 체인(핸들러들의 리스트)을 사용하여 해결한다.
- 인터럽트 우선순위 레벨을 구현하여, 우선순위가 높은 인터럽트가 낮은 인터럽트의 실행을 선점할 수 있다.
1.2.2. 저장장치 구조
CPU는 메모리에서만 명령을 적재할 수 있으므로 실행하려면 프로그램을 먼저 메모리(RAM)에 적재해야 한다.
컴퓨터는 다른 형태의 메모리도 사용한다.
예를 들어, 컴퓨터 전원을 켤 때 가장 먼저 실행되는 프로그램은 부트스트랩 프로그램이며, 운영체제를 적재한다.
RAM은 휘발성이므로 부트스트랩 프로그램을 유지하는 용도로 사용할 수 없다. 대신 컴퓨터는 전기적으로 소거 가능한 프로그램 가능 읽기 전용 메모리(EEPROM) 및 기타 형태의 펌웨어를 사용한다.
모든 형태의 메모리는 바이트의 배열을 제공하며, 각 바이트는 자신의 주소를 가지고 적재(load), 저장(store) 명령을 통해 상호작용한다.
폰 노이만 구조 시스템에서 실행되는 전형적인 명령-실행 사이클은 메모리로부터 명령을 인출해, 그 명령을 명령 레지스터에 저장한 후 해독한다.
메모리 장치는 단지 일련의 메모리 주소만을 인식한다. 명령 카운터, 색인, 간접 주소 등이 어떻게 생성되었는지 알지 못한다.
메인 메모리는 크기가 작고 휘발성이므로 프로그램과 데이터를 영구히 유지할 수 없다.
따라서 대부분의 컴퓨터 시스템은 보조저장장치를 제공한다. (HDD/SSD 등)
다른 구성 가능한 요소로는 캐시 메모리, CD-ROM/Blu-ray, 자기 테이프 등이 있다.
다양한 저장장치 시스템은 저장 용량 및 액세스 시간에 따라 계층 구조로 구성될 수 있다.

- 휘발성 저장장치는 메모리로 언급한다.
- 비휘발성 저장장치는 전원이 꺼졌을 때 내용을 유지하며, NVS로 언급한다.
- 전기적 저장장치 시스템에는 플래시 메모리, FRAM, NRAM, SSD가 있으며 NVM으로 언급한다.
1.2.3. 입출력 구조
인터럽트 구동 I/O의 형태는 소량의 데이터를 이동하는 데는 좋지만 NVS I/O와 같은 대량 데이터 이동에 사용될 때 높은 오버헤드를 유발할 수 있다.
이 문제를 해결하기 위해 직접 메모리 액세스(DMA)가 사용된다.
장치 컨트롤러는 CPU의 개입 없이 메모리로부터 자신의 버퍼 장치 또는 버퍼로부터 메모리 데이터 블록 전체를 전송한다.
장치 컨트롤러가 전송 작업을 수행하는 동안 CPU는 다른 작업을 수행할 수 있다.
1.3. 컴퓨터 시스템 구조
1.3.1. 단일 처리기 시스템
대부분의 컴퓨터 시스템은 단일 처리 코어를 가진 하나의 CPU를 포함하는 단일 프로세서를 사용했다.
코어는 명령을 실행하고 로컬로 데이터를 저장하기 위한 레지스터를 포함하는 구성요소이다.
코어를 가진 하나의 메인 CPU는 프로세스의 명령어를 포함하여 범용 명령어 세트를 실행할 수 있다.
다른 특수 목적 프로세서도 있으며, 디스크/키보드 등 장치별 프로세서 형태로 제공될 수도 있다.
1.3.2. 다중 처리기 시스템
최신 컴퓨터는 각각 단일 코어 CPU가 있는 두 개 이상의 프로세서를 가진다. (다중 처리기 시스템)
프로세서 수를 늘리면 더 적은 시간에 많은 작업을 수행할 수 있으나 동기화를 이유로 일정한 양의 오버헤드가 발생할 수 있다.
가장 일반적인 다중 처리기 시스템은 각 피어 CPU 프로세서가 운영체제 기능 및 사용자 프로세스를 포함한 모든 작업을 수행하는 SMP(Symmetric Multiprocessing)를 사용한다.

- 각 CPU 처리기에는 개별 또는 로컬 캐시뿐만 아니라 자체 레지스터 세트가 있다.
- 모든 프로세서는 시스템 버스를 통해 물리 메모리를 공유한다.
- 많은 프로세스를 동시에 실행할 수 있으나, CPU가 독립적이므로 하나는 유휴 상태이고 다른 하나는 과부하가 걸려 비효율적일 수 있다.
- 프로세서가 특정 자료구조를 공유하는 경우 이러한 비효율성을 피할 수 있다.
다중 처리기의 정의는 시간이 지남에 따라 발전해 왔으며, 여러 개의 컴퓨팅 코어가 단일 칩에 상주하는 다중 코어 시스템을 포함한다.

- 각 코어에는 자체 레지스터 세트와 L1 캐시가 있다.
- L2 캐시는 칩에 국한되지만 두 처리 코어에서 공유한다.
- CPU를 너무 많이 추가하면 시스템 버스에 대한 경합이 병목 현상이 되어 성능이 저하된다.
NUMA(Non-Uniform Memory Access) 방식은 각 CPU(CPU 그룹)에 작고 빠른 로컬 버스를 통해 액세스되는 자체 로컬 메모리를 제공하여 하나의 물리 주소 공간을 공유한다.

- CPU가 로컬 메모리에 액세스할 때 빠르며, 시스템 상호 연결에 대한 경합이 없다.
- 더 많은 프로세서가 추가될수록 더 효과적으로 확장할 수 있다.
- CPU가 시스템 상호 연결을 통해 원격 메모리에 액세스해야 할 때 지연 시간이 증가하여 성능 저하가 발생할 수 있다.
블레이드 서버는 다수의 처리기 보드 및 입출력 보드, 네트워킹 보드들이 하나의 섀시(chassis) 안에 장착되는 형태를 가진다.
- 각 블레이키-처리기 보드는 독립적으로 부팅될 수 있고 자기 자신의 운영체제를 수행한다.
- 여러 독립적인 다중 처리기 시스템으로 구성된다.
1.3.3. 클러스터형 시스템
클러스터 시스템은 둘 이상의 독자적 시스템 또는 노드들을 연결하여 구성한다.
각 노드는 통상 다중 코어 시스템이며, 약결합으로 간주된다.
클러스터링은 통상 높은 가용성을 제공하기 위해 사용된다.
클러스터 소프트웨어 중 한 층이 클러스터 노드에서 실행되며, 각 노드는 하나 이상의 다른 노드들을 감시한다.
감시받던 노드가 고장나면 감시하던 노드가 고장난 노드의 역할을 수행한다.
남아 있는 하드웨어 수준에 비례하여 서비스를 계속 제공하는 기능을 우아한 성능 저하(graceful degradation)이라 한다.
일부 시스템은 정상적인 성능 저하를 넘어 단일 구성요소에 오류가 발생하여도 계속 동작할 수 있으므로 결함허용 시스템이라고 한다.
클러스터링은 비대칭적 또는 대칭적으로 구성될 수 있다.
비대칭형 클러스터링에서는 다른 컴퓨터들이 응용 프로그램을 실행하는 동안 한 컴퓨터는 긴급 대기 모드 상태를 유지하며, 활성 서버들을 감시한다. 서버가 고장나면 긴급 대기 모드의 호스트가 활성 서버가 된다.
대칭형 클러스터링에서는 둘 이상의 호스트들이 응용 프로그램을 실행하고 서로를 감시한다.
다른 형태의 클러스터로 병렬 클러스터와 WAN을 이용한 클러스터링이 있다.
병렬 클러스터는 여러 호스트가 공유 저장장치상의 동일한 데이터에 접근할 수 있도록 하며, 충돌을 방지하기 위해 분산 잠금 관리자(DLM)가 포함된다.
어떤 클러스터 제품은 스토리지 전용 네트워크(SAN; Storage-Area Network)를 통해 수 킬로미터 떨어진 클러스터 노드들뿐 아니라 한 클러스터 안에서 수천 개의 노드를 지원한다.
1.4. 운영체제의 작동
운영체제는 프로그램이 실행하는 환경을 제공하며, 내부적으로는 운영체제마다 큰 차이를 보인다. 그러나 공통점 역시 많이 존재한다.
컴퓨터를 켰을 때 실행되는 부트스트랩 프로그램은 단순한 형태이며, 하드웨어 내에 펌웨어 형태로 저장된다.
CPU 레지스터, 장치 컨트롤러, 메모리 등 시스템의 모든 측면을 초기화한다.
부트스트랩 프로그램은 커널을 적재하며, 커널이 실행되면 시스템과 사용자에게 서비스를 제공할 수 있다.
Linux에서 첫 번째 시스템 프로그램은 systemd이며 다른 많은 데몬을 시작한다.
이 단계가 완료되면 시스템이 완전히 부팅되고, 어떤 이벤트가 발생할 때까지 기다린다.
이벤트는 거의 항상 인터럽트를 발생시켜 신호를 보내지만, 또 다른 형태의 인터럽트는 트랩(또는 예외)이 있다.
트랩은 오류 또는 사용자 프로그램의 특정 요청 때문에 발생하는 소프트웨어 생성 인터럽트이다.
이 특정 요청은 시스템 콜이라는 특수 연산을 실행하여 요청되고 운영체제가 제공하는 서비스가 수행될 것을 요구한다.
1.4.1. 다중 프로그래밍과 다중 태스킹
다중 프로그래밍은 CPU가 항상 한 개는 실행할 수 있도록 프로그램을 구성하여 CPU 이용률을 높이고 사용자 만족도를 높이는 것이다.
다중 프로그램 시스템에서 실행 중인 프로그램을 프로세스라고 한다.
운영체제는 여러 프로세스를 동시에 메모리에 유지하며, 이 중 하나를 선택하여 실행한다.
실행 중인 프로세스가 I/O 등을 대기해야 하는 경우 CPU는 다른 프로세스로 전환하여 실행한다.
다중 태스킹은 다중 프로그래밍의 논리적 확장으로, 프로세스 전환을 자주 하여 사용자에게 빠른 응답시간을 제공한다.
대화식 입력이 진행될 때, 사용자의 입력을 기다리는 동안 운영체제는 CPU를 다른 사용자의 프로그램으로 신속하게 전환한다.
동시에 여러 프로세스를 메모리에 유지하려면 메모리 관리 방식이 필요하다.
또한 여러 프로세스가 동시에 실행할 준빅다 되면 시스템은 다음에 실행할 프로세스를 선택해야 한다. (CPU 스케줄링)
다중 태스킹 시스템에서 적절한 응답 시간을 보장하는 일반적인 방법은 가상 메모리이다.
운영체제는 일부만 메모리에 적재된 프로세스의 실행을 허용한다. 즉, 프로그램이 물리 메모리의 크기보다 더 커도 된다.
또한, 가상 메모리는 메인 메모리를 크고 균등한 저장장치의 배열로 추상화하여, 사용자에게 보이는 논리 메모리를 물리 메모리로부터 분리시킨다.
다중 프로그래밍 및 다중 태스킹 시스템도 파일 시스템을 제공해야 하며, 저장장치 관리가 제공되어야 한다.
또한 시스템은 부적절한 사용으로부터 자원을 보호해야 하며, 질서 있게 실행하려면 시스템은 프로세스 동기화 및 통신을 위한 기법을 제공해야 한다.
1.4.2. 이중-모드와 다중모드 운용
운영체제와 사용자는 컴퓨터 하드웨어와 소프트웨어 자원을 공유하므로, 잘못된 혹은 악의적인 프로그램으로 인해 다른 프로그램 또는 운영체제 자체가 잘못 실행될 수 없도록 보장해야 한다.
따라서 컴퓨터 시스템은 두 개의 독립된 연산 모드, 즉 사용자 모드와 커널 모드(슈퍼바이저 모드, 시스템 모드, 혹은 특권 모드)를 제공한다.
모드 비트라는 하나의 비트가 컴퓨터 하드웨어에 존재하며, 이 비트가 현재 모드를 나타낸다.
사용자 응용프로그램을 실행할 때는 사용자 모드이다가, 사용자 응용프로그램이 서비스를 요청(시스템 콜)하면 커널 모드로 전환하여 실행한다. 
하드웨어는 악영향을 끼칠 수 있는 일부 명령을 특권 명령으로 지정하여, 이들을 커널 모드에서만 수행하도록 허용한다.
사용자 모드에서 특권 명령을 수행하려고 시도하면, 하드웨어는 이를 실행하지 않고 운영체제로 트랩을 건다.
특권 명령에는 커널 모드로 전환하는 명령어, I/O 제어, 타이머 관리 및 인터럽트 관리 등이 있다.
모드의 개념은 두 가지 모드 이상으로 확장될 수 있다.
Intel에서는 4개의 분리된 보호 링이 있다. (링 0: 커널, 링 4: 사용자)
ARMv8 시스템에는 7가지 모드가 있다.
가상화를 지원하는 CPU는 종종 VMM이 시스템을 제어하는 시점을 표시하기 위한 별도의 모드를 가진다. 이 모드에서 VMM은 사용자 프로세스보다 많은 권한을 가지지만 커널보다는 적은 권한을 가진다.
시스템 콜은 사용자 프로그램이 자신을 대신하여 운영체제가 수행하도록 지정되어 있는 작업을 운영체제에 요청할 수 있는 방법을 제공한다.
시스템 콜은 일반적으로 인터럽트 벡터의 특정 위치로 트랩을 거는 형태를 취하며, trap 명령어를 통해 수행되지만 몇몇 시스템은 syscall이라는 특정 명령어를 가지기도 한다.
시스템 콜은 하나의 소프트웨어 인터럽트로 취급되며, 커널은 인터럽트를 발생시킨 명령을 검사하여 어떤 시스템 콜이 발생했는지 결정한다.
이때 전달된 인수가 사용자 프로그램이 요청하는 서비스 유형을 표시하며, 요청이 필요로 하는 추가 정보는 레지스터, 스택 또는 메모리로 전달될 수 있다.
1.4.3. 타이머
운영체제는 CPU에 대한 제어를 유지할 수 있도록 보장되어야 한다.
사용자 프로그램이 무한 루프에 빠지거나 시스템 서비스 호출에 실패하여, 제어가 운영체제로 복귀하지 않는 경우가 없도록 반드시 방지해야 한다. 이를 위해 타이머를 사용할 수 있다.
타이머는 지정 시간 후 컴퓨터를 인터럽트하도록 설정할 수 있다.
1.5. 자원 관리
운영체제는 자원 관리자이며, CPU, 메모리 공간, 파일 저장 공간 및 I/O 장치를 관리한다.
1.5.1. 프로세스 관리
프로세스는 자기 일을 수행하기 위해 CPU 시간, 메모리 등 여러 가지 자원을 필요로 한다.
프로세스가 생성될 때 획득하는 여러 가지 물리적 논리적인 자원 외에, 여러 초기화 데이터도 아울러 전달될 수 있다.
프로그램은 디스크에 저장된 파일의 내용과 같이 수동적 개체지만, 프로세스는 다음 수행할 명령어를 지정하는 프로그램 카운터를 가진 능동적 개체이다.
한 프로세스의 수행은 반드시 순차적이어야 하며, CPU는 그 프로세스가 끝날 때까지 명령들을 차례대로 수행한다.
다중 스레드 프로세스는 여러 개의 프로그램 카운터를 가진다.
한 프로세스는 한 시스템 내의 작업의 단위이다. 이러한 시스템은 프로세스의 집합으로 구성된다.
프로세스 중 일부는 운영체제 프로세스들이며, 나머지는 사용자 프로세스들이다.
운영체제는 프로세스 관리에 대해 다음과 같은 책임을 진다.
- 사용자/시스템 프로세스의 생성과 제거
- CPU에 프로세스와 스레드 스케줄링
- 프로세스의 일시 중지와 재개
- 프로세스 동기화를 위한 기법 제공
- 프로세스 통신을 위한 기법 제공
1.5.2. 메모리 관리
메모리는 크기가 수십 만에서 수십 억까지의 범위를 갖는 바이트의 대용량 배열이며, 각 바이트는 자신의 주소를 가진다.
메인 메모리는 CPU와 입출력 장치에 의해 공유되는, 빠른 접근이 가능한 데이터의 저장소이다.
메인 메모리는 일반적으로 CPU가 직접 주소를 지정할 수 있고 접근할 수 있는 유일한 대량 메모리이다.
CPU가 디스크에서 가져온 데이터를 처리하려면 먼저 메인 메모리로 전송되어야 한다.
또한, CPU가 어떤 명령을 수행하려면 명령이 메인 메모리 내에 존재해야 한다.
프로그램이 수행되기 위해서는 반드시 절대 주소로 매핑되고 메모리에 적재되어야 한다.
프로그램이 종료되면, 프로그램이 차지하던 메모리 공간은 가용 공간으로 선언되고, 다음 프로그램이 적재되어 실행될 수 있다.
CPU 이용률과 사용자에 대한 컴퓨터의 응답 속도를 개선하기 위해, 메모리에 여러 개의 프로그램을 유지해야 하며 이를 위해 메모리 관리 기법이 필요하다.
운영체제는 메모리 관리에 대해 다음과 같은 책임을 진다.
- 메모리의 어느 부분이 현재 사용 중이고, 어떤 프로세스에 의해 사용되고 있는지 추적
- 필요에 따라 메모리 공간을 할당하고 회수
- 어떤 프로세스를 메모리에 적재하고 제거할 지 결정
1.5.3. 파일 시스템 관리
운영체제는 저장장치의 물리적 특성을 추상화하여 논리적인 저장 단위인 파일을 정의한다.
운영체제는 파일을 물리적 매체로 매핑하며, 저장장치를 통해 이들 파일에 접근한다.
컴퓨터는 여러 유형의 물리적 매체에 정보를 저장할 수 있다.
2차 저장장치, 3차 저장장치 등 각 매체는 자신의 특성과 물리적 구성을 가진다. (접근 속도, 용량, 데이터 전송률, 접근 방식 등)
파일은 파일 생성자에 의해 정의된 관련 정보의 집합체이며, 일반적으로 프로그램과 데이터를 나타낸다.
파일은 텍스트 파일과 같은 자유 형태일 수도 있고, 엄격하게 포맷된 형태일 수도 있다.
운영체제는 대량 저장 매체와 그것을 제어하는 장치를 관리함으로써 파일의 추상적인 개념을 구현한다.
또한, 파일은 사용하기 쉽도록 통상 디렉터리들로 구성된다.
다수의 사용자가 파일에 접근하려고 할 때는 누구에 의해서 어떤 방법으로 접근되어야 하는지 통제하는 것이 바람직하다.
운영체제는 파일 관리에 대해 다음과 같은 책임을 진다.
- 파일/디렉터리 생성 및 제거
- 파일과 디렉터리를 조작하기 위한 프리미티브의 제공
- 파일을 보조저장장치로 매핑
- 안정적인 저장 매체에 파일을 백업
1.5.4. 대용량 저장장치 관리
컴퓨터 시스템은 메인 메모리를 백업하기 위해 보조저장장치를 제공한다.
프로그램 대부분은 메모리에 적재될 때까지 보조저장장치에 저장된다.
운영체제는 보조저장장치 관리에 대해 다음과 같은 책임을 진다.
- 보조저장장치 마운팅과 언마운팅
- 사용 가능 공간의 관리
- 저장 장소 할당
- 디스크 스케줄링
- 저장장치 분할 및 보호
1.5.5. 캐시 관리
정보는 통상 어떤 저장장치에 보관되는데, 정보가 사용됨에 따라 더 빠른 장치인 캐시에 일시적으로 복사된다.
우리가 특정 정보가 필요할 경우, 먼저 캐시에 그 정보가 있는지를 조사한다.
캐시에 정보가 있다면 캐시로부터 정보를 직접 사용하지만, 캐시에 없다면 메인 메모리로부터 그 정보를 가져와야 하며, 이 정보가 다음에 곧 다시 사용될 확률이 높다는 가정하에 캐시에 넣는다.
CPU 내부의 레지스터 역시 메인 메모리를 위한 고속의 캐시로 볼 수 있다.
하드웨어로 구현된 캐시도 있다. 시스템 대부분은 다음에 수행될 것으로 예상되는 명령을 넣어 두는 명령 캐시를 갖고 있다.
캐시 크기는 제한적이므로 캐시 관리는 중요한 문제이며, 캐시 크기와 교체 정책을 신중하게 선택하면 큰 성능 향상을 기대할 수 있다.
메모리 계층 구조에서, 동일한 데이터가 서로 다른 수준의 저장장치 시스템에 나타나게 된다.
- 자기 디스크에 저장된 B라는 파일의 변수 A가 1 증가되어야 한다고 생각해보자.
- 먼저 A가 있는 디스크 블록을 메인 메모리로 복사해오는 입출력 연산을 호출한다.
- A를 캐시로 복사하고, 이어서 다시 내부 레지스터로 복사한다. 따라서 A의 복사본이 여러 곳에 존재하게 된다.
- 내부 레지스터에서 증가가 일어나면, A의 값은 여러 저장장치 시스템에서 서로 달라진다.
- A의 값은 자기 디스크에 새로운 A의 값이 다시 기록된 이후에야 비로소 비슷해진다.
어떤 시간에 오직 하나의 프로세스만 실행하는 환경에서는 문제가 없다. A에 대한 접근은 항상 계층 구조의 최상윗값을 참조하기 때문이다.
그러나 다중 태스킹 환경에서는 여러 개의 프로세스가 A에 접근하기를 원할 수 있으므로, 각 프로세스가 최근에 갱신된 A의 값을 얻을 것을 보장하기 위해 극도의 주의가 필요하다.
CPU가 내부 레지스터뿐만 아니라 로컬 캐시도 갖고 있는 환경 하에서는 더욱 복잡해진다.
이런 환경에서는 A의 복사본이 동시에 여러 캐시에 존재할 수 있으며, 여러 개의 CPU가 동시에 실행될 수 있으므로, 한 캐시에 있는 A의 값이 갱신될 경우 A가 존재하는 모든 캐시에 즉각적으로 반영되어야 한다.
이러한 상황을 캐시 일관성 문제라고 한다.
1.5.6. 입출력 시스템 관리
운영체제의 목적 중 하나는 사용자에게 특정 하드웨어 장치의 특성을 숨기는 것이다.
입출력 시스템은 다음과 같이 구성된다.
- 버퍼링, 캐싱, 스풀링을 포함한 메모리 관리 구성요소
- 일반적인 장치 드라이버 인터페이스
- 특정 하드웨어 장치들을 위한 드라이버
단지 장치 드라이버만이 자신에게 지정된 특정 장치의 특성을 알고 있다.
1.6. 보안과 보호
컴퓨터 시스템이 다수의 사용자를 가지며 다수 프로세스의 병행 실행을 허용한다면, 데이터에 대한 접근은 반드시 규제되어야 한다.
이를 위해 파일, 메모리 세그먼트, CPU 및 다른 자원들에 대해 운영체제로부터 적절한 허가를 획득한 프로세스만이 작업할 수 있도록 보장하는 기법이 필요하다.
보호란 컴퓨터 시스템이 정의한 자원에 대해 프로그램, 프로세스 또는 사용자들의 접근을 제어하는 기법이다.
보호는 구성요소 서브시스템 간의 인터페이스에서 잠재적인 오류를 검출함으로써 시스템의 신뢰성을 증가시킬 수 있다.
컴퓨터 시스템은 충분한 보호 기능이 있더라도 여전히 고장이 나거나 부적절한 접근을 허용할 수 있다.
사용자의 인증 정보가 탈취될 경우, 파일과 메모리 보호 기능이 작동하더라도 사용자의 데이터는 복사 또는 삭제될 수 있다.
이러한 외부 또는 내부의 공격을 방어하는 것이 보안 기능이다.
공격은 시스템의 많은 범위에 대해 가능하고 바이러스, 웜, 서비스 거부 공격, 식별자 도용, 서비스 도용 등이 있다.
운영체제는 이러한 공격을 자체적으로 막기도 하며, 정책이나 부가적인 응용 프로그램에 맡기기도 한다.
보호와 보안을 제공하기 위해 시스템의 모든 사용자를 구분할 수 있어야 한다.
운영체제는 사용자 이름과 연관된 사용자 식별자(user IDs)의 리스트를 유지한다. Windows 용어로는 보안 식별자(SID; Security ID)라고 한다.
사용자가 로그인할 때 인증 단계에서 사용자에게 맞는 적절한 식별자를 결정하며, 이 식별자는 사용자의 모든 프로세스나 스레드에 연관된다.
어떤 상황에서는 각 사용자가 아니라 사용자의 집합(그룹)을 구분될 수도 있다.
운영체제는 그룹 이름과 그 그룹에 속한 사용자들의 리스트를 구현하며, 사용자는 하나 이상의 그룹에 속할 수 있다.
사용자의 그룹 식별자 역시 모든 프로세스나 스레드에 연관된다.
사용자는 때때로 원하는 작업을 수행하기 위해 권한을 상승해야 할 때가 있다.
운영체제는 다양한 권한 상승 방법을 제공한다. UNIX에서는 setuid 속성을 이용하여, 프로세스가 현 사용자 식별자가 아닌 파일 소유주의 식별자를 이용하여 동작할 수 있다.
프로세스는 종료되거나 특권을 해제할 때까지 유효 사용자 식별자(Effective User ID)로 수행된다.
1.7. 가상화
가상화는 단일 컴퓨터의 하드웨어를 여러 가지 실행 환경으로 추상화하여 개별 환경이 자신만의 컴퓨터에서 실행되고 있다는 환상을 만들 수 있는 기술이다.
이러한 환경은 동시에 실행되고 서로 상호 작용할 수 있는 다른 개별 운영체제로 볼 수 있다.
가상화는 운영체제가 다른 운영체제 내에서 하나의 응용 프로그램처럼 수행될 수 있게 한다.
가상화 소프트웨어는 에뮬레이션을 포함하는 클래스의 구성원이다.
소프트웨어로 컴퓨터 하드웨어를 시뮬레이션하는 에뮬레이션은 일반적으로 소스 CPU 유형이 대상 CPU 유형과 다른 경우에 사용된다.
이와 달리 가상화에서는 특정 CPU를 위해 컴파일된 운영체제가 동일 CPU용의 다른 운영체제 내에서 수행된다.
1.8. 분산 시스템
분산 시스템은 물리적으로 떨어져 있는 이기종 컴퓨터들의 집합이다.
분산 시스템의 컴퓨터들은 다양한 자원들을 접근할 수 있도록 네트워크로 연결되어 있다.
몇몇 운영체제는 네트워킹의 자세한 사항을 네트워크 인터페이스의 장치 드라이버에 포함시킴으로써 네트워크에 대한 접근을 파일 접근 형태로 일반화시키며, 또 다른 운영체제들은 사용자가 특정 네트워크 기능을 명시적으로 호출하게 한다.
일반적으로 시스템 상에는 두 모드가 혼재되어 있으며, 그 예로 FTP와 NFS가 있다.
네트워크는 두 개 이상 시스템 간의 통신 경로이다.
네트워크는 사용되는 프로토콜, 노드 간의 거리, 그리고 전송 매체에 따라 다르다.
TCP/IP는 가장 일반적인 네트워크 프로토콜로, 인터넷의 기본 구조를 제공한다. 운영체제의 대부분은 TCP/IP를 지원한다.
네트워크는 노드 간의 거리에 의해 유형이 결정된다.
근거리 통신망(LAN)은 한 방, 한 층, 또는 한 건물에 존재한다.
광역 통신망(WAN)은 통산 건물, 도시 또는 국가 사이를 연결한다.
도시권 통신망(MAN)은 한 도시 내의 건물들을 연결할 수 있다.
단거리 통신망(PAN)은 블루투스 또는 802.11 무선 통신 기술을 이용하여 수 미터 짧은 거리에서 통신한다.
네트워크에 사용되는 매체는 구리 전선, 섬유 가닥, 위성, 마이크로웨이브 접시, 라디오 등 다양하다.
네트워크 운영체제는 다른 컴퓨터의 다른 프로세스가 메시지를 교환할 수 있도록 하는 통신 체계와 함께 네트워크를 통한 파일 공유와 같은 기능을 제공하는 운영체제이다.
네트워크 운영체제를 실행하는 컴퓨터는 네트워크를 인식하고 다른 네트워크 컴퓨터와 통신할 수 있지만 네트워크의 다른 모든 컴퓨터와는 자율적으로 작동한다.
1.9. 커널 자료구조
1.9.1. 리스트, 스택 및 큐
배열은 각 원소가 직접 접근될 수 있는 단순한 자료구조이다.
크기가 변하는 데이터나, 한 데이터를 제거하고 나머지 데이터들을 유지해야 할 경우에는 배열 대신 다른 자료구조를 사용해야 한다.
리스트는 컴퓨터 과학에서 가장 기본적인 자료구조이다.
배열의 각 항은 직접 접근할 수 있으나 리스트의 항들은 특정 순서로 접근해야 한다. 즉 리스트는 데이터 값들의 집단을 하나의 시퀀스로 표시한다.
이 구조를 구현하는 가장 일반적인 방법이 연결 리스트이다. 연결 리스트에서는 각 항이 다른 하나에 연결되어 있다.
- 단일 연결 리스트에서는 후속 항을 가리킨다.
- 이중 연결 리스트에서는 자신의 앞 항과 뒤 항을 가리킨다.
- 원형 연결 리스으에서는 리스트의 마지막 항이 널이 아니라 첫 항을 가리킨다.
연결 리스트는 가변 수의 항들을 수용하며 항의 삭제와 삽입이 쉽다.
단점은 길이가 N인 리스트에서 특정 항을 인출할 때의 성능이 선형, 즉 O(N)이라는 점이다.
리스트는 커널 알고리즘에 의해 직접 사용되며, 스택이나 큐 같은 강력한 자료구조를 구축하는 데 사용되기도 한다.
스택은 순차적 순서를 가진 자료구조로, 항을 넣거나 꺼내는 데 후입선출(LIFO)을 사용한다. 즉, 스택에 마지막에 삽입된 항이 먼저 인출된다.
스택에 항을 삽입하거나 인출하는 일은 각각 push, pop이라 부른다.
운영체제는 함수를 호출할 경우 종종 스택을 사용한다. 함수를 호출할 때 인수, 로컬 변수 및 복귀 주소 등이 스택에 push되고 함수로부터 복귀할 때 이들 항을 스택으로부터 pop한다.
큐는 순차 순서의 자료구조로 선입선출(FIFO)을 사용한다. 각 항은 삽입된 순서대로 큐로부터 제거된다.
1.9.2. 트리
트리는 데이터의 서열을 표시하는 데 사용 가능한 자료구조이다.
트리 구조에서 데이터 값들은 부모-자식 관계로 연결된다.
일반 트리에서 부모는 임의의 수의 자식을 가질 수 있고, 이진 트리에서는 최대 두 개의 자식을 가질 수 있으며, 좌측 자식/우측 자식으로 부른다.
이진 탐색 트리는 추가로 부모의 두 자식 사이에 좌측 자식 <= 우측 자식의 순서를 요구한다.
이진 탐색 트리에서 한 항을 찾으려면 최악의 경우 성능이 O(N)이므로, 균형 이진 탐색 트리를 만드는 알고리즘을 사용할 수 있다. 이 경우 최악의 경우 성능 O(lgN)을 보장한다.
Linux에서는 CPU 스케줄링 알고리즘의 일부로, Red-Black Tree라는 균형 이진 탐색 트리를 사용한다.
1.9.3. 해시 함수와 맵
해시 함수는 데이터를 입력으로 받아 이 데이터에 산술 연산을 수행하여 하나의 수를 반환한다.
이 수는 그 데이터를 인출하기 위해 테이블의 인덱스로 사용할 수 있다.
크기 N인 리스트에서 데이터를 찾는 데 최대 O(N)의 비교가 필요한 반면 테이블에서 해시 함수를 이용하여 데이터를 인출할 경우 O(1)만큼 좋을 수도 있다.
해시 함수의 단점은, 서로 다른 두 개의 입력이 하나의 출력 값을 가질 수 있다는 것이다. 이를 해시 충돌이라 하며 테이블의 각 항에 연결 리스트를 두어 동일한 해시 값을 갖는 모든 항을 수록하게 한다.
해시 함수의 한 용도는 해시 맵을 구현하는 것이다. 해시 맵은 해시 함수를 사용하여 키:값을 연관(매핑)시킨다.
매핑이 성립되면 키에 해시 함수를 적용하여 해시맵으로부터 그 값을 얻을 수 있다.
1.9.4. 비트맵
비트맵은 N개의 항의 상태를 나타내는 데 사용 가능한 N개의 이진 비트 스트링이다.
비트맵에서 i번째 위치의 값은 i번째 자원과 연관된다.
비트맵은 공간 효율이 좋으며, 일반적으로 대량의 자원(디스크 드라이브 등)의 가용성을 표시할 때 사용된다.
1.10. 계산 환경
1.10.1. 전통적 계산
전형적인 사무실 환경에서는 네트워크에 연결된 PC들과 파일과 프린트 서비스를 제공하는 서비스로 구성되었다. 원격 접근은 흔하지 않았으며 이동성은 랩톱을 이용함으로써 이루어졌다.
오늘날 웹 기술이 전통적인 계산의 경계를 확장하고 있다.
회사들은 자신의 내부 서버에 웹 접근을 제공하는 포털을 구현하고 있다.
네트워크 컴퓨터는 실질적으로 웹 기반 컴퓨팅을 이해하는 터미널을 말하며, 전통적 워크스테이션을 대체하여 사용되고 있다.
모바일 컴퓨터는 PC와 동기화하여 회사 정보를 쉽게 휴대할 수 있게 하며, 무선 네트워크나 이동전화 망에 연결되어 회사의 웹 포털을 사용할 수 있게 한다.
집에서 사용자 대부분은 하나의 컴퓨터가 느린 모뎀 연결을 통해 사무실이나 인터넷 또는 양쪽 모두에 연결되어 있는 환경이었다.
한때는 큰 비용이 들었던 네트워크 연결 속도는 싼 비용으로 이용 가능하며, 더 많은 데이터에 더 많은 접근을 가능하게 한다.
이러한 고속 연결은 홈 컴퓨터가 웹 페이지를 제공하고 프린터, 클라이언트 PC, 서버를 갖는 자신의 네트워크를 가질 수 있게 한다.
일부 홈은 이러한 홈 계산 환경을 보안 침해로부터 보호하기 위해 방화벽을 가지고 있다.
1.10.2. 모바일 컴퓨팅
모바일 컴퓨팅은 휴대용 스마트폰과 태블릿 컴퓨터의 컴퓨팅 환경을 말하며, 이동 가능하고 가볍다는 구별되는 물리적 특징을 공유한다.
데스크톱이나 랩톱과 비교하면 휴대용 시스템은 화면 크기, 메모리 용량과 전체적 기능을 포기한 대신 이메일과 웹브라우징 같은 손에 쥘 수 있는 휴대용 접근을 얻은 것이다.
그렇지만 지난 몇 년 동안 휴대용 장치의 기능이 풍부해져서 소비자용 랩톱과 태블릿 컴퓨터 사이의 기능 구분이 분명하지 않게 되었다.
오늘날 휴대용 시스템은 이메일이나 웹 브라우징뿐만 아니라 음악 연주, 비디오, 디지털 책 읽기, 사진 촬영 및 고품질 비디오의 녹화 및 편집에 사용된다.
온라인 서비스에 접근을 허용하기 위해 휴대장치는 전형적으로 IEEE 802.11 무선 또는 휴대 전화 데이터망을 사용한다.
휴대장치의 메모리 용량과 처리속도는 PC보다 제한적이며, 전력 소모가 적게 하기 위해 더 적은 수의 처리기 코어를 갖는다.
현재 휴대 컴퓨팅에서 두 개의 지배적인 운영체제는 Apple iOS와 Google Android이다.
1.10.3. 클라이언트 서버 컴퓨팅
현대 네트워크 구조는 서버 시스템이 클라이언트 시스템이 생성한 요청을 만족시키는 배치를 특징으로 한다.
서버 시스템은 대체적으로 계산 서버와 파일 서버로 분류될 수 있다.
- 계산 서버 시스템은 클라이언트가 어떤 작업을 요청할 수 있는 인터페이스를 제공한다.
- 파일 서버 시스템은 클라이언트가 파일을 생성, 갱신, 읽기 및 제거할 수 있느 파일 시스템 인터페이스를 제공한다.
1.10.4. 피어 간 계산
분산 시스템의 또 다른 구조는 피어 간 시스템(P2P; Peer-to-Peer)이다.
이 모델에서는 클라이언트와 서버가 서로 구별되지 않으며, 시스템 상의 모든 노드가 피어로 간주되고 각 피어는 서비스를 요청하느냐 제공하느냐에 따라 클라이언트와 서버로 동작한다.
피어 간 시스템은 전통적인 클라이언트 서버에 비해 장점을 제공한다.
클라이언트 서버 시스템에서는 서버가 병목으로 작용하지만, 피어 간 시스템에서는 서비스가 네트워크에 분산된 여러 노드에 의해 제공될 수 있다.
피어 간 시스템에 참여하기 위해서 노드는 먼저 피어 간 네트워크에 참가해야 한다.
네트워크에 참가하게 되면 네트워크의 다른 노드에게 서비스를 제공하거나 서비스를 요청할 수 있다.
어떤 서비스가 가능한지를 결정하는 방법에는 다음의 두 일반적인 방법이 있다.
- 노드가 네트워크에 참가할 때 네트워크의 중앙 검색 서비스에 자신이 제공하는 서비스를 등록한다.
- 원하는 서비스를 제공하는 노드를 찾아내기 위해 네트워크상의 모든 노드에게 서비스 요청 메시지를 브로드캐스팅한다.
1.10.5. 클라우드 컴퓨팅
클라우드 컴퓨팅은 계산, 저장장치는 물론 응용 프로그램 조차도 네트워크를 통한 서비스로 제공하는 계산 유형이다.
예를 들면 아마존 EC2는 수천의 서버, 수백만의 가상 머신 및 페타 바이트의 저장장치를 인터넷상의 누구든지 사용할 수 있게 한다.
여러 유형의 클라우드 컴퓨팅이 존재한다.
- 공중 클라우드: 서비스를 위해 지불 가능한 사람은 누구나 인터넷을 통해 사용 가능한 클라우드
- 사유 클라우드: 한 회사가 사ㅏ용하기 위해 운영하는 클라우드
- 혼합형 클라우드: 공공과 사유 부분을 모두 포함하는 클라우드
- SaaS: 인터넷을 통해 사용 가능한 하나 이상의 응용 프로그램
- PaaS: 인터넷을 통해 사용하도록 응용 프로그램에 맞게 준비된 소프트웨어 스택
- IaaS: 인터넷을 통해 사용 가능한 서버나 저장장치
많은 유형의 클라우드 하부구조 내에 전통적인 운영체제가 존재하며, 그 위에는 사용자 프로세스가 수행되는 가상 머신을 관리하는 VMM이 있다.
더 위로는 VMware vCloud Director나 오픈 소스인 Eucalyptus 툴 세트와 같은 클라우드 관리 도구가 있어 VMM을 관리한다.
1.10.6. 실시간 내장형 시스템
내장형 시스템은 현재 가장 유행하는 컴퓨터의 형태이다. 이 장치들은 자동차, 공장용 로봇 등 어느 곳에서나 볼 수 있다.
이 장치들은 아주 특정한 작업만을 수행하는 경향이 있으며, 운영체제도 제한된 기능만을 제공한다.
내장형 시스템들은 매우 다향하며, UNIX와 같은 범용 운영체제를 수행시키면서 특수 목적을 가진 응용 프로그램을 수행시키는 형태를 갖는다.
혹은 필요한 기능만을 제공하는 내장형 운영체제를 가진 하드웨어의 형태를 취할 수도 있다.
내장형 시스템은 언제나 실시간 운영체제를 수행한다.
실시간 시스템은 고정된 시간 제약을 가진다. 정의된 제한 시간 내에 처리가 반드시 이루어져야 하며, 그렇지 않으면 시스템은 실패하게 된다.
1.11. 무료 및 오픈 소스 운영체제
무료 운영체제와 오픈 소스 운영체제는 컴파일된 이진 코드가 아닌 소스 코드 형식으로 제공된다.
무료 소프트웨어는 소스 코드를 공개할 뿐만 아니라 무료 사용, 재배포 및 수정을 허용하도록 라이선스를 받는다. 하지만 오픈 소스 소프트웨어는 반드시 그러한 라이선스를 제공하지는 않는다.
Microsoft Windows는 반대 개념인 비공개 소스 방식이다.
Windows는 독점 소프트웨어로서 Microsoft가 소유하고, 사용을 제한하며, 소스 코드를 신중하게 보호한다.
Apple의 macOS 운영체제는 하이브리드 방식으로 구성된다. 여기에는 Darwin이라는 오픈 소스 커널이 포함되어 있지만 독점적인 비공개 소스 구성요소도 포함되어 있다.
소스 코드로부터 프로그래머는 한 시스템에서 실행 가능한 이진 코드를 생성할 수 있다.
역공학(Reverse Engineering)을 통하여 이진 코드로부터 소스 코드를 얻어내는 반대의 작업은 매우 많은 노력이 필요하며 주석과 같은 유용한 사항들을 복원해낼 수는 없다.
오픈 소스 운영체제는 많은 장점이 있다.
- 관심 있는 프로그래머들이 코드를 작성하고, 디버깅에 도움을 주고, 코드를 분석하고, 지원을 제공하고, 수정 사항을 제안함으로써 코드 발전에 기여한다.
- 더 많은 프로그래머들이 코드를 검토하기 때문에 비공개 소스 코드보다 보안성이 더 높을 수 있다.
1.11.1. 역사
현대 컴퓨팅의 초기에 소프트웨어는 일반적으로 소스 코드와 함께 제공되었다.
1.11.2. 무료 운영체제
[생략]
1.11.3. GNU/Linux
GNU/Linux 운영체제는 수백 가지의 고유한 배포판 또는 사용자 맞춤 빌드를 가지고 있다.
주요 배포판에는 Red Hat, SUSE, Fedora, Debian, Slackware 및 Ubuntu가 있다.
배포판은 기능, 유틸리티, 설치된 응용 프로그램, 하드웨어 지원, 사용자 인터페이스 및 목적에 따라 다르다.
Red Hat과 Enterprise Linux는 대규모 상업적 용도로 사용된다.
PCLinuxOS는 시스템의 부팅 디스크에 설치하지 않고 CD-ROM에서 부팅 및 실행할 수 있는 운영체제인 라이브 CD이다.
1.11.4. BSD Unix
BSD UNIX는 AT&T의 파생물로 출발하였으며, Linux와 마찬가지로 FreeBSD, NetBSD, OpenBSD 등 여러 배포판이 존재한다.
macOS의 핵심 커널 구성요소인 Darwin은 BSD UNIX에 기반을 두고 있으며 오픈 소스이다.
1.11.5. Solaris
Solaris는 Sun Microsystems사의 Unix 기반 상용 운영체제이며, AT&T의 System-V 기반이다.
1.11.6. 학습 도구로서 오픈 소스 시스템
[생략]
