혼자 공부하는 컴퓨터구조 + 운영체제를 보고 정리한 글입니다. cf. https://www.youtube.com/watch?v=kFWP6sFKyp0&list=PLYH7OjNUOWLUz15j4Q9M6INxK5J3-59GC
1. 운영체제를 알아야 하는 이유
데스크톱 컴퓨터나 노트북, 스마트폰에는 모두 운영체제가 설치되어 있습니다.
- 데스크톱 운영체제로는 윈도우와 macOS, 리눅스가 있고,
- 스마트폰 운영체제로는 안드로이드와 iOS가 있습니다.
컴퓨터 부품들은 전기만 공급하면, 마치 마법처럼 알아서 작동하는 것이 아닙니다.
- 운영체제라는 특별한 프로그램의 지휘 하에 작동하지요.
- 운영체제는 01~08장까지 배운 컴퓨터 부품들을 관리하고,
- 여러분이 개발한 프로그램이 올바르게 실행되도록 돕습니다.
1.1 운영체제란
- 모든 프로그램은 하드웨어를 필요로 합니다.
- 다시 말해, 모든 프로그램은 실행되기 위해 반드시 자원이 필요합니다.
- 프로그램 실행에 마땅히 필요한 요소들을 가리켜
시스템 자원, 혹은 줄여서자원이라고 합니다.- CPU, 메모리, 보조기억장치, 입출력장치 등과 같은 컴퓨터의 4가지 핵심 부품들 포함
- e.g. 1+2를 계산하는 프로그램은 CPU를 필요
- e.g. 이미지를 하드 디스크에 저장하는 프로그램은 하드 디스크를 필요
운영체제(operating system)는
- 실행할 프로그램에 필요한 자원을 할당하고,
- 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램

운영체제는 인터넷 브라우저, 게임과 같은 프로그램입니다.
-
그래서 운영체제 또한 여느 프로그램과 마찬가지로 메모리에 적재되어야 합니다.
-
다만
운영체제는 매우 특별한 프로그램이기 때문에,- 항상 컴퓨터가 부팅될 때,
- 메모리 내
커널 영역(kernel space)이라는 공간에 따로 적재되어 실행됩니다.
-
커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을
사용자 영역(user space)이라고 합니다.
-
즉,
운영체제는 커널 영역에 적재되어,- 사용자 영역에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 돕습니다.

e.g. 일반적으로 메모리에는 여러 개의 응용 프로그램이 사용자 영역에 적재되어 실행됩니다.
- 사용자가 워드 프로세서, 인터넷 브라우저, 메모장을 실행 중이면,
- 최소 3개의 응용 프로그램이 사용자 영역에 적재되어 있는 셈입니다.
💡 응용 프로그램(application software)
- 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램을 의미
- e.g. 워드 프로세서, 인터넷 브라우저, 메모장, 게임 등과 같은 프로그램

그런데 누가 이 프로그램들을 메모리에 적재했을까요? 위 그림을 보면,
- 워드 프로세서, 인터넷 브라우저, 메모장은 각각 2000번지, 1500번지, 1000번지에 적재되었는데,
- 메모리 주소가 겹치지 않도록, 적당한 공간에 프로그램들을 적재해준 건 누구였을까요?
- 바로
운영체제입니다.- 운영체제는 실행할 프로그램을 메모리에 적재하고,
- 더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원을 관리합니다

3개의 응용 프로그램이 실행되려면 반드시 CPU가 필요합니다.
- 그렇다면 어떤 프로그램부터 CPU를 사용하게 할까요?
- 그리고 얼마나 오랫동안 CPU를 이용하게 할까요?
- 이 문제 또한
운영체제가 해결합니다.- 어느 한 프로그램이 CPU를 독점하면,
- 다른 프로그램들은 올바르게 실행될 수 없기 때문에,
- 운영체제는 최대한 공정하게 여러 프로그램에 CPU 자원을 할당합니다.

이번에는 워드 프로세서와 메모장이 동시에 동일한 프린터를 이용하려는 상황을 생각해 봅시다.
- 운영체제는 동시에 두 개의 프로그램이 프린터를 사용하지 못하도록 막고,
- 하나의 프로그램이 프린터를 이용하는 동안, 다른 프로그램은 기다리게 만들어 프린터 자원을 관리합니다.

- 이처럼
운영체제는응용 프로그램과하드웨어사이에서 응용 프로그램에 필요한 자원을 할당하고, - 응용 프로그램이 올바르게 실행되도록 관리하는 역할을 맡습니다.

- 운영체제는 흔히 정부에 비유되기도 합니다.
- 한 나라의 정부는 땅, 인력, 돈 등 국내 자원을 효율적으로 배분하고,
- 국민들이 지켜야 할 규칙을 만들어 나라 전체를 관리합니다.
- 운영체제도 마찬가지입니다.
- 운영체제는 응용 프로그램에 자원을 효율적으로 배분하고,
- 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리합니다.
- 또한 정부에 기획재정부, 과학기술정보통신부 같이 역할별로 여러 부서가 나누어져 있는 것처럼
- 운영체제 또한 관리할 자원별로 기능이 나누어져 있습니다.
- e.g. 운영체제의 어느 한 부분에서는 CPU를,
- 어느 한 부분에서는 메모리를,
- 어느 한 부분에서는 하드 디스크를 관리합니다.
1.2 운영체제를 알아야 하는 이유
-
운영체제없이 프로그램을 개발하는 것? 생각만 해도 골치 아픈일입니다.
-
아무리 간단한 프로그램이라도 운영체제가 없다면,
- 하드웨어를 조작하는 코드를 개발자가 모두 직접 작성해야 하기 때문입니다.
- e.g. 1+2한 결과를 모니터에 출력하는 간단한 프로그램
- 프로그램을 메모리에 적재하는 코드
- CPU로 하여금 1과 2를 더하게 하는 코드
- 모니터에 계산 결과를 출력하는 코드…
-
하지만 다행히도 이 세상에는 운영체제가 있습니다.
- 운영체제가 하드웨어를 조작하고 관리하는 기능들을 제공하기 때문에
- 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요없이
- 운영체제의 도움을 받아 간편하게 개발할 수 있습니다.
-
그렇다면 개발자들이 왜 운영체제를 알아야 할까요?
- 운영체제는 사용자를 위한 프로그램이 아닙니다.
- 운옃제제는 프로그램을을 위한 프로그램입니다.
- 그렇기에 프로그램을 만드는 개발자는 운영체제를 알아야 합니다.
- 어떤 하드웨어에 문제가 생겼다라고 가정하면, 운영체제가 가장 먼저 알아쳅니다.
-
그리고 운영체제는 딱딱한 하드웨어가 아닌 프로그램이기 때문에 여러분과 대화할 수 있습니다.
-
e.g. CPU, 메모리, 어떤 컴퓨터 부품이든 딱딱한 하드웨어이기 때문에
- 문제가 생겼으면, 동작을 안하면 끝이지만,
-
e.g. 운영체제는 부드러운 프로그램이기 때문에,
- 여러 오류 메시지를 통해서, 사용자와 대화를 할 수 있습니다.
- 사용자가 만든 코드를 실행하니, 이러이러한 문제가 있다고 알려줍니다.
-
-
그래서 운영체제를 이해하면, 오류 메시지에 대한 이해가 깊어지고,
- 문제 해결력도 당연히 높아집니다.
- 그리고 운영체제를 알아야만, 해결가능한 오류 메시지도 존재합니다.
-
물론 위 사실뿐만 아니라,
- 다수의 기업에서 운영체제에 대한 이해를 필수적인 기초 역량으로 요구하고,
- 채용 과정에서 기술 면접 등을 통해 검증하는 것도 이러한 이유 때문입니다.
2. 운영체제의 큰 그림
운영체제는 사용자를 위한 프로그램이 아닌 사용자가 실행하는 프로그램을 위한 프로그램입니다.
- 즉, 사용자가 실행하는 응용 프로그램이 올바르게 실행되도록 돕고 필요한 자원을 할당해 주는 프로그램
- 이번 절에는 다음과 같은 개념을 배웁니다.
- 커널이란?
- 운영체제의 서비스 종류?
- 시스템 콜과 이중 모드란?
2.1 운영체제의 심장, 커널

- 운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나
- ‘how many source code lines in linus’라고 검색해보면, 천만 줄이 넘는다고 나옵니다.
- 또 세상에는 다양한 운영체제가 있습니다.
- e.g. Winods, macOS, Android, IOS, Linux
- 그렇기에 운영체제가 제공하는 기능 역시 다양합니다.
- e.g. 같은 스마트폰이라도 Android, IOS인지에 따라 제공하는 기능이 천차만별
- But, 이런 다양한 운영체제에서도 가장 핵심적인 서비스는 존재합니다.
- e.g. 스마트폰이 Android든, IOS든 전화, 문자, 인터넷연결(Wi-fi) 등
- e.g. 운영체제 역시 자원에 접근·조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능 등
- 이러한 운영체제의 핵심 서비스를 담당하는 부분을
커널(kernel)이라고 합니다.- 그래서 이 책을 비롯한 대부분의 운영체제 전공서는 운영체제의 핵심부, 즉 커널을 설명합니다.
- 필자가 운영체제를 지칭할 때는 특별히 언급하지 않는 한 커널을 지칭한다고 봐도 무방합니다.
2.1.2 GUI와 CLI
운영체제가 제공하는 사용자 인터페이스의 종류에는 GUI와 CLI가 있습니다.

운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스도 있는데,
- 대표적으로
사용자 인터페이스(UI; User Interface)가 있습니다.- e.g. 윈도우의 바탕화면과 같이 사용자가 컴퓨터와 상호작용할 수 있는 통로입니다.
- cf. 실제로 같은 커널을 사용하더라도, 사용자 인터페이스는 다를 수 있습니다.
그래픽 유저 인터페이스(GUI; Graphical User Interface)- 윈도우 바탕화면이나 스마트폰의 화면처럼 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스

커맨드 라인 인터페이스(CLI; Command Line Interface)- 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스
- 명령어를 기반으로 컴퓨터와 상호작용하는 인터페이스이기 때문에,
- 아이콘이나 다채로운 그래픽 화면이 없습니다.
2.2 이중 모드와 시스템 호출

사용자가 실행하는 프로그램은 자원에 직접 접근할 수 있을까요?
- e.g. 메모장, 웹 브라우저등이 CPU, 메모리, 하드 디스크 등에 마음대로 접근하고 조작한다면?
- 안됩니다. 응용 프로그램이 자원에 직접 접근은 위험합니다.
- 왜냐하면, 자원이 무질서하게 관리되고,
- 응용 프로그램이 조금만 실수해도 컴퓨터 전체에 큰 악영향을 미칩니다.
- e.g. 한 응용 프로그램이 CPU를 쓰고 있는데, 다른 응용 프로그램이 쓸려고 하는 등의 문제

그래서 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때,
- 오직 자신을 통해서만 접근하도록 하여 자원을 보호합니다.
- 비유하자면, 운영체제는 응용 프로그램의 자원 접근을 대행하는 일종의 문지기 역할을 하는 셈
- 다시말해, 응용 프로그램이 자원에 접근하려면,
- 운영체제에 도움을 요청(=운영체제의 코드를 실행)해야

e.g. 응용 프로그램이 실행 과정에서 하드디스크에 접근하여 데이터를 저장하려면,
- 운영체제에 도움을 요청해야 하고,
- 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여
- 응용 프로그램의 작업을 대신 수행해줍니다.
2.2.1 이중 모드(dual mode)
- 이러한 운영체제의 문지기 역할은 이중 모드로써 구현됩니다.
이중 모드: CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식사용자 모드(user mode)- 운영체제 서비스를 제공받을 수 없는 실행 모드
- 커널 영역의 코드 를 실행할 수 없는 모드
- 입출력 명령어와 같이 하드웨어 자원에 접근 불가
커널 모드(kernel mode)- 운영체제 서비스를 제공받을 수 있는 실행 모드
- 자원에 접근을 비롯한 모든 명령어를 실행 가능
- cf. CPU가 사용자 모드로 실행 중인지, 커널 모드로 실행 중인지는
- 플래그 레지스터 속
슈퍼바이저 플래그를 보면 알 수 있습니다. (04장 참고) - 1이면 커널 모드, 0이면 사용자 모드로 실행 중임을 의미
- 플래그 레지스터 속

2.2.2 시스템 호출(system call)

- 커널 모드로 전환하여 실행하기 위해 호출
- 일종의 소프트웨어 인터럽트!
- 인터럽트는 입출 력장치에 의해 발생하기도 하지만,
- 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데,
- 이를 소프트웨어 인터럽트라고 합니다.
- CPU가 시스템 호출을 처리하는 순서는 04장에서 설명한 인터럽트 처리 순서와 유사합니다.
- 시스템 호출을 발생시키는 명령어가 실행되면
- CPU는 지금까지의 작업을 백업하고,
- 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤,
- 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나갑니다.
- e.g. 시스템 호출의 작동 예 : 한 응용 프로그램이 하드디스크에 데이터를 저장하려 한다고 가정
- 하드 디스크에 데이터를 저장하는 시스템 호출을 발생시켜 커널 모드로 전환하고,
- 운영체제 내의 ‘하드디스크에 데이터를 저장하는 코드’를 실행함으로써 하드디스크에 접근
- 하드 디스크에 접근이 끝났다면, 다시 사용자 모드로 복귀하여 실행을 계속해 나갑니다

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 이용합니다. 그 과정에서 빈번하게 시스템 호출을 발생시키고, 사용자 모드와 커널 모드를 오가며 실행됩니다.
💡 Linux의 시스템 호출 명령어 정리
2.3 운영체제의 핵심 서비스
2.3.1 프로세스 관리

프로세스(process)=== 실행 중인 프로그램- 수 많은 프로세스들이 동시에 실행
- 윈도우의 [작업 관리자]를 열어 [프로세스] 항목을 보면,
- 굉장히 많은 프로세스가 실행 중인 것을 알 수 있습니다.
- 컴퓨터를 사용하는 동안 메모리 안에서는 새로운 프로세스들이 마구 생성되고,
- 사용되지 않는 프로세스는 메모리에서 삭제됩니다.

- 사실 **‘동시에 실행된다’**는 말은 아주아주 빠르게
- 사용자가 눈치채지 못할 정도로 빠르게 번갈아가면서 실행되는 겁니다.
- 즉,
CPU는 한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고,- 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 반복합니다.

- 그래서 운영체제는 다양한 프로세스를 동시다발적으로 생성·실행·삭제되는 다양한 프로세스를
- 일목요연하게 관리할 수 있어야 합니다.
- e.g. 새롭게 어떤 프로그램을 실행하게 되면,
- 작업 관리자의 프로세스 목록에 프로세스가 새롭게 생성되겠죠?
- 또 프로세삭 실행될 떄도 문제없이 잘 되게끔 관리해줘야되고,
- 실행이 끝난 프로세스는 올바르게 종료해줘야 합니다.
- 더군다나 프로세스마다 상황도 다양할 수 있습니다.
- 어떤 프로세스는 특정 입출력 장치를 사용해야 할 수도 있고,
- 어떤 프로세스는 되게 빨리 CPU를 써야될 수도 있고,
- 어떤 프로세스는 지금 당장 실행이 어려울 수도 있습니다.
- 이렇게 다양한 프로세스들 그리고 각기 다른 상황에 프로세스들을
- 일목요연하게 관리해주는 역할을 운영체제가 합니다.
- 앞으로 운영체제가 다양한 프로세스를 어떻게 관리하고 실행하는지 배웁니다.
- e.g. 프로세스와 스레드, 프로세스 동기화, 교착상태 해결
2.3.2 자원 접근 및 할당
모든 프로세스는 실행을 위해 자원을 필요로 합니다. 그리고 운영체제는 프로세스들이 사용할 자원에 접근하,고 조작함으로써 프로세스에 필요한 자원을 할당해 줍니다.
CPU 접근 및 할당CPU 스케줄링: 어떤 프로세스를 먼저, 얼마나 오래 실행할까?- e.g. 모든 프로세스는 실행되기 위해서 CPU가 필요합니다.
- 메모리에는 여러 프로세스가 적재되고,
- 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있습니다.
- 그래서 하나의 프로세스가 CPU를 이용하고 있다면 다른 프로세스는 기다려야 합니다.
- 그래서 프로세스들에 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용할지,
- 얼마나 오래 CPU를 이용하게 할지를 결정할 수 있어야 합니다.
메모리 접근 및 할당- 페이징, 스와핑, 등…
- e.g. 어떤 새로운 프로세스를 적재할 적에 비어있는 공간에다가 적재해야 하는데,
- 비어있는 공간을 어떻게 찾을 것인지,
- 다양한 프로세스들이 동시에 실행되고 있는데, 메모리에 전부 다 적재하는 것이 효율적인지,
- 어떻게 메모리에 다 적재하지 않고도 문제없이 실행할 수 있는지 등…
- e.g. 어떤 실행하려는 프로세스가 메모리 크기보다 큰 경우
- 실행이 안될 거 같지만, 사실 실행이 됩니다.
- 이것이 어떻게 가능한지 등…
입출력장치 접근 및 할당- 인터럽트 서비스 루틴은 운영체제가 제공해주는 기능입니다.
- 이는 커널 영역에 적재되어 있는 코드입니다.
- 그래서 응용 프로그램이 입출력장치에 접근하고자 할 떄,
- 운영체제는 인터럽트 서비스 루틴을 제공함으로써
- 각각의 응용 프로그램한테 입출력 장치를 접근할 수 있도록 합니다.
2.3.3 파일 시스템 관리
- 당연해 보이는
파일 시스템(file system)도 운영체제가 지원하는 핵심 서비스입니다. - 보조저장장치에 있는 정보 덩어리를 ‘파일’이라는 단위로 묶어서 저장해서 보관
- 관련된 정보를 파일이라는 단위로 저장 장치에 보관
- 파일들을 묶어 폴더(디렉토리) 단위로 저장 장치에 보관
- 운영체제가 보조기억장치 속 데이터를 어떻게 파일과 디렉터리로 관리하는지에 대해 배웁니다.
2.4 가상 머신과 이중 모드의 발전
이중 모드는 커널 모드와 사용자 모드, 두 가지 모드를 지원하는 실행 모드이지만, 가상 머신을 통한 가상화를 지원하는 현대 CPU는 2가지 모드 이상을 지원합니다.

가상 머신(virtual machine)- 소프트웨어적으로 만들어낸 가상 컴퓨터
- 가상 머신을 설치하면 새로운 운영체제와 응용 프로그램을 설치하고 실행할 수 있습니다.
- 윈도우 운영체제에 가상 머신을 설치하면,
- 가상머신 상에 리눅스 운영체제와 그를 기반으로 여러 응용 프로그램들을 설치하고 실행 가능

이때 컴퓨터에 설치된 운영체제에서 가상 머신을 설치 및 실행한다면, 그 가상머신 또한 응용 프로그램입니다.
- 그래서 사용자 모드로 작동하지요.
- 마찬가지로 가상머신 상에 설치된 운영체제 또한 사용자 모드로 작동합니다.
- 가상 머신에 설치된 응용 프로그램이 운영체제 서비스를 제공받기 위해서는 커널 모드로 전환되어야 하는데,
- 가상 머신에 설치된 운영체제도 사용자 모드로 작동하면, 운영체제 서비스를 제공받기 어렵겠죠?
그래서 가상화를 지원하는 CPU는 커널 모드와 사용자 모드 이외에
- 가상 머신을 위한 모드인
하이퍼 바이저 모드를 따로 둡니다. - 이로써 가상 머신 상에서 작동하는 응용 프로그램들은
- 하이퍼바이저 모드로써 가상 머신에 설치된 운영체제로부터 운영체제 서비스를 받을 수 있습니다.
2.5 시스템 호출의 종류
시스템 호출 종류만 잘 파악해도 해당 운영체제를 깊이 이해할 수 있습니다. 이곳에서는 유닉스, 리눅스 등의 운영체제(POSIX 운영체제) 에서 사용하는 대표적인 시스템 호출의 종류에 대해 알아보겠습니다. 아직은 운영체제를 본격적으로 학습하기 전이니 ‘이런 것이 있구나’ 하는 정도로만 살펴보세요.
| 종류 | 시스템 호출 | 설명 |
|---|---|---|
| 프로세스 관리 | fork() | 새 자식 프로세스 생성 |
| execve() | 프로세스 실행(메모리 공간을 새로운 프로그램의 내용으로 덮어씌움) | |
| exit() | 프로세스 종료 | |
| waitpid() | 자식 프로세스가 종료할 때까지 대기 | |
| 파일 관리 | open() | 파일 열기 |
| clase() | 파일 닫기 | |
| read() | 파일 읽기 | |
| write() | 파일 쓰기 | |
| stat() | 파일 정보 획득 | |
| 디렉터리 관리 | chdir() | 작업 디렉터리 변경 |
| mkdir() | 디렉터리 생성 | |
| rmdir() | 비어 있는 디렉터리 삭제 | |
| 파일 시스템 관리 | mount() | 파일 시스템 마운트 |
| umount() | 파일 시스템 마운트 해제 |
개발자가 작성하는 프로그래밍 언어들은 내부적으로 위와 같은 시스템 호출을 통해 실행됩니다.
- 가령 C 언어에서 무언가를 화면에 출력하라는 코드인 printf도 내부적으로 시스템 호출을 통해 실행되고,
- 사용자로부터 무언가를 입력받으라는 코드인 scanf도 내부적으로 시스템 호출을 통해 실행됩니다.
운영체제는 제공하는 서비스가 매우 다양하기에 시스템 호출의 종류도 다양합니다. 아래 링크 system_calls 항목에 리눅스 시스템 호출의 종류를 정리해 두었으니 참고하세요.