컴퓨터 프로그래밍 공부/컴퓨터 구조 + 운영체제

에러 처리와 스레드의 상관 관계와 커널 개체

게임 개발 2024. 5. 16. 12:09

 

해당 환경은 WINDOWS 환경이며, C/C++에 대해서만 다룬다.

 

에러 처리와 스레드의 상관 관계

 

에러처리를 잘 하기 위해서는 일단 윈도우가 제공하는 수많은 기능 중 하나인,

윈도우 함수가 에러를 어떻게 처리하는지에 대해 먼저 이해해야 한다.

 

윈도우 함수를 호출하면 호출된 함수는 먼저 전달된 인자의 유효성을 확인하고

함수의 기능을 수행하려 한다.

 

만일 전달된 인자가 유효하지 않거나 다른 이류로 인해 해당 기능을

수행할 수 없으면 함수는 실패를 반환한다.

 

윈도우 함수가 실패하면 왜 함수가 실패했는지의 여부를 알아내는 과정이 반드시 필요하다.

마이크로 소프트는 발생할 가능성이 있는 모든 에러 코드를 32비트 숫자로 정의해 두었다.

 

윈도우 함수가 실패하게 되면 내부적으로

함수를 호출한 스레드의 스레드 지역 저장소에 적절한 에러 코드를 저장해 둔다.

이러한 메커니즘을 통해 여러 개의 스레드가 동시에 수행될 경우라도

상호간에 영향을 미치지 않고 각 스레드별로 에러 코드를 유지할 수 있게 된다.

 

호출한 함수가 실패한 것으로 판단되면 어떤 에러가 발생했는지 확인하기 위해

GetLastError 함수를 이용할 수 있다.

 

즉 함수를 실패하면 관련 에러 코드를 획득하기 위해 지체 없이 GetLastError를 호출해야 한다.

만일 이 함수를 호출하기 전에 다른 함수를 호출하게 되면

다른 함수의 수행 결과가 겹쳐 써지게 된다.

함수 호출이 성공하면 ERROR_SUCCESS를 에러 코드로 기록한다.

몇몇 윈도우 함수들은 몇 가지 서로 다른 성공 이유가 존재한다.

 

어떠한 이유로 함수가 성공했는지 정확히 구분해야 할 필요가 있다.

마이크로소프트는 에러 코드 저장 방식과 동일한 메커니즘을 사용하여 이를 구분할 수 있도록 했다.

따라서 몇몇 함수의 경우 함수 호출에 성공했더라도 부가적인 성공의 이유를 확인하기 위해

GetLastError를 호출해야 할 수도 있다.

 

 

 

커널 개체

 

Windows 시스템 핸들 및 개체 범주에서

커널 개체는 커널 개체 핸들은 프로세스 별로 다르다.

즉, 프로세스는 개체를 만들거나 기존 개체를 열어 커널 개체 핸들을 가져와야 한다.

커널 핸들의 프로세스당 제한은 2^24이다.

 

프로세스가 개체의 이름을 알고 개체에 대한 보안 액세스 권한이 있는 경우

모든 프로세스는 기존 커널 개체(다른 프로세스에서 만든 커널 개체)에 대한

새 핸들을 만들 수있다.

 

 

 

 

해당 게시글은 WINDOWS VIA C/C++ 과 Microsoft 공식 문서를 기반으로 작성된 내용입니다.

 

첨언,

WINDOWS VIA C/C++이 정말 좋은 책임을 느낀 것이

이 책에 나온 코드를 이해하고 지식을 조금이라도 이해하면

엔진 코드 보기가 좀 더 수월해질 것 같다는 생각이 들었다.

언리얼 엔진 코드를 이제 조금씩 이해하고 있는데,

자주 안만지면 또 헷갈리곤 했다.

하지만 이러한 기반지식을 쌓아두면 언제 보더라도 곧 잘 이해할 수 있을 것 같았다.

기반 지식의 중요성을 근래에 깨닫는 중이다.

 

가령 소프트웨어적 스레드는 하드웨어적 스레드 위에서 돌아가며,

하드웨어적 스레드는 수많은 소프드웨어적 스레드를 돌아가게 할 수 있다. 라는 것을

말로 외운 느낌이었다면,

 

해당 서적을 천천히 읽어 나가다보면 그래서 그 스레드가 왜 스레드인지,

소프드웨어적 스레드가 뭔지 천천히 알려주고있다.

이 외에도 엔진의 근간도 결국 OSCS인지라,

해당 서적을 통해서 OS를 이해해나가면서 엔진 개념 애해에도 도움이 됐다.