실행중인 프로세스A를 B로 변경하려면 CPU 내에 레지스터들의 값이 변경되야한다. 이때 A프로세스에서 사용되던 값들은 메모리에 저장해야 한다. B프로세스를 위해서 저장되었던 값들도 메모리에서 레지스터로 불러와야한다. 이작업을 가리켜 컨텍스트 스위칭이라한다
"실행되는 프로세스의 변경과정에서 발생하는 컨텍스트 스위칭은 시스템에 많은 부담을 준다"
멀티프로세스 운영체제는 I/O로 인한 대기상태를 관리해서 성능향상에 도움이 되지만 컨텍스트 스위칭의 부담을 최소화 해야한다.
Windows는 CreateProcess 함수를 제공한다
CreateProcess 를 호출하는 프로세스를 부모 프로세스라고 한다
CreateProcess 의해 생성된 프로세스를 자식 프로세스라고 한다
BOOL CreateProcessA(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
lpApplicationName: 생성할 프로세스의 실행파일 이름을 인자로 전달한다. 경로면을 추가로 지정할 수 있으며 지정하지 않을 경우 프로그램의 현재 디렉터리에서 실행파일을 찾는다
lpCommandLine: 생성하는 프로세스에 인자를 전달할때 사용한다
lpApplicationName 에 NULL을 전달하고 lpCommandLine 에 실행파일의 이름을 더불어 전달할 수도 있다
lpProcessAttributes: 프로세스의 보안속성을 지정할때 사용한다 보통 NULL 사용. 그러면 default 보안속성 사용됨
lpThreadAttributes: 쓰레드의 보안 속성을 지정할때 사용한다 NULL 사용. 그러면 default 보안속성 사용됨
bInheritHandles: 전달인자가TRUE인경우 자식프로세스는 부모 프로세스가 소유하는 핸들중 일부를 상속함
dwCreationFlags: 생성하는 프로세스의 특성을 결정지을 때 사용되는 옵션
lpEnvironment: 프로세스마다 Environment Block 이라는 메모리 블록을 관리함 이 블록을 통해서 프로세스가 실행에 필요로 하는 문자열을 저장할 수 있다. NULL 이 전달되면 자식 프로세스는 부모 프로세스의 환경 블록에 저장되어 있는 문자열을 복사하게 된다
lpCurrentDirectory: 생성하는 프로세스의 현재 디렉터리를 설정하는 인자이다. 전달인자는 디렉터리 정보를 포함하는 완전경로 형태로 구성되어야 하며, NULL이 전달될 경우 부모프로세스의 현재 디렉터리가 새로생성하는 자식프로세스의 현재 디렉터리가 된다. NULL이 일반적으로 던달된다
lpStartupInfo: STARTUPINFO 구조체 변수를 초기화한 다음에 이변수의 포인터를 인자로 전달한다. 구조체는 프로세스의 속성을 지정할때 사용된다.
lpProcessInformation: 생성하는 프로세스 정보를 얻기위해 사용되는 인자이다. PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달한다.