logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

[WINCE] Process, Thread API 함수 사용법

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

Windows CE kernel은 기번적인 운영체제 기능인 프로세스 관리 기능, 쓰레드 관리 기능, 메모리 관리 기능, 일부 파일 기능을 지원한다. 또한 선점형(preemptive) 멀티태스킹을 지원한다. Windows CE가 제공하는 kernel API 함수는 다음과 같다.


CeGetThreadQuantum  :  Thread 실행 단위의 시간 크기를 얻는다.

CeSetThreadQuantum  :  Thread 실행 단위의 시간 크기를 설정한다.

CreateProcess  :  새로운 프로그램을 실행시키기 위해 사용한다.

CreateThread  :  호출한 프로세스의 주소 공간 내에서 실행하는 thread를 생성한다.

ExitThread  :  실행중인 thread를 종료시킨다.

GetCommandLine  :  프로세스의 명령어 라인 문자열 포인터를 반환

GetCurrentProcess  :  수행중인 프로세스의 의사 핸들 값을 얻는다.

GetCurrentProcessId  :  호출 프로세스의 ID를 얻는다.

GetCurrentThread  :  수행중인 thread의 의사 핸들 값을 얻는다.

GetCurrentThreadId  :  호출 thread의 ID를 얻는다.

GetExitCodeProcess  :  Process의 종료 상태를 얻는다.

GetExitCodeThread  :  Thread의 종료 상태를 얻는다.

GetThreadPriority  :  Thread의 우선 순위 상태를 얻는다.

GetThreadTimes  :  Thread와 관련된 시간 정보를 얻는다.

OpenProcess  :  수행중인 process 개체의 핸들 값을 얻는다.

ResumeThread  :  Thread의 일시중지(suspend) 계수기 값을 감소시킨다.

                         계수기 값이 0이면, thread의 실행을 재개한다.

SetThreadPriority  :  Thread의 우선 순위 상태를 설정한다.

Sleep  :  주어진 시간만큼 thread의 실행을 일시 중지시킨다.

SuspendThread  :  Thread의 실행을 일시 중지시킨다.

TerminateProcess  :  Process와 process 내의 모든 thread를 종료시킨다.

TerminateThread  :  Thread의 실행을 종료시킨다.

TlsAlloc  : TLS (Thread Local Storage) 인덱스를 할당한다.

TlsFree  :  할당된 TLS 인덱스를 반환한다.

TlsGetValue  :  TLS 인덱스로 지정된 호출 thread의 TLS 슬롯의 값을 구한다.

TlsSetValue  :  TLS  인덱스에 대한 호출 thread의 TLS 슬롯의 값을 설정한다.

 

1. Process

 WinCE는 32개의 process를 수행시킬 수 있다. 각 process는 primary thread를 가지고 실행된다. Process는 부가적인 thread를 더 생성할 수 있다. Application은 process가 종료되거나 primary thread가 종료되면 실행을 중단한다.

 (1) 우선순위

 WinCE가 지원하는 RTOS 능력은

- 보다 많은 thread의 우선순위 level

- 단순화된 우선순위 변경

- 완전한 interrupt의 처리

- 일정 및 scheduler 제어

 WinCE는 256개의 우선순위를 제공한다. Application의 thread는 248 ~ 255의 우선순위를 갖는다. 실시간 application, driver, system process는 0 ~ 247의 우선순위를 갖는다.

 CeGetThreadPriority(), CeSetThreadPriority()를 이용하여 우선순위 level을 구하거나 바꿀 수 있다.


 (2) Thread 실행 시간 (Quantum)

 WinCE에서 thread의 실행시간 단위는 quantum이고, default thread 실행 시간은 100msec이다. CeGetThreadQuantum(), CeSetThreadQuantum()을 사용하여 각 thread의 quantum을 얻거나 변경할 수 있다. GetThreadTimes() 함수를 호출하여 Thread와 관련된 시간 정보를 얻을 수 있다. 이것은 thread가 생성된 시간, thread가 실제 kernel mode에서 수행한 시간, user mode에서 수행한 시간등을 알려준다.

     BOOL GetThreadTimes(HANDLE hThread, LPFILETIME lpCreationTime,
                                   LPFILETIME lpExitTime, LPFILETIME lpKernelTime,
                                     LPFILETIME lpUserTime)

LPFILETIME 구조체에는 dwLowDateTime 필드와 dwHighDateTime 필드가 있다.

Thread간 타이밍이나 동기화를 위하여 Sleep() 함수와 Wait로 시작하는 함수가 제공된다. Sleep() 함수는 일정 시간동안 thread의 실행을 중지시킨다. 인자의 단위는 msec이며, 인자가 INFINITE이면 무한 대기한다.

 

(3) Process 생성

    BOOL CreateProcess(LPCWSTR pszImageName, LPCWSTR pszCmdLine,
                                    LPSECURITY_ATTRIBUTES psaProcess,
                                    LPSECURITY_ATTRIBUTES psaThread, BOOL fInheritHandles,
                                    DWORD fdwCreate, PVOID pvEnvironment, LPWSTR pszCurDir,
                                    LPSTARTUPINFOW psiStartInfo,
                                    LPPROCESS_INFORMATION pProcInfo)

    LPCWSTR pszImageName  :  생성하려는 프로세스가 있는 경로명 문자열의 포인터

    LPCWSTR pszCmdLine  :  생성하려는 프로세스에 전달될 문자열의 포인터

    LPSECURITY_ATTRIBUTES psaProcess  :  보안을 지원하지 않으므로 NULL

    LPSECURITY_ATTRIBUTES psaThread  :  보안을 지원하지 않으므로 NULL

    BOOL fInheritHandles  :  핸들 계승을 지원하지 않으므로 NULL

    DWORD fdwCreate  :  프로세스 생성을 제어하는 플래그

                                   0 : 표준 프로세스를 생성

                                   CREATE_NEW_CONSOLE : 부모 콘솔에서 계승하지 않은 새로운 콘솔

                                   CREATE_SUSPENDED : 새로 생성되는 primary thread의 실행을

                                                 일시중지 시키고, ResumeThread() 함수가 호출될 때까지

                                                 리턴하지 않는다.

                                   DEBUG_PROCESS : 새로운 프로세스를 생성하는 프로세스를

                                                 debuger로 간주한다. 새로 생성된 프로세스의 자식

                                                 프로세스도 debug 될 수 있다.

                                   DEBUG_ONLY_THIS_PROCESS : 새로운 프로세스를 생성하는

                                                 프로세스를 debuger로 간주한다. 새로 생성된 프로세스의

                                                 자식 프로세스는 debug되지 않는다.

    PVOID pvEnvironment  :  지원하지 않으므로 NULL

    LPWSTR pszCurDir  :  지원하지 않으므로 NULL

    LPSTARTUPINFOW psiStartInfo  :  지원하지 않으므로 NULL

    LPPROCESS_INFORMATION pProcInfo  :  새로 생성되는 프로세스의 정보를 저장하기 위한

                                  PROCESS_INFORMATION 구조체의 포인터. 이 구조체에는 Process

                                  핸들, 프로세스 ID, Thread 핸들, Thread ID 필드가 있다.

 

(4) Process 종료

WinMain() 함수에서 return되면 process는 종료된다. ExitThread() 함수를 사용하여 process의 primary thread를 종료시켜도 process는 종료된다. Thread가 종료될 때 종료코드를 반환한다. 이 종료코드는 GetExitCodeProcess() 함수로 알 수 있다. Process가 실행 중일 때 이 함수를 호출하면 STILL_ACTIVE가 반환된다.

 

    void ExitThread(DWORD dwExitCode);

 

2. Thread

 GetThreadContext(), SetThreadContext()를 사용하여 thread의 context를 얻거나 변경할 수 있다.

 (1) Thread의 생성과 종료

     HANDLE CreateThread(LPSECURITY_ATTRIBUTE lpThreadAttributes,
                                     DWORD dwStackSize,
                                     LPTHREAD_START_ROUTINE lpStartAddress,
                                     LPVOID lpParameter,
                                     DWORD dwCreateFlags,
                                     LPDWORD lpThreadId)

 

    LPSECURITY_ATTRIBUTE lpThreadAttributes  :  보안을 지원하지 않으므로 NULL

    DWORD dwStackSize  :  사용하지 않음. Stack의 크기는 링커에 의해 결정됨.

    LPTHREAD_START_ROUTINE lpStartAddress  :  Thread 함수의 포인터

    LPVOID lpParameter  : Thread에 전달되는 32비트 인자의 포인터

    DWORD dwCreateFlags  :  Thread 생성에 관련된 상태

                                          CREATE_SUSPENDED : Thread 생성과 동시에 일시중지

                                                        상태가 됨. ResumeThread()로 실행상태로 갈 수 있음.

                                          0 : Thread 생성과 동시에 실행

    LPDWORD lpThreadId  :  생성된 Thread ID를 저장하는 변수의 포인터

    return value : 생성된 thread의 핸들 또는 NULL

 

Thread 내에서 GetCurrentThreadId()나 GetCurrentThread() 함수를 호출하여 thread의 ID와 핸들을 얻을 수 있다. Thread 함수가 종료되면 thread는 종료된다.

 
(2) Thread의 중지와 재개

SuspendThread()와 ResumeThread() 함수를 사용하여 thread의 실행을 중지, 재개 시킬 수 있다. Thread를 중지, 재개하는 함수를 호출한 횟수는 서로 동일해야 한다.

    DWORD SuspendThread(HANDLE hThread);

 

(3) TLS (Thread Local Storage) 

Thread는 process의 자원을 서로 공유한다. 그러나 때때로 각 thread가 고유한 저장 영역을 가져야 할 상황이 있다. 이때 각 thread가 고유 저장 영역을 가질 수 있도록 하기 위해 TLS가 사용된다.

WinCE는 실행하고 있는 각 process에 64개의 slot을 할당한다. Thread에서 TLS를 사요하기 위해서는 DLL이나 process가 thread를 생성하기 전에 TlsAlloc() 함수를 사용하여 thread가 사용하는 TLS slot에 대한 index 값을 얻어야 한다. TLS index는 전역변수에 저장되어 thread가 이 값을 access할 수 있게 한다.

     DWORD TlsAlloc();   //return value : TLS index 또는 0xffffffff

 TlsAlloc()을 사용하여 TLS index를 생성할 수 있으며, TlsFree()를 사용하여 TLS index를 반환한다. 얻은 TLS index를 사용하여 TlsGetValue()나 TlsSetValue()를 호출함으로서 thread 고유의 데이터를 얻거나 변경할 수 있다.

 
TAG •

List of Articles
No. Subject Author Date Views
45 세마포어의 개념과 사용법 digipine 2017.10.29 765
44 [Windows] DOS 명령어 실행하고 결과 스트링 가져오는 샘플 코드 digipine 2017.11.02 2689
43 [WINCE] 키보드 및 마우스 메시지 후킹하기 digipine 2017.10.29 809
42 [WINCE] 메모리카드 상태 감시 digipine 2017.10.29 327
» [WINCE] Process, Thread API 함수 사용법 digipine 2017.10.29 960
40 [WINCE] MulDiv 함수 구현 digipine 2017.10.29 699
39 [WINCE] IAT Hooking 방법과 소스 코드 digipine 2017.10.29 659
38 [WIN32] 파일 핸들로 파일 명 구하기 digipine 2017.10.29 1066
37 [WIN32] 실행 중인 프로세스를 외부에서 강제로 종료, 안전한 TerminateProcess digipine 2017.10.29 3460
36 [WIN32] Process ID로 HWND 구하기 digipine 2017.10.29 5019
35 [Win32] HBITMAP Contrast 조절하는 코드 - RGB 이미지 보정 엉뚱도마뱀 2018.05.04 737
34 [WIN32] API Hook 정리 문서 digipine 2017.10.29 1970
33 [WIN32, WINCE] 디스크 용량 구하는 방법 API GetDiskFreeSpaceEx digipine 2017.10.29 1569
32 [Win API]프로세스 아이디와 윈도우 핸들을 이용 파일명 구하기 digipine 2017.10.29 1393
31 [VC++, WInAPI] 폴더를 통채로 지우기, 서브 폴더 포함, DeleteAllFiles digipine 2017.10.29 1763
30 [MFC] Dialog에서 부모 윈도우 알아내기 digipine 2017.10.28 923
29 [DirectShow] 화면 원본 비율유지 digipine 2017.10.29 960
28 [C#] 프로그램 종료 방법 lizard2019 2019.01.23 6789
27 [C#] 코드 실행 시간 측정 및 DateTime 스트링으로 변환 포맷 lizard2019 2019.01.23 23016
26 [C#] StreamReader 에서의 한글 Encoding 문제 digipine 2017.10.29 1000
Board Pagination Prev 1 2 3 Next
/ 3