이상한 Windows 프로세스 ID가없는 이유는 무엇입니까?


160

Windows에서 프로세스 ID를 검사하는 방법에는 여러 가지가 있습니다.

예를 들어 PowerShell 명령을 사용하면 다음과 같습니다.

ps | select Id, ProcessName  | Sort Id | ft -AutoSize

다음과 같은 결과가 나타납니다.

  Id ProcessName         
  -- -----------         
   0 Idle                
   4 System              
 264 svchost             
 388 smss                
 476 csrss               
 536 wininit             
 580 winlogon                      
 620 services            
 628 lsass                          
 728 svchost             
 828 dwm                                     
1060 chrome              
1080 rundll32            
1148 vmms                                        
1620 spoolsv                                                
2912 taskhostex          
3020 explorer       
...     

모든 프로세스 ID는 짝수이며 또한 4의 배수입니다 .

Windows NT를 기반으로하는 모든 Windows 버전에는 이상한 프로세스 ID가 없습니다.

그 이유는 무엇입니까?


6
아마도 흥미로운 : 리눅스에 대한 세부 사항-justskins.com/forums/why-are-process-ids-204416.html
Dave

13
실제로는 없습니다. 이상하다.
AndreKR

답변:


168

"왜 이상한 Windows 프로세스 ID가 없습니까?"

커널 핸들을 할당하는 동일한 코드가 프로세스 및 스레드 ID를 할당하는 데에도 사용됩니다. 커널 핸들은 4의 배수이므로 프로세스 및 스레드 ID도 있습니다.


프로세스 및 스레드 ID가 4의 배수 인 이유는 무엇입니까?

Windows NT 기반 운영 체제에서 프로세스 및 스레드 ID는 항상 4의 배수입니다. 우연의 일치일까요?

그렇습니다. 우연의 일치 일뿐입니다. 프로그래밍 계약의 일부가 아니므로 의존해서는 안됩니다. 예를 들어, Windows 95 프로세스 및 스레드 ID가 항상 4의 배수는 아니 었습니다. (커널 핸들이 항상 4의 배수 인 이유는 사양의 일부이며 가까운 미래에 보장 될 것입니다.)

프로세스 및 스레드 ID는 코드 재사용의 부작용으로 4의 배수입니다. 커널 핸들을 할당하는 동일한 코드가 프로세스 및 스레드 ID를 할당하는 데에도 사용됩니다. 커널 핸들은 4의 배수이므로 프로세스 및 스레드 ID도 있습니다. 이것은 구현 세부 사항이므로 그에 의존하는 코드를 작성하지 마십시오. 나는 단지 당신에게 당신의 호기심을 만족 시키라고 말하고 있습니다.

소스 프로세스 및 스레드 ID가 4의 배수 인 이유는 무엇입니까?


커널 핸들이 항상 4의 배수 인 이유는 무엇입니까?

커널 핸들의 맨 아래 두 비트가 항상 0이라는 것은 잘 알려져 있지 않습니다. 즉, 숫자 값은 항상 4의 배수입니다. 이것은 커널 핸들에만 적용됩니다. 의사 핸들이나 다른 유형의 핸들 (USER 핸들, GDI 핸들, 멀티미디어 핸들 ...)에는 적용되지 않습니다. 커널 핸들은 CloseHandle 함수에 전달할 수있는 항목입니다.

맨 아래 두 비트의 가용성은 ntdef.h 헤더 파일에 묻혀 있습니다.

//
// 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

GetQueuedCompletionStatus 함수는 커널 HANDLE의 최하위 비트가 항상 0임을 암시하며, 완료 포트 알림을 억제하도록 이벤트 핸들의 최하위 비트를 설정할 수 있음을 나타냅니다. 이것이 작동하려면 맨 아래 비트는 일반적으로 0이어야합니다.

이 정보는 대부분의 응용 프로그램 작성자에게는 유용하지 않으므로 HANDLE을 계속 불투명 한 값으로 취급해야합니다. 태그 비트에 관심이있는 사람들은 저수준 클래스 라이브러리를 구현하거나 더 큰 프레임 워크 안에 커널 객체를 래핑하는 사람들입니다.

소스 커널 핸들이 항상 4의 배수 인 이유는 무엇입니까?


추가 자료



3
한 인용문은 "프로그래밍 계약의 일부가 아니기 때문에 그것에 의존해서는 안된다"고 말하지만, 다음 주장 ntdef.h는 비트가 "응용 프로그램 코드에서 태그 비트로 사용 가능" 하다고 말합니다 . 공개 헤더 파일의 문서 는 얻을 수 있는 "프로그래밍 계약"에 가깝기 때문에 첫 번째 클레임이 잘못되었습니다.
BlueRaja-대니 Pflughoeft

2
@BlueRaja, "잘 알려지지 않은 것은 커널 핸들 의 맨 아래 두 비트 가 항상 0이라는 것입니다. 즉, 숫자 값은 항상 4의 배수입니다. "ntdef.h의 코드는 다른 종류의 핸들에도 적용됩니다. (USER 핸들, GDI 핸들, 멀티미디어 핸들 ...)
DavidPostill

37
@BlueRaja : 커널 핸들은 4의 배수이며 계약이므로이를 신뢰할 수 있습니다. 프로세스 ID (있는 하지 프로세스 처리와 같은)를 대신 일어날 네의 여러 수 있지만, 당신이 그것에 의존해서는 안 즉, 단지 구현 세부입니다.
Matteo Italia

6
@BlueRaja Raymond는 문서를 작성한 사람은 누구나 커널 색 안경을 통해 세상을 보았 으므로 다른 종류의 핸들이 아니라 커널 핸들 만 언급 했다고 말할 것이라고 생각 합니다.
코드 InChaos

1
@Mehrdad : USER 및 GDI 핸들은 일반적으로 "커널"핸들이라고하지 않습니다 (소위 커널 모드에서 실행되는 구성 요소에 의해 생성 되기는하지만).
Matteo Italia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.