행복한 연어의 이야기

(윈도우 시스템) 5. 프로세스 생성과 소멸 본문

IT/윈도우 시스템 프로그래밍

(윈도우 시스템) 5. 프로세스 생성과 소멸

해피살몬 2021. 7. 28. 21:06

1. 프로세스(Process)의 이해

프로세스란 무엇인가?

프로세스란 실행중인 프로그램을 말한다.

게임 중에 익스플로어를 실행시킨다면 게임과 익스플로어 두개의 프로세스를 실행시킨 것이 된다.

 

프로세스의 구성요소?

프로그램을 실행시키면 실행파일에 존재하는 명령어들이 메모리에 올라간다.

그 메모리는 Code 영역, Data 영역, Heap 영역, Stack 영역으로 나뉘게 되는데

메모리 영역(Code, Data, Heap, Stack)들은 프로세스 마다 가지고 있다.

즉 위에서 게임과 익스플로어를 실행시키면

게임의 메모리 영역 과 익스플로어의 메모리 영역이 따로 생성되는 것이다.

또한 명령어를 실질적으로 수행하는 레지스터들의 상태까지도 프로세스의 일부라고 말할 수 있다. 

 

 

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

정확히 말하면 프로세스가 아닌 쓰레드의 스케줄링 상태변화 이지만 쓰레드 배우지 않았기에

프로세스라고 서술한다. 그래도 이해하는데는 문제가 없다.

(자세한 내용은 여기(쓰레드의 이해)에서 )

Windows 입장에서 프로세스는 단순히 쓰레드를 담는 상자에 지나지 않는다.

실제 프로그램의 흐름을 형성하는 것은 쓰레드이다.

프로세스는 Running Ready Blocked 상태를 지니지 않는다.

상태를 지니는 것은 쓰레드이며 스케줄러의 실행단위도 프로세스가 아닌 쓰레드이다.

프로세스를 생성하면 기본적으로 main 쓰레드가 생성되며

앞서 프로세스라고 말한 내용 대부분은 이 main 쓰레드라고 생각해야한다.

 

프로세스 스케줄링(Scheduling)

CPU 는 하나인데 프로세스는 여러개이다.

그래서 CPU 여러 프로세스들을 번갈아가면서 실행하는데

그 프로젝트들을 어떤 기준으로 할당하고 실행하는지 결정하는 일을 스케줄링이라고 한다. 

 

프로세스의 상태 변화

기본적으로 프로세스 상태는 3가지가 있다.

아래 상태 중 Ready 와 Blocked 두 상태 모두 프로세스가 실행 중이 아닌 상태이지만

Ready 는 스케줄러에 의해 선택될 수 있는 상태이고

Blocked 상태는 선택 될 수 없는 상태라는 차이점이 있는 것을 명심해야 한다.

 

Ready

프로그램 실행시 프로세스가 실행되며 Ready 상태에 놓이게 된다.

Ready 상태는 CPU에 의해서 선택될 수 있는 상태를 말하며

CPU 는 Ready 상태에 있는 프로세스 중 우선순위가 높은 프로세스를 선택하게 된다.

Running 

프로세스가 진행되고 있는 상태이다.

이후 프로세스는 Ready 상태에 놓이거나 Blocked 상태에 놓일 수 있다.

일반적으로 Ready 상태로 돌아가는 경우는 다른 우선순위 높은 프로세스가 Ready 상태에 놓였을때이고

Blocked 상태로 가는 경우는 보통 데이터 입출력 관련 일(입출력은 CPU가 처리 하지 않으므로)을 처리할때 이다.

Blocked

입출력 등이 완료된 프로세스는 다시 Ready 상태에 놓이고 CPU 가 선택해주길 기다리고 있는 상태가 된다.

또한 프로세스 종료시 Blocked 상태를 거쳐서 종료하게 된다.

 

3. 컨텍스트 스위칭(Context Switching)

위에서 언금한 프로세스의 잦은 상태변화는 시스템의 부하를 주기도 한다.

Running 중인 프로세스가 A 에서 B로 바뀐다고 했을때

A 프로세스의 명령어를 실행하던 레지스터 값들을 메모리에 저장하고

레지스터에 (메모리에 있던) B 프로세스 관련 값을 채워넣게 된다.

이 과정을 컨텍스트 스위칭이라고 하며 이 컨텍스트 스위칭은 시스템에 많은 부담을 주게 된다.

 

4. 프로세스의 생성

CreateProcess 함수 이해 

Windows 는 CreateProcess 함수를 통해 프로세스 생성을 지원하고 있다.

이때  CreateProcess 함수를 호출한 프로세스를 부모 프로세스

생성된 프로세스를 자식 프로세스 라고 부른다.

BOOL CreateProcess(
	LPCSTR lpApplicationName,	//생성할 프로세스의 이름(경로 지정 안할시 현재 디렉토리)
	LPSTR lpCommandLine,		//새로 생성하는 프로세스에게 전달할 인자
	LPSECURITY_ATTRIBUTES lpProcessAttributes,		//프로세스의 보안속성
	LPSECURITY_ATTRIBUTES lpThreadAttributes,		//쓰레드의 보안속성
	BOOL bInheritHandles,		//자식프로세스가 부모프로세스의 핸들 상속 가능 여부(상속 가능한 핸들)
	DWORD dwCreationFlags,		//프로세스의 우선순위
	LPVOID lpEnvironment,		//환경블록 전달 여부
	LPCSTR lpCurrentDirectory,	//생성할 프로세스의 디렉토리 설정
	LPSTARTUPINFOA lpStartupInfo,				//STARTUINFO 구조체 변수
	LPPROCESS_INFORMATION lpProcessInformation		//PROCESS_INFORMATION 구조체 변수(프로세스 정보를 얻기위한 인자 )
);

STARTUINFO 구조체 변수

STARTUINFO 구조체에는 기본적으로

타이틀바 제목, x y 좌표, 가로 세로 길이 등을 지정한다.

 

알고 넘어가야할 것

1. 프로세스에 대한 이해

2. 프로세스 상태 변화

3. 컨텍스트 스위칭

4. 프로세스를 생성하는 방법

 

'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.

 

 

Comments