일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 유니티
- 2021 방탈출 추천
- 꽃길
- Unity
- 방탈출 리뷰
- 강남 방탈출
- C#
- 필활
- 정렬 알고리즘
- 홍대 방탈출
- 방탈출
- 홍대
- 방탈출 후기
- 공포 방탈출
- 넥스트에디션 2호점
- 이스케이퍼스
- 추천
- 방탈출 추천
- Android
- PC VR
- C 자료구조
- 윈도우 프로그래밍
- 후기
- 홍대 방탈출 추천
- 개발
- C++ 자료구조
- 홍대 덤앤더머
- 시스템 프로그래밍
- 이스케이퍼스 2호점
- 넥스트에디션
- Today
- Total
행복한 연어의 이야기
(윈도우 시스템) 6. 커널오브젝트와 오브젝트 핸들 본문
1. 커널 오브젝트에 대한 이해
커널오브젝트란 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록
커널 오브젝트의 이해
프로세스의 생성, 소멸, 상태 변화등 프로세스를 관리하는 일은 Windows 운영체제가 처리한다.
A 프로세스 인지 B 프로세스인지 어떤 프로세스의 상태가 Ready 인지 Blocked 인지 등
운영체제는 프로세스에 대한 정보를 알아야 하는데
그 정보들을 모아둔 '프로세스 관리 구조체' 가 있고 이것이 커널 오브젝트 라고 할수 있다.
프로세스 내에서 쓰레드를 생성하거나 프로세스간 통신할때 등
프로세스가 생성될때만 커널 오브젝트가 생성되는 것이 아니며
커널 오브젝트의 종류에 따라서 서로 다른 구조체에 의해 생성된다.
또한 커널 오브젝트는 프로그래머가 직접 생성하거나 조작 할수 없다.
정확히 말하면 프로세스가 아닌 쓰레드 상태변화 이지만 쓰레드 배우지 않았기에
프로세스라고 서술한다. 그래도 이해하는데는 문제가 없다.
(자세한 내용은 여기(쓰레드의 이해)에서 )
Windows 입장에서 프로세스는 단순히 쓰레드를 담는 상자에 지나지 않는다.
실제 프로그램의 흐름을 형성하는 것은 쓰레드이다.
프로세스는 Running Ready Blocked 상태를 지니지 않는다.
상태를 지니는 것은 쓰레드이며 스케줄러의 실행단위도 프로세스가 아닌 쓰레드이다.
프로세스를 생성하면 기본적으로 main 쓰레드가 생성되며
앞서 프로세스라고 말한 내용 대부분은 이 main 쓰레드라고 생각해야한다.
오브젝트 핸들(Handle)을 이용한 커널 오브젝트 조작
프로그래머들이 직접적으로 조작 할 수 있는 방법은 제공하지 않고
시스템 함수를 통해 안정적인 방식으로 접근하는 것을 권장 하고 있다.
BOOL SetPrioityClass( ///우선순위를 높이는 함수
HANDLE hProcess, //프로세스의 핸들 정보
DWORD dwPriorityClass //새롭게 적용할 우선숭위 정보
);
HANDLE GetCurrentProcess(); ///현재 프로세스의 핸들값을 반환하는 함수
위 함수는 프로세스의 우선순위를 변경하는 시스템 함수이다.
첫번째 인자인 핸들은 커널 오브젝트에 할당되는 숫자로써
커널 오브젝트 핸들 혹은 오브젝트 핸들이라고 불린다.
즉 핸들은 커널오브젝트를 가르키는 정수값이다.
아래 함수는 현재 프로세스의 커널오브젝트를 가르키는 핸들값을 가져오는 함수이다.
2. 커널 오브젝트와 핸들의 종속 관계
커널 오브젝트의 종속 관계
커널 오브젝트는 프로세스가 아니라 운영체제의 종속적이다.
그래서 프로세스가 종료되었다고 커널 오브젝트도 소멸하는 것이 아니라
운영체제에 의해서 커널 오브젝트의 소멸이 결정되고
커널오브젝트는 여러 프로세스에 의해서 접근 가능하다.
핸들의 종속 관계
핸들은 운영체제에 종속적이지 않고 프로세스의 종속적이다.
자세한 내용은 8. 프로세스간 통신(IPC) 2 에서 다루도록 한다.
typedef struct PROCESS_INFORMATION(
HANDLE hProcess; //프로세스 핸들
HANDLE hThread; //쓰레드 핸들
DWORD dwProcessId //프로세스 ID
DWORD dwThreadId //쓰레드 ID
)
위 구조체는 5. 프로세스 생성과 소멸
CreateProcess 함수를 소개 할때 제일 마지막에 넘겨주던 구조체 정보이다.
A 프로세스에서 B 프로세스를 생성할때 위 구조체 정보를 넣어주는데
A 프로세스에서 위 구조체를 통해 B 프로세스의 커널오브젝트에 접근 할 수 있다.
프로세스의 핸들은 커널 오브젝트를 가르키기 위한 것이고
프로젝트의 ID 는 커널오브젝트가 아닌 프로세스 자체를 구분하기 위한 것이다.
3. 커널 오브젝트와 Usage Count
커널 오브젝트를 생성한 주체는 CreateProcess 함수를 호출한 프로그래머나 프로그램이 아니라 운영체제 이다.
프로세스가 생성 되면 그 프로세스를 위한 커널 오브젝트가 생성되는 것은 맞지만
프로세스가 소멸된다고 해서 커널 오브젝트가 소멸 한다고는 할 수 없다.
소멸은 커널 오브젝트를 관리하고 있는 운영체제의 권한이기 때문이다.
Usage Count 는 해당 커널 오브젝트를 참조하는 프로세스 수 만큼 증가한다.
커널 오브젝트와 Usage Count
커널 오브젝트는 해당 커널 오브젝트를 참조하는 대상이 하나도 없을때 소멸하는 것이 이상적이고
이 방식이 Windows 가 커널오브젝트를 소멸시키는 방식이다.
즉 하나라도 커널오브젝트를 참조하고 있는 프로세스가 있다면 커널 오브젝트를 소멸시키지 않는다.
해당 커널오브젝트를 참조 하고 있는 수를 관리하기 위해 커널오브젝트 안에 Usage Count 가 있으며
Usage Count 가 0이 되면 그 커널 오브젝트를 소멸시킨다.
기본적으로 프로세스(쓰레드)는 해당 프로세스(쓰레드)가 종료될때 Usage Count 가 감소한다.
BOOL CloseHandle(
HANDLE hObject
);
위 함수는 CloseHandle 함수이다.
A 프로세스에서 B 프로세스 를 생성했다고 했을때
B 커널오브젝트의 Usage Count 는 2 이다.
A 프로세스에서 참조할수 있기 때문에 1
B 프로세스에서 참조할수 있기에 1
B 프로세스가 종료되어도 B 커널오브젝트가 소멸하지 않는 이유는 A 프로세스에서 참조 하고 있기 때문인데
만약 A 프로세스에서 위 CloseHandle 함수를 호출한다면 B 프로세스 종료와 동시에 B 커널 오브젝트는 소멸하게 된다.
물론 이 경우 부모 프로세스인 A 프로세스에서 자식 프로세스인 B 프로세스의 종료코드를 얻을 수 없다.
종료코드란 프로그램의 정상, 비정상 종료를 알수있는 코드인데 커널오브젝트의 저장되어있다.
또한 부모 프로세스는 자식 프로세스의 커널오브젝트에 접근해서 종료코드를 가져올 수 있는데
부모인 A 프로세스에서 CloseHandle 함수를 호출한다면 핸들을 반환하면서
자식인 B 프로세스의 커널오브젝트를 더 이상 참조 할 수 없다.
이 경우 B 프로세스가 끝나면 Usage Counter 가 1 감소하면서 B 커널오브젝트가 소멸하게 된다.
3. Signaled vs Non-Signaled
커널 오브젝트의 두가지 상태
커널 오브젝트는 두가지 상태를 가진다.
Signaled 와 Non-Signaled 인데 커널오브젝트 상태 변수의 TRUE FALSE 유무로 알수 있다.
커널 오브젝트의 상태가 변하는 시점은 커널 오브젝트 종류마다 다른데
프로세스 커널 오브젝트의 경우 프로세스가 종료되면 Non-Signaled 상태에서 Signaled 로 변하게 된다.
프로세스의 경우 종료된 프로세스가 다시 실행 될 일이 없으니 프로세스 커널 오브젝트의 경우
Signaled 상태에서 Non-Signaled 로 바뀌는 일은 없다.
커널 오브젝트의 상태를 확인 하는 함수
DWORD WaitForSingleObject(
HANDLE hHandle, //커널오브젝트의 핸들을 인자로 넣는다.
DWORD dwMilliseconds //Sigaled 상태가 될때까지 기다릴 수 있는 최대시간
);
DWORD WaitForMultipleObject(
DWORD nCount, //배열에 저장되어 있는 핸들 개수
const HANDLE* IpHandles, //핸들을 저장하고 있는 배열 주소 정보
BOOL bWaitALL, //모두 Signaled 상태일때 반활할지 하나라도 Signaled 상태가 되면 반환할지
DWORD dwMilliseconds //Sigaled 상태가 될때까지 기다릴 수 있는 최대시간
);
위 함수는 한개의 커널 오브젝트를의 상태를 확인 하는 함수
아래 함수는 확인할 커널 오브젝트의 핸들이 배열로 묶여있을때 활용할수 있는 함수이다.
알고 넘어가야할 것
1. 커널 오브젝트와 핸들
2. 운영체제의 종속적인 커널 오브젝트
3. Usage Count
4. CloseHandle 함수
5. 프로세스의 Usage Count
6. 커널 오브젝트의 두가지 상태
7 상태를 확인하는 함수와 커널 오브젝트의 관계
'IT > 윈도우 시스템 프로그래밍' 카테고리의 다른 글
(윈도우 시스템) 8. 프로세스간 통신(IPC) 2 (0) | 2021.08.04 |
---|---|
(윈도우 시스템) 7. 프로세스간 통신(IPC) 1 (0) | 2021.08.02 |
(윈도우 시스템) 5. 프로세스 생성과 소멸 (0) | 2021.07.28 |
(윈도우 시스템) 4. 컴퓨터 구조 두번째 (0) | 2021.07.26 |
(윈도우 시스템) 3. 64비트 기반 프로그래밍 (0) | 2021.07.23 |