프로세스의 이해
  • 프로세스란?
    • 메인 메모리로 이동하여 실행중인 프로그램 -> 일반적인 정의
  • 프로세스의 범위
    • 메모리 구조+ 레지스터 Set    
    • 프로세스 별 독립적인 대상은 프로세스의 범주에 포함시킬 수 있다.


  • 프로세스 스케줄러
    • 둘 이상의 프로세스가 적절히 실행되도록 컨트롤

  • 스케줄링 방법
    • 스케줄링 알고리즘에 따라 다양함.


프로세스의 상태

프로세스들을 스케줄러가 관리함

S = exe 실행

Ready = 러닝하고 싶은 상태 / 스케줄러의 명령을 기다림.

Running = 현재 실행중인 상태

Blocked = I/O연산을 기다리는 상태 / CPU의 연산이 필요없는 I/O연산(파일 네트워크, 그래픽, 사운드)을 기다리는 중

E = 종료


러닝 상태에서 CPU(ALU)에 의존적 연산이 아닌 CPU가 필요없는 I/O연산(파일 네트워크, 그래픽, 사운드)을 기다려야 할 때 블럭디드상태로 감.


Contex Switching(컨텍스트 스위칭)

A, B 프로세스들이 있다고 가정 할 때 나만의 레지스터셋을 가지고 컨텍스트 스위칭 할 때 레지스터셋을 바꿈

컨텍스트 스위칭 하는 대상이 많으면 많을수록 연산이 많아짐.


프로세스의 생성

부모 프로세스

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#define DIR_LEN MAX_PATH+1
 
int _tmain(int argc, TCHAR* argv[])
{
    STARTUPINFO si = {0,};       // 정보 전달용
    PROCESS_INFORMATION pi;    // 정보 반환용
    
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;
    si.dwX = 100;
    si.dwY = 200;
    si.dwXSize = 300;
    si.dwYSize = 200;
    si.lpTitle = _T("Test!");
 
    TCHAR command[]=_T("Test2.exe 10 20"); // 프로그램을 실행시키고 10, 20을 넣겠다.
    TCHAR cDir[DIR_LEN];
    BOOL state;
 
    GetCurrentDirectory(DIR_LEN, cDir);    //현재 디렉토리 확인.
    _fputts(cDir, stdout);
    _fputts(_T("\n"), stdout);
 
    SetCurrentDirectory(_T("파일 경로")); // 디렉토리를 바꿈
    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
    );  //CreateProcess
    
    if(state!=0)
        _fputts(_T("Create OK! \n"), stdout);
    else
        _fputts(_T("Create Error! \n"), stdout);
 
    return 0;
}
cs

SetCurrentDirectory 바탕화면으로 경로 변경했었는데 잘안됨...

자식 exe를 부모 디폴트 Directory에 넣음


자식 프로세스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
 
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;
}
cs


결과 화면

어거지로 결과를 만든기분.


SetCurrentDirectory가 왜 안될까....


구조체 정보





반응형