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; 
} 

 

디버깅하기!!  

 

 

<결과값>

 

=> 프로그래밍에 의해 프로세스 생성 및 실행 

 

 

 

+ Recent posts