프로세스를 구성하는 범주는 프로세스 별로 독립적으로 할당받는 리소스. 메모리, 가상 메모리 + 레지스터 Set
메모리 구조 + 레지스터 Set
프로세스 별 독립적인 대상도 프로세스의 범주에 포함시킬 수 있다 => 레지스터 Set

- 둘 이상의 프로세스가 적절히 실행되도록 컨트롤.
- 스케줄링 방법은 스케줄링 알고리즘에 따라 다양함.

어떤 경우에 Running, Ready, Blocked 상태가 되는지 아는 것이 중요하다.

ALU의 연산은 레지스터에 의존적. 따라서 레지스터는 현재 Running 상태의 프로세스 정보로 채워져 있다. 프로세스 B가 실행되기 위해서는 현재 실행 중인 프로세스 A의 정보를 하드 디스크같은 다른 곳으로 저장해두고, B의 정보를 레지스터로 복원해야 한다. 이 과정을 컨텍스트 스위칭이라 하며, 이는 실행 중인 프로세스가 바뀔 때마다 빈번하게 일어난다.
컨텍스트 스위칭은 레지스터말고도 프로세스에 종속적인 다른 요소에서도 일어날 수 있다.


바탕화면 관리자도 프로세스.
바탕화면에 있는 프로그램을 클릭하면 해당 프로그램은 바탕 화면 프로세스의 자식 프로세스가 된다.
별도의 프로세스를 생성하는 함수
BOOL CreateProcess(
LPCSTR lpApplicationName, // 실행 파일의 이름 지정
LPSTR lpCommandLine, // 실행 파일에게 전달할 인자값
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo, // 프로세스의 특성 정보
LPPROCESS_INFORMATION lpProcessInformation // 생성된 프로세스의 특정 정보
);

typedef struct _STARTUPINFOA {
DWORD cb; // 구조체 변수의 크기
LPSTR lpReserved;
LPSTR lpDesktop;
LPSTR lpTitle; // 콘솔 윈도우의 타이틀 바 제목
DWORD dwX; // 프로세스 윈도우의 x 좌표
DWORD dwY; // 프로세스 윈도우의 y 좌표
DWORD dwXSize; // 프로세스 윈도우의 가로 길이
DWORD dwYSize; // 프로세스 윈도우의 세로 길이
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags; // 설정된 멤버 정보
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; // 프로세스 핸들
HANDLE hThread; // 쓰레드 핸들
DWORD dwProcessId; // 프로세스 ID
DWORD dwThreadId; // 쓰레드 ID
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;