운영체제란 컴퓨터 하드웨어(입출력 장치, CPU)의 리소스를 관리해주면서 동시에 여러 애플리케이션이 작동할 수 있는 환경을 제공해주는 소프트웨어다.
컴퓨터의 전원이 나가면 CPU는 ROM에 저장되어 있는 내용을 읽는다. ROM(Read Only Memory)은 컴퓨터에 전원이 나가도 사라지지않는 비휘발성 메모리며, 계속 보관되어야할 정보들을 저장한다. ROM안에는 POST(Power On Self-Test)
와 부트로더(Boot Loader)
가 저장되어 있다.
POST는 컴퓨터 전원이 켜지면 가장 먼저 실행되는 프로그램으로 컴퓨터에 이상이 있는지 체크하는 프로그램이다. 부트로더(Boot Loader)는 하드디스크에 저장되어 있는 OS 프로그램을 가져와서 RAM에 넘겨준다.
부트로더(Boot Loader)
부트로더
란 운영체제가 시동되기 이전에 미리 실행되면서커널이 올바르게 시동되기 위해 필요한 모든 관련 작업을 마무리
하고 최종적으로운영 체제를 시동
시키기 위한 목적을 가진 프로그램을 말한다.
컴퓨터가 부팅이 되면 OS 프로그램을 실행한 후 사용자의 입력 이벤트를 기다린다. 이 이벤트를 인터럽트라고 한다. 인터럽트가 발생되면 OS는 해당 명령어(Interrupt를 발생시킨) 주소를 기억한다. 그 후 인터럽트가 끝나면 해당 주소로 돌아가 다음 명령어를 수행하거나 대기상태로 돌아간다.
Interrupt(인터럽트)
인터럽트는 말그대로
방해
의 의미를 가지고 있다. CPU가 프로그램을 실행하고 있을 때 입출력 하드웨어 등의 장치에 예외상황(에러
라던지,입력
이라던지,출력
이라던지..) 다양한 상황에 대해서 CPU가 처리할 수 있도록 중간에 멈추게 한다. 인터럽트가 발생하면 CPU가 수행중이던 작업은 따로 저장하게 되고(CPU 내부 레지스터
나메인 메모리
등), 인터럽트가 발생한 작업을 먼저 수행하게된다.
관련 내용은 나중에 집중해서 쓰도록 하겠다.
운영체제는 DOS 시절부터 꾸준히 발전해왔다. 기본적으로 하나의 CPU는 하나의 작업(Interrupt)만 처리할 수 있다. 따라서 예전에는 하나의 작업이 끝날 때까지 다른 작업은 대기만 하고 있어서 효율이 낮았다.
작업 1
,작업 2
를 처리해야 한다.
작업 1
이I/O 자원
을 사용한다.작업 2
대기,CPU 자원
대기
작업 1
이CPU 자원
을 사용한다.작업 2
대기,I/O 자원
대기
작업 2
가I/O 자원
을 사용한다.CPU 자원
대기
작업 2
가CPU 자원
을 사용한다.I/O 자원
대기
이러한 문제를 해결하기 위해 생긴 방법론이 멀티 프로그래밍 원리다. 멀티 프로그래밍의 기본 개념은 입출력을 수행하고 있는 경우, 다른 작업에 CPU를 할당해서 처리하도록 한다. 반대로 CPU가 작업을 하고 있는 경우, 입출력 장치들을 대기 상태로 만들어서 입출력이 필요한 작업에게 입출력 리소스를 할당한다.
작업 1
,작업 2
를 처리해야 한다.
작업 1이 CPU 자원
을 사용한다.작업 2가 I/O 자원
을 사용한다.
작업 1이 I/O 자원
을 사용한다.작업 2가 CPU 자원
을 사용한다.
기술이 발전하면서 프로세서의 처리 속도가 더욱 빨라졌는데 역설적으로 C프로세서의 낭비가 더욱 커졌다. 그 이유는 프로세서의 처리 속도의 발전 속도를 입출력 장치가 따라가지 못해서 프로세서의 낭비가 더욱 커지게 된다.
작업 1
,작업 2
를 처리해야 한다.
작업 1
에게CPU 자원 할당
,작업 2
에게I/O 자원 할당
작업 1
를 완료하여CPU 대기
,작업 2
처리 중
(이때,작업 2가 처리될 때까지 CPU는 대기 상태여서 자원 낭비
발생)
이러한 문제를 해결하기 위해 나온 개념이 멀티 태스킹(Multi-tasking)
이다. 멀티 태스킹은 각각에 작업들에게 자원 할당 시간
을 정해줘서 그 시간이 지나면 다른 작업들에게 자원을 넘겨준다.
이때, 각 자원들에게 시간을 할당하는 것이 스케쥴링
이고 Job 스케쥴링
과 CPU 스케쥴링
이 있다.
운영체제는 interrupt-driven
방식으로 사용자의 요청(Event 혹은 Interrupt)이 발생하면 운영체제는 적절하게 자원(CPU, I/O, 메모리 등)을 분배하여 그 요청을 처리하는 구조이다.
Interrupt에는 크게 두 가지가 있다. H/W interrupt
와 S/W interrupt
가 있다. H/W interrupt는 I/O, 메모리, CPU
와 관련된 interrupt이고 S/W interrupt는 프로그램이 실행되다가 발생될 수 있는 Errors
, 운영체제 Services들에 대한 요청인 System Call
이 있다. S/W interrupt는 잘못 처리하면 한 작업이 자원을 계속 점유하거나 컴퓨터의 동작을 크게 저해할 수 있기 때문에 여러 방법을 써서 이를 예방해야 한다.
그 첫 번째로 Dual-Mode Execution
이다. 운영체제는 기본적으로 사용자에게 인터페이스를 제공하는 User Mode
와 기기들을 직접 관리하는 Kernel Mode
로 구분된다. Kernel
에서의 작업은 컴퓨터의 중요한 부분에 해당하는 작업이기에 사용자가 직접 작업하다가 문제가 생길 시 컴퓨터 전체에 영향을 끼치기 때문에 User Mode와 Kernel Mode로 나눠 사용자가 접근하지 못하게 한다.
사용자가 User Mode에서 작업을 명령
하면 Kernel Mode에서 이를 처리
해야하는데 그 연결고리 역할을 하는 것이 바로 Mode-Bit
이다. 운영체제는 User mode에 들어온 명령어와 일치하는 Mode-Bit을 가진 Kernel Mode의 명령어를 찾아 Kernel에서 실행한 후, 그 결과를 User-Mode에 넘기고 일을 마무리한다. 이러한 행위를 System Call
이라 한다.
두 번째로 Timer
가 있다. Timer는 말 그대로 프로세스들에게 유효 시간을 부여
하여 그 시간이 지나면 프로세스를 종료시켜 Error가 발생하여 작업이 멈추더라도 CPU를 계속 점유하는 것을 방지
한다.