5장. 프로세스의 생성과 소멸

유니야·2023년 1월 6일

✏️ 프로세스와 스케줄러의 이해

💻 프로세스란?

  • 메인 메모리로 이동해 실행 중인 프로그램.
  • 그러나 프로그래머의 입장에서 이 같은 일반적인 정의는 애매하다. 프로세스가 윈도우에 떠있는 창인지, 메인 메모리인지, 메인 메모리에 올라와서 실행 중인 코드인지 정확하지 않음.

💻 프로세스의 범위

프로세스를 구성하는 범주는 프로세스 별로 독립적으로 할당받는 리소스. 메모리, 가상 메모리 + 레지스터 Set

  • 메모리 구조 + 레지스터 Set

  • 프로세스 별 독립적인 대상도 프로세스의 범주에 포함시킬 수 있다 => 레지스터 Set

    • 하나의 프로세스가 생성되면 아래와 같은 메모리 공간이 할당됨.
      (프로세스가 할당받는 메모리 공간의 크기와 메인 메모리 크기가 같을 필요는 없다)
    • 레지스터 Set => ALU의 연산을 도움 + 현재 실행 중인 프로세스의 정보로 채워짐.
    • 프로세스 A가 실행 중이라면 레지스터는 프로세스 A의 정보로 채워진다. 이어서 프로세스 B가 실행된다면 A를 위한 레지스터 정보는 메모리 공간 어딘가에 잠시 복사해두고, 프로세스 B의 정보로 채워진다.

💻 프로세스 스케줄러

  • 둘 이상의 프로세스가 적절히 실행되도록 컨트롤.
  • 스케줄링 방법은 스케줄링 알고리즘에 따라 다양함.
  • 윈도우에서 제공하는, 소프트웨어적으로 구성된 장치. CPU에 의해 프로세스가 공평하게 실행될 수 있도록 함
  • 스케줄러도 일종의 프로세스. 따라서 스케줄러가 자주 실행된다면 다른 프로세스가 공평하게 실행되지 못 할 수 있다.
  • 좋은 OS는 스케줄러가 적게 실행되면서 원하는 프로세스를 공평하게 실행시켜주는 것.

💻 프로세스의 상태

어떤 경우에 Running, Ready, Blocked 상태가 되는지 아는 것이 중요하다.

  • Running
    • CPU에 의해 실행 중인 상태.
    • CPU가 1개라면 Running상태인 프로세스는 최대 1개.
  • Ready
    • 프로세스는 실행될 준비가 모두 끝나고 스케줄러의 선택에 의해 Running이 되기를 기다리는 상태.
  • Blocked
    • I/O 연산 중인 프로세스.
    • I/O 연산은 CPU에 의존적이지 않다. 따라서 CPU에 의한 ALU 연산과 함께 병행될 수 있다. I/O 연산과 같이 CPU에 의존적이지 않은 작업은 연산 시작 시 Blocked상태가 되고, Blocked상태가 끝나면 Ready상태가 된다.

💻 컨텍스트 스위칭

ALU의 연산은 레지스터에 의존적. 따라서 레지스터는 현재 Running 상태의 프로세스 정보로 채워져 있다. 프로세스 B가 실행되기 위해서는 현재 실행 중인 프로세스 A의 정보를 하드 디스크같은 다른 곳으로 저장해두고, B의 정보를 레지스터로 복원해야 한다. 이 과정을 컨텍스트 스위칭이라 하며, 이는 실행 중인 프로세스가 바뀔 때마다 빈번하게 일어난다.
컨텍스트 스위칭은 레지스터말고도 프로세스에 종속적인 다른 요소에서도 일어날 수 있다.

✏️ 프로그래밍을 통한 프로세스의 생성

바탕화면 관리자도 프로세스.
바탕화면에 있는 프로그램을 클릭하면 해당 프로그램은 바탕 화면 프로세스의 자식 프로세스가 된다.

💻 프로세스 생성 함수

별도의 프로세스를 생성하는 함수

BOOL CreateProcess(
    LPCSTR                lpApplicationName,   // 실행 파일의 이름 지정
    LPSTR                 lpCommandLine,       // 실행 파일에게 전달할 인자값
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL                  bInheritHandles,
    DWORD                 dwCreationFlags,
    LPVOID                lpEnvironment,
    LPCSTR                lpCurrentDirectory,  
    LPSTARTUPINFOA        lpStartupInfo,       // 프로세스의 특성 정보
    LPPROCESS_INFORMATION lpProcessInformation // 생성된 프로세스의 특정 정보
);
  • LPSTARTUPINFO 구조체
    생성하고자 하는 프로세스 정보 전달.
  • LPPROCESS_INFORMATION
    생성된 프로세스 정보를 반환받는 구조체.
typedef struct _STARTUPINFOA {
  DWORD  cb;              // 구조체 변수의 크기
  LPSTR  lpReserved;
  LPSTR  lpDesktop;
  LPSTR  lpTitle;         // 콘솔 윈도우의 타이틀 바 제목
  DWORD  dwX;             // 프로세스 윈도우의 x 좌표
  DWORD  dwY;             // 프로세스 윈도우의 y 좌표
  DWORD  dwXSize;         // 프로세스 윈도우의 가로 길이
  DWORD  dwYSize;         // 프로세스 윈도우의 세로 길이
  DWORD  dwXCountChars;
  DWORD  dwYCountChars;
  DWORD  dwFillAttribute; 
  DWORD  dwFlags;         // 설정된 멤버 정보
  WORD   wShowWindow;
  WORD   cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;
  HANDLE hStdOutput;
  HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;    // 프로세스 핸들
  HANDLE hThread;     // 쓰레드 핸들
  DWORD  dwProcessId; // 프로세스 ID
  DWORD  dwThreadId;  // 쓰레드 ID
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
  • 절대경로를 지정하지 않았을 경우 표준 검색 경로
  1. 실행 중인 프로세스의 실행파일이 존재하는 디렉터리
  2. 실행 중인 프로세스의 현재 디렉터리(Current Directory)
  3. Windows의 시스템 디렉터리(System Directory)
  4. Windows 디렉터리(Windows Directory)
  5. 환경변수 PATH에 의해 지정되어 있는 디렉터리

0개의 댓글