1. 프로세스란?
- 일반적으로는 실행중인 파일을 의미
* 프로그램 vs 프로세스
- 프로그램은 실행파일 test.exe같은 것을 의미
- 프로세스는 이 프로그램을 실행시켰을때 보게 되는 익스플로러 창
* 실행되는 프로세스 개수 = 메모리 구조 개수
2. 프로세스의 범주
- 메모리 구조 + 레지스터 Set
- 프로세스 별로 독립적으로 할당받는 리소스
3, 프로세스 스케줄러
- 둘 이상의 프로세스가 적절히 실행되도록 컨트롤하는 요소(모듈)
4. 프로세스의 상태
* Ready와 Blocked상태의 차이점
- Ready상태는 스케줄러에 의해 선택되어 지금 당장이라도 실행 가능한 상태
- Blocked상태는 스케줄러에 의해 선택될수 없는 상태
* I/O란? => CPU가 관여하지 않는다.
- 데이터의 입출력, 송수신
ex) 주소창에 'www.naver.com'을 입력하고 엔터키 누르는 것. 그러면 네이버 서버로부터 웹페이지 전송 받는것 => 데이터 입출력
* Context Switching (켄텍스트 스위칭)
- A프로세스가 실행중일때, B프로세스의 요청이 들어오면 A의 프로세스 상태, 값을 저장한 후 B프로세스가 수행하도록 프로세스 상태, 레지스터 값을 교체하는 것.
- 즉, cpu에 있던 A의 데이터 <-> 메모리에 있던 B의 데이터
5. 프로세스의 생성
- 바탕화면에서 아이콘 더블 클릭
- 프로그래밍으로 프로세스 생성 및 실행
=> 둘다 같은 원리이다. 부모 프로세스가 CreateProcess()함수로 자식 프로세스를 생성하는 느낌.
6. 프로세스 생성 함수
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 생성될 프로세스의 이름
LPTSTR lpCommandLine, // 생성될 프로세스에 인자 전달
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 프로세스의 보안 속성 지정
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 쓰레드의 보안 속성 지정
BOOL bInheritHandles, // TRUE : 부모 프로세스가 소유하는 상속 가능한 핸들을 상속한다.
DWORD dwCreationFlags, // 생성하는 프로세스의 특성을 결정짓는 옵션(우선순위)
LPVOID lpEnvironment, // 생성하는 프로세스의 Environment Block 지정
NULL : 부모 프로세스의 환경 블록 복사
LPCTSTR lpCurrentDirectory, // 생성하는 프로세스의 현재 디렉터리 설정
NULL : 부모 프로세스의 현재 디렉터리
LPSTARTUPINFO lpStartupInfo, // STARTUPINFO 구조체 변수 초기화한 후
변수의 포인터를 인자로 전달
LPPROCESS_INFORMATION lpProcessInformation
//생성하는 프로세스의 정보를 얻기 위한 인자
//PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달
);
출처: https://dakuo.tistory.com/82 [hacker dakuo]
7. 프로그래밍을 통한 프로세스 생성
01. 프로젝트명: AdderProcess
// AdderProcess.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
// 메인함수의 전달인자를 뎃셈하는 프로그램
#include "pch.h"
#include
#include
#include
int _tmain(int argc, TCHAR* argv[])
{
DWORD val1, val2;
val1 = _ttoi(argv[1]);
val2 = _ttoi(argv[2]);
_tprintf(_T("%d + %d = %d \n"), val1, val2, val1 + val2);
_gettchar();
return 0;
}
디버깅 후 만들어진 실행파일을 C:\\WinSystem로 복사 또는 이동한다.
// CreateProcess.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
#include "pch.h"
#include
#include
#include
#include
#define DIR_LEN MAX_PATH+1
int _tmain(int argc, TCHAR* argv[])
{
STARTUPINFO si = { 0, }; // 구조체 변수 선언 및 초기화
PROCESS_INFORMATION pi;
si.cb = sizeof(si); // 구조체 변수의 크기를 나타내는 멤버변수 cb초기화
si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE; // Flag지정 (내가 지정한 값만 참고하여 설정할 수 있도록 하는 것. ) 즉, 바로 밑 4줄인 x,y좌표와 프로세스 윈도우 가로,세로 길이값 참고를 위해 사용하는 Flag.
si.dwX = 100; // 프로세스 x좌표
si.dwY = 200; // 프로세스 y좌표
si.dwXSize = 300; // 프로세스 윈도우의 가로 길이
si.dwYSize = 200; // 프로세스 윈도우의 세로 길이
si.lpTitle = _T("I am a boy!");
TCHAR command[] = _T("AdderProcess.exe 10 20"); // 실행파일 명과 매개변수를 선언한 것. 실행파일 명은 위에서 만든것과 이름이 같아야 한다.
TCHAR cDir[DIR_LEN];
BOOL state;
GetCurrentDirectory(DIR_LEN, cDir); // 현재 디렉터리 확인
_fputts(cDir, stdout);
_fputts(_T("\n"), stdout);
SetCurrentDirectory(_T("C:\\WinSystem")); // 현재 디렉터리를 c:\\WinSystem으로 변경하는 코드
GetCurrentDirectory(DIR_LEN, cDir); // 현재 디렉터리 확인
_fputts(cDir, stdout);
_fputts(_T("\n"), stdout);
state = CreateProcess( // 프로세스 생성
NULL,
command, // 메인함수에 전달될 문자열
NULL, NULL, TRUE,
CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi
);
if (state != 0)
_fputts(_T("Creation OK! \n"), stdout);
else
_fputts(_T("Creation Error! \n"), stdout);
return 0;
}
디버깅하기!!
<결과값>
=> 프로그래밍에 의해 프로세스 생성 및 실행