V : 프로세스의 생성과 소멸
뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;)
프로세스의 이해
오늘날의 운영체제는 멀티프로세스 운영체제로서, 프로세스가 여러개 존재할 수 있는 운영체제이다.
프로세스란 실행 중 상태에 있는 프로그램을 의미하며, 프로그램을 실행하는 순간 메모리의 할당이 이루어지고, 이 메모리 공간으로 프로그램의 바이너리 코드가 올라가게 된다. 이 순간 이 메모리와 프로그램의 인스턴스에 대한 정보를 가지는 집합을 프로세스라고 한다.
메모리 공간은 여러 영역으로 나뉠 수 있다.
- Data 영역 : 전역변수나 static 변수의 할당을 위해 존재하는 영역
- Stack 영역 : 지역변수 할당이나 함수 간 호출에 따른 계층 및 파라미터 저장 영역
- Heap 영역 : 동적 할당을 위해 존재하는 영역
- Code 영역 : 실행파일 내에 존재하는 명령어들이 적재되는 메모리 영역
또한, 프로세스를 구성하는 요소로 더불어 생각해봐야 할 것은 CPU 내에 존재하는 레지스터들이다.
CPU 내에 존재하는 레지스터들은 현재 실행 중인 프로그램을 위한 데이터들로 채워지므로, 레지스터들의 상태 또한 프로세스의 일부로 포함시켜 말할 수 있다.
프로세스의 스케줄링과 상태 변화
CPU는 하나인데, 동시에 실행되어야 할 프로세스가 여러개라면, 하나의 CPU가 여러 개의 프로세스를 번갈아 가며 실행해야 한다.
따라서 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일을 가리켜 스케줄링이라고 한다. 이 때 사용되는 알고리즘 또한 스케줄링 알고리즘이라고 부른다.
일반적으로, 프로그램이 실행되는 과정에서 대부분의 시간을 I/O 작업에 소모한다. 따라서 이러한 시간 동안 다른 프로세스를 실행하여 연산시키는 것이 효율성을 높이는 방법이다.
프로세스 각각의 상태는 시간 흐름에 따라 변화하는데, 이는 다음과 같은 상태를 가질 수 있다.
- 생성 에서의 준비 상태로의 전환
- 프로세스는 생성과 동시에 준비 상태로 들어간다. 프로세스가 생성된다고 해서 바로 실행 상태로 가는 것이 아니며, 스케줄링의 대상으로 등록될 뿐이다.
- 준비 상태에서 실행 상태로의 전환
- 이는 준비 상태에 있는 여러 프로세스 중 스케줄러에 의해 선택된 프로세스가 CPU에서 실행되는 것이다.
- 실행 상태에서 준비 상태로의 전환
- 이는 CPU를 점유하고 있는 프로세스가 사용 가능한 시간을 모두 소모하였거나, 우선순위가 높은 다른 프로세스가 생성되었을 경우 CPU 사용을 중단하고 준비상태로 돌아가게 된다.
- 실행 상태에서 블럭 상태로의 전환
- 이는 CPU 작업 중 프로세스가 I/O 작업을 필요로 하는 것으로서, CPU가 더이상 이 프로세스에 대해 해줄 수 있는 것이 없을 때, I/O 작업이 완료될 때 까지 스케줄링 대상에서도 제외할 수 있게끔 블럭 상태로 전환된다.
- 블럭 상태에서 준비 상태로의 전환
- 만일 블럭 상태였던 프로세스의 I/O 작업이 완료되어 CPU 연산을 수행할 준비가 되었다면, 스케줄러에 의해 선택될 수 있도록 준비 상태로 전환이 된다.
컨텍스트 스위칭
실행 중인 프로세스의 변경은 시스템에 많은 부하를 가져다 주기도 한다. 이는 프로세스의 실행을 중단했을 때, 그 상태 그대로 이후에 다시 실행을 이어나가야 하기에, 프로세스마다 레지스터가 가지고 있는 데이터들을 어딘가에 저장하고 불러와야 하기 때문이다.
따라서 프로그램의 실행과정에서 I/O 를 고려한다면 멀티 프로세스 기반의 프로그램 실행이 성능 향상에 많은 도움을 주지만, 그로 인한 빈번한 컨텍스트 스위칭은 오히려 성능에 저하를 가져올 수도 있기에 여러 방법론이 존재하게 된다.
프로세스의 생성
프로세스를 생성하는 가장 쉬운 방법은 실행 파일을 더블클릭하는 것이지만, 시스템 프로그래머는 프로그램 실행 중에 또 하나의 프로세스를 생성하는 방법이 더 있다.
윈도우는 프로세스 생성을 돕기 위해서 CreateProcess()
함수를 제공하고 있다. 이 때 이 함수를 호출하는 프로세스를 부모 프로세스라고 하고, 호출되어 생성되는 프로세스를 자식 프로세스라고 한다.
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
...
);
LPCTSTR lpApplicationName
: 생성할 프로세스의 실행파일 이름을 의미한다. 경로명을 제공하지 않는 경우 프로그램의 현재 디렉터리에서 찾게 된다.LPTSTR lpCommandLine
: 프로세스를 생성하며 같이 전달할 인자를 의미한다. 만일lpApplicationName
이NULL
인 경우 이 값에 실행파일의 이름을 더불어 전달할 수 있고, 이 경우 표준 검색경로를 기준으로 실행파일을 찾게 된다.
프로세스의 생성의 첫 번째 단계로서, STARTUPINFO
구조체를 선언하고 초기화해야 한다. 이는 콘솔 윈도우의 타이틀 제목, 프로세스 윈도우의 좌표와 크기, 표준 입출력 핸들 등을 다룬다.
이어서, 현재 디렉터리를 설정해야 한다. 일반적으로 프로세스가 생성되면 프로세스의 현재 디렉터리는 프로세스의 실행파일이 존재하는 디렉터리로 설정된다.
현재 디렉터리 위치는 GetCurrentDirectory()
함수를 통해 얻어오고, SetCurrentDirectory()
함수를 통해 설정할 수 있다.
세 번째 단계로, CreateProcess()
함수를 호출한다. 이 함수는 두 번째 인자로 전달된 문자열에 변경을 가하기에, 이 인자는 수정이 가능한, 변수 형태로 전달되어야 한다.
이처럼 구현해야 할 프로그램에 따라서 프로세스 생성은 유용하게 사용이 될 수도 있으며, 일반적으로 DOS 명령어를 처리할 때 대표적으로 사용된다.
이것만은 알고 갑시다
- 프로세스에 대한 이해
- 실행 중에 있는 프로그램으로서, 오늘날 우리가 쓰는 대부분의 OS는 한 번에 여러 프로세스를 생성하고 다루는 멀티 프로세스 운영체제이다.
- 프로세스의 상태
- 프로세스는 생성, 준비, 실행, 블럭, 종료의 상태 전이를 거치며 실행되며, 이는 OS의 스케줄러와 프로세스의 I/O 처리와 관련되어 다양한 상태로 옮겨갈 수 있다.
- 컨텍스트 스위칭
- 실행 중인 프로세스가 변경될 때 해당 프로세스의 레지스터 정보들을 메모리에 저장하고, 실행하려는 프로세스의 레지스터 정보를 가져와 세팅해주는 작업을 포함해서 다양한 작업이 일어나는데, 이 컨텍스트 스위칭은 시스템에 많은 부하를 주는 작업이다.
- 프로세스를 생성하는 방법
CreateProcess()
함수를 통해 윈도우에서 프로세스를 생성할 수 있다.
'공부한 이야기 > 윈도우 OS' 카테고리의 다른 글
VII : 프로세스간 통신 (IPC) 1 (0) | 2023.04.29 |
---|---|
VI : 커널 오브젝트와 오브젝트 핸들 (0) | 2023.04.29 |
IV : 컴퓨터 구조에 대한 두번째 이야기 (0) | 2023.04.29 |
III : 64비트 기반 프로그래밍 (0) | 2023.04.29 |
II : 아스키코드 VS 유니코드 (0) | 2023.04.29 |