[Operating System Concepts 10th] 1. Introduction 리뷰 (1)
본 글은 Operating System Concepts 10th (운영체제) 책을 보며 내용을 개인 공부에 목적으로 정리했습니다.
이전에 운영체제 관련 강의들을 들으면서 정리한 시리즈 글들이 있는데,
지식을 습득하는 데 있어 가장 느리지만 가장 빠른 방법이 원본책을 자세히 보는 것이라 생각됩니다.
따라서 책 내용들을 최대한 이해하기 위해 거의 모든 내용을 담고 있습니다.
책 pdf 링크 : Operating System Concepts 10th Edition by Abraham Silberschatz Peter B Galvin Greg Gagne pdf free download
연습 문제 정답지 : Solutions of Practice Exercises, Tenth Edition of Operating System Concepts, AVI SILBERSCHATZ
Introduction
- 운영체제(operating system) : 컴퓨터 하드웨어를 관리하는 소프트웨어
- 응용 프로그램을 위한 기반을 제공하며 사용자와 하드웨어 사이에서 중재자 역할을 한다.
- 운영체제는 CPU, 메모리 및 입출력 장치와 저장장치 등 이러한 자원들을 프로그램에 할당해야 하는 책임이 있다.
- 목표
- 컴퓨터 시스템의 일반적인 구성과 인터럽트의 역할을 기술한다.
- 현대 멀티 프로세서 컴퓨터 시스템의 구성요소에 관해 기술한다.
- 사용자 모드에서 커널 모드로의 전환에 대해 설명한다.
- 다양한 컴퓨팅 환경에서 운영체제가 어떻게 사용되는지 논의한다.
- 무료 및 공개 소스 운영체제의 예를 제공한다.
1.1 What Operating Systems Do
- 컴퓨터 시스템은 하드웨어(hardware), 운영체제(operating system), 응용 프로그램(application) 및 사용자(user) 네 가지 구성요소로 구분할 수 있다.
- 하드웨어는 CPU, 메모리 및 I/O 장치로 구성되어 기본 계산용 자원을 제공한다.
- 응용 프로그램은 사용자의 계산 문제를 해결하기 위해 응용 프로그램 자원이 어떻게 사용될지를 정의한다.
- 운영체제는 다양한 사용자를 위해 다양한 응용 프로그램 간의 하드웨어 사용을 제어하고 조정한다.
- 운영체제는 단순히 다른 프로그램이 유용한 작업을 할 수 있는 환경(environment)을 제공한다.
1.1.1 User View
- 컴퓨터에 대한 사용자의 관점은 사용되는 인터페이스에 따라 달라진다.
- 이러한 시스템은 한 사용자가 자원(resource)을 독점하도록 설계되었으며, 사용자가 수행하는 작업을 최대화하는 것이다.
- 이러한 경우 운영체제는 사용의 용이성(ease of use)을 위해 설계되고, 자원의 이용(resource utilization)은 신경쓰지 않는다.
1.1.2 System View
- 컴퓨터의 관점에서 운영체제는 하드웨어와 가장 밀접하게 연관된 프로그램이다.
- 따라서 운영체제를 자원 할당자(resource allocator)로 볼 수 있다.
- 컴퓨터 시스템은 문제를 해결하기 위해 CPU 시간, 메모리 공간, 저장장치 공간, 입출력 장치 등을 가진다.
- 다른 관점으로 운영체제는 제어 프로그램(control program)이다.
- 제어 프로그램은 컴퓨터의 부적절한 사용을 방지하기 위해 사용자 프로그램의 수행을 제어한다.
- 제어(control) : 어떤 목적에 적합하도록 제어 대상에 필요한 조작을 가하는 것
1.1.3 Defining Operating Systems
- 컴퓨터 시스템의 기본 목표는 프로그램을 실행하고 사용자 문제를 더욱 쉽게 해결할 수 있게 하는 것이다.
- 운영체제에는 항상 실행 중인 커널, 응용 프로그램 개발을 쉽게 하고 기능을 제공하는 미들웨어 프레임 워크 및 시스템 실행 중에 시스템을 관리하는 데 도움이 되는 시스템 프로그램이 포함된다.
- 커널(kernel) : 컴퓨터에서 항상 실행되는 프로그램
- 미들웨어(middleware) : 응용 프로그램 개발자에게 추가 서비스를 제공하는 일련의 소프트웨어 프레임워크
- 응용프로그램(application) : 기술, 시스템 및 제품 등을 사용하는 것을 말한다. 또 어떤 경우에는 다른 응용 프로그램에게, 특정한 기능을 직접 수행하도록 설계된 프로그램이다. 1
1.2 Computer-System Organization
- 현대의 범용 컴퓨터 시스템은 하나 이상의 CPU와 구성요소(component)와 공유 메모리(shared memory) 사이의 액세스(access)를 제공하는 공통 버스(bus)를 통해 연결된 여러 장치 컨트롤러(device controller)로 구성된다.
- 장치 컨트롤러(device controller) : 일부 로컬 버퍼(buffer) 저장소와 특수 목적 레지스터 집합을 유지 관리한다.
이미지출처 2
- 장치 컨트롤러는 제어하는 주변 장치와 로컬 버퍼 저장소 간에 데이터를 이동한다.
- 입력(input) : 컴퓨터 내부로 데이터가 들어오는 것
- 출력(output) : 컴퓨터 외부 장치로 데이터가 나가는 것
- 주변 장치(peripheral device) : 모니터, 프린터, 마우스, 키보드, USB 등등을 말한다.
- 로컬 버퍼(local buffer) : 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리 2
- 디스크나 키보드 등에서 데이터를 읽어오는 경우, 로컬 버퍼에 데이터가 임시 저장된 후 메모리에 전달된다.
- 이 때, 장치에서 로컬 버퍼로 읽어오는 일을 컨트롤러가 담당한다.
- 데이터를 다 읽어오면 컨트롤러가 인터럽트를 발생시켜 CPU에 보고한다. 3
- 일반적으로 운영체제에는 각 장치 컨트롤러마다 장치 드라이버(device driver)가 있다.
- 장치 드라이버(device driver) : 특정 하드웨어나 장치를 제어하기 위한 커널의 일부분으로 동작하는 프로그램 4
- 장치 드라이버는 장치 컨트롤러의 작동을 잘 알고 있고 나머지 운영체제에 장치에 대한 일관된 인터페이스를 제공한다.
1.2.1 Interrupts
- 입출력 작업을 시작하기 위해 장치 드라이버는 장치 컨트롤러의 적절한 레지스터(register)에 값을 적재한다.
- 레지스터(register) : 프로세서의 일부로 포함되어 있는 작은 크기의 고속 저장장치 5
- 레지스터는 메모리 계층의 최상위에 위치하며, 가장 빠른 속도로 접근 가능한 메모리이다.
- 입출력 장치의 데이터는 반드시 입출력 레지스터를 거쳐 CPU로 전달된다.
- 레지스터(register) : 프로세서의 일부로 포함되어 있는 작은 크기의 고속 저장장치 5
- 그런 다음 장치 컨트롤러는 이러한 레지스터의 내용을 검사하여 수행할 작업을 결정한다.
- 컨트롤러는 장치에서 로컬 버퍼로 데이터 전송을 시작한다.
- 데이터 전송이 완료되면 장치 컨트롤러는 장치 드라이버에게 작업이 완료되었음을 알린다.
- 그런 다음 장치 드라이버는 읽기 요청이면 데이터에 대한 포인터를 반환하며 운영체제의 다른 부분에 제어를 넘긴다.
- 다른 작업의 경우 장치 드라이버는 “쓰기 완료” 또는 “장치 사용 중”과 같은 상태 정보를 반환한다.
- 포인터(pointer) : 메모리의 주소값을 저장하는 변수 6
- 컨트롤러는 장치 드라이버에게 인터럽트(interrupt)를 통해 작업을 완료했다는 사실을 알린다.
- 인터럽트(interrupt) : CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치에 예외상황이 발생하여 처리가 필요할 경우에 CPU에게 알려 처리할 수 있도록 하는 것 7
1.2.1.1 Overview
- 하드웨어는 어느 순간이든 시스템 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킬 수 있다.
- CPU가 인터럽트 되면 CPU는 하던 일을 중단하고 즉시 고정된 위치로 실행을 옮긴다.
- 이러한 고정된 위치는 일반적으로 인터럽트를 위한 서비스 루틴이 위치한 시작 주소를 가지고 있다.
-
그리고 인터럽트 서비스 루틴(interrupt service routine)이 실행된다.
- 인터럽트 서비스 루틴(interrupt service routine) or 인터럽트 핸들러(interrupt handler) : 인터럽트 접수에 의해 발생되는 인터럽트에 대응하여 특정 기능을 처리하는 기계어 코드 루틴 (커널에 존재) 8
- 인터럽트 서비스 루틴의 실행이 완료되면, CPU는 인터럽트 되었던 연산을 재개한다.
- 인터럽트는 적절한 서비스 루틴으로 제어를 전달한다.
- 그 후 인터럽트 고유의 핸들러(handler)를 호출하지만, 인터럽트는 매우 빈번하게 발생하기 때문에 빠르게 처리하기 위해, 인터럽트 루틴에 대한 포인터들의 테이블을 대신 이용한다.
- 이 경우 중간 루틴을 둘 필요 없이, 테이블을 통하여 간접적으로 인터럽트 루틴이 호출될 수 있다.
- 일반적으로, 포인터들의 테이블은 하위 메모리에 저장된다.
- 이들 위치에는 여러 장치에 대한 인터럽트 서비스 루틴의 주소가 들어 있다.
- 인터럽트가 요청되면, 인터럽트를 유발한 장치를 위한 인터럽트 서비스 루틴의 주소를 제공하기 위해 인터럽트 벡터(interrupt vector)가 인터럽트 요청과 함께 주어진 고유의 유일한 장치 번호로 index된다.
- 인터럽트 벡터(interrupt vector) : 인터럽드 발생시 처리해야 할 인터럽트 핸들러의 주소를 인터럽트 별로 보관하고 있는 테이블 9
1.2.1.2 Implementation
- CPU 하드웨어에는 인터럽트 요청 라인(interrupt request line)이라는 선이 있는데, 하나의 명령어의 실행을 완료할때 마다 CPU가 이 선을 감지한다.
- CPU가 컨트롤러가 인터럽트 요청 라인에 신호를 보내 것을 감지하면, 인터럽트 번호를 읽고 이 번호를 인터럽트 벡터의 인덱스로 사용하여 인터럽트 핸들러 루틴(interrupt-handler routine)으로 점프한다.
- 그런 다음 해당 인덱스와 관련된 주소에서 실행을 시작한다.
- 인터럽트 핸들러는 작업 중에 변경될 상태를 저장하고, 인터럽트 원인을 확인하고, 필요한 처리를 수행하고, 상태 복원을 수행하고,
return_from_interrupt
명령어를 실행하여 CPU를 인터럽트 전 실행 상태로 되돌린다.
- 장치 컨트롤러가 인터럽트 요청 라인에 신호를 선언하여 인터럽트를 발생(raise)시키고 CPU는 인터럽트를 포착(catch)하여 인터럽트 핸들러로 디스패치(dispatch)하고 핸들러는 장치를 서비스하여 인터럽트를 지운다(clear).
- 디스패치(dispatch) : 준비(ready) 상태에서 실행(running) 상태로 전이되는 과정을 말하며, 이는 작업 스케줄러가 해당 프로세스를 선택하여 실행되어지는 것으로 이때 실행된 프로세스가 CPU를 점유하게 된다. 10
- 대부분의 CPU에는 2개의 인터럽트 요청 라인이 있다.
- 마스크 불가능 인터럽트(nonmaskable interrupt) : 회복 불가능한 메모리 에러와 같은 이벤트를 위해 사용
- 마스크 가능 인터럽트(maskable interrupt) : 필요 시 인터럽트 기능을 잠시 중단시켜 놓을 수 있는 기능으로 장치 컨트롤러가 서비스를 요청하기 위해 사용한다.
- 인터럽트 기법 중 인터럽트 우선순위 레벨(interrupt priority level)을 구현했는데, 이것을 통해 CPU는 모든 인터럽트를 마스킹하지 않고도 우선순위가 낮은 인터럽트 처리를 연기할 수 있고, 우선순위가 높은 인터럽트가 우선순위가 낮은 인터럽트의 실행을 선점할 수 있다.
1.2.2 Storage Structure
- CPU는 메모리에서만 명령(instruction)을 적재할 수 있기 때문에 실행(execution)하려면 프로그램을 먼저 메모리에 적재해야 한다.
- 컴퓨터는 프로그램 대부분을 메인 메모리(random-access memory, RAM)라 불리는 재기록 가능한 메모리에서 가져온다.
- 메인 메모리(random-access memory, RAM) : 컴퓨터가 빠른 액세스를 하기 위해 데이터를 단기간 저장하는 구성 요소 11
- Random Access라는 의미는 메인 메모리의 어느 주소(랜덤한 곳)이든지 동일한 접근 속도로 데이터를 사용할 수 있다는 의미이다.
- 메인 메모리는 전원이 공급되지 않으면 그 내용을 잃어버리는 휘발성 저장장치이다.
- 메인 메모리(random-access memory, RAM) : 컴퓨터가 빠른 액세스를 하기 위해 데이터를 단기간 저장하는 구성 요소 11
- 메인 메모리는 dynamic random-access memory(DRAM)라 불리는 반도체 기술로 구현된다.
- 모든 형태의 메모리는 바이트의 배열을 제공한다.
- 각 바이트는 자신의 주소를 가지고 있다.
- 다음은 저장 용량과 액세스 시간에 따라 계층 구조로 구성한 그림이다.
1.2.3 I/O Structure
- 1.2.1절에 설명된 인터럽트 구동 I/O의 형태는 소량의 데이터를 이동하는 데는 좋지만 대량 데이터 이동에 사용될 때 높은 오버헤드를 유발할 수 있다.
- 이 문제를 해결하기 위해 직접 메모리 액세스(direct memory access;DMA)가 사용된다.
- 직접 메모리 액세스(direct memory access;DMA) : 주변 장치들이 메모리에 직접 접근하여 읽거나 쓸 수 있도록 하는 기능 (CPU 개입 X) 12
- 장치에 대한 버퍼 및 포인터, 입출력 카운트를 세팅한 후 장치 컨토롤러는 CPU의 개입 없이 메모리로부터 자신의 버퍼 장치로 또는 버퍼로부터 메모리로 데이터 블록 전체를 전송한다.
- 블록 전체가 완료될 때마다 인터럽트가 발생한다.
1.3 Computer-System Architecture
1.3.1 Single-Processor Systems
- 컴퓨터 시스템 구성요소의 정의
- CPU(Central Processing Unit) : 명령을 실행하는 하드웨어
- 프로세서(processor) : 하나 이상의 CPU를 포함하는 물리적 칩
- 코어(core) : CPU의 기본 계산 단위
- 명령을 실행하고 로컬로 데이터를 저장하기 위한 레지스터를 포함하는 구성요소
- 멀티코어(multicore) : 동일한 CPU에 여러 컴퓨팅 코어를 포함함
- 멀티프로세서(multiprocessor) : 여러 프로세서를 포함함
- 현대 컴퓨터 시스템은 싱글 프로세서 시스템이 거의 없다.
1.3.2 Multiprocessor Systems
- 멀티프로세서 시스템에는 각각 싱글 코어 CPU가 2개 이상의 프로세서(processor)를 가지고 있다.
- 프로세서는 컴퓨터 버스 및 클록, 메모리 및 주변 장치를 공유한다.
- 가장 일반적인 멀티프로세서 시스템은 각 피어 CPU 프로세서가 운영체제 기능 및 사용자 프로세스를 포함한 모든 작업을 수행하는 SMP(symmetric multiprocessing)를 사용한다.
- 각 CPU 프로세서에는 로컬 캐시뿐만 아니라 자체 레지스터 세트가 있다.
- 모든 프로세서는 시스템 버스를 통해 물리 메모리를 공유한다.
- Pros
- 많은 프로세스를 동시에 실행할 수 있다.
- Cons
- CPU가 독립적이기 때문에 하나는 유휴 상태이고 다른 하나는 과부하가 걸려 비효율적일 수 있다.
- 다음 그림에서는 같은 프로세서 칩에 두 개의 코어를 가지는 이중 코어(dual-core) 설계를 보여준다.
- 각 코어에는 자체 레지스터 세트와 레벨 1(L1) 캐시라고 하는 자체 로컬 캐시가 있다.
- 레벨 2(L2) 캐시는 칩에 국한되지만 두 처리 코어에서 공유한다.
- 아키텍처 대부분은 로컬 및 공유 캐시를 결합한 이 접근 방식을 채택한다.
L1 캐시는 일반적으로 CPU 칩안에 내장되어 데이터 사용/참조에 가장 먼저 사용된다. L1 캐시는 보통 8~64KB 정도의 용량으로 CPU가 가장 빠르게 접근하게 되며, 여기서 데이터를 찾지 못하면, 이제 L2 캐시 메모리로 넘어간다.
L2 캐시 메모리는 용도와 역할은 L1 캐시와 비슷하지만 속도는 그보다 느리다. 일반적으로 64KB~4MB 정도가 사용된다. L2 캐시는 CPU 회로판에 별도의 칩으로 내장된다. 13
- 다음 그림은 모든 CPU가 공유 시스템 연결(shared system interconnect)로 연결되어 모든 CPU가 하나의 물리 주소 공간을 공유하는 NUMA(non-uniform memory access) 시스템 구조이다.
- Pros
- CPU가 로컬 메모리에 액세스 할 때 빠를 뿐만 아니라 시스템 상호 연결에 대한 경합도 없다.
- 따라서 NUMA 시스템은 더 많은 프로세서가 추가될수록 더 효과적으로 확장할 수 있다.
- Cons
- CPU가 시스템 상호 연결을 통해 원격 메모리에 액세스해야 할 때 지연 시간(latency)이 증가하여 성능 저하가 발생할 수 있다.
1.3.3 Clustered Systems
- 클러스터 컴퓨터는 저장장치를 공유하고 근거리 통신망(local area network, LAN)같은 고속의 상호 연결망(interconnect)으로 연결된다.
- 클러스터링은 높은 가용성(availability)을 제공하기 위해 사용된다.
- 클러스터 내 하나 이상의 컴퓨터 시스템이 고장 나더라도 서비스는 계속 제공된다.
- 높은 가용성은 시스템에 중복 기능을 추가함으로써 얻어진다.
- 클러스터 소프트웨어 중 한 층이 클러스터 노드에서 실행된다.
- 각 노드는 하나 이상의 다른 노드들을 감시한다.
- 만일 감시받던 노드가 고장 나면 감시하던 노드가 고장 난 노드의 저장장치에 대한 소유권을 넘겨받고, 그 노드에서 실행 중이던 응용 프로그램을 다시 시작한다.
- 사용자와 응용 프로그램의 클라이언트는 잠깐의 서비스 중단만을 경험하게 된다.
- 높은 가용성은 안정성을 향상해 많은 응용 프로그램에서 중요하다.
- 우아한 성능 저하(graceful degradation) : 남아 있는 하드웨어 수준에 비례하여 서비스를 계속 제공하는 기능
- 장애 허용(fault tolerance) : 정상적인 성능 저하를 넘어 싱글 구성요소에 오류가 발생하여도 계속 작동할 수 있게 하는 것
- 장애 허용에는 장애를 감지, 진단 및 가능한 경우 수정할 수 있는 기법이 필요하다.
- 비대칭형 클러스터링(asymmetric clustering)에서는 다른 컴퓨터들이 응용 프로그램을 실행하는 동안 한 컴퓨터는 긴급 대기(hot-standby) 모드를 유지한다.
- 서버가 고장 난다면 긴급 대기 모드의 호스트가 활성 서버가 된다.
- 대칭형 클러스터링(symmetric clustering)에서는 둘 이상의 호스트들이 응용 프로그램을 실행하고 서로를 감시한다.
- 가용한 하드웨어를 모두 사용하기 때문에 대칭형 구성이 더 효율적이다.
댓글남기기