What is an Operating System?

 

OS는 사용자와 컴퓨터 하드웨어 사이에 중개인으로서 행동하는 프로그램을 말합니다. 일반적으로 OS의 목표는

 

(1) 사용자의 프로그램을 실행시키고, 사용자의 문제를 더 쉽게 푸는 것,

(2) 컴퓨터 시스템을 더 사용하기 쉽게 만드는 것(Computer system의 resource를 관리해준다. 자원관리의 측면),

(3) 컴퓨터의 하드웨어를 더 효율적인 방법으로 사용하게 하는 것(Hardware resource (e.g., CPU resource)들을 관리함으로써 효율성을 올림)이 있습니다.

 

Computer System Structure

Four Components of a Computer System

 

컴퓨터 시스템의 구조는 아래 4개의 요소로 구성됩니다:

  • Hardware: 기본적인 컴퓨팅 자원을 제공합니다.
    • CPU, memory(휘발성), I/O devices, Hard-disc(비휘발성), ...
  • Operating system: 다양한 응용 프로그램들과 사용자들로부터 하드웨어의 사용을 제어하고 조정하는 역할을 수행합니다.
  • Application programs: 사용자가 해결하고자하는 문제들을 컴퓨터 자원을 이용해 해결하는 방법. 그냥 응용 프로그램.
    • Word processors, compliers, web browsers, database systems, video games, ...
  • Users: 컴퓨터를 사용하는 사람 뿐 아니라 응용 프로그램을 사용하는 기계나 다른 컴퓨터들도 포함하는 개념입니다.
    • People, machines, other computers

 

What Operating Systems Do

 

관점에 따라 OS가 하는 일은 달라질 수 있습니다.

예를 들어,

 

(1) 사용자의 입장에서 OS는 각종 프로그램들을 사용하기 쉬우면서 좋은 성능을 내는 역할을 맡습니다. 사용자들은 자원의 응용같은 것은 별로 신경쓰지 않습니다.

(2) 하지만 mainframe이나 minicomputer와 같은 분산 컴퓨터(shared computer)의 경우 이를 사용하는 모든 사용자가 모두 해당 자원을 공평하게 사용하는 것이 가장 중요합니다.

(3) workstation같은 하나의 프로그램만 수행할 수 있는 시스템(dedicate system)의 사용자들은 서버들로부터 자원을 자주 공유받을 수 있어야합니다.

(4) 손에 들고 다닐 수 있는 컴퓨터(Handheld computer, e.g., 닌텐도)는 가용가능한 자원이 부족하기에 사용 최적화나 배터리 효율성등이 중요할 수 있습니다.

(5) 임베디드 컴퓨터는 인터페이스가 중요하지 않을 수 있습니다.

 

이런 관점들의 공통점은 OS는 자원관리의 역할을 맡는다는 것입니다.

 

Operating System Definition

 

OS는 두 가지로 정의할 수 있습니다:

  • resource allocator(자원할당자): OS는 모든 자원들을 관리합니다. 자원을 두고 경쟁하는 여러 요청들을 효율적이고 공정하게 처리하는 역할을 맡습니다.
  • control program(통제 프로그램): 오류나 부적절한 컴퓨터의 사용을 막기위해 프로그램의 실행을 통제합니다.

 

이렇게 OS는 통용되는 하나의 정의가 없습니다. 그래서 "Everything a vendor ships when you order an operating system"이라고 정의하는 것이 적절할 수 있습니다.

 

이때, 컴퓨터에서 항상 실행중인 프로그램을 커널(kernel)이라고 부르는데, 일반적으로 커널은 OS라고 부릅니다. 반면 다른 응용 프로그램들이나 OS와 같이 동작되는 다른 시스템 프로그램들을 OS라고 부를 수 있는가에 대해서는 이견이 존재할 수 있습니다.

 

Computer Startup

 

bootstrap program은 컴퓨터를 리부팅(rebot)하거나 전원을 켰을 때, load됩니다. 일반적으로 ROM이나 EPROM에 저장되어있고, firmware라고 불리기도 합니다. 이 bootstrap program은 모든 시스템을 초기화하고 실행시키며, OS kernel을 load하고 실행시킵니다.

bootstrapping

 

Computer System Organization

 

Computer System Organization

 

컴퓨터 시스템은 하나 이상의 CPU, 범용 버스(common bus)로 memory와 연결되어있는 device controller들로 구성되어있습니다. 이때 device controller에는 local buffer가 존재하며, I/O 작업에서의 효율성을 위해 존재합니다. memory 사이클동안 CPU와 devices들은 병렬적으로 처리됩니다.

 

즉, I/O devices들과 CPU는 병렬적으로 실행이 가능합니다. 만약 병렬적으로 처리할 수 없다면, CPU process가 I/O operation을 실행시킬때, 해당 I/O operation을 실행시키고 CPU는 아무런 동작을 수행하지 않을것입니다. 즉, 효율성이 떨어집니다. 이를 방지하기 위해, I/O operation을 동작하는 동안 CPU는 다른 동작을 수행할 수 있도록 OS가 CPU자원을 효율적으로 처리합니다.

 

각각의 device controller는 특정한 device들을 담당하고, 각각의 device controller안에는 local buffer가 존재합니다. I/O 작업이란 device에서 controller의 local buffer로 데이터를 (CPU를 통해) 이동하는것을 말합니다. 만약 I/O operation이 device에서 바로 memory로 데이터를 옮기는 작업이었다면, 하나의 I/O 작업을 수행하는데 오버헤드가 매우 컸을 것입니다.

 

I/O 작업을 끝났다면 device controller가 CPU에 해당 작업이 끝났다고 알리는 interrupt를 발생시킵니다.

 

Common Functions of Interrupts

 

Interrupt는 CPU의 control을 interrupt service routine으로 옮깁니다. 이는 interrupt vector를 통해 이루어지는데, 이는 각각의 service routine의 주소를 포함하고 있는 벡터입니다. CPU가 interrupt를 당했다면 interrupt를 당했을 때의 그 상태(CPU의 Program counter, register등등)를 반드시 저장해야합니다(interrupt service routine이 종료되면 다시 그 상태로 돌아와야하기 때문에).

Interrupt Vector Table

 

I/O 작업과 같이 hardware가 발생하는 interrupt말고, software가 생성하는 interrupt를 흔히 trap혹은 exception이라고 부릅니다. 이는 error나 사용자의 요청에 의해 발생합니다(e.g., divide by zero, kill signal, etc.). 그래서 OS은 interrupt driven하다고 부릅니다.

 

Interrupt Handling

 

OS는 register와 program counter값을 저장함으로써 CPU의 상태를 보존합니다. 이렇게 interrupt가 발생하면 두 가지 종류의 interrupt 처리 방법이 존재합니다. (1) polling 방법입니다. OS는 하드웨어의 상태를 지속적으로 읽으며 interrupt가 발생했는지 아닌지를 확인합니다. (2) 반면 vectored interrupt system은 polling과 달리 계속해서 확인하는 것이 아닌, interrupt가 발생하면 정해진 interrupt service routine에 따라 행동하는 것입니다.

 

Interrupt timeline

 

처음 I/O request가 발생하면, CPU는 I/O operation을 실행합니다. 이때 CPU는 I/O operation과 독립적으로 수행가능하기 때문에, interrupt된 상태로 넘어가지 않음을 알 수 있습니다.

 

그 후 I/O operation이 끝나면 CPU에 Interrupt를 보냅니다. 그러면 Interrupt vector table에 저장되어있는 service routine에 따라 동작을 실행합니다. CPU가 interrupt상태로 넘어가기 전에는 CPU의 register, program counter값을 미리 저장합니다. *이때 CPU의 interrupt service routine은 device local buffer에 있는 data를 memory로 옮기는 작업이라고 유추할 수 있습니다.