사용자에 의해 프로세스 A가 실행된다.

-> 프로세스 A의 부모 프로세스는 OS다


프로세스 A에 의해 프로세스 B가 실행된다.

-> 프로세스 B의 부모 프로세스는 A다.


프로세스 B에 의해 파일이 실행된다.

-> 파일의 부모 프로세스는 프로세스 B다.


프로세스는 실행될 때 프로세스, 프로세스 커널 오브젝트, 프로세스 핸들이 실행된다.


프로세스는 프로세스 핸들 테이블을 가지고 있다.(사진 참고)


프로세스 핸들 테이블에는 프로세스가 들고 있는 핸들 키, 그리고 핸들 대상이 존재한다.


프로세스 A

프로세스 핸들 번호는 운영체제로부터 부여받는다. 프로세스 A가 실행되면 프로세스 A의 핸들 테이블에 자신의 커널 오브젝트를 지정하는 핸들 값이 생성된다.


위 경우 핸들값은 3이다. 프로세스 A의 커널 오브젝트 UC(Usage Count)가 1로 올라갔다.


프로세스 B

프로세스 A로부터 생성된 프로세스 B도 생성과 동시에 커널 오브젝트와, 핸들 테이블, 운영체제로부터 생성된 핸들값이 핸들 테이블에 저장된다. 위 경우 값은 3이다.


또한, 프로세스 B의 커널 오브젝트에 접근할 수 있는 핸들값이 프로세스 B를 생성한 프로세스 A에도 리턴된다. 위 경우 값은 7이다.


즉, 프로세스 B의 커널 오브젝트 UC는 프로세스 B 자신의 핸들과, 프로세스 A의 핸들로 인해 2가 된다.






프로세스 B의 설명으로, 부모 프로세스도 핸들 테이블에 자식 프로세스의 커널 오브젝트 접근 핸들이 저장된다는 것을 알게 되었다.


프로세스 A 역시 부모 프로세스 OS가 존재하기 때문에, 프로세스 A 커널 오브젝트 UC는 2가 된다.


파일


파일은 프로세스가 아닌 단순 리소스이기 때문에 제어가 불가능하다. 즉 프로그램 코드가 없기 때문에 스스로 커널 오브젝트를 제어할 수 없다.


이 경우 파일의 커널 오브젝트는 생성이 되지만 그 커널 오브젝트에 접근이 가능한 것은 파일의 부모 프로세스인 프로세스 B다. 그렇기 때문에 위 경우의 파일 커널 오브젝트의 UC는 1이다.


정리로 인해, 핸들 테이블은 프로세스에 종속적이라는 사실을 알게 되었다.



만약 프로세스 B를 종료한다면, 프로세스 B를 종료해도 프로세스 B의 커널 오브젝트는 사라지지 않는다.


그 이유는 프로세스 A가 프로세스 B의 커널 오브젝트에 접근하는 핸들을 가지고 있기 때문이다.


레퍼런스 카운팅 방식과 비슷하게, 임의의 프로세스 커널 오브젝트에 접근하고 있는 핸들이 하나라도 있다면 커널 오브젝트는 사라지지 않는다.




라고 했는데...



1. 프로세스 A를 생성했을 때, 프로세스 핸들 테이블에 자기 자신을 가리키는 핸들이 정말 생성 되는가?


2. 자식 프로세스 B를 종료했을 때, 부모 프로세스 A는 자식 프로세스 B의 커널 오브젝트 핸들을 가지고 있을 필요가 있을까?


부모 프로세스가 자식 프로세스의 커널 오브젝트 핸들을 가지고 있어야 하는 이유


일반적인 코드에서, return 0;를 사용하는 의미는 프로그램을 정상 종료하겠다는 의미다. 


여기서 값 01-1 등은 해당 프로세스의 커널 오브젝트에 들어간다.


이때 부모 프로세스가 자식 프로세스의 실행에 밀접한 관련이 있다면 자식 프로세스의 동작 유무, 종료 유무는 상당히 중요한 부분이 있는데


만약 자식 프로세스가 비정상적 종료코드를 받거나 정상적 종료코드를 커널 오브젝트에 받은 채 프로세스와 커널 오브젝트를 동시에 소멸시켜 버린다면


부모 프로세스는 자식 프로세스가 정상적인 종료가 되었는지, 비정상적 종료가 되었는지 알 길이 없다.


그래서 임의의 프로세스 커널 오브젝트에 관심을 가지고 있는 프로세스가 하나라도 있으면 임의의 프로세스는 소멸되더라도 프로세스 커널 오브젝트는 사라지지 않는다.


ANSI함수와 Windows 시스템 함수


C표준인 ANSI함수를 실행하면 윈도우 환경에서 ANSI함수는 윈도우 시스템 함수를 호출한다. 마찬가지로, ANSI함수를 유닉스 환경에서 실행하면 유닉스 시스템 함수를 호출한다.


ANSI함수는 각각 OS의 시스템 함수를 랩핑한채 존재하는 것이다.


여기서 주의해야 할 점은 윈도우 시스템 함수를 랩핑되지 않은 함수이기 때문에 빠르다고 생각할 것이 아니라(물론 빠르긴 하지만)


윈도우 시스템 함수, 유닉스 시스템 함수들은 ANSI함수에 비해 제공하는 기능이 훨씬 많다는 측면에서 생각해야 한다.


프로세스 핸들 테이블은 자기 자신의 핸들값을 가지고 있을까?


사실 임의의 프로세스를 생성하더라도 자기 자신의 핸들값이 핸들 테이블에 들어가지는 않는다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
 
int _tmain(int argc, TCHAR* argv[])
{
    //우선순위를 변경하는 함수
    //GetCurrentProcess() 현재 프로세스의 핸들 정보를 가져오는 함수
    //HIGH_PRIORITY_CLASS 우선순위를 높이는 매크로
    SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
    while (1)
    {
        //Sleep()함수는 Blocked 상태로 변환된다. 우선순위를 포기하는 것
        //우선순위를 관찰하기 위해선 Ready 상태로 두어야 한다.
        for (DWORD i = 0; i < 10000; i++)
            for (DWORD i = 0; i < 10000; i++);    //Busy Waiting!!
        _fputts(_T("Operation2.exe \n"), stdout);
    }
    return 0;
}
 
cs


여기서 GetCurrentProcess()는 OS로부터 임의의 핸들 값을 부여받아 핸들 테이블에 집어넣은 값이 아니라. 고유한 값을 가지는 특정 상수다. 

(자기 자신을 호출하는 IP주소처럼)


즉 핸들 테이블의 내용물은 증가하지 않지만, 커널 오브젝트의 UC는 증가한다. 그냥 프로세스와 같이 들고있는 것이다.



STARTUPINFO si = { 0 };

생성 정보를 담는다


PROCESS_INFORMATION pi;

프로세스 정보를 담는다


핸들 정보는 프로세스 정보를 담은 pi에 들어간다.


커널 오브젝트는 종속적으로 여러 프로세스에 의해 접근이 가능하다


다른건 별거없다. 부모 프로세스가 자식 프로세스의 우선순위를 변경하는 예제다.



CloseHandle(pi.hProcess);


핸들을 끊는 함수다. 자식 프로세스 정보를 담고있는 변수 pi의 핸들을 닫겠다고 OS에 요청을 보내면 OS가 pi 커널 오브젝트의 UC를 1 내린다.



커널 오브젝트의 종속 관계

 

“커널 오브젝트는 Windows 운영체제에 종속적이다.”

 

‘종속’이라는 단어는 뜻이 상당히 넓다. 기본적으로 종속이라는 말은 독립적이지 못하다는 뜻이다.

 

예를 들어, 도서 대여점에 가면 많은 양의 도서가 있다.

 

이 도서들은 도서 대여점에 등록된 고객들만 대여할 수 있다.

 

그렇다면, 이 책들은 누구에게 종속적일까?

 

당연히 도서 대여점에 종속적이다.

 

도서 대여점에 있는 도서는 특정 고객에게 소유되는 물건이 아니다. 따라서 어느 누구라도 대여 관계가 깨끗하면 대여가 가능하다.

 

이를 위해, 도서 대여점에서는 도서를 소유하고 관리한다.

 

때문에, 고객은 임의로 도서를 폐기 할 수 없지만 대여점은 임의로 폐기 할 수 있다.

 

그렇다면, 커널 오브젝트가 Windows 운영체제(커널)에 종속적인 이유를 들겠다.

 

첫 째, 도서(커널 오브젝트)는 고객(프로세스)에 종속적이지 않고, 도서 대여점(운영체제)에 종속적인 관계로, 도서의 폐기(커널 오브젝트의 소멸)은 도서 대여점(운영체제)에 의해 결정된다.

 

둘 째, 도서(커널 오브젝트) 는 고객(프로세스)에게 종속되는 것이 아니므로, 여러 고객(여러 프로세스)에 의해 대여(접근) 이 가능하다.



'운영체제 > 윈도우 시스템' 카테고리의 다른 글

Signaled Non-Signaled  (0) 2019.09.27
프로세스간 통신  (0) 2019.09.26
커널 오브젝트 오브젝트 핸들  (0) 2019.09.26
프로세스, 스케줄러  (0) 2019.09.25
컴퓨터를 디자인하자  (0) 2019.09.23

+ Recent posts