혼공컴운
혼자 공부하는 컴퓨터구조 + 운영체제 Chapter09 ~ Chapter15를 읽고 공부한 것을 기록합니다.

09. 운영체제 시작하기09-1. 운영체제를 알아야 하는 이유09-2. 운영체제의 큰 그림10. 프로세스와 스레드10-1. 프로세스 개요포그라운드 프로세스(foreground process)백그라운드 프로세스(background process)프로세스 제어 블록(PCB)문맥 교환프로세스의 메모리 영역10-2. 프로세스 상태와 계층 구조프로세스 상태프로세스 계층 구조프로세스 생성 기법10-3. 스레드스레드프로세스 vs 스레드멀티프로세스와 멀티스레드11. CPU 스케줄링11-1. CPU 스케줄링 개요11-2. CPU 스케줄링 알고리즘선입 선처리 스케줄링최단 작업 우선 스케줄링라운드 로빈 스케줄링최소 잔여 시간 우선 스케줄링우선순위 스케줄링다단계 큐 스케줄링다단계 피드백 큐 스케줄링12. 프로세스 동기화13. 교착 상태14. 가상 메모리15. 파일 시스템
09. 운영체제 시작하기
09-1. 운영체제를 알아야 하는 이유
- 운영체제는 실행할 프로그램에 필요한 자원(CPU, 메모리, 보조기억장치, 입출력장치 등)을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이다
- 운영체제는 메모리의 커널 영역에 적재되어 실행된다
- 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역이라 한다
- 운영체제와의 대화를 통해 하드웨어와 프로그램을 더 깊이 이해하고 문제 해결의 실마리를 찾을 수 있다
09-2. 운영체제의 큰 그림
- 커널은 운영체제의 핵심 기능을 담당한다(마치 사람의 심장, 자동차의 엔진과 같음)
- 이중 모드는 CPU가 명령어를 실행하는 모드를 두 가지로 구분하는 방식
- 커널 모드
- 사용자 모드
- 사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 함 → 이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출(시스템 콜)이라고 함
- 대표적인 운영체제 서비스 3가지
- 프로세스 관리
- 자원 접근 및 할당
- 파일 시스템 관리
- 참고:
- 이중 모드는 커널 모드와 사용자 모드를 지원하는 실행 모드이지만, 가상 머신을 통한 가상화를 지원하는 현대 CPU는 두 가지 모드 이상을 지원
- ex) 윈도우 운영체제에 가상 머신을 설치하면 가상 머신상에 리눅스 운영체제와 그를 기반으로 여러 응용 프로그램들을 설치하고 실행할 수 있음 이 때 가상 머신 또한 응용 프로그램이므로 사용자 모드로 작동함. 가상 머신에 설치된 응용 프로그램이 운영체제 서비스를 제공받기 위해서는 커널 모드로 전환되어야 하는데, 가상 머신에 설치된 운영체제도 사용자 모드로 작동하면 운영체제 서비스를 제공받기 어려움 → 가상화를 지원하는 CPU는 이중 모드 이외에 가상 머신을 위한 모드인 하이퍼 바이저 모드를 따로 둠 → 따라서 가상 머신 상에서 작동하는 응용 프로그램들은 하이퍼바이저 모드로써 가상 머신에 설치된 운영체제로부터 운영체제 서비스를 받을 수 있음
10. 프로세스와 스레드
10-1. 프로세스 개요
프로세스(process)란 실행 중인 프로그램을 의미한다. 프로그램은 실행 되기 전까지 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 보조기억장치에서 프로그램을 메모리에 적재하고 실행하는 순간 프로세스가 된다. 이를 “프로세서를 생성한다”라고도 표현한다.
포그라운드 프로세스(foreground process)
- 사용자가 볼 수 있는 공간에서 실행되는 프로세스
백그라운드 프로세스(background process)
- 사용자가 보지 못하는 공간에서 실행되는 프로세스
- 백그라운드 프로세스중에서 사용자와 상호작용하는 프로세스도 있지만, 사용자와 상호작용하지 않고 그저 묵묵히 정해진 일만 수행하는 백그라운드 프로세스도 있다. → 이를 유닉스 체계의 운영체제에서는 데몬(demon), 윈도우 운영체제에서는 서비스(service)라고 한다
프로세스 제어 블록(PCB)
- PCB(Process Control Block)이란 프로세스와 관련된 정보를 저장하는 자료구조이다. 프로세스가 차례로 CPU를 이용할 때, 인터럽트가 발생하면 다음 순서의 프로세스가 CPU를 할당 받는다. 운영체제는 이러한 프로세스의 실행 순서를 관리 할 때 PCB를 이용한다.
- PCB는 커널 영역에 생성되는데, 운영체제는 수많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리한다
그렇다면 PCB에는 어떤 정보들이 담길까?
- PID(프로세스 ID) : 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값
- 프로세스 상태
- CPU 스케줄링 정보
- 메모리 관리 정보
- 사용한 파일과 입출력장치 목록
앞서 프로세스가 차례로 CPU를 이용하면서 인터럽트가 발생하면 다음 순서의 프로세스가 CPU를 할당 받는다고 하였다. 이 때 “문맥 교환, 즉 context switching”이 발생한다.
문맥 교환
- 프로세스 A가 운영체제로부터 CPU를 할당 받아 실행되다가 시간이 다 되어 프로세스 B에 CPU 사용을 양보 한다고 가정해보자
- 프로세스 A는 프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력장치 등 중간 정보를 백업하고 다음 차례에 이 내용들을 다시 불러와 실행해야 한다
- 이러한 각종 정보들을 “문맥(context)”라고 하고, 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 싱행하는 것을 “문맥 교환(context switching)”이라고 한다
- 문맥 교환을 너무 자주 하면 오버헤드가 발생할 수 있기 때문에 문맥 교환이 자주 일어난다고 해서 반드시 좋은 건 아니다
프로세스의 메모리 영역
프로세스가 생성되면 커널 영역에는 PCB가 생성된다고 하였다. 그렇다면 사용자 영역에는 프로세스가 어떻게 배치될까?
→ 하나의 프로세스는 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다

참고:
코드 영역과 데이터 영역은 크기가 고정된 영역이라는 점에서 “정적 할당 영역”이라고 불리고, 힙 영역과 스택 영역은 프로세스 실행 과정에서 크기가 변할 수 있어 “동적 할당 영역”이라고 불린다
- 코드 영역 : 기계어로 이루어진 명령어가 저장된다. CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있다. 즉 코드 영역은 읽기 전용(read-only) 공간이다
- 데이터 영역 : 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. 대표적으로 “전역 변수”가 있다.
- 힙 영역 : 사용자가 직접 할당할 수 있는 저장 공간이다. 해당 메모리 공간을 더 이상 사용하지 않는다면 해당 공간을 반환해야 한다. 그렇지 않다면 메모리 누수가 발생한다.
- 스택 영역 : 일시적인 데이터가 저장되는 공간이다. 대표적으로 “매개 변수, 지역 변수”가 있다.
10-2. 프로세스 상태와 계층 구조
프로세스 상태

- 생성 상태
- 프로세스를 생성 중인 상태
- 메모리에 적재되어 PCB를 할당 받은 상태
- 준비 상태
- 당장이라도 CPU를 할당받아 실행할 수 있지만, 자신의 차례를 기다리는 상태
- 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치(dispatch)라고 한다
- 실행 상태
- CPU를 할당받아 실행 중인 상태
- 할당된 시간을 모두 사용한다면 다시 준비 상태가 되고, 실행 도중 입출력 장치를 사용하여 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다
- 대기 상태
- 입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝낼 때까지 기다려야하는데, 이를 대기 상태라고 한다
- 종료 상태
- 프로세스가 종료된 상태
프로세스 계층 구조
- 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이때 새 프로세스를 생성한 프로세스를 부모 프로세스(parent process), 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스(child process)라고 한다.
- 이처럼 프로세스는 계속 자식 프로세스를 생성할 수 있는데, 이를 계층적인 구조라고 한다
프로세스 생성 기법
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성한다
- 자식 프로세는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다
10-3. 스레드
스레드
- 스레드(thread)란 프로세스를 구성하는 실행의 흐름 단위다.
- 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다
프로세스 vs 스레드
- 전통적인 관점에서 하나의 프로세스는 한 번에 하나의 일을 처리했다. 이는 결국에는 실행의 흐름 단위가 하나라는 점에서 “단일 스레드 프로세스”라고 볼 수 있다
- 하지만 스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다. 이는 곧 “멀티 스레드 프로세스”라고 볼 수 있다
멀티프로세스와 멀티스레드
컴퓨터는 실행 과정에서 여러 프로세스가 동시에 실행될 수 있고, 그 프로세스를 이루는 스레드는 여러 개 있을 수 있다. 여러 프로세스를 동시에 실행하는 것을 멀티프로세스, 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드라고 한다.
그렇다면 단일 스레드 프로세스 여러 개를 실행하는 것과, 하나의 프로세스를 여러 스레드로 실행하는 것의 차이는 뭘까?
프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다.
프로세스를 fork하여 같은 작업을 하는 동일한 프로세스를 여러 개 실행하면 코드 영역, 데이터 영역, 힙 영역 등을 비롯한 모든 자원이 복제되어 메모리에 적재되는데, 이는 곧 같은 프로그램을 실행하기 위해 메모리에 동일한 내용들이 중복해서 존재하는 것을 의미한다.
스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지고 있는 자원을 공유한다.
11. CPU 스케줄링
11-1. CPU 스케줄링 개요
운영체제는 프로세스들에게 CPU 자원을 배분해야 하는데, 이를 CPU 스케줄링이라고 한다. 만약 현명하게 CPU를 배분하지 못하면 반드시 실행되어야 할 프로세스들이 실행되지 못하거나, 급하지 않은 프로세스들만 주로 실행되는 등 무질서한 상태가 발생할 수도 있다.
따라서 CPU 스케줄링은 필수이고, 스케줄링 방법에는 여러가지가 있다. 스케줄링에 대해 알아보기 전에 알아야 할 배경지식에 대해 먼저 알아보자.
대부분의 프로세스들은 CPU와 입출력장치를 모두 사용하며 실행되는데, 달리 말하면 프로세스는 실행 상태와 대기 상태를 반복하며 실행된다. 비디오 재생이나 디스크 백업 작업을 담당하는 프로세스와 같이 입출력 작업이 많은 프로세스를 입출력 집중 프로세스(I/O bound process) 라고 하고, 복잡한 수학 연산, 컴파일, 그래픽 처리 작업을 담당하는 프로세스와 같이 CPU 작업이 많은 프로세스를 CPU 집중 프로세스(CPU bound process)라고 한다.
이 때, CPU 집중 프로세스와 입출력 집중 프로세스는 각각 실행 상태와 대기 상태에 더 많이 머무르게 되는데 모두 동일한 빈도로 CPU를 사용하는 것은 비합리적이다. 그렇기 때문에 중요도에 맞게 각 프로세스의 PCB에 우선순위를 명시하고, 우선순위에 맞게 프로세스를 실행한다.
하지만 운영체제가 모든 프로세스의 PCB를 보면서 우선순위에 맞게 실행시키는 것은 비효율적이기 때문에, 운영체제는 프로세스들에게 “줄을 서서 기다릴 것”을 요구한다. 이 줄을 스케줄링 큐로 구현하고 관리한다.
여기까지 스케줄링 큐에 대해 알아보았는데, 이 스케줄링 큐를 관리하는 방법인 CPU 스케줄링에 대해 알아보고, 각 스케줄링의 특징에 대해서는 다음 챕터에서 알아보자.
스케줄링은 크게 선점형 스케줄링과 비선점형 스케줄링으로 나뉜다.
- 선점형 스케줄링
- 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식
- 비선점형 스케줄링
- 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까진 다른 프로세스가 끼어들 수 없는 스케줄링 방식
11-2. CPU 스케줄링 알고리즘
지금부터 스케줄링 알고리즘 종류 7가지를 알아볼 것이다. 하지만 알고리즘은 매우 다양하고 운영체제마다 서로 다른 스케줄링 알고리즘을 사용하기 때문에 각 스케줄링 알고리즘에서 사용된 아이디어, 작동 방식, 장단점을 이해하는 데에만 집중하자.
선입 선처리 스케줄링
FCFS 스케줄링(First Come First Served) 이라고도 불리는 이것은 준비 큐에 삽입된 순서대로 프로세스들을 처리하는 비선점형 스케줄링 방식이다. 프로세스들이 기다리는 시간이 매우 길어질 수 있는 호위효과(convoy effect)가 발생할 수 있는 단점이 있다.
최단 작업 우선 스케줄링
준비 큐에 삽입된 프로세스들 중 CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 스케줄링 방식을 최단 작업 우선 스케줄링 혹은 SJF(Shortest Job First) 스케줄링 이라고 한다
라운드 로빈 스케줄링
선입 선처리 스케줄링에 타임 슬라이스라는 개념이 더해진 스케줄링 방식이다. 타임 슬라이스란 각 프로세스가 CPU를 사용할 수 있는 정해진 시간을 의미한다.
최소 잔여 시간 우선 스케줄링
최소 잔여 시간 우선 스케줄링 혹은 SRT(Shortest Remaining Time) 스케줄링은 최단 작업 우선 스케줄링 알고리즘과 라운드 로빈 알고리즘을 합친 스케줄링 방식이다.
우선순위 스케줄링
프로세스들에 우선순위를 부여하고 가장 높은 우선순위를 가진 프로세스부터 실행하는 스케줄링 알고리즘이다. 하지만 우선순위가 높은 프로세스들에 의해 우선순위가 낮은 프로세스들은 실행이 계속 연기될 수 있는 기아(Starvation) 현상이 발생할 수 있다. 이를 방지하기 위한 대표적인 기법으로 에이징(aging)이 있는데, 이는 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식이다.
다단계 큐 스케줄링
다단계 큐 스케줄링은 우선순위 스케줄링의 발전된 형태로, 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식이다. 우선순위가 가장 높은 큐에 있는 프로세스들을 먼저 처리하고, 우선순위가 가장 높은 큐가 비어 있으면 그 다음 우선순위 큐에 있는 프로세스들을 처리한다.
다단계 피드백 큐 스케줄링
앞서 설명한 다단계 큐 스케줄링에서는 프로세스들이 큐 사이를 이동할 수 없기 때문에 다시 기아 현상이 발생할 수 있다. 이를 보완한 다단계 피드백 큐 스케줄링은 프로세스들이 큐 사이를 이동할 수 있다.
- 새로 준비 상태가 된 프로세스가 있다면 우선 우선순위가 가장 높은 우선순위 큐에 삽입되고 일정 시간(타임 슬라이스)동안 실행된다.
- 만약 프로세스가 해당 큐에서 실행이 끝나지 않는다면 다음 우선순위 큐에 삽입되어 실행된다.



댓글