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

6,050 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,050
On SlideShare
0
From Embeds
0
Number of Embeds
2,721
Actions
Shares
0
Downloads
37
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

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

×