카테고리 없음

[혼공컴운] 4주차 | 운영체제 시작하기, 프로세스와 스레드, CPU 스케줄링

muncaem 2024. 7. 28. 23:51

이번 주차는

▶ Chapter 9 운영체제 시작하기

▶ Chapter 10 프로세스와 스레드

▶ Chapter 11 CPU 스케줄링 이다.


먼저 Chapter 9 운영체제 시작하기에 대해 알아보자.

 

운영체제란,

실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이다.

 

>>> 여기서 필요한 자원이란 무엇을 의미할까.

프로그램 실행에 마땅히 필요한 요소들을 시스템 자원(자원) 이라고 한다. CPU, 메모리, 보조기억장치, 입출력장치 등이 있다.

 

운영체제 또한 프로그램이기 때문에 메모리에 적재되어야 한다.

하지만 특별한 프로그램이기에 항상 컴퓨터가 부팅될 때 메모리 내 커널 영역에 따로 적재되어 실행된다.

 

그렇다면 우리는 메모리를 아래와 같이 구분지을 수 있다.

커널 영역 (운영체제)
사용자 영역 (응용 프로그램) 

운영체제의 핵심 서비스를 담당하는 부분을 커널이라고 한다.

(+) 커널에 포함되지 않는 서비스는 대표적으로 사용자 인터페이스로 GUI(그래픽 유저 인터페이스)와 CLI(커맨드 라인 인터페이스)가 있다.

 

운영체제는 컴퓨터 자원의 질서 있는 사용을 위해

응용 프로그램들이 자원에 접근하려고 할 때, 오직 자신을 통해서만 접근하도록하여 자원을 보호한다.

 

이러한 문지기 역할은 이중 모드로 구현된다.

이중 모드란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다.

 

>>> 여기서 사용자 모드란, 운영체제 서비스를 제공받을 수 없는 실행 모드로 자원에 접근할 수 없다.

>>> 커널 모드란, 운영체제 서비스를 제공받을 수 있는 실행 모드이다. 따라서 자원에 접근할 수 있다.

 

사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있다.

이러한 시스템 호출은 일종의 인터럽트로 특정 명령어에 의해 발생하기에 소프트웨어 인터럽트라고 한다.

 

따라서 일반적으로 응용 프로그램은 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행된다.


이번엔 운영체제의 핵심 서비스를 살펴보자.

 

먼저, 프로세스 관리가 있다.

>>>여기서 프로세스란, 실행 중인 프로그램을 말한다.

일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다. 그렇기에 운영체제는 다양한 프로세스를 관리하고 실행할 수 있어야 한다.

 

두번째로, 자원 접근 및 할당이 있다.

운영체제가 CPU, 메모리, 입출력장치를 어떻게 관리하고 어떤 기능을 제공하는지 순서대로 보자.

 

- CPU 스케줄링: 운영체제가 프로세스들에 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용하게 할 것인지, 얼마나 오래 CPU를 이용하게 할 지를 결정한다.

 

- 메모리: 새로운 프로세스가 적재될 때마다 어느 주소에 적재할지 결정한다.

- 입출력장치: 입출력장치는 하드웨어 인터럽트로 실행된다. 인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있다. 따라서 운영체제는 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행한다.

 

세번째로, 파일 시스템 관리가 있다.

우리는 여러 파일을 열고, 생성하고, 삭제하며 한데 묶어 폴더로 관리한다. 이를 가능하게 하는 것이 운영체제의 파일 시스템 서비스이다.


다음은 Chapter 10 프로세스와 스레드이다.

 

모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU 자원은 한정되어 있다. 따라서 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고 자원을 배분해야 한다. 이를 위해 프로세스 제어 블록(PCB)를 이용한다.

 

프로세스 제어 블록 , PCB는 프로세스와 관련된 정보를 저장하는 자료구조이다.

PCB는 커널 영역에 생성되며 특정 프로세스를 식별할 ID값과 해당 프로세스를 처리하는데 필요한 정보를 가지고 있다. 이는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.

 

>>>PCB에 담기는 정보들에 알아보자.

1. PID(프로세스 ID): 특정 프로세스를 식별하기 위해 부여하는 고유 번호이다.

2. 레지스터 값: 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값이 담긴다.

3. 프로세스 상태: 현재 프로세스가 어떤 상태인지 기록된다.

4. CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보가 기록된다.

5. 메모리 관리 정보: 프로세스가 어느 주소에 저장되어 있는지, 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담긴다. 주소를 알기위한 또 다른 중요한 정보인 페이지 테이블 정보도 담긴다.

6. 사용한 파일과 입출력장치 목록: 프로세스 실행 과정에서 특정 입출력장치나 파일을 사용할 경우, 이를 명시한다.


운영체제는 여러 개의 프로세스를 돌아가며 실행해야 한다.

따라서 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 저장해둬야 하는데 이를 문맥이라고 한다. PCB에 기록되는 정보를 문맥이라고도 할 수 있다.

 

또한 문맥 교환이란, 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 말한다.


사용자 영역에는 프로세스가 어떻게 배치될까?

 

하나의 프로세스는 사용자 영역에 [ 코드 영역 | 데이터 영역 | 힙 영역 | 스택 영역 ] 으로 나뉘어 저장된다.

- 코드 영역: 읽기 전용으로 기계어로 이루어진 명령어가 저장된다.

- 데이터 영역: 프로그램이 실행되는동안 유지할 데이터가 저장되는 공간으로 전역 변수가 대표적이다.

- 힙 영역: 프로그래머가 직접 할당할 수 있는 저장 공간이다. 

- 스택 영역: 데이터를 일시적으로 저장하는 공간으로 매개 변수, 지역 변수가 있다.

 

>>> 여기서 코드 영역과 데이터 영역은 그 크기가 변하지 않으므로 정적 할당 영역이라고도 부르며 힙 영역과 스택 영역은 크기가 변할 수 있으므로 동적 할당 영역이라고 부를 수 있다.


프로세스가 가질 수 있는 대표적인 상태에 대해 알아보자.

1. 생성 상태: 이제 막 메모리에 적재되어 PCB를 할당 받은 상태

2. 준비 상태: 차례가 올 때까지 기다리고 있는 상태

-> (실행 상태로 전환되는 것: 디스패치)

3. 실행 상태: CPU를 할당받아 실행 중인 상태로 할당된 일정 시간 동안만 CPU를 사용할 수 있다.

4. 대기 상태: 입출력장치의 작업을 기다리는 상태로 입출력 작업이 완료되면 다시 준비 상태가 된다.

5. 종료 상태: 프로세스가 종료된 상태로 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

 

아래는 프로세스 상태를 도표로 표현한 것으로 프로세스 상태 다이어그램이라고 한다.

https://itwiki.kr/w/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EC%83%81%ED%83%9C

 


다음으로 프로세스 계층 구조에 대해 알아보자.

 

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할수 있다.

이 때, 새 프로세스를 생성한 프로세스를 부모 프로세스, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다. 

>>> 여기서 자식 프로세스는 PCB의 부모 프로세스의 PID인 PPID를 가지기도 한다.

>>> 프로세스 생성 기법을 알아보자.

1. fork: 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성한다.

2. exec: 만들어진 복사본 자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

(+) fork와 exec는 시스템 호출이다.

 

이처럼 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리한다.

 

컴퓨터가 부팅될 때 실행된느 최초의 프로세스가 자식프로세스들을 생성하고, 생성된 자식 프로세스들이 새로운 프로세스들을 낳는 형식으로 여러 프로세스가 동시에 실행되는 것이다. 이를 프로세스 계층 구조라고 한다.  


이번에는 스레드에 대해 알아보자.

 

스레드란, 프로세스를 구성하는 실행 단위이다.

프로세스 내에서 [ 각기 다른 스레드 ID, 프로그램 카운터, 레지스터 값, 스택 ]으로 구성된다. 스레드는 프로세스의 자원을 공유하는 것이 핵심으로 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행된다.

 

여러 프로세스를 동시에 실행하는 것을 멀티프로세스,

여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드라고 한다.

 

여러 프로세스를 병행 실행하는 것보다 같은 프로세스 내의 자원을 공유하기 때문에 메모리를 더 효율적으로 사용할 수 있으며 서로 협력과 통신에 유리하다. 하지만, 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.


마지막으로 Chapter 11 CPU 스케줄링을 알아보자.

 

프로세스마다 우선순위가 있는데 우선순위가 높은 프로세스에는 대표적으로 입출력 작업이 많은 프로세스가 있다.

운영체제는 상황에 맞게, 프로세스의 중요도에 맞게 프로세스가 CPU를 이용할 수 있도록 하기 위해 프로세스마다 우선순위를 부여한다. 우선순위를 PCB에 명시하고 우선순위가 높은 프로세스는 더 빨리 더 자주 실행된다.

 

프로세스 종류마다 입출력장치를 이용하는 시간과 CPU를 이용하는 시간의 양에는 차이가 있는데

실행 상태보다 입출력을 위한 대기 상태에 더 많이 머무르는 프로세스를 입출력 집중 프로세스라고 하며

대기 상태보다 실행 상태에 더 많이 머무리는 프로세스를 CPU 집중 프로세스라고 한다.

 

운영체제가 일일이 모든 프로세스의 PCB를 확인하고 우선순위를 처리하는 것은 비효율적이다.

 

따라서 메모리로 적재되고 싶은(새로 생성되는) 프로세스들을 큐에 삽입하여 줄을 세우고, CPU를 이용하고 싶은 프로세스들을 따로 큐에 줄 세우고, 특정 입출력장치를 이용하고 싶은 프로세스들도 따로 큐에 줄을 세운다.

>>> 운영체제는 이 줄을 스케줄링 큐로 구현하고 관리한다.

 

이 큐에는 여러 종류가 있는데 대표적으로 큐는 다음과 같다.

준비 큐는 CPU를 이용하고 싶은 프로세스들이 서는 줄을 의미한다.

대기 큐는 입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄을 의미한다.


갑자기 다른 급한 프로세스가 운영체제에 CPU를 지금 당장 사용하길 요청하면 어떻게 할 수 있을까?

 

1. 선점형 스케줄링: 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식으로 자원 사용을 독점할 수 없다.

2. 비선점형 스케줄링: 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까지 다른 프로세스가 끼어들 수 없는 스케줄링 방식으로 독점할 수 있다.

 

현재 대부분의 운영체제는 선점형 스케줄링 방식인데 이는 골고루 자원을 배분할 수 있지만 문맥 교환 과정에서 오버헤드가 발생할 수 있다. 반면 비선점형 스케줄링은 오베헤드가 선점형보다는 적지만 모든 프로세스가 골고루 자원을 사용할 수 없다는 단점이 있다.


스케줄링 알고리즘은 매우 다양하고 운영체제도 저마다 다른 스케줄링 알고리즘을 사용한다.

여러 알고리즘 중 다음과 같은 스케줄링 알고리즘에 대해 알아보자.

 

1. 선입 선처리 스케줄링(FCFS 스케줄링)

준비 큐에 삽입된 순서대로 프로세스들을 처리하는 비선점형 스케줄링 방식이다. 때때로 프로세스들이 기다리는 시간이 매우 길어질 수 있는 부작용이 있다. 이를 호위 효과라고 한다.

 

2. 최단 작업 우선 스케줄링(SJF 스케줄링)

준비 큐에 삽입된 프로세스들 중 CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 스케줄링 방식이다. 기본적으로 비선점형 스케줄링 알고리즘이다.

 

3. 라운드 로빈 스케줄링

선입 선처리 스케줄링에 타임 슬라이스라는 개념이 더해진 방식이다. 타임 슬라이스란 각 프로세스가 CPU를 사용할 수 있는 정해진 시간을 의미한다. 선점형 스케줄링이다.

 

4. 최소 잔여 시간 우선 스케줄링(SRT 스케줄링)

최단 작업 우선 스케줄링 알고리즘과 라운드 로빈 알고리즘을 합친 스케줄링 방식이다. 정해진 타임 슬라이스만큼 CPU를 사용하되 다음 프로세스로는 남아있는 작업 시간이 가장 적은 프로세스가 선택된다.

 

5. 우선순위 스케줄링

프로세스들에 우선순위를 부여하고 가장 높은 우선순위를 가진 프로세스부터 실행하는 스케줄링 알고리즘이다. 우선 순위가 낮은 프로세스는 우선순위가 높은 프로세스들에 의해 실행이 계속 연기될 수 있는데 이를 기아 현상이라고 한다. 이를 방지하기 위해 오랫동안 대기한 프로세스의 우선 순위를 점차 높이는데 이를 에이징이라고 한다.

 

6. 다단계 큐 스케줄링

우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식이다. 따라서 큐 별로 타임 슬라이스를 여러 개 지정할 수도 있고 큐마다 다른 스케줄링 알고리즘을 사용할 수도 있다.

 

7. 다단계 피드백 큐 스케줄링

다단계 큐 스케줄링은 우선순위가 낮은 프로세스들은 게속 연기되어 기아 현상이 발생할 수도 있다. 따라서 프로세스들이 큐 사이를 이동할 수 있도록 보완한 스케줄링 방식이다. 새로 준비 상태가된 프로세스를 가장 높은 우선순위 큐에 삽입하고 CPU를 오래 사용할 수록 점차 우선순위를 낮춘다.