운영체제가 무엇인지 알아보고, 프로세스, 스레드, CPU 스케줄링의 개념을 알아보는 시간이다.
프로그램 실행에 필요한 요소들을 시스템 자원이라고 하는데,
실행할 프로그램에 이러한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램을
운영체제 OS; operating system 라고 한다.
운영체제는 컴퓨터가 부팅될 때 메모리 내 커널 영역 kernal space 라는 공간에 적재되며,
커널 영역을 제외한 공간은 사용자 영역 user space 으로, 일반적인 응용 프로그램이 적재된다.
커널 영역에 적재된 운영체제가 사용자 영역에 적재된 프로그램들에 자원을 할당하고 실행을 돕는 것이다.
운영체제가 하는 작업의 사례로는 다음과 같은 것들이 있다.
이외에도 다양한 역할이 있지만 세부적인 것들은 앞으로 차차 알아보도록 하자.
운영체제가 있기에 하드웨어를 조작하고 관리하는 기능을 직접 작성할 필요 없이
운영체제의 도움을 받아 프로그램을 간편하게 개발할 수 있다는 점.
컴퓨터 구조를 이해하면 문제 해결 능력을 키울 수 있다고 한 것과 같은 맥락에서
운영체제에 대한 이해 또한 문제 해결의 실마리를 찾는 데 도움이 된다.
더 알아보기
세상에는 다양한 운영체제가 존재하며 운영체제가 응용 프로그램에 제공하는 서비스 종류도 다양하지만
어느 운영체제에나 존재하는 핵심적인 기능들이 있다.
운영체제의 핵심 서비스를 담당하는 부분을 커널 kernal 이라고 한다.
운영체제가 설치된 모든 기기에는 커널이 있다.
운영체제에 대해 다룰 때 대부분 운영체제의 핵심부, 즉 커널에 대해 이야기를 하며
앞으로 언급되는 "운영체제"는 대체로 커널을 지칭한다.
커널에 포함되지 않는 운영체제의 서비스에는 대표적으로 다음과 같은 것이 있다.
운영체제는 응용 프로그램이 시스템 자원에 접근하려고 할 때
오직 자신을 통해서만 접근하도록 하여 자원을 보호하는데
이 때 이중 모드와 시스템 호출이 사용된다.
일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스를 빈번하게 이용하며
시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행된다.
우리는 운영체제의 세 가지 핵심 서비스를 다룰 것이다.
더 알아보기
【↗[컴퓨터 공학 기초 강의] 24강. 운영체제의 큰 그림】
【↗[컴퓨터 공학 기초 강의] 25강. 시스템 호출(system call) 직접 관찰하기】
【↗[저자 GitHub] 리눅스 시스템 호출 정리】
앞서 살짝 언급되었지만, 실행 중인 프로그램을 프로세스 process 라고 한다.
컴퓨터가 부팅되는 순간부터 수많은 프로세스들이 실행되는데,
유닉스 체계의 운영체제에서는 ps
명령어를 통해 실행 중인 프로세스를 확인할 수 있다.
(그냥 ps
만 하면 현재 터미널에서 실행 중인 프로세스를 확인할 수 있으며,
시스템 내 전체 프로세스를 확인하려면 -ef
와 같은 옵션을 설정해야 한다.)
다음은 그 출력 예시다.
새삼... 전원 안끈지 며칠이나 된 겨...;;ㅋㅋ
여기엔 직접 실행한 프로세스 외에도 운영체제에 의해 실행되는 다양한 프로세스가 존재한다.
윈도우 운영체제에서는 "작업 관리자"라는 것을 통해 GUI로 확인할 수 있다나.
프로세스가 차례대로 돌아가며 한정된 시간만큼 CPU를 이용하기 위해 타이머 인터럽트가 사용되는데,
클럭 신호를 발생시키는 장치에 의해 주기적으로 타이머 인터럽트가 발생하면
프로세스가 자신의 차례를 양보하고 다음 차례가 올 때까지 기다린다.
그리고 이러한 작업을 하기 위해 운영체제는 프로세스와 관련된 정보를 저장하는 자료구조,
프로세스 제어 블록(PCB) process control block 을 이용한다.
PCB에는 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 포함되어 있으며, 커널 영역에 존재한다.
PCB에 담기는 정보는 운영체제마다 차이가 있지만 대표적으로 다음과 같은 것들이 있다.
어떤 프로세스가 실행되다가 다른 프로세스에게 CPU 자원을 양보하는 상황에서
이전 프로세스가 사용하던 레지스터 값, 메모리 정보 등 중간 정보를 백업해야 하는데
이처럼 프로세스 수행을 재개하기 위해 기억해야 할 중간 정보를 문맥 context 이라고 한다.
문맥은 CPU 사용 시간이 다 되거나 인터럽트가 발생하면 해당 프로세스의 PCB에 백업되며,
프로세스 수행이 재개될 때 PCB에 기록되어 있는 문맥을 복구한다.
이전 프로세스의 문맥을 해당 프로세스의 PCB에 백업하고
다음 프로세스의 문맥을 해당 프로세스의 PCB로부터 복구하여
새로운 프로세스를 실행하는 과정을 문맥 교환 context switch 이라고 한다.
문맥 교환이 자주 일어나는 만큼 빠르게 번갈아가며 수행되어 마치 동시에 실행되는 것처럼 보인다.
하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장.
더 알아보기
여러 프로세스들이 빠르게 번갈아가며 실행되는 과정에서
각각의 프로세스는 여러 상태를 거치며 실행되며
그 상태는 PCB를 통해 인식되고 관리된다.
프로세스 상태 표현 방식은 운영체제마다 차이가 있지만 대표적인 상태는 다음과 같다.
프로세스 상태를 도표로 정리한 프로세스 상태 다이어그램 process state diagram 이라고 한다.
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있는데,
이 때 생성의 주체가 되는 프로세스를 부모 프로세스 parent process 라고 하며
생성의 객체가 되는 프로세스를 자식 프로세스 child process 라고 한다.
운영체제에 따라 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID parent PID 가 포함되기도 한다.
많은 운영체제들은 컴퓨터가 부팅될 때 실행되는 최초의 프로세스가 자식 프로세스를 생성하고
생성된 자식 프로세스가 또 다시 자식 프로세스를 생성하여 트리 구조를 이루는
프로세스 계층 구조로 프로세스들을 관리한다.
로그인 프로세스와 데몬은 최초의 프로세스의 자식에 해당한다는 건 여담.
최초의 프로세스는 운영체제마다 차이가 있는데
유닉스 운영체제에서는 init
, 리눅스 운영체제에서는 systemd
, macOS에서는 launchd
와 같으며,
그 PID는 항상 1
이다.
pstree
명령어를 사용하면 다음과 같은 계층 구조를 확인할 수 있다.
부모 프로세스는 시스템 호출 fork
를 통해 자신의 복사본을 자식 프로세스로 생성하고
자식 프로세스는 시스템 호출 exec
을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
fork
를 통해 프로세스를 복제하면 시스템 자원을 그대로 복사한 채
PID와 메모리 주소만 다르고 동일한 내용이 할당된다.
exec
은 자신의 메모리 공간에 새로운 프로램을 덮어쓰는 시스템 호출로,
코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고 나머지 영역은 초기화된다.
만약 fork
후 자식 프로세스가 exec
을 하지 않는다면
부모 프로세스와 동일한 코드를 병렬적으로 실행하게 된다.
더 알아보기
【↗[컴퓨터 공학 기초 강의] 27강. 프로세스 상태와 계층 구조】
【↗[컴퓨터 공학 기초 강의] 29강. 파이썬 코드로 프로세스 확인하기】
【↗[저자 GitHub] Python으로 프로세스 다루기】
【↗[저자 GitHub] C/C++으로 프로세스 다루기】
전통적인 관점에서 보면 하나의 프로세스는 한 번에 하나의 일만을 처리하였으나
스레드 thread 라는 개념이 도입되며 한 번에 여러 일을 처리할 수 있게 되었다.
기존의 한 번에 하나의 일만 처리하는 프로세스는 단일 스레드 프로세스라고 칭한다.
더 알아보기
【↗[컴퓨터 공학 기초 강의] 28강. 스레드】
【↗[컴퓨터 공학 기초 강의] 30강. 파이썬 코드로 스레드 확인하기】
【↗[저자 GitHub] Python으로 스레드 다루기】
【↗[저자 GitHub] C/C++으로 스레드 다루기】
운영체제는 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하기 위해
CPU 스케줄링 CPU scheduling 을 수행한다.
프로세스마다 우선순위 priority 가 다르기 때문에 일반적으로 운영체제는 이를 반영하여 스케줄링한다.
입출력 집중 프로세스와 CPU 집중 프로세스가 동시에 CPU 자원을 요구할 경우
입출력 집중 프로세스를 먼저 실행하여 입출력장치를 끊임없이 작동시키고
해당 프로세스가 입출력 작업을 하며 대기 상태로 존재하는 동안
CPU 집중 프로세스에 CPU를 집중적으로 할당하는 것이 효율적.
⇒ 일반적으로 입출력 집중 프로세스의 우선순위가 더 높다
프로세스의 우선순위는 ps -el
명령어로 확인할 수 있다.
운영체제는 각 프로세스의 PCB에 우선순위를 부여해해고 이를 기반으로 먼저 처리할 프로세스를 결정하는데
CPU를 사용할 다음 프로세스를 찾을 때마다 PCB를 일일이 확인하는 것은 비효율적이다.
따라서 프로세스의 상태별로 우선순위에 따라 줄을 세워두고 순서를 결정하는데
이 줄을 스케줄링 큐 scheduling queue 라고 한다.
(큐라고 하지만 엄밀히 말하면 일반적으로는 완전한 선입선출은 아닌 우선순위 큐)
실행 중인 프로세스 우선순위가 더 높은 프로세스가 도착했을 때
실행 중인 것까지만 실행하고 우선순위가 높은 프로세스를 실행하는지
실행 중인 것을 중단하고 우선순위가 높은 프로세스를 먼저 실행하는지에 따라
스케줄링 기법이 구분된다.
더 알아보기
CPU 스케줄링 알고리즘은 다양하고 운영체제마다 다른 알고리즘을 사용하고 있지만
그 중 몇 가지 알고리즘에 대해 알아보도록 하겠다.
더 알아보기
이번 주 미션
- 기본 미션 | p. 304의 확인 문제 1번 풀고 인증하기
- 선택 미션 | Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입될 때 선입 선처리, 최단 작업 우선, 라운드 로빈, 우선순위 스케줄링에서 어떤 프로세스로 CPU를 할당 받는지 정리해보기
미션은 P.304의 1번 문제뿐이지만, 이왕 학습하고 확인 문제를 푸는 거 다 풀어보자.
P.267 [09-1 | 운영체제를 알아야 하는 이유] 확인 문제
- 빈칸에 알맞은 단어를 채워 보세요.
"운영체제는 실행할 프로그램에 [ 시스템 자원 ]을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램입니다.
- 운영체제에 대한 설명으로 옳지 않은 것을 고르세요.
① 운영체제를 이해하면 하드웨어와 프로그램을 더 깊이 이해할 수 있습니다.
② 운영체제는 사용자 영역에 적재됩니다. → 그건 응용 프로그램. 운영체제는 커널 영역에.
③ 운영체제는 시스템 자원을 관리하는 프로그램입니다.
④ 운영체제는 사용자가 실행하는 프로그램이 올바르게 실행되도록 돕습니다.
P.281 [09-2 | 운영체제의 큰 그림] 확인 문제
- 빈칸에 알맞은 단어를 작성하세요.
"[ 커널 ]은 운영체제의 핵심 기능을 담당하는 부분을 의미합니다."
- 이중 모드와 시스템 호출에 대해 옳지 않은 것을 고르세요.
① 운영체제의 핵심 서비스는 커널 모드로 실행됩니다.
② 일반적인 응용 프로그램은 사용자 모드로 실행됩니다.
③ 시스템 호출을 통해 사용자 모드에서 커널 모드로 전환할 수 있습니다.
④ 시스템 호출은 인터럽트와 아무런 연관이 없습니다. → 소프트웨어 인터럽트.
- 운영체제의 핵심 서비스가 아닌 것을 고르세요.
① 프로세스 관리
② 자원 접근 및 할당
③ 사용자 인터페이스 제공 → 커널 외적인 부분.
④ 파일 시스템 관리
P.295 [10-1 | 프로세스 개요] 확인 문제
- 프로세스와 관련한 설명 중 옳지 않은 것을 고르세요.
① 실행되는 프로그램을 프로세스라고 합니다.
② 프로세스가 생성되면 커널 영역에 PCB가 생성됩니다.
③ 프로세스들은 문맥 교환을 통해 번갈아 가며 수행됩니다.
④ 프로세스는 반드시 사용자와 상호작용할 수 있어야 합니다. → 데몬의 경우 상호작용하지 않음.
- 문맥 교환과 관련한 설명 중 옳지 않은 것을 고르세요.
① 문맥 교환은 빠르게 수행될수록 좋습니다. → 어느 정도까지는 동시에 실행되는 것처럼 보이기에 좋지만, 지나치게 빠를 경우 오버헤드가 크다.
② 문맥 교환 과정에서 직전에 수행되던 프로새스의 문맥이 백업됩니다.
③ 문맥 교환 과정에서 다음에 수행할 프로세스의 문맥이 복구됩니다.
④ 문맥은 PCB에 기록됩니다.
P.304~305 [10-2 | 프로세스 상태와 계층 구조] 확인 문제
- 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. ①부터 ⑤까지 올바른 상태를 적어 보세요.
① 생성 상태
② 준비 상태
③ 실행 상태
④ 종료 상태
⑤ 대기 상태(요것이 이번주 기본 미션!!)
- 최초의 프로세스가 로그인 프로세스를 생성하고, 로그인 프로세스는 bash 프로세스를, bash 프로세스는 Vim 프로세스를 생성했다고 가정해 보겠습니다.
- bash 프로세스의 부모 프로세스는 무엇인가요? [① 로그인 프로세스 ]
- bash 프로세스의 자식 프로세스는 무엇인가요? [② Vim 프로세스 ]
- Vim 프로세스의 부모 프로세스는 무엇인가요? [③ bash 프로세스 ]
- fork와 exec에 대한 설명으로 옳지 않은 것을 고르세요.
① fork 시스템 호출을 하면 새로운 폴더가 생성됩니다. → 새로운 프로세스 생성.
② fork 시스템 호출을 하면 부모 프로세스의 복제본이 자식 프로세스로서 생성됩니다.
③ exec 시스템 호출을 하면 프로세스의 메모리 공간이 다른 프로세스의 내용으로 변경됩니다.
④ 많은 운영체제는 fork와 exec을 통해 프로세스 계층 구조를 형성합니다.
- 프로세스 상태에 대한 설명으로 옳은 것을 고르세요.
① 생성 상태는 프로세스가 입출력 장치의 작업을 기다리는 상태입니다. → 그건 대기 상태.
② 실행 상태는 프로세스가 종료되는 상태입니다. → 그건 종료 상태.
③ 종료 상태는 프로세스가 이제 막 생성된 상태입니다. → 그건 생성 상태.
④ 준비 상태는 CPU를 할당받기를 기다리고 있는 상태입니다.
P.313 [10-3 | 스레드] 확인 문제
- 스레드와 관련한 설명으로 옳지 않은 것을 고르세요.
① 스레드는 프로세스 내의 실행의 흐름 단위입니다.
② 프로세스 내의 스레드들은 각기 다른 코드/데이터/힙 영역을 가지고 있습니다. → 동일한 것 공유
③ 프로세스 내의 스레드들은 각기 다른 프로그램 카운터 값을 가지고 있습니다.
④ 프로세스 내의 스레드들은 각기 다른 스택을 가지고 있습니다.
- 멀티프로세스와 멀티스레드의 차이를 설명하는 내용입니다, 아래 글에서 제시된 단어 중 옳은 것을 고르세요.
"프로세스끼리는 기본적으로 자원을 [ 공유하지 않지만, 공유하지만 ], 프로세스 내 스레드끼리는 같은 프로세스 내의 자원을 [ 공유하지 않습니다, 공유합니다 ].
P.326~327 [11-1 | CPU 스케줄링 개요] 확인 문제
- 프로세스 스케줄링에 대해 옳지 않은 것을 고르세요.
① 운영체제는 우선순위를 토대로 프로세스들을 스케줄링합니다.
② 운영체제는 스케줄링 큐를 사용하여 스케줄링할 프로세스를 관리합니다.
③ 준비 큐에는 준비 상태인 프로세스들이, 대기 큐에는 대기 상태인 프로세스들이 삽입됩니다.
④ 선점형 스케줄링은 프로세스가 이용 중인 자원을 빼앗을 수 없는 방식을 의미합니다. → 그건 비선점형.
- ①과 ②에 알맞은 말을 써넣으세요.
① 준비 큐
② 대기 큐(다이어그램이 살짝 이상하지만 다음 쇄에서 수정 반영 예정이라고 답변 받았다.)
- 선점형 스케줄링과 비선점형 스케줄링에 대해 옳지 않은 것을 고르세요.
① 선점형 스케줄링은 어느 한 프로세스가 자원을 독점할 수 없는 스케줄링 방식입니다.
② 선점형 스케줄링은 문맥 교환 과정의 오버헤드가 비선점형 스케줄링에 비해 적습니다. → 우선순위에 따라 자원을 분배하는 과정에서 오버헤드 발생.
③ 비선점형 스케줄링은 어느 한 프로세스가 자원을 독점할 수 있는 스케줄링 방식입니다.
④ 비선점형 스케줄링은 문맥 교환 과정의 오버헤드가 선점형 스케줄링에 비해 적습니다.
P.337 [11-2 | CPU 스케줄링 알고리즘] 확인 문제
- 준비 큐에 프로세스 A, B, C, D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링을 적용한다면 어떤 프로세스 순서대로 CPU를 할당받게 될까요?
① A-D-B-C
② B-C-A-D
③ A-B-C-D
④ D-C-B-A
- 다음 보기에서 올바른 정의를 찾아 써 보세요.
[보기| 기아 현상, 에이징, 타임 슬라이스]
- 우선순위가 낮아 실행이 계속 연기되는 문제를 무엇이라고 하나요? [① 기아 현상 ]
- 우선순위가 낮아 실행이 계속 연기되는 문제를 해결하기 위해 점차 우선순위를 높이는 기법을 무엇이라고 하나요? [② 에이징 ]
준비 큐에 A,B,C,D 순으로 삽입될 때 각각의 스케줄링 기법에 따른 CPU 할당을 정리해보면,
스케줄링 기법 | CPU 할당 |
---|---|
선입 선처리 | A가 모두 실행된 후 B가 실행되고, B가 모두 실행된 후 C가 실행되고, C가 모두 실행된 후 D가 실행된다. |
최단 작업 우선 | A, B, C, D 중 실행 시간이 짧은 것부터 작업 시간 순으로 실행된다. |
라운드 로빈 | A, B, C, D가 타임 슬라이스만큼의 시간동안 실행되며, 아직 실행할 게 남은 동안 이 순서로 반복된다. |
우선순위 | A, B, C, D의 우선순위를 판별하여 우선순위가 높은 프로세스부터 실행된다. |
내 눈에는 모호해보이는 보기가 있길래 제안.
그리고 프로세스 상태 다이어그램에서 뭔가 위화감이 느껴져서 뭐지 했는데
준비 상태가 두 개인 걸 인지하여 제보했다.