오다기리 박의 알고리즘 노트

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

운영체제

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

오다기리 박 2018. 8. 8. 23:17

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

1. 프로세스의 이해


  • 프로세스란?

    • 실행 중에 있는 프로그램

    • 실행파일을 클릭하면 메모리 할당이 이뤄지고 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로그램은 프로세스이다.

    • 우리가 사용하는 Windows를 멀티 프로세스 운영체제라 한다.

  • 프로세스의 구성요소

    • C프로그램 실행

    • 레지스터 셋

      • CPU내에 존재하는 레지스터들은 현재 실행 중인 프로그램을 위한 데이터들로 채워진다.

      • 레지스터들의 상태까지도 프로세스의 일부.


2. 프로세스의 스케줄링과 상태 변화


  • 프로세스의 스케줄링(Scheduling)

    • 하나의 CPU가 여러 개의 프로세스를 번갈아 가면서 실행해야 함.

    • 기본 원리

      • 스케줄링 : 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일

      • 스케줄러 : 스케줄링 알고리즘을 적용해서 실제로 프로세스를 관리하는 운영체제 요소(모듈)로서 스프트웨어적으로 구현되어 있는 요소이다.

    • 멀티 프로세스는 CPU를 바쁘게 한다.

      • 일반적으로 프로그램이 실행되는 과정에서 많은 시간을 I/O에 할당하기 때문에 순차기반 보다는 멀티 프로세스 기반으로 프로세스들을 처리하는 것이 효율적이다.

      • I/O 작업은 CPU 연산을 필요로 하지 않는다

  • 프로세스의 상태변화

    • 1. S -> Ready

      • 프로세스는 생성과 동시에 Ready 상태로 들어간다.

    • 2. Ready -> Running

      • 스케줄러는 Ready 상태에 있는 프로세스중 하나를 선택해서 CPU에 의해 실행되도록 한다.

    • 3. Running -> Ready

      • 프로세스들은 생성 시 우선순위가 메겨진다.


    • 4. Running -> Blocked

      • 입출력 작업은 CPU 연산을 필요로 하지 않는다.

      • 데이터 입출력을 진행 중인 프로세스는 잠시 내려오게 하고 Ready 상태에 있는 프로세스 중 하나를 대신 실행시키는 것이 CPU를 효율적으로 사용하는 것이다.


    • 5. Blocked -> Ready

      • Ready 상태는 스케줄러에 의해 선택되어 당장 실행 가능한 상태이고, Blocked 상태는 스케줄러에 의해서 선택될 수 없는 상태이다.

      • (프로세스 종료시 Blocked 상태를 거쳐서 E 상태로 감)

      • 입출력이 완료된 Blocked 상태에 있는 프로세스가 Ready 상태로 돌아간다.

  • 프로세스의 상태 변화 시나리오

    • 1. 우선순위가 높은 MS워드를 실행시켰을 때


    • 2. MS워드의 작업 파일을 저장할 때



    • 3. MS 워드의 저장이 끝났을 때


    • 4. 스케줄러가 작동하여 우선수위가 높은 MS워드를 실행 시킬 때


결론 : 여러 개의 프로세스들이 CPU 실행시간을 나누는 방식으로 동시 실행되는 효과를 얻는다. 프로그램 실행의 상당 시간을 I/O에 소모하기 때문에 둘 이상의 프로세스 실행은 CPU의 활용도를 높여 성능 향상까지 가져온다.

3. 컨텍스트 스위칭


  • CPU 내에 존재하는 레지스터들은 현재 실행 중인 프로세스 관련 데이터들로 채워진다.

  • 실행중인 프로세스가 변경되면 CPU 내의 레지스터들의 값도 변경된다.

  • 실행되는 프로세스의 변경과정에서 발생하는 컨텍스트 스위칭은 시스템에 많은 부담을 줌.

  • 레지스터 개수가 많은 시스템일수록, 프로세스별로 관리되어야 할 데이터 종류가 많을수록 시스템 부담이 크다.



4. 프로세스의 생성


  • 프로세스의 생성

    • 프로그램 실행 중에 또 하나의 프로세스를 생성할 수 있다.

  • CreateProcess()

    • BOOL CreateProcess(
      LPCTSTR lpApplicationName,
      LPTSTR lpCommandLine,
      LPSECURITY_ATTRIBUTES lpProcessAttributes,
      LPSECURITY_ATTRIBUTES lpThreadAttibutes,
      BOOL bInheritHandles,
      DWORD dwCreationFlags,
      LPVOID lpEnvironment,
      LPCTSTR lpCurrentDirectiory,
      LPSTARTUPINFO lpStartupInfo,
      LPPROCESS_INFORMATION lpProcessInformation
      );
      If the function fails, the return value is zero.

      • lpApplicationName : 생성할 프로세스의 실행파일 이름

      • lpCommandLine : 새로 생성하는 프로세스에 인자를 전달 할때 사용. lpApplicationName에 NULL, lpCommandLine에 실행파일 이름을 전달할 경우 실행파일의 이름은 표준 검색경로를 기준으로 찾게됨.

        • 첫번째 전달인자를 통해 실행파일 이름을 전달할 경우, 현재 디렉터리를 기준으로 실행파일을 찾게 되지만, 두번째 전달인자를 통해 실팽파일 이름을 전달 할 경우 표준검색경로 순서대로 실행파일을 찾는다

        • 1. 표준검색경로 : 실행 중인 프로세스의 실행파일이 존재하는 디렉터리

2. 표준검색경로 : 실행 중인 프로세스의 현재 디렉터리

3. 표준검색경로 : Windows의 시스템 디렉터리(C:\Windows\System32)

4. 표준검색경로 : Windows 디렉터리 (C:\Windows)

5. 표준검색경로 : 환경변수 PATH에 의해 지정되어 있는 디렉터리

      • lpProcessAttributes : 프로세스의 보안 속성. NULL

      • lpThreadAttibutes : 쓰레드의 보안속성 지정. NULL

      • bInheritHandles : TRUE인 경우 생성되는 자식 프로세스는 부모 프로세스가 소유하는 핸들 중 일부를 상속

      • dwCreationFlags : 생성하는 프로세스의  특성(우선순위)을 결정. 0
        CREATE_NEW_CONSOLE 전달시 새롭게 생성하는 프로세스를 위한 콘솔 윈도우가 독립적으로 생성됨. 0 전달시 부모 프로세스의 콘솔 윈도우를 자식 프로세스가 공유함.

      • lpEnvironment : 프로세스마다 Environment Block이라는 메모리 블록을 관리한다. 이 블록을 통해 프로세스가 실행에 필요로 하는 문자열을 저장할 수 있음. 이 전달인자를 통해서 생성하는 프로세스의 Environment Block을 지정. NULL 전달시 자식 프로세스는 부모 프로세스의 환경 블록에 저장되어 있는 문자열을 복사함.

      • lpCurrentDirectiory : 생성하는 프로세스의 현재 디렉터리 설정. NULL 전달시 부모 프로세스의 현재 디렉터리가 됨.

      • lpStartupInfo : STARTUPINFO 구조체 변수를 초기화한 다음에 이 변수의 포인터를 인자로 전달.

      • lpProcessInformation : 생성하는 프로세스 정보를 얻기 위해 사용. PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달하면 전달된 주소값이 가리키는 변수에 프로세스 정보가 채워짐.

        • typedef struct _PROCESS_INFORMATION
          {
          HANDLE hProcess; //프로세스의 핸들
          HANDLE hThread; //쓰레드 핸들
          DWORD dwProcessId; //프로세스의 ID
          DWORD dwThreadId; //쓰레드 ID
          } PROCESS_INFORMATION;

        • hProcess은 프로세스의 커널 오브젝트를 가리키기 위한 것이고, dwProcessId는 프로세스 자체를 구분짓기 위한 것이다.

        • 운영체제는 프로세스를 생성하면 프로세스 내부적으로 쓰레드라는 가벼운 프로세스를 생성하여 이를 통해 main 함수가 호출되게끔 디자인되어 있다.