"여러 스레드의 집합"
■ 프로그램은 보조 기억장치에 존재하며 실현되기를 기다리는 명령어와 정적인 데이터(스레드) 묶음
이 프로그램의 정적 데이터가 메모리에 적재되면 프로세스가 된다(실행중인 프로그램)
■ 프로세스가 무언가를 수행하기 위해서는 반드시 프로세스의 컨텍스트 내에서 수행되는 스레드가 있어야 함 -> 스레드가 프로그램 내의 코드 수행에 실체
■ 하나의 프로세스는 다수의 스레드를 가질 수 있다 -> 여러 스레드는 동시에 코드를 수행한다(사실 말하자면 동시에 모든 스레드를 수행하는건 아님, 모든 스레드가 동시에 수행될 수 있도록 하기위해 운영체제는 퀀텀이라는 단위의 시간을 나누어줌, 각 스레드들은 라운드 로빈 방식으로 퀀텀 만큼만 실행을 하게 되어 동시에 실행되는것과 같이 보임)
■ 각 스레드들은 자신만의 CPU 레지스터 집합과 스택을 가져야만 함
■ 각 프로세스마다 핸들 테이블이 존재
■ 각 프로세스는 독립된 가상 주소 공간을 가짐
프로세스(프로세스 커널 오브젝트) 생성
BOOL CreateProcessA(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
프로세스의 종료
1. 주 스레드의 진입점 함수가 반환될 때
2. 프로세스 내의 어떤 스레드가 ExitProcess 함수를 호출할 때(정상적이지 못한 방법)
▶ C/C++ 런타임이 프로세스를 대신하여 많은 정리 작업을 수행함 -> 하지만 ExitProcess를 이용해 프로세스를 종료해 버리면 리소스에 대한 정리작업을 수행하지 못한 체 프로세스가 종료 되버림 Ex)C++의 파괴자
3. 다른 프로세스의 스레드가 TerminateProess 함수를 호출할 때(다른 방법으로 프로세스를 종료시킬 수 없을 경우에만 사용)
▶ 자신의 프로세스뿐 아닌 다른 프로세스까지 종료 가능한 함수
▶ 메모리 상에 존재하는 데이터를 저장할 수 도 없고, 적절한 정리작업 불가 -> 타겟 프로세스의 모든 리소스는 완벽하게 정리됨(모든 메모리는 해제되고, 열려 있던 파일은 닫히고, 모든 커널 오브젝트의 사용자 카운트는 감소)
▶ 비동기 함수이므로 WaitForSingleObject로 프로세스 종료 시점을 확인해야 함
4. 프로세스 내의 모든 스레드가 각자 종료될 때
▶ 프로세스내의 모든 스레드가 종료되면 운영체제는 더 이상 프로세스의 주소 공간을 유지할 이유가 없다고 판단해 프로세스를 종료시킴
프로세스 종료 후
1. 남아있는 스레드 또한 종료
2. 프로세스에 의해 할당됐던 모든 사용자 오브젝트와 GDI 오브젝트가 삭제되며 모든 커널 오브젝트는 파괴
3. 종료 코드가 프로세스 종료 전엔 STILL_ACTIVE, 그 후엔 ExitProcess, TerminateProcess 호출 시 설정한 종료 코드로 변경 됨
4. 프로세스 커널 오브젝트가 시그널 상태로 변경됨
5. 프로세스 커널 오브젝트의 사용 카운트가 1만큼 감소
'윈도우즈 API' 카테고리의 다른 글
커널 오브젝트를 이용한 스레드 동기화 (0) | 2018.11.05 |
---|---|
유저 모드 스레드 동기화 (0) | 2018.11.03 |
스레드 스케줄링, 우선순위 (0) | 2018.11.01 |
스레드 (0) | 2018.10.31 |
커널 오브젝트 (Kernel Object) (2) | 2018.10.23 |