2015년 10월 7일 수요일

windows programming 공부하면서..(6)

프로세스

프로세스 : 실행 중에 있는 프로그램을 의미

프로그램의 구조
Data 영역 : 전역변수나 static 변수의 할당을 위해 존재
Stack 영역 : 지역변수 할당과 함수 호출 시 전달되는 인자값들의 저장을 위해 존재
Heap 영역 : 동적 할당(malloc, calloc 함수에 의한 할당)을 위해 존재
Code 영역 : 실행파일을 구성하는 명령어들이 올라가는 메모리 영역

메모리 구조(프로세스)



스케줄링(Scheduling) : 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일
스케줄링 알고리즘(Scheduling Algorithm) : 스케줄링을 할 때 사용되는 알고리즘을 의미
스케줄러(Scheduler) : 스케줄링 알고리즘을 적용해서 실제로 프로세스를 관리하는 운영체제 요소(모듈)

멀티 프로세스


고전적 : 사용하는 순서대로 사용
동시에 실행 : 동시에 여러가지 프로세스를 사용

I/O 처리시 문제가 발생하는데
고전적인 방법에서 첫 번째로 들어온 프로세스가 I/O처리가 필요하면 뒤에 사용해야 하는 프로세스를 실행되지 않는 반면,
동시에 실행하게 되면 이러한 문제점이 사라지고 CPU가 쉬지 않고 일을 할 수 있게 된다.곧, 프로세스를 효율적으로 사용하게 되는 것이다.

프로세스는 S(Start), Ready, Running, Blocked, E와 같은 상태로 나뉜다.

S(Start) : 프로세스가 생성되었음을 의미, 보통 생성과 동시에 Ready 상태로 들어간다.
Ready : CPU에 의해 실행되기 희망하는 상태.
Running : 스케줄러에 의해 선택된 프로세스가 실행되고 있는 상태를 의미.
Blocked : 실행 중에 있는 프로세스가 실행을 멈추는 상태(보통 I/O 작업이 필요한 경우)

* 우선순위(Priority) : 프로세스의 중요도에 따라서 나누는 순위
* Ready & Blocked : 둘 다 사용되지 않는 상태이지만,
Ready 상태는 스케줄러에 의해 선택되어 지금 당장이라도 실행 가능한 상태
Blocked 상태는 스케줄러에 의해서 선택될 수 없는 상태이다.

컨테스트 스위칭(Context Switching) : 멀티 프로세스 과정 중에 레지스터에 있는 값(메모리)과 CPU에 값을 주고 받는 것

이러한 컨테스트 스위칭은 시스템에 많은 부담을 준다. 이는 레지스터 개수가 많은 시스템일 수록, 그리고 프로세스별로 관리되어야 할 데이터 종류가 많을 수록 더하다. 이는 바로 멀티 프로세스 OS의 단점이다.

CreateProcess 함수의 이해


부모 프로세스(Parent Process) : CreateProcess함수를 호출하는 프로세스
자식 프로세스(Child Process) : CreateProcess함수 호출에 의해 생성된 프로세스

곧, CreateProcess를 통해 부모 자식간의 관계가 형성된다.

MSDN :  https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx




lpApplicationName : 생성할 프로세스의 실행파일 이름을 인자로 전달. 경로명을 추가로 지정할 수 있으며, 경로명을 지정하지 않을 경우 프로그램의 현재 디렉토리(Current Directory)에서 실행파일을 찾게 된다.

lpCommandLine : 새로 생성하는 프로세스에 인자를 전달할 때 사용하는 매개변수.
lpApplicationName에 NULL을 전달하고, 이 변수에 실행파일의 이름을 더불어 전달할 수 있다. 이 경우 실행파일의 이름은 표준 검색경로를 기준으로 찾게 된다.

lpProcessAttributes : 프로세스의 보안 속성을 지정할 때 사용하는 인자로 보통 NULL을 전달한다.

lpthreadAttributes : 쓰레드의 보안 속성을 지정할 때 사용. NULL을 전달할 경우 디폴트 보안 속성이 지정된다.

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

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

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

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

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

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

*자료형 BOOL은 헤더파일 windef.h에 아래와 같이 선언되어 있다.



해더파일 windef.h는 헤더파일 windows.h에 의해 포함되기 때문에 windef.h를 #include 지시자를 통해 포함시킬 필요가 없다.

AdderProcess.cpp


tchar.h 파일의 내용을 보면 아래와 같은 내용을 확인 할 수 있다.



CreateProcess.cpp





코드를 보기 전에 STARTUPINFO 구조체에 대해서 알아보자.




프로세스의 현재 디렉터리 위치는 GetCurrentdirectory 함수를 이용하여 확인 가능하다.



값이 없으면 0을 반환한다. 위 코드에 보면 MAN_PATH를 사용하는데 이는 windef.h에 선언되어 있으며, Windows에서 허용하는 완전경로(Full Path)의 최대 길이가 얼마인지를 알려준다.

프로세스의 현재 디렉터리변경을 위해서 SetCurrentDirectory()함수를 사용할 수 있다.



실패할 경우 0을 반환한다.
CreateProcess 함수를 호출할 때 아래와 같은 형태의 호출은 불가하다.(유니코드 버전에서)


두 번째 전달인자의 문자열은 변수 형태여야 한다. 이럴 경우 컴파일 타임(Compile Time)에는 오류가 발생하지 않지만, 런 타임(Run Time)에는 메모리 참조 오류가 발생한다.

두 번째 전달인자를 통해서 실행파일 이름을 전달할 경우에는 아래에서 보여주는 표준 검색경로 순서대로 실행파일을 찾게 된다.

  1. 표준 검색경로 : 실행 중인 프로세스의 실행파일이 존재하는 디렉토리
  2. 표준 검색경로 : 실행 중인 프로세스의 현재 디렉토리(Current Directory) 
  3. 표준 검색경로 : Windows의 시스템 디렉터리(System Directory)
  4. 표준 검색경로 : Windows 디렉토리(Windows Directory)
  5. 표준 검색경로 : 환경변수 PATH에 의해 지정되어 있는 디렉토리
3번과 4번에 대한 이해는 아래 예제를 통해 이해하도록 하자.

WinSysDir.cpp




'표준 검색경로'의 활용

실습을 위해 AdderProcess.cpp파일을 컴파일 해서 AdderProcess.exe파일을 만들고, CreateProcess.cpp파일은 CreateProcess.exe 파일을 만든다.

CreateProcess.cpp 코드를 보면 현재 디렉터리(Current Directory)를 'C:\WinSystem'으로 변경하는 부분을 볼 수 있다. 곧 c:\에 WinSystem 디렉터리를 생성해줘야한다.

다음 c:\WinSystem경로에 두 파일을 넣어준 후 CreateProcess.exe 파일을 실행하면 실행되는 것을 확인 할 수 있다.
 


댓글 없음:

댓글 쓰기