[windows via c/c++] 4장 프로세스

52
제프리 리처의 WINDOWS VIA C/C++ 4장 프로세스 릭터 http://ohyecloudy.com ohyecloudy http://cafe.naver.com/architect1 아꿈사 2012.01.14

Upload: -

Post on 27-Jun-2015

5.117 views

Category:

Technology


26 download

TRANSCRIPT

Page 1: [Windows via c/c++] 4장 프로세스

제프리 리처의 WINDOWS VIA C/C++

4장 프로세스

릭터

http://ohyecloudy.com ohyecloudy http://cafe.naver.com/architect1 아꿈사

2012.01.14

Page 2: [Windows via c/c++] 4장 프로세스

프로세스process, 스레드thread에 대해

간단히 브리핑하고

프로세스 특징에 대해 알아보자. 고고~

Page 3: [Windows via c/c++] 4장 프로세스

수행중인 프로그램 인스턴스

프로세스

Page 4: [Windows via c/c++] 4장 프로세스

커널 오브젝트

주소 공간

프로세스

프로세스 관리 목적으로 OS가 사용 프로세스 통계 정보를 시스템이 커널 오브젝트에 저장

Page 5: [Windows via c/c++] 4장 프로세스

커널 오브젝트

주소 공간

프로세스

실행 모듈이나 DLL 코드, 데이터를 수용 동적 메모리 할당에 사용되는 공간 포함 - 스레드 스택, 힙 할당

Page 6: [Windows via c/c++] 4장 프로세스

코드를 수행할 책임

스레드 thread

6장~9장 참고

프로세스 주소 공간 내에서 동시에 코드를 수행

스레드마다 CPU 레지스터 집합, 스택을 가져야 함

Page 7: [Windows via c/c++] 4장 프로세스

주 스레드primary thread

프로세스가 생성되면 자동으로 생성

첫 번째 스레드

Page 8: [Windows via c/c++] 4장 프로세스

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

CreateProcess 함수

프로세스 종료

차일드 프로세스 (p160~p163)

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

Page 9: [Windows via c/c++] 4장 프로세스

윈도우는 CUI, GUI 기반 애플리케이션 지원.

서브 시스템으로 구분

윈도우는 어떻게 서브 시스템을 구분하는가?

Page 10: [Windows via c/c++] 4장 프로세스

header

실행파일

linker /SUBSYSTEM : CONSOLE /SUBSYSTEM : WINDOWS

write

Page 11: [Windows via c/c++] 4장 프로세스

header

실행파일

linker /SUBSYSTEM : CONSOLE /SUBSYSTEM : WINDOWS

write

OS loader

서브시스템에 맞게 로드

Page 12: [Windows via c/c++] 4장 프로세스

윈도우 어플리케이션은 수행 시작위치를 가진다

진입점 함수entry-point function

_tWinMain(), _tmain()

작성한 진입점 함수는 어떻게 호출되는가?

Page 13: [Windows via c/c++] 4장 프로세스

OS

작성한 진입점 함수 예) wWinMain

CRT 시작 함수 예) wWinMainCRTStartup

Page 14: [Windows via c/c++] 4장 프로세스

CRT(c run-time libraries) 시작 함수가 하는 일?

새로운 프로세스 명령행 포인터 획득

새로운 프로세스 환경변수 포인터 획득

CRT 전역 변수 초기화

CRT 메모리 할당 함수 초기화

저수준 입출력 루틴 사용하는 힙 초기화

전역, static 클래스 오브젝트 생성자 호출

Page 15: [Windows via c/c++] 4장 프로세스

작성한 진입점 함수 예) wWinMain

반환 값

CRT exit()

CRT 시작 함수 예) wWinMainCRTStartup

Page 16: [Windows via c/c++] 4장 프로세스

CRT exit() 하는 일?

_onexit()로 등록했던 함수 호출

전역, static 클래스 오브젝트 소멸자 호출

_CrtDumpMemoryLeaks() 메모리 누수 보고

진입점 함수 반환 값을 인자로 ExitProcess() 호출

Page 17: [Windows via c/c++] 4장 프로세스

고유의 인스턴스 핸들을 할당받는다

모든 실행파일과 DLL 파일

프로세스 메모리 공간 상에 로드될 때

Page 18: [Windows via c/c++] 4장 프로세스

int WINAPI _tWinMain(

HINSTANCE hInstanceExe,

HINSTANCE hPrevInstance,

PSTR pszCmdLine,

int nCmdShow);

방금 말한 그 핸들 GetModulehandle() 로도 알 수 있다.

Page 19: [Windows via c/c++] 4장 프로세스

HICON LoadIcon(

HINSTANCE hInstance,

PCTSTR pszIcon);

보통 리소스를 로드할 때 사용

Page 20: [Windows via c/c++] 4장 프로세스

실행 파일이 로드될 시작 주소 링커가 결정

0x00400000 visual studio linker 기본 시작 주소 윈도 98에서 실행 파일을 로드할 수 있는 최하단 역사적인 이유

/BASE:[address]로 변경 가능

Page 21: [Windows via c/c++] 4장 프로세스

엥? 그럼 프로세스 시작 주소가 다 겹치지 않나?

가상 주소 공간을 가지기 때문에 문제 X

13장 기대하세요

Page 22: [Windows via c/c++] 4장 프로세스

패스 (p121~p136)

프로세스 명령행

프로세스 환경변수

프로세스 선호도

프로세스 에러 모드

프로세스 현재 드라이브와 디렉토리

시스템 버전

Page 23: [Windows via c/c++] 4장 프로세스

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

CreateProcess 함수

프로세스 종료

차일드 프로세스 (p160~p163)

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

Page 24: [Windows via c/c++] 4장 프로세스

CreateProcess()를 호출하면?

프로세스 커널 오브젝트 생성 (사용 카운트 1)

가상 주소 공간을 생성

코드와 데이터, DLL파일을 로드

주 스레드를 위한 스레드 커널 오브젝트 생성

CRT 시작 코드 실행

Page 25: [Windows via c/c++] 4장 프로세스

BOOL CreateProcess(

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psaProcess,

PSECURITY_ATTRIBUTES psaThread,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo);

프로세스를 생성할 실행 파일

전달할 명령행 문자열

p138~p140

Page 26: [Windows via c/c++] 4장 프로세스

BOOL CreateProcess(

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psaProcess,

PSECURITY_ATTRIBUTES psaThread,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo);

프로세스 커널 오브젝트 보안 특성

상속 가능한 핸들을 생성할 것인가?

p140~p142

스레드 커널 오브젝트 보안 특성

Page 27: [Windows via c/c++] 4장 프로세스

BOOL CreateProcess(

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psaProcess,

PSECURITY_ATTRIBUTES psaThread,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo);

새로운 프로세스를 어떻게 생성할지

p142~p145

환경변수 문자열 메모리 블록 포인터

현재 디렉토리 설정

Page 28: [Windows via c/c++] 4장 프로세스

BOOL CreateProcess(

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psaProcess,

PSECURITY_ATTRIBUTES psaThread,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo);

p145~p152

STARTINFO나 STARTINFOEX 구조체 포인터 어플리케이션 윈도 크기, 위치,…

Page 29: [Windows via c/c++] 4장 프로세스

BOOL CreateProcess(

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psaProcess,

PSECURITY_ATTRIBUTES psaThread,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo);

p145~p152

CreateProcess()가 채워줌 프로세스 핸들, 주 스레드 핸들…

Page 30: [Windows via c/c++] 4장 프로세스

프로세스, 스레드 ID 특징

Page 31: [Windows via c/c++] 4장 프로세스

시스템 전체에 걸쳐 unique

ID pool 공유

프로세스 ID랑 스레드 ID

같은 ID를 가지는 프로세스, 스레드는 존재 안함

Page 32: [Windows via c/c++] 4장 프로세스

ID는 0이 될 수 없다. system idle process는 가상 프로세스 (PID 0) # of CPU만큼 스레드를 가지고 있다.

Page 33: [Windows via c/c++] 4장 프로세스

프로세스 ID는 재사용

종료하면 새로운 프로세스에 ID 할당

프로세스간 통신이 필요하면

PID 대신

영속적인 커널 오브젝트, 윈도우 핸들 등을 사용

Page 34: [Windows via c/c++] 4장 프로세스

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

CreateProcess 함수

프로세스 종료

차일드 프로세스 (p160~p163)

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

Page 35: [Windows via c/c++] 4장 프로세스

1/4

주 스레드의 진입점 함수가 반환된다.

유일하게 리소스가 적절히 해제되는 걸 보장

Page 36: [Windows via c/c++] 4장 프로세스

생성된 c++ 오브젝트 소멸자 호출

스레드 스택으로 할당된 메모리 해제

프로세스 종료 코드 설정

진입점 함수 반환 값으로

프로세스 커널 오브젝트 사용 카운트 감소

Page 37: [Windows via c/c++] 4장 프로세스

2/4

ExitProcess() 호출

이 방법은 피하는 게 좋다

Page 38: [Windows via c/c++] 4장 프로세스

VOID ExitProcess(UINT fuExitCode);

프로세스를 종료하고 종료 코드를 설정

Page 39: [Windows via c/c++] 4장 프로세스

프로세스는 종료되지 않는다 모든 스레드가 종료되기 전까지

windows 플랫폼 sdk 문서

주 스레드가 진입점 함수로부터 반환하면 ExitProcess() 호출

다른 스레드가 돌던 말던

CRT

Page 40: [Windows via c/c++] 4장 프로세스

완벽히 제거

프로세스, 스레드 OS 리스소

정리 작업이 수행 안 됨

CRT 리소스

Page 41: [Windows via c/c++] 4장 프로세스

3/4

TerminateProcess() 호출

프로세스를 종료할 수 없을 때만

Page 42: [Windows via c/c++] 4장 프로세스

BOOL TerminateProcess(

HANDLE hProcess,

UINT fuExitCode);

다른 프로세스를 종료할 수 있음

종료와 관련된 어떠한 통지도 못 받는다

Page 43: [Windows via c/c++] 4장 프로세스

4/4

프로세스 내의 모든 스레드가 종료

Page 44: [Windows via c/c++] 4장 프로세스

프로세스 종료

모든 스레드가 종료해서

프로세스 주소 공간 유지할 이유가 없다고 판단

마지막 스레드 종료 코드가 프로세스 종료 코드

Page 45: [Windows via c/c++] 4장 프로세스

프로세스가 종료되면?

Page 46: [Windows via c/c++] 4장 프로세스

남아있는 스레드 종료 할당한 리소스 해제 사용자 오브젝트, GDI 오브젝트 커널 오브젝트

종료 코드 설정 종료 전에는 STILL_ACTIVE

시그널 상태로 바뀜(9장 참고) 프로세스 커널 오브젝트 상태

프로세스 커널 오브젝트 사용 카운트 감소

Page 47: [Windows via c/c++] 4장 프로세스

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

CreateProcess 함수

프로세스 종료

차일드 프로세스 (p160~p163)

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

Page 48: [Windows via c/c++] 4장 프로세스

관리자 권한 로그온

보안 토큰

필터된 토큰

권한 수준에 맞는 즉, 관리자

표준 사용자 권한 수준

Page 49: [Windows via c/c++] 4장 프로세스

보안 토큰

필터된 토큰

프로세스 생성

시스템이 프로세스를 생성할 때마다 자동으로 전달

Page 50: [Windows via c/c++] 4장 프로세스

권한 상승 요구

관리자 권한이 필요할 때

관리자로 로그인해도

필터된 토큰을 넘겨주기 때문

Page 51: [Windows via c/c++] 4장 프로세스

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

CreateProcess 함수

프로세스 종료

차일드 프로세스 (p160~p163)

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