본 글은 Operating System Concepts 10판을 기준으로 작성됬습니다...!
1장에서는 운영체제의 개념과 컴퓨터의 기본 구조에 대해 살펴봅니다.
1.1 What Operating Systems Do
Operating System(운영체제)란?
정확하게 운영체제를 정의할 수는 없지만, 간단히 말하면 운영체제는 컴퓨터 하드웨어 자원을 관리하고, 컴퓨터 사용자가 컴퓨터를 사용하기 편리하도록 서비스를 제공하는 소프트웨어다. 운영체제는 우리가 흔히 사용하는 PC나 Laptop에는 물론 스마트폰, 자동차, 가전제품 등에도 들어간다. 스마트폰에 들어가는 Android는 본래 운영체제라기보다는 Platform 취급을 했었다고 하는데, 지금은 하나의 운영체제로서 인정받고 있다. 자동차나 가전제품같은 경우에는 IoT(Internet of Things)를 위해 컴퓨터가 들어가있다.
Resource allocator, Control Program, Kernel이라고 부를 수도 있다.
따라서 운영체제는 CPU나 memory, I/O devices, Storages 같은 하드웨어 자원들을 알맞게 관리하고, 사람이 편하게 프로그램을 실행하고 사용하고 만들 수 있는 환경을 제공한다.
운영체제의 다섯가지 역할을 간략하게 알아보자.
- Abstaction: 하드웨어 추상화
- Sharing: 여러 프로세스가 동시에 자원을 나눠쓸 수 있도록 한다.
- Protection: A 프로세스가 B 프로세스가 사용할 자원을 무단으로 침범하지 않도록 보호한다.
- Fairness: 어느 프로세스가 자원을 독접하지 않도록 한다.
- Performance: 성능을 잘 발휘하도록 한다.
Computer HW architecture, CPU
CPU (x86 system)
- ALU(Arithmatic Logical Unit): 산술 연산을 담당하는 유닛
메모리에 저장되어있는 데이터를 CPU에 로드하고 수행하고 다음 명령어를 수행하기 위해 레지스터들이 필요하다.
- PC(Program Counter): 메모리에서 CPU가 현재 수행해야 하는 instruction이 저장되어있는 주소를 포함한 레지스터
- IR(Intruction Register): PC에서 저장한 주소에 있는 instruction을 IR에 집어넣어 수행
- CU(Control Unit): jump, return, branch 같은 명령어들을 수행하는 유닛
SP(Stack Pointer)
PSW(Process Status Word): CPU를 점유하고 있는 프로세스가 어떤 상태인지를 저장하는 레지스터
- MMU(Memory Management Unit): 메모리 컨트롤을 위한 유닛
General purpose register: 일반적인 작업들을 수행할 수 있는 레지스터들
Bus: 컴퓨터의 척추역할. I/O device들, Memory, CPU가 Bus를 통해 상호작용한다.
CPU operation
Von neumann architecture: 메모리에서 명령어를 불러와서 실행시키는 작업을 반복하는 컴퓨터 구조.
Harvard architecture: 데이터용 메모리와 Instruction용 메모리를 분리해서 사용하는 컴퓨터 구조.
Instructions
CPU가 수행하는 instruction들
Arithmetic instructions: add, subtract, multiply, divide...
Logical instructions: and, or, xor, not, shift...
Control flow instructions: goto, if, call, return...
Data instructions: load, store, move, input, output...
운영체제의 역할에 대해 자세히 파고들기 전에, 컴퓨터 시스템에 대해 간략히 알아보자.
컴퓨터 시스템을 크게 네 부분으로 나누면 다음과 같이 나눌 수 있다.
1. Hardware
2. Operating system
3. Application programs
4. User
1. Hardware (하드웨어)
하드웨어는 기본적인 컴퓨터 자원들을 제공하는 장치들로 central processing unit(CPU), memory, Input/Output Devices(I/O Devices), Storage 등이 있다. 컴퓨터를 조립할 때 하나하나 맞춰가는 그 부품들이 맞다.
2. Operating System (운영체제)
3. Application programs (응용 프로그램)
줄여서 App이라 하는 그것이다. 우리가 컴퓨터를 사용할 때 쓰는 프로그램들이다. 웹 브라우저나 워드 프로세서, 컴파일러, 미디어 재생기 등이 많이 있다.
4. User (사용자)
컴퓨터를 사용하는 사람. 바로 우리다.
이 네가지 말고도 Hardware, Software, Data 세가지로 구성된 것이 컴퓨터 시스템이라고 볼 수도 있다. 자신 나름대로의 정의를 의미가 벗어나지 않도록 하면 될 것 같다.
다음은 운영체제의 역할을 더 잘 이해하기 위해서, 운영체제가 무슨 일들을 하는지를 유저의 입장에서, 그리고 시스템의 입장에서 살펴보도록 하자.
1. User View
유저는 컴퓨터를 사용할 때 키보드, 모니터, 마우스 등의 장치를 이용한다. 모니터를 통해 화면을 보고, 나타난 화면을 보고 마우스와 키보드로 조작한다. 스피커를 통해 음악을 듣는다. 운영체제는 이러한 것들을 유저 입장에서 쉽고 편리하게 사용할 수 있도록 돕는 소프트웨어다.
유저 입장을 고려하지 않거나 적게 고려하는 컴퓨터 시스템도 존재하는데, 그 중 하나는 Embedded System이 있다. Embedded System이란 흔히 사용하는 데스크탑, 랩탑, 스마트폰같은 범용 컴퓨터 시스템이 아니라 특정 목적만을 위해 만들어진 컴퓨터이다.
2. System View
컴퓨터의 입장에서 운영체제는 Resource Allocator(자원 할당자)의 역할을 수행한다. 앞서 이야기했듯이 운영체제의 역할 중 하나는 컴퓨터 자원의 관리다. 운영체제는 CPU, Memory, I/O devices, Storage space등 컴퓨터 자원들을 적절히 관리하여 컴퓨터가 원활하게 동작하도록 한다. 수많은 리소스 요청들이 들어오면 운영체제는 이들을 각 프로그램들에게 공평하게 할당한다.
운영체제는 Kernel, Middleware framework, 그리고 System programs를 포함한다.
Kernel(커널)은 컴퓨터가 돌아가는 내내 동작하는 프로그램이다.
System programs는 프로그램 실행, 개발에 있어서 편리한 환경을 제공하기 위해 존재하는 유틸리티들을 말한다. 운영체제와 관련있는 프로그램이지만 kernel의 동작에 필수적이지 않은 프로그램들이다.
Applcation programs는 우리가 App이라 부르는 그것이다. 시스템의 운영과는 전혀 관계없는 프로그램들을 말한다. 게임을 지워도 시스템은 잘만 동작한다.
Middleware frameworks는 어플리케이션 개발자에게 필요한 서비스들을 제공하는 software framework다. 우리가 어플리케이션을 더 쉽게 개발할 수 있도록 한다.
1.2 Computer-System Organization
현대의 컴퓨터들은 CPU와 각 device들을 컨트롤하는 device controller를 갖는다. 예를 들면 disk controller, USB controller, graphic adapter등을 포함하고 있다. CPU와 각 device controller들은 Bus라는 통로로 연결되어 있으며. Bus를 통해 서로와 shared memory에 접근할 수 있다. CPU와 device controller들은 병렬적으로 동작할 수 있다.
Device driver : 운영체제의 일부로 각 device별로 붙어있어 동작한다. 그냥 코드임
Device controller : 컴퓨터의 I/O bus에 붙어있는 하드웨어. Device와 Device driver의 중간개념. CPU로부터 들어오고 나가는 정보들을 다룬다.
각 device들이 할 일을 끝내거나 수행해야 할 일이 생겼음을 알릴 때 device controller는 device driver에게 정보를 전달해야한다. 이 때 각 device controller들은 CPU에게 이벤트 발생을 알리게 되는데, 이를 Interrupt라고 한다.
Interrupt : Hardware가 프로그램을 실행중인 CPU에게 신호를 보낼 때마다 interrupt를 하게 된다.
CPU: 하 겁나바쁘네
Hardware: 님 이거도 해야됨
CPU: ?
Hardware가 CPU에게 어떤 일을 처리해 달라고 요청할 때 interrupt를 하게 된다. 이 때에는 일반적으로 System bus를 통해 신호를 전달한다. Interrupt는 매우 중요한데, 하드웨어와 운영체제가 상호작용하기 위한 핵심요소이기 때문이다.
Interrupt의 종류
1. Hardware interrupt: 우리가 흔히 부르는 인터럽트.
2. Trap: 일반 프로그램은 I/O나 하드웨어 못건드린다. 그래서 운영체제에 요청을 해야 하는데, 이를 위해서 운영체제가 제공하는 인터페이스가 system call이다. 즉 어플리케이션 프로세스에 의해서 만들어지는 인터럽트를 Trap이라 한다.
3. Fault(Exception): Divided-by-Zero, page fault, protection fault 등등... CPU가 못하겠다! 할 때 발생되는 인터럽트.
CPU가 interrupt를 받으면, 지금 하는 일을 잠시 중단한다. 그리고 받은 interrupt를 위한 처리 프로그램으로 점프하여 해당 일을 수행한다. 인터럽트 처리를 위한 루틴을 Interrupt service routine이라고 하는데, interrupt는 이 때 반드시 적절한 interrupt service routine에게 컨트롤을 전달해야한다. 이를 제어하기 위한 가장 직접적인 방법은 generic routine을 통해 인터럽트 정보를 확인하는 것이다.
인터럽트는 매우 빈번하게 일어나는 만큼 빠르게 동작해야한다. 따라서 interrupt routine에 대한 포인터 테이블로 처리한다. 인터럽트 루틴은 테이블을 통해 간접적으로 호출되니 중계할 루틴이 따로 필요가 없는 것이다. 포인터 테이블은 매우 낮은 메모리에 위치하고 있다. Interrupt vector는 인터럽트 서비스 루틴들의 주소들을 테이블처럼 저장하고 있으며, 인터럽트가 요청되면 해당 요청에 대한 인터럽트 서비스 루틴들의 주소를 제공한다. Windows와 UNIX가 이런 방식을 채용하고 있다고 한다.
기초적인 인터럽트 매커니즘 구현은 다음과 같은 순서로 진행된다.
1. CPU 하드웨어는 interrupt-request line이라는 선을 하나 가지고 있다. 이 선은 CPU가 각 instruction을 수행한 후에 확인한다.
2. CPU가 interrupt-request line에 컨트롤러가 신호를 보낸 것을 감지할 때, 해당 interrupt number를 읽는다. 그리고 이를 index로 삼아 interrupt vector를 통해서 interrupt-handler routine으로 점프한다.
3. 점프한 해당 index와 관련된 주소에서 실행을 시작한다.
4. Interrupt handler가 연산에 따라 바뀔 수도 있는 모든 상태를 저장
5. Interrupt handler가 필요한 처리를 수행한 후 상태를 복원한다. (CPU는 인터럽트 이전의 실행 상태로 복원됨)
최근의 운영체제에서는 더 복잡한 인터럽트 처리 기능이 필요하다.
1. 중요한 프로세스를 실행할 때 인터럽트 처리를 지연하기.
2. 적절한 interrupt handler를 적절한 디바이스에 dispatch하는 효율적인 방법
3. 운영체제가 우선순위에 따라 처리할 수 있는 multilevel interrupt
현대의 컴퓨터 하드웨어에서 이 세가지 기능들은 CPU와 interrupt-controller hardware에서 제공되고 있다.
대부분의 CPU는 두가지의 interrupt request lines를 갖는다.
- Nonmaskable interrupt: 복원 불가능한 메모리 에러같은 이벤트에 사용됨
- Maskable interrupt: 인터럽트되면 안될 중요한 instruction을 실행중일 때 CPU가 차단할 수 있는 interrupt. device controller들이 사용한다.
컴퓨터는 실제로 interrupt vector의 주소에 저장되어 있는 것보다 많은 디바이스들을 가지고 있는데, 이러한 문제를 해결하기 위해서 interrupt chaining을 사용한다.
Interrupt chaining: interrupt vector의 각 요소가 interrupt handler의 리스트 제일 위를 가리키는 것을 말한다.
인터럽트가 발생하면 해당 목록에 있는 handler들을 요청에 맞는 서비스를 찾을 때까지 하나씩 호출한다.
요약: 인터럽트는 현대의 운영체제에서 비동기 이벤트를 다루기 위해 사용된다. 디바이스 컨트롤러와 하드웨어 결함 인터럽트가 발생할 수 있다. 더 긴급한 일을 먼저 할 수 있도록 현대 컴퓨터는 인터럽트에 우선순위가 있다.
Storage Structure: 저장 구조
CPU는 instruction을 오직 메모리에서만 로드할 수 있다. 그래서 어떤 프로그램이든 실행되기 위해선 메모리에 로드되어야 한다.
'Computer Science > 운영체제' 카테고리의 다른 글
Operating System - Ch08. Deadlock (0) | 2022.06.01 |
---|---|
Operating System - Bootstrapping (0) | 2022.06.01 |
Operating System - Ch07. Synchronization example (0) | 2022.06.01 |
Operating System - Ch05. CPU Scheduling (0) | 2022.04.21 |
Operating System - Ch.04 Thread & Concurrency (0) | 2022.04.19 |
댓글