본문 바로가기

Study/Windows System Programming

[Windows via c/c++] 4. 프로세스

 

책 "제프리 리처의 Windows via c/c++"을 보고 작성한 글 입니다.

 

 

프로세스는 일반적으로 수행 중인 프로그램의 인스턴스(instance)라고 정의하며, 두 개의 컴포넌트로 구성된다.

 

1. 첫 번째 윈도우 애플리케이션 작성

윈도우는 GUI/CUI기반의 어플리케이션을 지원한다. 둘의 진입점은 _tWinMain과 _tmain이다.

진입점에 들어가기 전에,

1. 새로운 프로세스의 전체 명령행과 환경변수를 가리키는 포인터를 획득하고

2. 런타임 라이브러리의 전역변수와 힙 메모리 공간을 초기화하며

3. 모든 전역 오브젝트와 static C++ 클래스 오브젝트의 생성자를 호출한다.

 

모든 실행파일과 DLL파일은 프로세스의 메모리 공간 상에 로드될 때 고유의 인스턴스 핸들을 할당받는다.

 

 

2. CreateProcess 함수

스레드가 CreateProcess를 호출하면 시스템은 사용 카운트가 1인 프로세스 커널 오브젝트를 생성한다.

매개변수를 활용하여 함수 내에서 문자열을 변경할 수 있다.

 

새로운 프로세스를 생성하기 위해 시스템은 새로운 프로세스 커널 오브젝트와 스레드 커널 오브젝트(프로세스의 주 스레드)를 생성해야 한다.

 

STARTUPINFOEX 구조체를 사용항 추가적인 매개변수(특성)를 전달할 수 있다.

 

 

3. 프로세스의 종료

프로세스는 4가지 방법으로 종료된다.

1. 주 스레드의 진입점 함수가 반환 << 가장 추천하는 프로세스 종료 방법

2. 프로세스 내의 어떤 스레드가 ExitProcess 함수를 호출

3. 다른 프로세스의 스레드가 TerminateProcess 함수를 호출

4. 프로세스 내의 모든 스레드가 각자 종료

 

 

4. 차일드 프로세스

어플리케이션을 설계할 때 다른 코드 블록을 수행해야 하는 상황에 직면할 수 있는데,

대부분의 경우 함수나 서브루틴을 호출하여 반환될 때까지 기다리는 '싱글태스킹 동기화'를 사용하지만,

프로세스 내에 새로운 스레드를 생성하여 이 스레드가 작업을 수행하도록 코드 블록을 제공하여 '멀티스레딩' 할 수 있게 한다.

다른 방법으로는 추가 작업을 수행하도록 새로운 차일드 프로세스를 생성하는 것이다. 이는 기존의 주소 공간을 보호할 수 있다는 장점이있다.

 

윈도우는 서로 다른 프로세스 간에 자료를 전송할 수 있도록 DDE(Dynamic Data Exchanger)등의 방법을 제공한다.

 

 

5. 관리자가 표준 사용자로 수행되는 경우

 

-