Post List

2017/11/27

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

프로세스에 대해서 알아보겠습니다. 프로세스란 실행 중에 있는 프로그램을 의미합니다.
예를 들어 벽돌깨기 게임이 하드디스크에 저장되어 있다고 가정할 때, 이 게임의 실행파일을 프로그램이라 부릅니다. 
이 프로그램을 실행시키는 순간, 프로그램의 실행을 위해 메모리(RAM)할당이 이뤄지고, 이 메모리 공간으로 바이너리 코드가 올라가게 되는데요, 이 순간부터 프로그램은 프로세스라고 불리게 됩니다. 즉, 프로세스란 실행 중에 있는 프로그램을 의미한답니다.

프로세스를 구성하는 요소
 * Data영역   - 기본적으로 전역변수나 static변수의 할당을 위해 존재하는 메모리 영역입니다.
 * Stack영역  - 지역변수 할당과 함수 호출 시 전달되는 인자값들의 저장을 위해 존재하는 영역입니다.
 * Heap영역   - 동적 할당(malloc, calloc 함수에 의한 할당)을 위해 존재하는 영역입니다.
 * Code영역  - 프로그램을 실행시키면, 실행파일 내에 존재하는 명령어들이 메모리상에 올라가서 순차적으로 실행된다고 하였습니다.
                   이렇게 실행파일을 구성하는 명령어들이 올라가는 메모리 영역을 말합니다.

프로그램 실행을 위해서 명령어들이 메모리 공간에 올라와 있는 상태이고, 프로그램 실행을 위해서 필요한 메모리 공간이 할당되어 있는 상태이기 때문에 이 상태를 프로세스라고 표현하기도 합니다.

프로세스를 구성하는 요소로 더불어 생각해봐야 하는 것은 CPU내에 존재하는 레지스터들입니다.
프로그램 실행을 위해서는 레지스터들이 절대적으로 필요하며, 레지스터들의 상태까지도 프로세스의 일부로 포함시켜 말할 수 있습니다.

프로세스의 스케쥴링의 기본 원리
 - A,b,c라는 프로세스 3개가 동시에 실행되어야 한다고 가정할 때, 프로세스의 CPU할당 순서 및 방법을 결정짓는 일을 가리켜 스케쥴링이라 합니다. 이때 사용되는 알고리즘을 스케줄링 알고리즘이라 하며, 또한 스케줄링 알고리즘을 적용해서 실제로 프로세스를 관리하는 운영체제 요소를 가리켜 스케줄러라 합니다.

소프트웨어적으로 구현되어 있는 요소로서운영체제를 구성하는 중요한 요소 중에 하나입니다

일반적으로 , 프로그램이 실행되는 과정에서 많은 시간을 I/O(입력 및 출력)에 할당한다.
* I/O란?
 - 데이터의 입력 및 출력을 말하는 것인데, 비단 파일 입.출력만을 뜻하는 것은 아닙니다. 네트워크 프로그램의 경우에는 네트워크로 연결되어 있는 호스트와 데이터를 송.수신하게 되는데 이것도 I/O에 해당됩니다.

[ 프로세스의 상태 변화 ]
멀티 프로세스 운영체제에서는 프로세스 하나가 계속해서 실행되는 것이 아니고, 여러 개의 프로세스들이 돌아가면서 실해되기 때문에, 프로세스 각각의 상태는 시간 흐름에 따라 변화한답니다.

* 우선순위가 높은 프로세스가 실행 중일 경우, 우선순위가 낮은 프로세스는 실행되지 않으며 현재 우선순위가 낮은 프로세스가 실행 중일지라도, 우선순위가 높은 프로세스가 실행될 경우, 우선순위가 낮은 프로세스는 Ready상태로 들어가고, 우선순위가 높은 프로세스가 실행됩니다.

Ready상태는 스케줄러에 의해 선택되어 지금 당장이라도 실행 가능한 상태이고, Block상태는 스케줄러에 의해서 선택될 수 없는 상태입니다.
* Block상태 : 실행 중에 있는 프로세스가 실행을 멈추는 상태로 들어가는 것. 일반적으로 데이터 입 출력에 관련된 일을 하는 경우에 발생.


컨텍스트 스위칭
 - 컨텍스트 스위칭이란 멀티 프로세스 운영체제에서 실행되는 프로세스의 변경 과정에서 사용되는 기법으로, 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정을 일컫습니다.

컨텍스트 스위칭의 원리
 -  프로세스 A 와 B가 있다고 가정할때 프로세스 A가 실행 중에 있습니다. 일정 시간이 지나서 프로세스 B를 실행해야만 합니다.
    그렇다고 프로세스 A의 실행이 완전히 끝난 것은 아닙니다. 잠시 후에 다시 실행 되어야 합니다. 
    따라서 프로세스 B가 실행되기 전에 현재 레지스터들이 지니고 있는 데이터들을 어딘가에 저장해야만 합니다. 이 데이터들은 프로세스A가 실행을 이어서 진행할 경우 필요한 데이터들이기 때문이지요.

 - 프로세스B는 현재 Ready상태에 있으며, 프로세스 B와 관련된 레지스터 정보가 메모리에 저장되어 있습니다. 프로세스 B가 다시 Running상태가 될 경우 이 데이터들로 레지스터를 채워야만 합니다. 그래야 프로세스 B는 마지막 실행 이후를 이어서 실행하게 됩니다.

 - 프로세스B가 다시 Running상태로 돌아가고, 프로세스 A는 Ready상태로 빠져 나와야 합니다. 프로세스 A관련 레지스터 정보는 메모리에 저장되고, 프로세스 B 관련 레지스터 정보는 CPU의 레지스터에 복원시킵니다.
그림이 보여주는 작업을 가리켜 컨텍스트 스위칭이라 합니다. 프로세스 A 관련 레지스터 정보는 메모리에 저장되고, 프로세스 B 관련 레지스터 정보는 CPU 레지스터에 복원시키고 있습니다. 한가지 중요한 사실은 실행되는 프로세스의 변경과정에서 발생하는 컨텍스트 스위칭은 시스템에 많은 부담을 줍니다.
이는 레지스터 개수가 많은 시스템이수록, 그리고 프로세스별로 관리되어야 데이터 종류가 많을수록 더합니다. 이것이 바로 멀티 프로세스 운영체제의 단점이지요.
그래서 프로그램을 구현하는데 있어서, 이러한 컨텍스트 스위칭 부담을 최소화하기 위해 많은 노력을 기울이기도 합니다.