본문 바로가기

Programming Logs/Windows

왜 System pid는 1이 아니고 4일까?

System PID가 항상 4일까? 하는 호기심에 찾아보다 발견한 글

 

https://superuser.com/questions/1182187/why-is-system-pid-4-not-pid-1

 

Why is System PID 4, not PID 1?

My Google-fu has failed me! On Linux, the process with the lowest PID is init with PID 1, since it is the first process that gets started after the kernel loads, and is responsible for starting all

superuser.com

윗 글에서 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

 

Why are process and thread IDs multiples of four? – The Old New Thing

Why are process and thread IDs multiples of four? On Windows NT-based operating systems, process and thread IDs happen always to be a multiple of four. Is this just a coincidence? Yes, it’s just a coincidence, and you shouldn’t rely on it since it is not p

devblogs.microsoft.com

왜 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

 

Why are kernel HANDLEs always a multiple of four? – The Old New Thing

Why are kernel HANDLEs always a multiple of four? Not very well known is that the bottom two bits of kernel HANDLEs are always zero; in other words, their numeric value is always a multiple of 4. Note that this applies only to kernel HANDLEs; it does not a

devblogs.microsoft.com

 

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인 것으로 이해할 수 있을 것 같다.

 

궁금증은 해소한 듯