공룡책 요약하기 01
01. Introduction
- 운영체제
- 컴퓨터 하드웨어를 관리하는 프로그램으로, 응용 프로그램을 위한 기반을 제공하며 컴퓨터 사용자와 하드웨어 사이에서 중재자 역할을 수행한다.
운영체제는 다양한 사용자를 위해 다양한 응용 프로그램간의 하드웨어 사용을 제어하고 조정한다.
또한 운영체제는 컴퓨터 시스템이 동작할 때 하드웨어, 소프트웨어 및 데이터를 적절하게 사용할 수 있는 방법과 환경을 제공한다.
운영체제의 역할을 좀 더 완전히 이해하기 위해서는 두가지 관점에서 살펴볼 필요가 있다.
첫번째는 사용자 관점(User View)이다.
사용자의 관점은 사용되는 인터페이스에 따라 달라지며 목적에 따라 사용의 용이성과 자원의 이용 간에 적절히 조화를 이루도록 설계되어 있다.
두번째는 시스템 관점이다.
운영체제는 하드웨어와 가장 밀접하게 연관된 프로그램이므로 이를 자원 할당자로 볼 수 있다.
CPU 시간, 메모리 공간, 파일 저장 공간, 입출력 장치 등의 자원의 관리자로서 동작하며 필요한 자원을 할당한다.
입출력 장치와 사용자 프로그램을 제어할 필요성을 강조하는 관점에서 운영체제는 제어 프로그램이다.
제어 프로그램은 컴퓨터의 부적절한 사용을 방지하기 위해 사용자 프로그램의 수행을 제어한다.
어느 부분이 운영체제에 속하고 어느 부분이 속하지 않는 지에 대한 보편적으로 인정되는 정의는 존재하지 않는다.
일반적인 정의로 운영체제는 컴퓨터에서 항상 수행되는 프로그램으로 일반적으로 커널이라 불린다.
- 커널(Kernel)
- 컴퓨터 과학에서 커널은 컴퓨터의 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제한다. 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다. 핵심이라고도 한다. 주요 역할로는 보안, 자원 관리, 추상화 등이 있다.
- 추상화
- 하드웨어에 직접 접근하는 것은 문제를 매우 복잡하게 만드므로 운영체제의 복잡한 내부를 감추고 깔끔하고 일관성 있는 인터페이스를 하드웨어에 제공
컴퓨터가 구동을 시작하기 위해 초기 프로그램(부트스트랩 프로그램)이 운영체제의 커널을 찾아 메모리에 적재한다.
사건이 발생하면 하드웨어나 소프트웨어로부터 발생한 인터럽트(interrupt)에 의해 신호가 보내어진다.
하드웨어는 시스템 버스를 통해 CPU에 신호를 보내서, 소프트웨어는 시스템 호출이라 불리는 특별한 연산을 실행하여 인터럽트를 발생시킬 수 있다.
- 인터럽트
- CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다.
운영체제의 가장 중요한 면은 다중 프로그램을 할 수 있는 능력이다.
다중 프로그래밍 시스템은 CPU가 수행할 작업을 항상 하나 가지도록 작업을 구성함으로써 CPU 이용률을 증가시키며, 여러 가지 시스템 자원(CPU, 메모리, 주변 장치 등)을 효율적으로 이용할 수 있는 환경을 제공하지만, 사용자를 위해 컴퓨터 시스템과 상호 작용은 제공하지 않는다.
시분할(멀티테스킹)은 다중 프로그래밍의 논리적 확장이다.
시분할 시스템에서는 CPU가 다수의 작업을 교대로 수행하지만, 매우 빈번하게 교대가 일어나기 때문에 프로그램이 실행되는 동안에 사용자들은 각자 자기의 프로그램과 상호 작용할 수 있다.
시스템이 한 사용자에서 다음 사용자로 빠르게 전환되기 때문에, 각 사용자는 자신이 전체 컴퓨터를 전용하는 것처럼 느끼지만, 실제로는 다수의 사용자가 하나의 컴퓨터를 공유한다.
시분할과 다중 프로그래밍 운영체제에서는 여러 작업이 메모리에 동시에 유지되어야 한다.
만약 몇몇 작업이 메모리로 옮겨올 준비가 되었고, 그들 전부를 메모리에 보관할만한 공간이 불충분하다면, 시 스템은 그들 중 몇 개를 선택해야 한다.
이러한 결정을 하는 것이 작업 스케줄링이다.
여러개의 작업이 동시에 실행 준비가 되어 있으면, 시스템은 그들 중 하나를 선택해야 한다.
이러한 결정을 내리는 것을 CPU 스케줄링이라 한다.
현대의 운영체제는 인터럽트 구동식이다.
사건은 거의 항상 인터럽트나 트랩을 발생시켜 신호를 보낸다.
- 트랩
- 오류, 혹은 사용자 프로그램의 운영체제 서비스 수행 요청에 의해 유발되는 소프트웨어에 의해 생성된 인터럽트이다.
운영체제와 사용자는 컴퓨터 시스템의 하드웨어와 소프트웨어 자원을 공유하기 때문에 사용자 프로그램의 오류가 현재 수행 중인 프로그램에만 문제를 일으키도록 보장해야 한다.
운영체제의 적절한 동작을 보장하기 위해, 운영체제 코드의 실행과 사용자 정의 코드의 실행을 구분할 수 있어야 한다.
이를 위해 적어도 두 개의 독립된 연산 모드, 즉 사용자 모드(1)와 커널 모드(0)를 필요로 한다.
사용자 모드에서 컴퓨터 시스템은 사용자 응용을 위해 실행된다.
그러나 사용자 응용이 운영체제로부터 서비스를 요청하면 이 요청을 수행하기 위해 사용자 모드에서 커널 모드로 전환한다.
시스템 부트 시, 하드웨어는 커널 모드에서 시작된다.
이어 운영체제가 적재되고, 사용자 모드에서 사용자 프로세스가 시작된다.
트랩이나 인터럽트가 발생할 때마다, 하드웨어는 사용자 모드에서 커널 모드로 전환한다(1 -> 0).
동작의 이중 모드는 악영향을 끼칠 수 있는 일부 명령을 특권 명령으로 지정함으로써 잘못된 사용자로부터 운영체제를, 그리고 잘못된 사용자 서로를 보호하는 방법을 제공한다.
하드웨어는 특권 명령이 커널 모드에서만 수행되도록 허용한다.
사용자 프로그램이 무한 루프에 빠지거나 시스템 서비스 호출에 실패하여 제어가 운영체제로 복귀하지 않는 경우가 없도록 방지하기 위해 타이머를 사용할 수 있다.
타이머는 지정된 시간 후 컴퓨터를 인터럽트 하도록 설정할 수 있다.
프로그램은 그 명령이 CPU에 의해 수행되지 않으면 아무 일도 할 수 없다.
언급한 것처럼 실행 중인 프로그램이 프로세스이다.
하나의 시분할 사용자 프로그램은 하나의 프로세스가 된다.
프로세스는 자신의 일을 수행하기 위해 CPU 시간, 메모리, 파일, 그리고 입출력 장치를 포함한 여러 자원을 필요로 한다.
프로그램은 수동적 개체인 반면, 프로세스는 다음 수행할 명령을 지정하는 프로그램 카운터를 가진 능동적 개체이다.
주 메모리는 현대 컴퓨터 시스템의 작동에 중추적인 역할을 한다.
주 메모리는 CPU와 입출력 장치에 의하여 공유되는, 빠른 접근이 가능한 데이터의 저장소이다.
폰 노이만 방식의 컴퓨터에서는 중앙 처리기가 명령어 인출 주기(instruction fetch-cycle) 동안 주 메모리로부터 명령어를 읽고, 자료 인출 주기(data fetch-cycle)동안 주 메모리로부터 데이터를 읽고 또한 쓴다.
주 메모리는 일반적으로 CPU가 디스크에서 가져온 데이터를 처리하려면, 이들 데이터는 CPU가 생성한 입출력 호출에 의해 먼저 주 메모리로 전송되어야 한다.
마찬가지로 CPU가 명령을 수행하기 위해서는 명령이 주 메모리 내에 있어야 한다.
캐싱은 컴퓨터 시스템의 중요한 원리이다.
- 캐시
- 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다.
주 메모리는 보조 메모리를 위한 빠른 캐시로 볼 수 있는데, 이는 보조 메모리의 데이터를 사용하기 위해서는 주 메모리에 복사되어야 하고, 안전하게 보관하기 위해 보조 메모리로 이동되기 전에 데이터는 반드시 주 메모미에 있어야 하기 때문이다.
다중 처리기 환경 하에서는 정수 A의 복사본이 동시에 여러 캐시에 존재할 수 있다.
여러 개의 CPU가 동시에 실행될 수 있으므로, 한 캐시에 있는 A값이 갱신될 경우 그것은 A가 존재하는 모든 캐시에 즉각적으로 반영되어야 한다.
이러한 상황을 캐시 일관성 문제라고 한다.