LISTORY

[윈도우 시스템즈 프로그래밍] 프로세스와 스케줄러의 이해 본문

IT/윈도우 프로그래밍

[윈도우 시스템즈 프로그래밍] 프로세스와 스케줄러의 이해

LiStoryTeller 2018. 6. 2. 17:00


간만에 하려니까 의욕이 떨어진다...


뇌를 자극하는 윈도우 시스템즈 프로그래밍 책의 유투브 강의 정리이다.


이번에 정리할 내용은 프로세스의 생성과 소멸 부분이다.


⊙ YouTube 주소 ⊙ ☞   프로세스와 스케줄러의 이해



프로세스와 스케줄러의 이해


이번장에서 다룰 내용은 프로세스와, 이 프로세스를 관리해주는 스케줄러에 대해서이다.



⊙ 프로세스란 무엇이냐


일반적으론 메인 메모리로 이동하여 실행중인 프로그램을 뜻한다. 하지만 이 정의는 뭔가 막연하다. 


예를 들어 벽돌파일 게임을 하고있다 하자. 


그럼 벽돌깨기 게임 윈도우가 프로세스인가??


개발자 입장에서는 다르다. 그렇다면 프로세스를 이루고 있는 것이 무엇일까?


기본적으로 프로세스 생성하면 메모리가 할당된다.


예를 들어 256메가 메모리가 존재한다. 우리는 프로세스를 생성하여 4기가를 할당 받았다.


즉, RAM 보다 더 큰 메모리 공간을 할당받은 것이다. 이럴때엔 가상메모리의 도움을 받는데, 이 부분은 후에 기술하겠다.


여하튼 이렇게 프로그램이 실행된다. 즉, CPU가 실제 작업을 시작한다.


이때 동작은 연산 장치인 ALU에서 실행하는데, 이때 또 중요한 것이 레지스터 SET이다.


레지스터 SET은 현재 실행중인 프로그램의 정보들로 채워지게 되어 있다.


예를 들어 프로세스 A와 B가 실행중이라 가정해보자.


A 프로세스가 실행중일 경우, 현재 레지스터에는 A 프로세스의 정보들로 가득 찬다. 


CPU는 동시에 두 프로세스를 돌릴 수 없으므로 A 프로세스를 실행하다가 B 프로세스를 실행해야 하는데,


그럼 이때 A 프로세스를 위해 채워졌던 레지스터를 다른 곳에 저장하고, 그 공간은 B 프로세스를 위해 채워져야 한다.


이러한 특성을 가지고 있는 레지스터 SET과 이러한 메모리 공간 역시 프로세스의 범주에 포함시킨다.


즉, 프로세스에 종속적인 것은 무조건 프로세스에 포함시킨다.


프로세스를 구성하는 범주는 프로세스 별로 독립적으로 할당받는 리소스이며, 여기에는 메모리 공간, 가상 메모리 공간도 포함된다.


프로세스별로 독립적으로 사용하는 레지스터 set도 프로세스의 범주에 포함시킬 수 있다.


⊙ 프로세스의 범위

- 메모리 구조 + 레지스터 set

- 프로세스 별 독립적인 대상은 프로세스의 범주에 포함시킬 수 있다.



아까 말했던 것 처럼 A 프로세스가 진행되다가 B 프로세스를 진행할 때, 안에 있는 레지스터 정보는 딴 곳에 저장되고 다른 정보로 채워진다.


이것을 Context Switching이라 한다.


CPU에서 이 과정은 굉장히 자주 일어나고, 이는 사실 시스템에 부담이 된다.


이를 위해 레지스터 SET을 여러개 가지고 있어, 프로세스 별로 레지스터를 할당하는 디자인도 존재한다.



⊙ 프로세스 스케줄러


윈도우즈 운영체제에서 제공하는 SW 장치(Block)이다. 말 그대로 프로세스를 스케줄링 한다.


앞서 말했듯이, CPU는 하난데 동시에 여러개의 프로세스를 돌릴 때가 많다.


그래서 정책을 결정하여, 그 정책대로 스케줄러가 공평하게 프로세스를 CPU에 가져다 준다.


하지만, CPU 입장에서 보면 스케줄러 역시 또 하나의 프로세스이다.


즉, 스케줄러가 동작하는 순간에, 다른 프로세스들은 실행되지 못한다.


그러므로 스케줄러 역시 지나치게 많이 돌리지 않는 편이 좋다.


⊙ 프로세스 스케줄러 기능

- 둘 이상의 프로세스가 적절히 실행되도록 컨트롤


⊙ 스케줄링 방법

- 스케줄링 알고리즘에 따라 다양함



⊙ 프로세스의 상태


스케줄러가, 프로세스가 어떻게 관리되는가


프로세스는 다음과 같은 상태 정보를 지닌다.



S와 E는 시작과 끝을 나타낸다.


프로세스 A, B, C과 있다고 가정하고, 각각의 상태에 대해 설명하겠다.


일단 Running 상태는 CPU에 의해 실행되고 있는 상태이다.


현재 실행중인 프로세스는 하나이므로 Running 상태인 프로세스는 하나이다.


반면 Ready 상태는 프로세스가 준비되어 Running을 기다리는 상태이다.


C가 Running 상태라 하고 A와 B가 실행을 준비중인 상태라 하면 A와 B 프로세스가 Ready 상태인 것이다.


여기서 C가 Blocked 상태로 간다 하더라고 A, 또는 B가 바로 Running 상태로 갈 수는 없다.


어떠한 프로세스가 Running 상태로 갈 지 결정하는 것은 스케줄러가 한다.


즉, Ready 상태는 스케줄러가 나를 선택해 주기를 기다리는 상태이다.


모든 프로세스는 처음에 Ready 상태가 되고, 스케줄러에 의해 선택되어야 Running 상태가 될 수 있다.


다시 가정으로 돌아가 보자.


C는 Running 중이고 A, B가 대기중이다.


연산 중에서 ALU, 즉 CPU에 의존적인게 있고 아닌 것이 있다.


만일 CPU에 의존적이지 않은 작업이 있다면, 두 작업은 병행이 가능하다. I/O 연산 또한 그닥 CPU에 의존적이지 않다.


일반적인 프로그램은 대부분 I/O 연산을 필요로 하므로, 프로세스가 I/O 연산을 할 때에 다른 프로세스를 Running 상태로 돌릴 수 있다.


C 프로세스가 이제 I/O 연산을 필요로 한다.


근데 여기서 C가 Ready 상태로 가버리면 스케줄러에 의해 다시 Running 상태로 가게될 수 있고, 이 경우 C는 아직 I/O 작업이 끝나지 않았으므로 다시 Ready 상태로 돌아가야 한다.


이 필요없는 과정을 없애기 위해 Blocked 상태를 만들었다.


일반적으로 I/O 작업을 필요로 할 때 Blocked 상태가 되고, 여기서 I/O 작업이 끝날 때 까지 기다린다.


즉, CPU 의 연산을 크게 필요로 하지 않는 경우에 Blocked으로 가고 끝나면 다시 Ready 상태가 된다.


정리하자면 이렇다.


우리 눈에는 여러 프로세스가 동시에 돌아가는 것으로 보이지만 


사실 CPU는 한번에 하나의 프로세스만 돌릴 수 있다.


여러 개의 프로세스가 동시에 돌아가는 것 처럼 보이게 하기 위해서는 여러 프로세스들을 번갈아 가며 실행하는 것이 필요한데


이를 위해 프로세스는 Ready와 Running 상태를 반복한다.


Running 상태에서 I/O 작업을 필요로 하게 되면 그 프로세스는 Blocked 상태가 되어 I/O 작업이 끝날 때 까지 기다리고


그 동안 다른 프로세스가 Running 상태가 된다.


Blocked 된 프로세스는 작업이 끝날 경우 다시 Ready 상태로 돌아가 선택을 기다린다.



Comments