일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Graphics
- Mesh Processing
- MFC
- 그래픽스
- 그래픽스기초
- MFC 윈도우 프로그래밍
- window programming
- 윈도우 구조
- 컴퓨터 구조
- Geometry Modeling
- 셰이더프로그래밍
- 운영체제
- shader
- 핵심 API로 배우는 윈도우프로그래밍
- shader programming
- 윈도우프로그래밍
- Win32 API
- c4d
- modeling
- bezier curve
- 오픈지엘
- OpenGL
- 셰이더
- 베지에 곡선
- win32
- 컴퓨터 아키텍쳐
- 윈도우
- 렌더링
- denoising
- 윈도우 프로그래밍
- Today
- Total
오다기리 박의 알고리즘 노트
5장. 프로세스의 생성과 소멸 본문
5장. 프로세스의 생성과 소멸
1. 프로세스의 이해
프로세스란?
실행 중에 있는 프로그램
실행파일을 클릭하면 메모리 할당이 이뤄지고 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로그램은 프로세스이다.
우리가 사용하는 Windows를 멀티 프로세스 운영체제라 한다.
프로세스의 구성요소
C프로그램 실행
레지스터 셋
CPU내에 존재하는 레지스터들은 현재 실행 중인 프로그램을 위한 데이터들로 채워진다.
레지스터들의 상태까지도 프로세스의 일부.
2. 프로세스의 스케줄링과 상태 변화
프로세스의 스케줄링(Scheduling)
하나의 CPU가 여러 개의 프로세스를 번갈아 가면서 실행해야 함.
기본 원리
스케줄링 : 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일
스케줄러 : 스케줄링 알고리즘을 적용해서 실제로 프로세스를 관리하는 운영체제 요소(모듈)로서 스프트웨어적으로 구현되어 있는 요소이다.
멀티 프로세스는 CPU를 바쁘게 한다.
일반적으로 프로그램이 실행되는 과정에서 많은 시간을 I/O에 할당하기 때문에 순차기반 보다는 멀티 프로세스 기반으로 프로세스들을 처리하는 것이 효율적이다.
I/O 작업은 CPU 연산을 필요로 하지 않는다
프로세스의 상태변화
1. S -> Ready
프로세스는 생성과 동시에 Ready 상태로 들어간다.
2. Ready -> Running
스케줄러는 Ready 상태에 있는 프로세스중 하나를 선택해서 CPU에 의해 실행되도록 한다.
3. Running -> Ready
프로세스들은 생성 시 우선순위가 메겨진다.
4. Running -> Blocked
입출력 작업은 CPU 연산을 필요로 하지 않는다.
데이터 입출력을 진행 중인 프로세스는 잠시 내려오게 하고 Ready 상태에 있는 프로세스 중 하나를 대신 실행시키는 것이 CPU를 효율적으로 사용하는 것이다.
5. Blocked -> Ready
Ready 상태는 스케줄러에 의해 선택되어 당장 실행 가능한 상태이고, Blocked 상태는 스케줄러에 의해서 선택될 수 없는 상태이다.
(프로세스 종료시 Blocked 상태를 거쳐서 E 상태로 감)
입출력이 완료된 Blocked 상태에 있는 프로세스가 Ready 상태로 돌아간다.
프로세스의 상태 변화 시나리오
1. 우선순위가 높은 MS워드를 실행시켰을 때
2. MS워드의 작업 파일을 저장할 때
3. MS 워드의 저장이 끝났을 때
4. 스케줄러가 작동하여 우선수위가 높은 MS워드를 실행 시킬 때
결론 : 여러 개의 프로세스들이 CPU 실행시간을 나누는 방식으로 동시 실행되는 효과를 얻는다. 프로그램 실행의 상당 시간을 I/O에 소모하기 때문에 둘 이상의 프로세스 실행은 CPU의 활용도를 높여 성능 향상까지 가져온다.
3. 컨텍스트 스위칭
CPU 내에 존재하는 레지스터들은 현재 실행 중인 프로세스 관련 데이터들로 채워진다.
실행중인 프로세스가 변경되면 CPU 내의 레지스터들의 값도 변경된다.
실행되는 프로세스의 변경과정에서 발생하는 컨텍스트 스위칭은 시스템에 많은 부담을 줌.
레지스터 개수가 많은 시스템일수록, 프로세스별로 관리되어야 할 데이터 종류가 많을수록 시스템 부담이 크다.
4. 프로세스의 생성
프로세스의 생성
프로그램 실행 중에 또 하나의 프로세스를 생성할 수 있다.
CreateProcess()
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttibutes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectiory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
If the function fails, the return value is zero.lpApplicationName : 생성할 프로세스의 실행파일 이름
lpCommandLine : 새로 생성하는 프로세스에 인자를 전달 할때 사용. lpApplicationName에 NULL, lpCommandLine에 실행파일 이름을 전달할 경우 실행파일의 이름은 표준 검색경로를 기준으로 찾게됨.
첫번째 전달인자를 통해 실행파일 이름을 전달할 경우, 현재 디렉터리를 기준으로 실행파일을 찾게 되지만, 두번째 전달인자를 통해 실팽파일 이름을 전달 할 경우 표준검색경로 순서대로 실행파일을 찾는다
1. 표준검색경로 : 실행 중인 프로세스의 실행파일이 존재하는 디렉터리
2. 표준검색경로 : 실행 중인 프로세스의 현재 디렉터리
3. 표준검색경로 : Windows의 시스템 디렉터리(C:\Windows\System32)
4. 표준검색경로 : Windows 디렉터리 (C:\Windows)
5. 표준검색경로 : 환경변수 PATH에 의해 지정되어 있는 디렉터리
lpProcessAttributes : 프로세스의 보안 속성. NULL
lpThreadAttibutes : 쓰레드의 보안속성 지정. NULL
bInheritHandles : TRUE인 경우 생성되는 자식 프로세스는 부모 프로세스가 소유하는 핸들 중 일부를 상속
dwCreationFlags : 생성하는 프로세스의 특성(우선순위)을 결정. 0
CREATE_NEW_CONSOLE 전달시 새롭게 생성하는 프로세스를 위한 콘솔 윈도우가 독립적으로 생성됨. 0 전달시 부모 프로세스의 콘솔 윈도우를 자식 프로세스가 공유함.lpEnvironment : 프로세스마다 Environment Block이라는 메모리 블록을 관리한다. 이 블록을 통해 프로세스가 실행에 필요로 하는 문자열을 저장할 수 있음. 이 전달인자를 통해서 생성하는 프로세스의 Environment Block을 지정. NULL 전달시 자식 프로세스는 부모 프로세스의 환경 블록에 저장되어 있는 문자열을 복사함.
lpCurrentDirectiory : 생성하는 프로세스의 현재 디렉터리 설정. NULL 전달시 부모 프로세스의 현재 디렉터리가 됨.
lpStartupInfo : STARTUPINFO 구조체 변수를 초기화한 다음에 이 변수의 포인터를 인자로 전달.
lpProcessInformation : 생성하는 프로세스 정보를 얻기 위해 사용. PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달하면 전달된 주소값이 가리키는 변수에 프로세스 정보가 채워짐.
typedef struct _PROCESS_INFORMATION
{
HANDLE hProcess; //프로세스의 핸들
HANDLE hThread; //쓰레드 핸들
DWORD dwProcessId; //프로세스의 ID
DWORD dwThreadId; //쓰레드 ID
} PROCESS_INFORMATION;hProcess은 프로세스의 커널 오브젝트를 가리키기 위한 것이고, dwProcessId는 프로세스 자체를 구분짓기 위한 것이다.
운영체제는 프로세스를 생성하면 프로세스 내부적으로 쓰레드라는 가벼운 프로세스를 생성하여 이를 통해 main 함수가 호출되게끔 디자인되어 있다.
'운영체제' 카테고리의 다른 글
7장. 프로세스간 통신(IPC) 1 (0) | 2018.08.08 |
---|---|
6장. 커널 오브젝트와 오브젝트 핸들 (0) | 2018.08.08 |
4장. 컴퓨터 구조에 대한 두 번째 이야기 (0) | 2018.08.08 |
3장. 64비트 기반 프로그래밍 (0) | 2018.08.08 |
2장. 아스키코드 vs 유니코드 (0) | 2018.08.08 |