System PID가 항상 4일까? 하는 호기심에 찾아보다 발견한 글
https://superuser.com/questions/1182187/why-is-system-pid-4-not-pid-1
윗 글에서 0은 idle PID 이므로 가장 먼저 부여할 수 있는 PID는 4라고 주장한다. 따라서 4가 가장 처음으로 부여할 수 있는 System PID라고 얘기하며, 근거로써 Raymond Chen의 아래 글을 인용하고 있다.
그러면서도 task manager에서 보여주는 값은 확실치 않을 수 있다며, 실제로는 1인데 그냥 2비트 시프트한 것일지도 모른다고 말을 흐린다.
[Why are process and thread IDs multiples of four?]
https://devblogs.microsoft.com/oldnewthing/?p=23283
왜 Process와 thread ID는 4의 배수인걸까? 큰 궁금증을 가지고 링크를 눌렀으나, 곧 현실적인 이유에 다소 실망했다. 중요한 이유를 기대했었는데, 단순히 kernel handle의 부여 코드를 재사용했기 때문에 4의 배수라는 것, 따라서 Process와 thread ID가 4의 배수인 건 그저 우연이니 이 같은 내용은 프로그래밍할 시 의존해서는 안된다고 얘기한다.
다소 허탈했으나 이번에는 왜 kernel handle이 4의 배수로 부여되게 코딩됐는지가 궁금해졌다.
[Why are kernel HANDLEs always a multiple of four?]
https://devblogs.microsoft.com/oldnewthing/?p=36633
The availability of the bottom two bits is buried in the
ntdef.h header file://
// Low order two bits of a handle are ignored by the system and available
// for use by application code as tag bits. The remaining bits are opaque
// and used to store a serial number and table index.
// #define OBJ_HANDLE_TAGBITS 0x00000003L
ntdef.h 헤더 파일에 적힌 주석을 통해 이유를 알 수 있다.
"핸들의 하위 2비트는 시스템에 의해서는 무시되므로 어플리케이션 코드에서 이를 태그비트로 사용할 수 있다. 남는 비트는 불투명하며 serial number를 저장하거나 테이블의 index를 저장하는데 사용한다(혹은 사용하곤 했다)"
이중적으로 해석이 가능하여 확실한 의미는 알 수 없으나, 일단 대충 내용은 알겠다.
Raymond Chen 씨는 친절하게도 "This information is not useful for most application writers" 라고 덧붙이고 있다.
ㅎㅎ.. 하지만 궁금한데요..
그래서, 정리해보면,
가장 먼저 부여할 수 있는 PID는 0이나 이는 Idle process로 사용되며, 이에 따라 적어도 Windows NT에서의 System PID는 그 다음으로 부여하는 4인 것으로 이해할 수 있을 것 같다.
궁금증은 해소한 듯
'Programming Logs > Windows' 카테고리의 다른 글
unix 시간을 windows의 FILETIME으로 변환하기 (0) | 2020.03.01 |
---|---|
LoadLibrary, FreeLibrary, GetModuleHandle (0) | 2019.12.26 |