본문 바로가기

High Level Technique/Window System

프로세스

프로세스



개념


가령 test.exe 라는 파일이 있으면 보통 프로그램이라고 부릅니다. 혹은 바이너리라고 부릅니다.

해당 프로그램을 해당 프로그램은 메모리에 할당이 되고 바이너리 코드가 올라가게 됩니다.

이 순간부터 프로그램은 프로세스라고 불립니다.




프로세스 구성


프로그램이 메모리에 할당이 되는 경우 Data, Stack, Heap, Code 영역에 올라가게 됩니다.

Data는 전역변수, static 변수가 할당이 되고, Stack 영역에는 지역변수, 함수 호출시 필요한 파라미터(인자 값), Heap 영역은 동적할당, Code 영역은 명령어들이 올라갑니다.





Register Set

CPU 내의 레지스터들 또한 실행된 프로그램(프로세스)에 필요한 데이터로 채워지게 됩니다.


즉, 메모리 영역과 레지스터들 또한 프로세스의 구성요소라고 할 수 있습니다.





스케줄링


CPU는 1개인데 처리해야 할 프로세스는 여러개라면 어떻게 여러개를 처리할 수 있을까요?

단순히 생각을 해보면 1개의 프로세스가 모두 실행이 끝나면 다음 프로세스가 실행되야 하는 것으로 생각 할 수 있습니다.


하지만 우리가 컴퓨터를 사용하다 보면 프로그램을 실행시키면 동시다발적으로 실행이 되는 것을 볼 수 있습니다.


이와 같은 이유로 CPU는 1개의 일을 처리할 수 있는데 여러 프로세스가 실행이 된다는 것은 번갈아 가면서 처리를 한다고 알 수 있습니다.


그럼 어떻게 프로세스를 번갈아 가면서 처리를 할 수 있을까요?





1. Start -> Ready

프로그램이 실행이 되면서 프로세스가 되는데 이때 프로그램이 바로 실행이 되는 것이 아니라 Ready 상태가 됩니다.


2. Ready -> Running

스케줄러에 의해서 Ready 상태의 프로세스 중 하나를 선택하여 Running 상태로 변경한다.


3. Running -> Ready

프로세스의 우선순위에 의해서 Ready 상태로 변경한다.

가령, 우선순위가 높은 A 프로세스가 있으면 A보다 낮은 우선순위인 B 프로세스는 Ready 상태로 바뀌며 A 프로세스가 종료되기만을 기다린다.


4. Running -> Blocked

일반적으로 데이터 입출력일 때 발생하는데 입출력 상태에서 프로세스가 더 이상 실행될 수 없기에 Ready 상태의 다른 프로세스를 Running 상태로 변경한다.


5. Blocked -> Ready

Blocked 상태와 프로세스를 Ready 상태로 변경하여 Running이 될 때까지 대기한다.




컨텍스트 스위칭


앞서 프로세스에 대해 설명했을 때 메모리와 레지스터에 해당 데이터들이 올라간다고 했습니다.


그렇다면 A라는 프로세스와 B라는 프로세스가 모두 실행이 된다고 했을 때 스케줄러에 의해서 Ready와 Running 상태를 왔다갔다 하는데 각 프로세스의 정보가 메모리와 레지스터에 올라가 있는데 다른 프로세스가 실행이 된다면 실행 중이었던 프로세스의 레지스터는 따로 저장을 해두어야 합니다.


이러한 것을 컨텍스트 스위칭이라고 말하며 이는 시스테멩 많은 부담을 줍니다.




프로세스 생성


프로세스는 CreateProcess()에 의해서 생성될 수 있는데 해당 함수를 호출하는 프로세스를 부모 프로세스라고 하고 호출 당하여 실행되는 프로세스는 자식프로세스라고 할 수 있습니다.


예제


Operation1.exe


#include <stdio.h>

#include <Windows.h>

#include <tchar.h>


int main(void)

{

STARTUPINFO si = { 0, };

PROCESS_INFORMATION pi;

si.cb = sizeof(si);


TCHAR command[] = _T("Operation2.exe");


CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);


while (1)

{

for (int i = 0; i < 10000; i++)

{

for (int i = 0; i < 10000; i++)

{


}

}


printf("Opertaion1.exe \n");

}


return 0;

}



Operation2.exe


#include <stdio.h>

#include <Windows.h>


int main(void)

{

SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);


while (1)

{

for (int i = 0; i < 10000; i++)

{

for (int i = 0; i < 10000; i++)

{


}

}


printf("Operation2.exe \n");

}


return 0;

}


위와 같이 코드를 작성하여 실행을 하면 아래와 같이 나타납니다.



'High Level Technique > Window System' 카테고리의 다른 글

메일 슬롯 (Mail Slot)  (0) 2016.12.27
커널 오브젝트 (Kernel Object)  (0) 2016.12.26
명령어, 레지스터의 구성  (0) 2016.09.20
Polymorphic  (0) 2016.09.13
x86 & x64  (1) 2016.09.12