2012년 8월 25일 토요일

윈도우즈 시스템 프로그래밍 [5] - 프로세스의 생성과 소멸



윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.



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 상태가 되어 스케쥴러의 선택을 기다려야 함.




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 구조체 변수의 주소값을 인자로 전달






참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저 


댓글 없음:

댓글 쓰기