시스템 프로그래밍 5장 -프로세스의 생성과 소멸

김주현·2021년 9월 29일
0

시스템 프로그래밍

목록 보기
5/21
post-thumbnail

프로세스의 이해

  • 프로세스란 무엇인가?

프로세스 : 메인 메모리로 이동하여 실행 중에 있는 프로그램

바탕화면에있는 blcok.exe 게임 - 프로그램

프로그램 클릭시 -> 메모리 할당 -> 메모리 공간으로 바이너리 코드 올라감 -> 이순간 부터 프로그램은 프로세스가 됨

  • 프로세스를 구성하는 요소

프로세스의 범위 : 메모리 구조 + 레지스터 Set

프로세스 별 독립적인 대상은 프로세스 범주에 포함시킬 수 있다.

프로그램이 실행될 때 구성되는 메모리 공간

Data 영역 - 기본적으로 전역변수나 static 변수의 할당을 위해 존재하는 영역

stack 영역 - 지역변수 할당과 함수 호출 시 전달되는 인자값들의 저장을 위해 존재하는 영역

heap 영역 - 동적 할당을 위해 존재하는 영역

code 영역 - 실행파일을 구성하는 명령어들이 올라가는 메모리 영역

위 메모리구조를 프로세스라고 표현하기도 함 위와 같은 메모리 구조는 실행되고 있는 프로세스 개수만큼 생성된다.

  • 레지스터 셋

cpu가 현재 프로그램을 실행 중에있다면 cpu를 구성하는 레지스터들은 block.exe의 실행을 위해 필요한 데이터들로 채워지게 된다. 이렇듯 CPU 내에 존재한느 레지스터들은 현재 실행 중인 프로그램을 위한 데이터들로 채워진다. 따라서 레지스터들의 상태까지도 프로세스의 일부로 포함시켜 말할 수 있다.

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

스케줄러 - 소프트웨어적으로 구현되어있는 윈도우즈에서 제공해주는 장치

  • 프로세스의 스케줄링

우리가 사용하는 멀티 프로세스 운영체제에서 여러 개의 프로세스가 실행되 것처럼 보이는 이유는 여러 개의 프로세스들이 CPU 할당 시간을 나누기 때문이다.

둘 이상의 프로세스가 적절히 실행되도록 컨트롤

  • 스케줄링의 기본원리

스케줄링 : 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일, 이때 사용되는 알고리즘을 가리켜 스케줄링 알고리즘이라 함

스케줄러 : 스케줄링 알고리즘을 적용해서 실제로 프로세스를 관리하는 운영체제 요소, 물리적 장치가 아닌 소프트웨어적을 구현되어 있는 요소로서,운영체제를 구성하는 중요한 요소

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

일반적으로 프로그램이 실행되는 과정에서 많은시간을 입출력에 할당함(파일 입출력만이 아닌 네트워크 송수신까지) 이때 CPU는 아무 일도 하지 않고 대기하게 됨

  • 프로세스의 상태 변화

프로세스 각각의 상태는 시간 흐름에 따라 변화함

상황 1: start에서 ready 상태로의 전이를 보여줌

start는 프로세스가 생성되었음을 의미 프로세스는 생성과 동시에 ready 상태로 들어감. ready 상태에 있는 프로세스는 cpu에 의해 실행되기를 희망하는 상태임

상황 2: Ready 상태에서 running 상태로의 전이를 보여준다

스케줄러는 스케줄링 알고리즘에 기반하여 ready상태에 있는 프로세스중 하나를 선택해서 CPU에 의해 실행될 수 있도록 함

상황 3 : 실행 상태에서 레디 상태로의 전이를 보여준다

프로세들은 생성 시 중요도에 따라서 우선순위라는 것이 메겨진다
우선순위가 더높은 프로세스가 생성될경우 실행을 멈추고 ready상태로 들어감

상활 4 : 실행상테에서 블록 상태로의 전이를 보여준다

실행 중에 있는 프로세스가 실행을 멈추는 상태로 들어간다 일반적으로 데이터 입/출력에 관련된 일을 하는 경우에 발생한다.

상활 5 : 블록 상태에서 레디상태로의 전이를 보여준다/

레디,블록 상태 모두 프로세스가 실행되지 않는 상태이다 하지만 ready 상태는 스케줄러에 의해 선택되어 지금 당장이라도 실행 가능한 상태이고 블록 상태는 스케줄러에 의해서 선택될 수 었는 상태이다(여기서 프로세스가 종료될경우 exit 상태로 갈 수도 있다.)

컨텍스트 스위칭

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

프로세스가 변경될때 레지스터가 지니고 있는 데이터들을 어딘가에 저장해야만 한다.

위그림에서 프로세스 A가 실행중 레지스터 안에는 프로세스 A와 관련된 정보들로 채워짐. 반면 프로세스 B는 ready 상태에 있으며, 프로세스 B와 관련된 레지스터 정보가 메모리에 저장되어있다.

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

이는 레지스터 개수가 많은 시스템일수록 그리고 프로세스별로 관리되어야 할 데이터 종류가 많을수록 더하다(이것이 멀티 프로세스 운영체제의 단점이다)

멀티프로세스 기반의 프로그램 실행은 많은 부분 성능 향상에 도움이되지만 컨텍스트 스위칭이 미치는 영향을 고려할 경우 오히려 성능저하를 가져올수도있음.

프로세스의 생성

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

-CreateProcess 함수의 이해

Window는 프로세스 생성을 돕기 위해서 createProcess 함수를 제공한다. 이때 CreateProcess 함수를 호출하는 프로세스를 가리켜 부모 프로세스라 하고, CreateProcess 함수 호출에 의해 생성된 프로세스를 자식 프로세스라 한다.

lpApplicationName : 생성할 프로세스의 실행파일 이름. 경로명을 추가로 지정할수있음 디폴트값은 프로그램의 현재 디렉토리

lpCommandLine : 프로세스의 인자를 전달할 때 사용. lpApplicationName에 NULL을 전달하고 이 두번째 전달인자에 실행파일의 이름을 더불어 전달할 수도있다. 이러한 경우 실행파일의 이름은 표준 검색경로를 기준으로 찾게 된다.

lpProcessAttributes: 프로세스의 보안속성을 지정.NULL 입력시 디폴트 보안속성 지정

lpThreadAttributes : 쓰레드의 보안 속성을 지정할 때 사용. NULL 입력시 디폴트 보안속성 지정

hinheritHandle : 전달인자가 TRUE인 경우. 생성되는 자식 프로세스는 부모 프로세스가 소유하는 핸들 중 일부(상속 가능한 핸들)를 상속한다.

dwCreationFlag : 생성하는 프로세스의 특성(특히 우선순위)를 결정지을 때 사용되는 옵션이다. 특별히 설정할 필요가 없을 경우에는 0을 전달한다.

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

lpCurrentDirectory : 생성하는 프로세스의 현재 디렉토리를 설정하는 인자이다. 전달인자는 디렉터리 정보를 포함하는 완전경로 형태로 구성되어야 하며.NULL이 전달될 경우 부모 프로세스의 현재 디렉터리가 새로 생성하는 자식 프로세스의 현재 디렉터리가 된다. 역시 NULL이 일반적으로 전달된다.

lpStartupInfo : STARTUPINFO 구조체 변수를 초기화한 다음에 이 변수의 포인터를 인자로 전달한다 . STARTUPINFO 구조체 변수는 생성하는 프로세스의 속성을 지정할 때 사용된다.

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

  • 예제를 통한 CreateProcess 함수의 이해

14행 : STARTUPINFO 구조체 변수를 선언과 동시에 0으로 초기화하고 있다.
이 변수는 CreateProcess 함수의 9번째 인자로 들어가는 요소로서, 생성하는 프로세스의 속성을 지정하는 용도로 사용된다. 0으로 초기화해야 함을 잊지말자.
17~23행 : 생성하고자 하는 프로세스의 속성을 지정하고있다.

다음은 초기화한 변수에대한 주석이다

-프로세스 생성 1단계 : STARTUPINFO 구조체 변수의 생성 및 초기화

17행 : 구조체 변수 si의 바이트 단위 크기로 멤버변수 cb를 초기화하고 있다. 확정성을 고려한 멤버이다 아직까지는 형식적인 측면이 강하다.

18행 : si 구조체 변수에 설정되어 있는 값들 중에서 반영코자 하는 멤버들에 대한 정보를 설정하고 있다. STARTF_USEPOSITION은 구조체 멤버 중에서 dwX와 dwY의 값을 참조해서, 생성하는 프로세스 윈도우 위치를 결정할 때 사용된다. 아무리 dwX와 dwY가 값을 지니고 있다 하더라도, dwFlags에 STARTF_USEPOSITION가 설정되지 않으면 아무런 의미가 없다. 비슷하게.STARTF_USESIZE는 구조체멤버 중에서 dwXSize와 dwYSize의 값을 참조해서, 생성하는 프로세스 윈도우 크기를 결정할 때 사용된다.

19,20행 : 생성하는 프로세스 콘솔의 위치를 설정해 주고 있으며 21,22번째 줄에서는 생성하는 프로세스 콘솔 윈도우 크기를 설정해 주고 있다.

23행 : 지정한 문자열은 프로세스 윈도우의 타이틀 바 제목을 지정할 때 사용된다. 만약에 생성하는 프로세스가 콘솔 프로세스가 아닌 노트패드와 같은 윈도우 프로세스 일경우에는 아무런 의미가 없다

44행 : 이렇게 초기화된 구조체 변수 si는 44번째 줄에서 인자로 전달되고 있다.

-프로세스 생성 2단계 : 현재 디렉토리의 설정

현재 디렉토리 : 특정 파일을 찾을 경우에 기본이 되는 디렉토리, 만약에 완전경로를 전달하지 않고 파일을 생성 및 개방할 경우 현재 디렉터리를 기준으로 작업은 이뤄지게됨

일반적으로 프로세스 생성시 현재 디렉토리는 프로세스의 실행파일이 존재하는 디렉토리러 설정됨.

실행 중에 있는 프로세스의 현재 디렉토리 위치는 다음 함수를 이용해서 확인이 가능하다.


DWORD GetCurrentDirectory(
	DWROD nBufferLength // 현재 디렉터리 정보가 저장될 메모리 버퍼의 크기 바이트 단위 길이 정보가 아니라, 저장 가능한 문자열 길이 정보가 전달되어야함
    LPTSTP lpBuffer 현재 디렉터리 정보가 저장될 메모리 버퍼의 포인터
    );

MAX_PATH : windef.h에 선언됨 이는 Windows에서 허용하는 완전경로의 최대 길이가 얼마인지 알려줌

다음 함수로 현재디렉토리를 변경가능

BOOL SetCurrentDirectory(
LPCTSTR lpPathName //변경하고자하는 디렉토리 경로명을 전달

);

29,30행 : 현재 디렉토리 정보를 추출해서 출력. 이 출력결과를 통해서 기본적으로 구성되는 현재 디렉토리가 어디인지 확인할수있다.

33행 : 현재 디렉토리를 C 드라이브 아래에 WinSystem이라는 디렉토리로 변경하고있다. 35,36번째 줄에서는 변경된 현재 디렉토리 정보를 다시 확인하고 있다.

  • 프로세스 생성 3단계 : CreateProcess 함수의 호출

39행 : CreateProcess 함수의 첫 번째 전달인자로 NULL이 전달되고 있다. CreateProcess 하무의 첫 번쨰 인자로 NULL을 전달하고, 두 번째 인자를 통해서 생성하려는 프로세스 이름 정보까지 함께 전달할수있다. 이때 두번자 인자는 무조건 변수의 형태여야만함(내부적으로 문자열을 변경하기 때문)

25행 : 실행파일의 이름과 전달인자 정보를 문자열로 구성하고 있고 구성된 문자열을 CreateProcess함수의 두 번째 인자로 전달하고 있다. "AdderProcess.exe"가 실행파일 이름이고, 이어서 등장하는 문장들은 main 함수의 전달인자가 된다.

CreateProcess 함수의 첫 번째 전달인자를 통해서 실행파일 이름을 전달할 경우. 현재 디렉토리를 기준으로 실행파일을 찾게 되지만, 두 번째 전달인자을 통해서 실행파일 이름을 전달할 경우에는 아래에서 보여주는 표준검색결로 순서대로 실행파일을 찾게 된다.

다양한 위치에서 실행파일 찾기 때문에 보통은 두 번째 전달인자를 통해 이름을 전달한다.

43행 : CreateProcess 함수의 여섯 번째 전달인자에 대해서 간략히 소개하겠다. 이 전달인자는 프로세스 특성을 결정지을 때 사욛됨.
CREATE_NEWCONSOLE을 전달하면 새롭게 생성하는 프로세스를 위한 콘솔 윈도우가 독립적으로 생성됨. 만약 전달되지않으면 부모 프로세스의 콘솔 윈도우를 자식 프로세스가 공유하게 됨. 또한 콘솔기반 프로세스가 아닐경우 아무런 의미를 지니지않음.

44행 : 15번째 줄에서 선언하고, 44번째 줄에서 전달되는 PROCESS_INFORMATION 구조체 변수는 새로 생성되는 프로세스 관련 정보를 얻기 위해 사용됨

이것만은 알고 갑시다.

1.프로세스에 대한 이해
실행 중에 있는 프로그램을 가리켜 프로세스라고 한다. 우리가 사용하는 windwows를 가리켜 멀티 프로세스 운영체제라 하는데, 이는 동시에 둘 이상의 프로세르를 생성할 수 있기 때문이다.

  1. 프로세스의 상태
    레디 - 런닝- 블록 - exit 상태를 이해하고있어야한다

  2. 컨텍스트 스위칭
    실행 중인 프로세스가 변경될때 컨텍스트 스위칭이라는 과정을 거치게 된다. 이는 현재 실행 중인 프로세스 레지스터 정보를 메모리에 저장하고,실행하고자 하는 프로세스의 정보를 레지스터에 복원하는 작업을 포하매서, 프로세스별로 관리되어야하는 데이터의 종류에 따라 그 범위가 결정된다. 이러한 컨텍스트 스위칭은 시스템에 많은 부담을 주는 작업이다.

  3. 프로세스를 생성하는 방법
    window에서 프로세스를 생성하는 대표적인 함수는 CreateProcess이다. 이 함수의 기본적인 상용방법을 예제를 통해서 익히도록 하자!

0개의 댓글