18-1 커널 오브젝트(Kernel Objects)
커널 오브젝트
시스템 리소스의 정보를 담고 있는 데이터 블록(윈도우즈 기반에서만)
시스템(운영체제)이 관리한다.
18-2. 윈도우즈 기반의 쓰레드 생성
※ CreateThread, _beginthreadex 차이점
#include<process.h>
unsigned long _beginthreadex(
void *security,
unsigned stack_size,
unsigned (*start_address)(void*),
void *arglist,
unsigned initflag,
unsigned *thrdaddr
);
security : 보안에 관련된 설정
stack_size : 쓰레드 생성시 요구되는 스택의 크기. 0이면 default
start_address : 쓰레드에 의해 호출되는 함수의 포인터
arglist : start_address가 가리키는 함수 호출시, 전달할 인자를 지정해 준다.
initflag : 바로 실행상태(0)가 되느냐, 아니면 대기 상태로 들어가느냐 결정하는 요소.
thrdaddr : 쓰레드 생성시 쓰레드 ID
쓰레드 생성을 위한 라이브러리 설정
※ 윈도우즈도 main thread가 먼저 끝나면 다른 thread들이 실행중이라도 프로그램이 종료가 된다.
※ 윈도우즈는 기본 실행 단위가 thread다. 프로그램을 만들면 main thread(main함수 실행하는 용도)가 생성된다.
커널 오브젝트, 리소스, 핸들과의 관계
※ 프로그램은 파일을 직접 조작하는 것이 아니라 커널 오브젝트에게 원하는 조작을 요청하고 시스템이 파일을 조작하게 된다.
18-3. Signaled & Non-Signaled 커널 오브젝트
커널 오브젝트의 상태
쓰레드 커널 오브젝트의 상태
생성시 : non-signaled 상태로 초기화.
종료시 : signaled 상태로 변경.
커널 오브젝트 상태 확인 함수
#include<windows.h>
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
리턴 : signaled 상태가 되어 리턴하는 경우 WAIT_OBJECT_0, 타임아웃에서 리턴될 경우 WAIT_TIMEOUT. 오류시 WAIT_FAILED.
hHandle : 상태를 확인할 커널 오브젝트의 핸들을 전달.
dwMilliseconds : 타임아웃을 1/1000초 단위로 설정한다. INFINITE를 전달할 경우 signaled 상태가 되기 전에 절대 리턴하지 않는다.
※ signaled 상태가 될 때까지 main thread가 기다려주면 된다. 리눅스의 JOIN과 비슷한 효과.
커널 오브젝트의 종류
auto-reset mode 커널 오브젝트 : 리턴이 되면서 커널 오브젝트가 non-signaled 상태가 됨.
manual-reset mode 커널 오브젝트 : 리턴이 되어도 커널 오브젝트는 자동으로 상태가 변경되지 않음.
'네트워크 프로그래밍' 카테고리의 다른 글
[TCP/IP 소켓 프로그래밍] 20. 동기와 비동기의 이해 (2) | 2009.08.28 |
---|---|
[TCP/IP 소켓 프로그래밍] 19. 윈도우즈 기반 쓰레드 동기화 (0) | 2009.08.24 |
[TCP/IP 소켓 프로그래밍] 17. 프로세스(Process)와 쓰레드(Thread) (0) | 2009.08.19 |
[TCP/IP 소켓 프로그래밍] 16. 입력과 출력 스트림의 완벽 분리 (0) | 2009.08.17 |
[TCP/IP 소켓 프로그래밍] 15. 소켓과 표준 입출력 (0) | 2009.08.08 |