[Windows via c/c++] 4장 프로세스
-
Upload
- -
Category
Technology
-
view
5.104 -
download
26
Transcript of [Windows via c/c++] 4장 프로세스
제프리 리처의 WINDOWS VIA C/C++
4장 프로세스
릭터
http://ohyecloudy.com ohyecloudy http://cafe.naver.com/architect1 아꿈사
2012.01.14
프로세스process, 스레드thread에 대해
간단히 브리핑하고
프로세스 특징에 대해 알아보자. 고고~
수행중인 프로그램 인스턴스
프로세스
커널 오브젝트
주소 공간
프로세스
프로세스 관리 목적으로 OS가 사용 프로세스 통계 정보를 시스템이 커널 오브젝트에 저장
커널 오브젝트
주소 공간
프로세스
실행 모듈이나 DLL 코드, 데이터를 수용 동적 메모리 할당에 사용되는 공간 포함 - 스레드 스택, 힙 할당
코드를 수행할 책임
스레드 thread
6장~9장 참고
프로세스 주소 공간 내에서 동시에 코드를 수행
스레드마다 CPU 레지스터 집합, 스택을 가져야 함
주 스레드primary thread
프로세스가 생성되면 자동으로 생성
첫 번째 스레드
첫 번째 윈도우 애플리케이션 작성
CreateProcess 함수
프로세스 종료
차일드 프로세스 (p160~p163)
관리자가 표준 사용자로 수행되는 경우
윈도우는 CUI, GUI 기반 애플리케이션 지원.
서브 시스템으로 구분
윈도우는 어떻게 서브 시스템을 구분하는가?
header
실행파일
linker /SUBSYSTEM : CONSOLE /SUBSYSTEM : WINDOWS
write
header
실행파일
linker /SUBSYSTEM : CONSOLE /SUBSYSTEM : WINDOWS
write
OS loader
서브시스템에 맞게 로드
윈도우 어플리케이션은 수행 시작위치를 가진다
진입점 함수entry-point function
_tWinMain(), _tmain()
작성한 진입점 함수는 어떻게 호출되는가?
OS
작성한 진입점 함수 예) wWinMain
CRT 시작 함수 예) wWinMainCRTStartup
CRT(c run-time libraries) 시작 함수가 하는 일?
새로운 프로세스 명령행 포인터 획득
새로운 프로세스 환경변수 포인터 획득
CRT 전역 변수 초기화
CRT 메모리 할당 함수 초기화
저수준 입출력 루틴 사용하는 힙 초기화
전역, static 클래스 오브젝트 생성자 호출
작성한 진입점 함수 예) wWinMain
반환 값
CRT exit()
CRT 시작 함수 예) wWinMainCRTStartup
CRT exit() 하는 일?
_onexit()로 등록했던 함수 호출
전역, static 클래스 오브젝트 소멸자 호출
_CrtDumpMemoryLeaks() 메모리 누수 보고
진입점 함수 반환 값을 인자로 ExitProcess() 호출
고유의 인스턴스 핸들을 할당받는다
모든 실행파일과 DLL 파일
프로세스 메모리 공간 상에 로드될 때
int WINAPI _tWinMain(
HINSTANCE hInstanceExe,
HINSTANCE hPrevInstance,
PSTR pszCmdLine,
int nCmdShow);
방금 말한 그 핸들 GetModulehandle() 로도 알 수 있다.
HICON LoadIcon(
HINSTANCE hInstance,
PCTSTR pszIcon);
보통 리소스를 로드할 때 사용
실행 파일이 로드될 시작 주소 링커가 결정
0x00400000 visual studio linker 기본 시작 주소 윈도 98에서 실행 파일을 로드할 수 있는 최하단 역사적인 이유
/BASE:[address]로 변경 가능
엥? 그럼 프로세스 시작 주소가 다 겹치지 않나?
가상 주소 공간을 가지기 때문에 문제 X
13장 기대하세요
패스 (p121~p136)
프로세스 명령행
프로세스 환경변수
프로세스 선호도
프로세스 에러 모드
프로세스 현재 드라이브와 디렉토리
시스템 버전
첫 번째 윈도우 애플리케이션 작성
CreateProcess 함수
프로세스 종료
차일드 프로세스 (p160~p163)
관리자가 표준 사용자로 수행되는 경우
CreateProcess()를 호출하면?
프로세스 커널 오브젝트 생성 (사용 카운트 1)
가상 주소 공간을 생성
코드와 데이터, DLL파일을 로드
주 스레드를 위한 스레드 커널 오브젝트 생성
CRT 시작 코드 실행
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
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
스레드 커널 오브젝트 보안 특성
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
환경변수 문자열 메모리 블록 포인터
현재 디렉토리 설정
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 구조체 포인터 어플리케이션 윈도 크기, 위치,…
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()가 채워줌 프로세스 핸들, 주 스레드 핸들…
프로세스, 스레드 ID 특징
시스템 전체에 걸쳐 unique
ID pool 공유
프로세스 ID랑 스레드 ID
같은 ID를 가지는 프로세스, 스레드는 존재 안함
ID는 0이 될 수 없다. system idle process는 가상 프로세스 (PID 0) # of CPU만큼 스레드를 가지고 있다.
프로세스 ID는 재사용
종료하면 새로운 프로세스에 ID 할당
프로세스간 통신이 필요하면
PID 대신
영속적인 커널 오브젝트, 윈도우 핸들 등을 사용
첫 번째 윈도우 애플리케이션 작성
CreateProcess 함수
프로세스 종료
차일드 프로세스 (p160~p163)
관리자가 표준 사용자로 수행되는 경우
1/4
주 스레드의 진입점 함수가 반환된다.
유일하게 리소스가 적절히 해제되는 걸 보장
생성된 c++ 오브젝트 소멸자 호출
스레드 스택으로 할당된 메모리 해제
프로세스 종료 코드 설정
진입점 함수 반환 값으로
프로세스 커널 오브젝트 사용 카운트 감소
2/4
ExitProcess() 호출
이 방법은 피하는 게 좋다
VOID ExitProcess(UINT fuExitCode);
프로세스를 종료하고 종료 코드를 설정
프로세스는 종료되지 않는다 모든 스레드가 종료되기 전까지
windows 플랫폼 sdk 문서
주 스레드가 진입점 함수로부터 반환하면 ExitProcess() 호출
다른 스레드가 돌던 말던
CRT
완벽히 제거
프로세스, 스레드 OS 리스소
정리 작업이 수행 안 됨
CRT 리소스
3/4
TerminateProcess() 호출
프로세스를 종료할 수 없을 때만
BOOL TerminateProcess(
HANDLE hProcess,
UINT fuExitCode);
다른 프로세스를 종료할 수 있음
종료와 관련된 어떠한 통지도 못 받는다
4/4
프로세스 내의 모든 스레드가 종료
프로세스 종료
모든 스레드가 종료해서
프로세스 주소 공간 유지할 이유가 없다고 판단
마지막 스레드 종료 코드가 프로세스 종료 코드
프로세스가 종료되면?
남아있는 스레드 종료 할당한 리소스 해제 사용자 오브젝트, GDI 오브젝트 커널 오브젝트
종료 코드 설정 종료 전에는 STILL_ACTIVE
시그널 상태로 바뀜(9장 참고) 프로세스 커널 오브젝트 상태
프로세스 커널 오브젝트 사용 카운트 감소
첫 번째 윈도우 애플리케이션 작성
CreateProcess 함수
프로세스 종료
차일드 프로세스 (p160~p163)
관리자가 표준 사용자로 수행되는 경우
관리자 권한 로그온
보안 토큰
필터된 토큰
권한 수준에 맞는 즉, 관리자
표준 사용자 권한 수준
보안 토큰
필터된 토큰
프로세스 생성
시스템이 프로세스를 생성할 때마다 자동으로 전달
권한 상승 요구
관리자 권한이 필요할 때
관리자로 로그인해도
필터된 토큰을 넘겨주기 때문
첫 번째 윈도우 애플리케이션 작성
CreateProcess 함수
프로세스 종료
차일드 프로세스 (p160~p163)
관리자가 표준 사용자로 수행되는 경우