데샤봇
IPC랑은 별개지만 중요
프로세스 핸들에는 커널 오브젝트 상태가 존재한다.
상태 : 리소스의 현재 상황을 알리기 위함
프로세스가 작동중이면
커널 오브젝트 상태 : Non-Signaled
작동중이 아니라면
커널 오브젝트 상태 : Signaled
그 밖에 다른 상태 정보들도 존재한다.
위의 예는 프로세스만을 대상으로 설명했지만 기타 리소스별로 나타내는 의미가 다른데 많고 번잡해도 중요한 것들이 존재
WailForSingleObject() 함수는 전달한 임의의 프로세스 커널 오브젝트 상태가 Signaled 상태로 변경되기를 기다리는 함수다.
함수에 커널 오브젝트 핸들을 전달하고, 얼마나 기다릴 것인지? 기다린다.
CPU 코어가 많아서 멀티프로세스 환경에서 연산을 분배해서 나눠가져야 하는 상황이 있는데, 이러한 멀티프로세스 환경에서 사용가능할 함수를 사용해
CPU 코어의 부담을 나눈다.
이런 식으로 진행하고자 한다.
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 51 52 53 54 55 56 | /* NonStopAdderManager.cpp */ #include <stdio.h> #include <windows.h> #include <tchar.h> int _tmain(int argc, TCHAR* argv[]) { STARTUPINFO si1 = { 0, }; STARTUPINFO si2 = { 0, }; PROCESS_INFORMATION pi1; PROCESS_INFORMATION pi2; DWORD return_val1; DWORD return_val2; TCHAR command1[] = _T("Branch1.exe 1 5"); TCHAR command2[] = _T("Branch2.exe 6 10"); DWORD sum = 0; si1.cb = sizeof(si1); si2.cb = sizeof(si2); CreateProcess(NULL, command1, NULL, NULL, TRUE, 0, NULL, NULL, &si1, &pi1 ); //CreateProcess 1 CreateProcess(NULL, command2, NULL, NULL, TRUE, 0, NULL, NULL, &si2, &pi2 ); //CreateProcess 2 CloseHandle(pi1.hThread); CloseHandle(pi2.hThread); //WaitForSingleObject(pi1.hProcess, INFINITE); //WaitForSingleObject(pi2.hProcess, INFINITE); GetExitCodeProcess(pi1.hProcess, &return_val1); GetExitCodeProcess(pi2.hProcess, &return_val2); if (return_val1 == -1 || return_val2 == -1) return -1; //비정상적 종료 sum += return_val1; sum += return_val2; _tprintf(_T("total : %d \n"), sum); CloseHandle(pi1.hProcess); CloseHandle(pi2.hProcess); return 0; } | cs |
44, 45 : WFS 함수
CreateProcess 1, CreateProcess 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /* PartAdder.cpp */ #include <stdio.h> #include <windows.h> #include <tchar.h> int _tmain(int argc, TCHAR* argv[]) { if (argc != 3) return -1; DWORD start = _ttoi(argv[1]); DWORD end = _ttoi(argv[2]); DWORD total = 0; for (DWORD i = start; i <= end; i++) total += i; return total; } | cs |
만약 주석을 해제하지 않는다면 결과로 518이 나온다.
각각의 return_val변수가 259를 담고 있는데, 오류코드인가? 값이 고정되어 있는 것을 보면 오류코드가 맞는 듯 한데...
이러면 만약 adder가 259를 리턴하면 어쩌려고 이런 값을 뱉는거지?
잘모르겠군
주석을 해제하면 정답이 잘 나온다.
'운영체제 > 윈도우 시스템' 카테고리의 다른 글
컴구세번째 함수호출 (0) | 2019.10.08 |
---|---|
프로세스간 통신(IPC)2 (0) | 2019.10.01 |
프로세스간 통신 (0) | 2019.09.26 |
커널 오브젝트, 핸들의 종속관계 (0) | 2019.09.26 |
커널 오브젝트 오브젝트 핸들 (0) | 2019.09.26 |