모든 프로세스는 하나나 그 이상의 스레드들을 가진다. 스레드는 실행의 기본 단위이다.
1) 하나 이상의 스레드들
2) 다른 프로세스의 주소 공간과 구별되는 가상 주소 공간
3) 하나나 그 이상의 코드 구역( Code Segment )들 ( DLL 코드 포함 )
4) 전역 변수들을 담은 하나나 그 이상의 자료 구역들 ( Data Segment )
5) 환경 변수 정보 / 프로세스 힙 / 핸들 및 자원 정보
한 프로세스 안의 각 스레드는 코드, 전역변수, 환경 문자열, 자원들을 공유한다.
스레드는 다음과 같은 구성 요소를 가진다.
1) 프로시저 호출, 인터럽트, 예외 처리부 등을 위한 스택
2) TLS(Thread Local Storage) 각 스레드 만의 고유한 저장소
3) 스레드 생성시 지정된 스택에 대한 인수 등
4) 커널이 관리하는 Context 구조체
1. 프로세스 생성
가장 기본적인 Windows 프로세스 관리 함수는 스레드 하나를 가진 프로세스를 생성하는 CreateProcess 함수이다. 함수의 원형은 다음과 같다.
CreateProcess 함수는 HANDLE 값을 반환하지 않고 성공 실패 여부만 반환한다. 생성된 프로세스 관련 정보는 PROCESS_INFORMATION 구조체를 통해 전달 받는다.
파일 핸들과 마찬가지로 프로세스 핸들이나 스래드 핸들도 더 이상 필요하지 않게 되면 닫아주어야 한다.
출처 : Windows 시스템 프로그래밍 윈도우즈 API 핵심 바이블
2. 상속 가능 핸들
프로세스를 생성 할때 부모 프로세스의 객체들에 대한 핸들을 통해 자식 프로세스에서도 객체들에 접근하고 싶은 상황이 발생한다. 이런 경우 부모프로세스가 가지고 있는 핸들 정보를 자식 프로세스에게 상속 할수 있다. 핸들 값을 상속 하기 위해서는 SECURITY_ATTRIBUTES 구조체의 보안 서술자 필드를 설정해주어야 한다. 상속된 핸들은 원래의 핸들과 개별적인 복사본이다. 부모와 자식이 같은 파일에 서로 다른 파일 포인터를 이용하여 접근한다. 또한 두 프로세스는 자신의 핸들을 각자 닫을 수 있으며 실제로 각자 닫아야 한다.
'0x001 Programming > 01. C | C++' 카테고리의 다른 글
[Tip] 동기화 (0) | 2017.12.29 |
---|---|
[Tip] Thread 사용시 주의 사항 (0) | 2017.12.29 |
[Example] 이진 검색 트리를 이용한 파일 정렬 (0) | 2017.12.29 |
[Tip] Heap Memory (0) | 2017.12.29 |
[Example] 예외 처리 (0) | 2017.12.29 |