본문 바로가기

운영체제

chapter 1. Introduction

- 커널은 무엇인가?

우리는 운영체제를 처음 배우게 되면 '운영체제는 항상 돌아가고 있는 프로그램이며 이를 커널이라고 한다' 라고 배우기도 한다. 그러면 운영체제 == 커널인가? 그건 아니다.


- 그렇다면 커널과 OS의 차이는 무엇인가?

단순히 비유하자면 OS가 하나의 자동차 라면 커널은 엔진에 비유할 수 있다. 여기서 실제 자동차와 차이가 있다면 엔진에 해당하는 커널이 자동차의 효율성을 위해 자동차의 각부분에 자원을 효율적으로 분배한다는 점에 있다. 


- 커널은 어떻게 시작되는가?

커널의 시작은 우리가 실제로 컴퓨터를 부팅 하는 것 부터 시작된다고 볼 수 있다.


1) 실제로 컴퓨터의 전원을 켠다

2) Bootstrap Program이 펌웨어 또는 EEPROM에 저장되어 있다가 실행되며 이 프로그램이 실행되면 CPU 레지스터, 장치 제어기, 메모리 내용 등 시스템의 모든 면을 초기화 한다

- 여기서 bootsrap이란 단어의 어원은 '한번 시작되면 알아서 진행되는 일련의 과정'을 뜻한다.

3) 또한 운영체제의 kernel을 메모리에 적제 시킨다.

4) 커널이 메모리에 올라가면 비로소 사용자에게 서비스를 제공할 수 있다.


- 커널은 사용자에게 서비스를 어떻게 제공하는가?

1) 커널은 항상 메모리 위에 올라와 있으며 어떤 EVENT가 발생하길 기다린다 

2) EVENT가 발생하면 하드웨어 또는 소프트웨어에서 발생한 interrupt가 system bus를 통해 cpu로 전달 된다

3) CPU가 interrupt 신호를 받으면 하던일을 중단하고 현재의 PC, register값, 메모리 limit 등등의 현재 context를 stack에 저장 후 받은 interrupt에 해당하는 일을 하기 위해 인터럽트 벡터로 간다

4) 인터럽트 벡터에는 인터럽트에 해당하는 일을 처리하기 위한 서비스 루틴의 주소 값들이 있으며 서비스 루틴으로 가서 일을 처리한다.

5) 서비스 루틴이 완료되면 다시 원래의 context를 불러와서 연산을 재개한다.


- 인터럽트는 무엇인가?

1) 인터럽트는 기본적으로 실행되고 있는 프로그램 또는 외부 장치 또는 I/O 장치에서 '지금 나 어떤 일 처리해야 해' 라고 운영체제에게 알리는 신호이다. 

2) 이렇게 날라온 인터럽트는 운영체제에 의해 적절한 처리가 되며 사용 가능한 인터럽트 수가 정해져 있다.



- 입출력

입출력 장치의 처리 과정을 통해 인터럽트를 살펴보자


1) programmed I/O

- 맨 처음에는 입출력을 위해 CPU가 계속 I/O의 상태 Flag를 계속 조사하여 I/O가 완료되었는지 체크하고 완료 되었으면 데이터 전송까지 해 주는 방식이었다.


- 이러한 방식을 polling 이라고 한다


- I/O 작업시 CPU는 계속 I/O에 관여해야 하기 때문에 다른 작업을 할 수 없다.


2) interrupt I/O

- I/O를 위해 CPU가 계속 검사하지 않고 데이터를 전송할 준비가 되면 입출력 인터페이스가 interrupt를 날려 입출력이 이루어지는 방식

- CPU가 flag를 계속 검사하지 않아도 되어 효율적이다.

- 그러나 아직까지 CPU가 데이터 전송을 해 주어야 하기 때문에 대량의 자료가 있다면 CPU의 부담이 커진다.


3) DMA에 의한 I/O

- I/O 장치가 직접 주 기억장치를 접근하여 Data block을 입,출력하는 방식으로 입 출력 전송이 CPU 레지스터를 경유하지 않고 수행된다.

- CPU와 DMA 제어기가 bus를 공유하며 DMA 제어기가 버스 사용 허가 요청을 보내서 CPU가 허가 해 주면 데이터를 전송하는 방식이다.


-운영 체제의 구조

1) 다중 프로그래밍

- 운영체제의 가장 중요한 점은 다중 프로그래밍을 할 수 있는 능력이다. CPU가 수행할 작업을 어느 시점에서든 항상 하나 가지도록 작업을 구성 함 으로써 'CPU이용률을 증가시킨다.'


- 과정

1) 운영체제는 한번의 여러 작업들을 디스크의 작업 풀 내에 유지한다.

2) 디스크 작업 풀 내에 있던 일부 작업들이 메모리로 올라가서 실행 된다

3) 이때 어떤 작업들을 I/O처리 등으로 CPU사용을 멈추게 되는데, 비 다중 프로그래밍에서는 CPU가 쉬지만 다중프로그래밍 환경에서는 운영체제가 단순히 다른 작업으로 전환하여 작업을 수행한다.

---> CPU가 일을 쉬지 않는다!


- 그러나 이러한 방법에서는 어떤 작업이 계속 CPU를 사용할 경우 다른 일이 CPU를 사용하지 못한다.

2) timesharing

- CPU가 아주 작은 시간 간격으로 다수의 작업들을 교대로 수행한다 이 교환이 너무 빨라서 사용자는 모든 프로그램이 동시에 돌아가고 있는 것 처럼 보인다.


- 다중 프로그래밍이나 시분할 에서는 여러 작업이 동시에 메모리에 올라와 있으며 여러 작업이 동시에 올라와 있으면 시스템은 그중 하나를 선택해야 한다. 이를 CPU 스케줄링 이라고 한다.


- 운영체제의 operation

운영체제는 interrupt와 trap에 의해 구동된다 그리고 이 둘은 kernel(소프트웨어)에 의해 처리된다


* 왜 kernel에서 처리될까?

interrupt의 종류에 따라 처리해야할 일이 다른데, 이걸 하드웨어에 의해 처리하게 되면 그 이벤트를 처리하기위한 하드웨어가 추가적으로 붙어야 할 수 있기 때문에 장치가 비대해 진다.


* interrupt와 trap의 차이?

인터럽트는 대부분 하드웨어쪽이다 프로그램 외부 상황에서 발생하며 발생 지점이 일정하지 않다. ( I/O나 exception이 발생할때 사용된다)

trap은 system call에 의해 발생하며 발생하는 지점이 일정하다. 


어떤 책에서는 CPU 외부에서 발생한 이벤트를 알리는 신호가 interrupt, CPU 내부에서 발생한 이벤트가 trap이라고도 설명한다.


* 인터럽트의 목적은 무엇인가?

거의 모든 작업은 CPU가 필요한데, 어떤 작업중 적절한 제어가 필요할 경우 인터럽트를 발생시켜 CPU가 처리할 수 있도록 한다.


- 이중 연산 모드

목적 : 운영체제의 적절한 동작을 보장하기 위해 운영체제의 코드와 사용자 정의 코드의 실행을 구분하기 위함이다.


시스템 부트시 하드웨어는 커널 모드에서 시작된다. 운영체제가 메모리에 적재되면 사용자 모드에서 사용자 프로세스가 시작되며, trap 또는 interrupt에 의해 사용자 모드에서 커널 모드로 전환한다.


이중 연산 모드는 잘못된 사용자로 부터 운영체제를, 잘못된 사용자 서로를 보호하는 방법을 제공한다.


커널모드에서 수행하는 명령을 특권 명령 이라고 한다.


만일 사용자 모드에서 특권 명령을 수행하려고 하면 불법적인 명령으로 간주하고 trap을 발생시킨다.


사용자는 커널모드에서 수행하도록 되어있는 작업을 운영체제에게 요청하기위해 system call을 사용한다.


사용자가 system call을 호출하면, trap이 발생되며 모드비트가 0 -> 1 로 바뀌며 제어가 커널로 넘어간다.


커널은 trap이 발생한 명령을 검사하여 어떤 명령인지 검사하고 그 명령을 수행한 후 다시 모드 비트를 1 ->0 으로 바꿔 사용자 영역의 system call 한 명령 다음번째로 (pc+4) 돌아간다.


- 운영체제와 프로세스 관리

* 프로그램과 프로세스의 차이

프로그램은 단순히 코드로 이루어진 수동적인 개체이다

프로세스는 다음 수행할 명령을 지정하는 PC를 가진 능동적인 개체이다.


프로그램이 리소스를 가지고 있는 경우 프로세스라고 부른다.


1) CPU에 프로세스와 스레드를 스케줄

2) 사용자 프로세스 커널 프로세스 생성 및 제거

3) 프로세스의 일시 중지 및 재수행

4) 프로세스간 통신 지원

5) 프로세스간 동기화 지원


- 운영체제의 메모리 관리


* CPU 이용률과 사용자에 대한 응답속도를 개선하기 위해 메모리 관리 기법이 필요하다


역할

1) 메모리의 어느부분이 현재 사용되고 있으며 누구에 의해 사용되는지 추적

2) 어떤 프로세스를 메모리에 적재, 제거할 것인지 결정

3) 필요에 따라 메모리 할당 및 회수