윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.
5장. 프로세스의 생성과 소멸
I. 프로세스 ( Process ) 의 이해
1. 프로세스란 무엇인가?
- 프로세스 = 실행 중에 있는 프로그램
2. 프로세스를 구성하는 요소
① execution of "C" program
- Data 영역 : 전역 변수, static 변수의 할당을 위한 공간
- Stack 영역 : 지역 변수, 함수 호출시 전달되는 인자 값의 저장을 위한 공간
- Heap 영역 : 동적 할당 (malloc, calloc) 함수를 위한 공간
- Code 영역 : 시행 파일을 구성하는 명령어들이 올라가는 메모리 영역
② register Set
- 프로그램 실행을 위해선 레지스터가 절대적으로 필요
- 레지스터의 상태도 프로세스의 일부로 포함시킬 수 있음
=> 컨텍스트 스위칭(context switching)의 이해에 중요!
II. 프로세스의 스케쥴링과 상태 변화
1. 프로세스의 스케쥴링
- 하나의 CPU가 여러개의 프로세스를 번갈아가며 실행
=> 고속으로 실행하므로 사용자는 동시라고 느낌
∴ 여러개의 프로세스가 CPU 할당 시간을 나누기 때문에 동시 실행처럼 보임
2. 스케쥴링의 기본 원리
- 스케쥴링 : 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일
- 스케쥴러 : 스케쥴링 알고리즘을 적용해 프로세스를 관리하는 운영체제 요소 ( 모듈)
3. 멀티 프로세스는 CPU를 바쁘게 함
- A프로세스가 I/O에 관련된 일( ex. 네트워크 송수신 )을 할 경우, 운영체제는 스케쥴러를 통해
다른 프로세스가 실행되도록 스케쥴링 함
- I/O가 프로그램 실행에서 많은 부분을 차지
4. 프로세스의 상태변화
① S(Start)에서 Ready 상태로의 전이
- S는 프로세스가 생성되었음을 의미 => 생성과 동시에 Ready 상태가 됨
- Ready 상태 = CPU에 할당 되기를 기다리는 상태
-> 멀티 프로세스 운영체제 => 실행 중인 프로세스가 있을것
② Ready 상태에서 Running 상태로의 전이
- 스케쥴러는 Ready 상태의 프로세스 중 하나를 실행할 수 있음
③ Running 상태에서 Ready 상태로 전이
- 프로세스는 생성시 중요도에 따라 우선순위 (Priority) 가 매겨짐
=> 다시 Ready상태가 된 프로세스는 다른 프로세스(우선순위가 높은)가 종료되기를 기다려야 함
④ Running 상태에서 Blocked 상태로 전이
- 실행 중에 있는 프로세스가 멈추는 (Blocked) 상태로 들어가는 것
- 데이터 입/출력에 관련된 일을 하는 경우 발생
=> 입/출력에 시간이 많이 걸림 -> 입/출력 진행 중인 프로세스는 잠시 Blocked 상태로 돌리고
Ready 상태의 프로세스를 대신 실행시킴
⑴ 프로세스 A가 파일을 입/출력 해야하는 상황을 만남
⑵ Blocked 상태가 되어 파일 입/출력을 진행
⑶ 프로세스 A가 Blocked 되는 동시에 Ready 상태의 프로세스가 Running 됨
⑤ Blocked 상태에서 Ready 상태로의 전이
- Blocked 상태는 스케쥴러에 의해 선택될 수 없는 상태
=> Ready 상태와의 차이점. Ready 상태에선 스케쥴러에 의해 실행 가능
- 입/출력이 완료된 Blocked 프로세스는 다시 Ready 상태가 되어 스케쥴러의 선택을 기다려야 함.
- S는 프로세스가 생성되었음을 의미 => 생성과 동시에 Ready 상태가 됨
- Ready 상태 = CPU에 할당 되기를 기다리는 상태
-> 멀티 프로세스 운영체제 => 실행 중인 프로세스가 있을것
② Ready 상태에서 Running 상태로의 전이
- 스케쥴러는 Ready 상태의 프로세스 중 하나를 실행할 수 있음
③ Running 상태에서 Ready 상태로 전이
- 프로세스는 생성시 중요도에 따라 우선순위 (Priority) 가 매겨짐
=> 다시 Ready상태가 된 프로세스는 다른 프로세스(우선순위가 높은)가 종료되기를 기다려야 함
④ Running 상태에서 Blocked 상태로 전이
- 실행 중에 있는 프로세스가 멈추는 (Blocked) 상태로 들어가는 것
- 데이터 입/출력에 관련된 일을 하는 경우 발생
=> 입/출력에 시간이 많이 걸림 -> 입/출력 진행 중인 프로세스는 잠시 Blocked 상태로 돌리고
Ready 상태의 프로세스를 대신 실행시킴
⑴ 프로세스 A가 파일을 입/출력 해야하는 상황을 만남
⑵ Blocked 상태가 되어 파일 입/출력을 진행
⑶ 프로세스 A가 Blocked 되는 동시에 Ready 상태의 프로세스가 Running 됨
⑤ Blocked 상태에서 Ready 상태로의 전이
- Blocked 상태는 스케쥴러에 의해 선택될 수 없는 상태
=> Ready 상태와의 차이점. Ready 상태에선 스케쥴러에 의해 실행 가능
- 입/출력이 완료된 Blocked 프로세스는 다시 Ready 상태가 되어 스케쥴러의 선택을 기다려야 함.
5. 프로세스의 상태 변화, 시나리오 다시 이해
- Running -> Ready : 해야할 일이 있으나, 어쩔 수 없이 양보해야하는 상황
ex) 우선순위가 높은 프로세스의 등장
but 항상 스케쥴러의 관심 대상이 됨
- Running -> Blocked : 해야할 일을 하고, 다른 프로세스에 Running 상태를 양보
ex) I/O 관련 작업 -> CPU 연산을 필요로 하지 않음 => 다른 프로세스의 CPU 연산을 양보
but 스케쥴러의 관심 대상이 되지 않음 -> Blocked 작업이 끝난 후 Ready로 가서 선택을 기다림
III. 컨텍스트 스위칭 (Context Switching)
- 실행중인 프로세스의 벼녕은 시스템에 많은 부하를 줌
- CPU 내에 레지스터는 현재 실행 중인 프로세스 데이터로 채워짐
=> ∴ 프로세스가 바뀌면 레지스터 값도 백업 후 변경되어야 함.
- Running -> Ready 될 때 레지스터 값은 메모리에 저장해 두어야 함 (Back Up)
- Running 프로세스와 Ready 프로세스가 바뀔 떄 => 컨텍스트 스위칭 발생
-> 실행되는 프로세스의 변경과정에서의 컨텍스트 스위칭은 시스템에 부담을 줌
=> 레지스터가 많을수록, 프로세스별 관리 데이터가 많을 수록 더 함 -> 멀티 프로세스의 단점.
IV. 프로세스의 생성
1. 프로세스의 생성
방법 1 : 실행 파일을 더블 클릭해 독립적인 프로세스를 생성
방법 2 : 프로그램 실행 중에 또 하나의 프로세스를 생성
2. CreateProcess 함수의 이해
- Windows에서 프로세스 생성을 위해 제공되는 함수
- CreateProcess 함수를 호출하는 프로세스 -> 부모 프로세스 (Parent Process)
- 호출 당하는 프로세스 -> 자식 프로세스 (Child Process)
BOOL CreateProcess (
LPCTSTR lpApplicationName, // ①
LPTCSTR lpCommandLine, // ②
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo, // ③
LPPROCESS_INFORMATION lpProcessInformation // ④
)
① lpApplicationName : 생성할 프로세스의 실행파일 이름
- 경로명을 지정할 수 있음
- 경로를 지정하지 않으면 프로그램의 현재 디렉토리에서 찾게 됨
② lpCommandLine :
- argc, argv와 같이 새로 생성하는 프로세스에 인자를 전달할 때
- lpApplicationName이 NULL일 경우 표준 검색경로에 따라 실행할 파일을 찾음
③ lpStartupInfo :
- STARTUPINFO 구조체 변수들을 초기화 한 후, 이 변수의 포인터를 전달함
④ lpProcessInformation
- 생성하는 프로세스의 정보를 얻기 위해 사용되는 인자
- PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달
참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저
댓글 없음:
댓글 쓰기