본문 바로가기

윈도우즈 API

프로세스

"여러 스레드의 집합"

 

  프로그램은 보조 기억장치에 존재하며 실현되기를 기다리는 명령어와 정적인 데이터(스레드) 묶음

이 프로그램의 정적 데이터가 메모리에 적재되면 프로세스가 된다(실행중인 프로그램)

 프로세스가 무언가를 수행하기 위해서는 반드시 프로세스의 컨텍스트 내에서 수행되는 스레드가 있어야 함 -> 스레드가 프로그램 내의 코드 수행에 실체

 하나의 프로세스는 다수의 스레드를 가질 수 있다 -> 여러 스레드는 동시에 코드를 수행한다(사실 말하자면 동시에 모든 스레드를 수행하는건 아님, 모든 스레드가 동시에 수행될 수 있도록 하기위해 운영체제는 퀀텀이라는 단위의 시간을 나누어줌, 각 스레드들은 라운드 로빈 방식으로 퀀텀 만큼만 실행을 하게 되어 동시에 실행되는것과 같이 보임)

 각 스레드들은 자신만의 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