bdfgdfg

5장 프로세스의생성과 소멸 본문

CS/시스템 프로그래밍

5장 프로세스의생성과 소멸

marmelo12 2021. 8. 20. 15:02
반응형

프로세스(Process)의 이해

● 프로세스란?

- 메인 메모리로 이동하여 실행중인 프로그램 -> 일반적인 정의

 

예로들어 우리의 하드디스크에 저장된 벽돌깨기라는 게임을 더블클릭하여 실행하면 이 프로그램을 실행하기 위해

메모리 할당이 이뤄지고 이 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로그램은 프로세스.

 

여기까지가 프로세스의 일반적인 정의다.

 

하지만 누군가가 프로세스를 구성하고 있는것은 무엇인가? 라고 물어본다면 어떻게 답을 해야할까.

 

● 프로세스를 구성하는 요소 (프로세스의 범위)

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

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

 -> 이 의미는 A와 B프로세스가 레지스터를 공유해서 사용하는 게 아님. 자세한 설명은 밑에서. 즉 A라는 프로세스의 독립적인 메모리(리소스,대상,레지스터에 올라가는 데이터)는 프로세스의 범주에 포함시킬 수 있다.

 

근데 궁금한게 있다. 우리의 메모리 공간이 256MB인데 만약 현재 실행한 프로그램(프로세스)가 1G등 메모리 공간을 넘어설 경우엔 어떻게 메모리에 올라갈까. -> 이것은 가상 메모리(Virtual Memory)의 도움을 받아서 그런 것. 나중에 나옴

 

각 메모리 영역이 무엇을 하는지는 알 것. Code영역은 실행파일을 구성하는 명령어들이 올라간다.

 

이제. 저렇게 위의 그림의 형태가 프로그램 실행 시 만들어지는 메모리 공간의 구성이며 프로세스의 실체이다.

 

● Register Set

- 프로세스를 구성하는 요소로 더불어 생각해봐야 하는 것은 CPU내에 존재하는 레지스터들.

- 앞서 벽돌깨기 프로그램을 실행하면 CPU의 구성품중 하나인 레지스터에 필요한 데이터가 채워진다.

- 즉 CPU내에 존재하는 레지스터들은 현재 실행중인 프로그램을 위한 데이터들로 채워지기에 레지스터의 상태까지도 프로세스의 일부로 포함시켜 말한다.

 

프로세스의 스케줄링과 상태 변화

우리는 궁금한게 있다. CPU는 하나인데 어떻게 여러 개의 프로그램이 동시에 실행 가능한 것인가?

 

● 프로세스 스케줄러(OS에서 S/W적으로 구현이되어있음) 기능

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

 

- 즉 하나의 CPU가 여러 개의 프로세스를 번갈아 가면서 실행한다.

  -> 여러개의 프로세스가 있을때 우리의 운영체제는 하나의 프로세스만 실행하는게 아니라 여러개의 프로세스를 번갈아가며 실행한다 -> 스케쥴러. 그렇기에 현재 A프로세스에서 진행하던 데이터를 잠시 어딘가에 저장해두었다가 다른 프로세스(B)의 데이터가 레지스터에 올라간다. -> 컨텍스트 스위칭

 

- CPU는 하나이지만 우리는 여러 프로세스를 사용하기에 스케줄러를 통해 적절히 사용된다.

 

간단하게 말하면 스케쥴러가 여러개의 프로세스를 스케쥴링 알고리즘에 의해 적절히 선택하여 실행한다.

 

결국 우리 사용자들은 CPU가 '동시'에 여러개의 프로그램을 실행시킨다고 생각하게 되지만

사실은 멀티 프로세스 운영체제에서 여러 개의 프로세스가 실행되는 것처럼 보이는 이유는 여러 개의 프로세스들이 CPU 할당시간을 나누기 때문이다.

 

● 스케줄링 방법

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

- 프로세스의 CPU할당 순서 및 방법을 결정짓는 일을 가리켜 스케줄링. 이때 사용되는 알고리즘을 스케줄링 알고리즘.

- 스케줄링 알고리즘을 적용해서 실제로 프로세스를 관리하는 운영체제 요소(모듈)을 가리켜 스케쥴러라 함.

 

● 프로세스의 상태 변화

S와 E는 각각 Start, End 간선 옆에 숫자는 단계별.

Running : CPU에 의해 실행중인 상태.

Ready    : CPU에 의해 실행되기를 기다리는 상태. 스케쥴러가 Ready상태에 있는 프로세스들 중 하나를 선택해 Running상태로 변환.

Blocked  : 실행 중에 있는 프로세스가 실행을 멈추는 상태

프로세스가 Ready->Running 상태로 바꿔주는 것은 스케쥴러가 결정한다.

 

3개의 프로세스가 있다고 보자.

 

1단계

: 이 3개의 프로세스가. 예로들어 A.exe, B.exe, C.exe등의 프로그램을 실행시킨다고 해서 바로 Running상태로 들어가는게 아니다. 현재 실행중인 프로세스가 있을 수 있기 때문. 그렇기에 Ready상태에서 기다리면서 스케쥴러에게 선택받기를 기다리는 상태.

 

2단계

: 이제 어떤 프로세스가 스케쥴러에게 선택받고 Running상태에 들어갔다. 

 

3단계

: 연산에 있어서 CPU에 의존적이지 않은 연산이 존재하는데 그것이 바로 I/O(여러 I/O)연산. 그렇기에 만약 현재 Running상태인 프로세스가 만약 I/O연산을 한다면 잠시 다른 프로세스에게 CPU를 넘기고(정확히는 스케쥴러가) 자기는 잠시 다른곳으로 이동한다. -> 4단계

 

다른 경우 스케쥴러가 스케쥴링 알고리즘에 의해 다른 프로세스가 와야할 경우(그 프로세스의 우선순위가 높다거나)   현재 Running상태인 프로세스가 양도를 하고 Ready상태로 내려온다.

 

4단계

: 근데 과연 어디로 이동할까? Ready? Blocked? Ready로 간다고 가정해보면 스케쥴러에 의해 이 프로세스가 다시 선택받았을 때, 아직도 I/O연산을 한다면 다시 Ready로 돌아가야한다. 그렇기에 Blocked로 가는게 깔끔하다. Blocked상태는 스케쥴러의 관심대상이 아니기에 I/O 연산이 끝나기전까지 Ready나 Running상태가 되지않게끔 둔다.

(보통 I/O연산을 하는 프로세스는 Blocked상태가 된다고 한다)

(헷갈릴 수 있는점 Ready상태는 스케쥴러에 의해 선택될 수 있는 상태, Blocked상태는 스케쥴러 관심 밖의 상태)

 

5단계 

: I/O연산이 끝난 프로세스는 다시 Ready상태로 돌아간다.

 

컨텍스트 스위칭(Context Switching) ★

앞에서 멀티 프로세스 운영체제의 기본 원리에 대해 많은 설명을 하였다.

여러개의 프로세스들이 CPU 실행시간을 나누는 방식으로 동시 실행되는 효과를 얻고 있으며, 프로그램 실행의 상당 시간을 I/O에 소모하기 때문에 둘 이상의 프로세스 실행은 CPU의 할용도를 높여 성능 향상까지 가져온다.

 

하지만 실행 중인 프로세스(Running 상태의 프로세스)의 변경은 시스템에 많은 부하를 가져다 주기도 한다.

 

앞에서 CPU내에 존재하는 레지스터들은 현재 실행중에 있는 프로세스 관련 데이터들로 채워진다. 라고 말했다.

 

그렇다면 실행 중인 프로세스가 변경되면 CPU내에 존재하는 레지스터들의 값이 변경된다.

A,B프로세스가 있고 A프로세스가 현재 Running중인데 B프로세스가 와서 B프로세스의 데이터가 레지스터로 채워져야 하는 상태. 그렇다고 A 프로세스의 데이터를 날릴 순 없다. -> 즉 어딘가에 저장을 해야한다

왜? 다시 A프로세스가 스케쥴러에 의해 선택을받고(Ready상태에서) 다시 실행되어야 하기 떄문에!

 

즉 어딘가에 진행중이던 데이터를 저장하고. 다시 프로세스가 실행할 때 다시 복원시켜야하는 일련의 과정이 존재.

 

다음 그림을 보자.

 

위와 같이 A프로세스가 현재 Running상태. B프로세스가 Ready상태.

 

여기서 이제 B프로세스가 Running상태가 되었을 때, A프로세스의 레지스터 Set(데이터들)를 메모리에 잠시 저장해두고. 

B프로세스를 위해 저장되었던 데이터를 다시 레지스터에 채운다.

 

이 일련의 과정이 컨텍스트 스위칭(Context Switching)

 

실행되는 프로세스의 변경과정에서 발생하는 컨텍스트 스위칭은 시스템에 많은 부담을 준다

 

이는 레지스터의 개수가 많은 시스템일수록, 프로세스별로 관리되어야 할 데이터 종류가 많을수록 더하다.

-> 멀티 프로세스 운영체제의 단점

 

 

 

반응형

'CS > 시스템 프로그래밍' 카테고리의 다른 글

컴퓨터 구조 - (1)  (0) 2021.08.09
Comments