Tại sao không có ID tiến trình Windows lẻ?


160

Có nhiều cách để kiểm tra ID tiến trình trong Windows.

Ví dụ: sử dụng lệnh PowerShell:

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

Chúng tôi thấy đầu ra sau đây:

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

Tất cả các ID quá trình là số chẵn và ngoài ra, chúng đều là bội số của 4 .

Không có ID tiến trình kỳ lạ trên bất kỳ phiên bản Windows nào dựa trên Windows NT.

Lý do cho điều này là gì?


6
Có thể thú vị: Một số chi tiết về linux - jowerskins.com/forums/why-are- Process
Dave

13
Quả thực không có. Thật ki quặc.
AndreKR

Câu trả lời:


168

"Tại sao không có Id quá trình Windows lẻ?"

Mã tương tự phân bổ các thẻ điều khiển kernel cũng được sử dụng để phân bổ ID tiến trình và ID luồng. Vì các thẻ điều khiển kernel là bội số của bốn, nên ID quá trình và luồng cũng vậy.


Tại sao ID tiến trình và chủ đề là bội số của bốn?

Trên các hệ điều hành dựa trên Windows NT, ID tiến trình và ID luồng luôn luôn là bội số của bốn. Đây chỉ là một trùng hợp ngẫu nhiên?

Vâng, đó chỉ là một sự trùng hợp ngẫu nhiên và bạn không nên dựa vào nó vì nó không phải là một phần của hợp đồng lập trình. Ví dụ, quy trình và chuỗi ID của Windows 95 không phải lúc nào cũng là bội số của bốn. (Để so sánh, lý do rằng các thẻ điều khiển kernel luôn là bội số của bốn là một phần của đặc tả và sẽ được đảm bảo trong tương lai gần.)

ID tiến trình và ID luồng là bội số của bốn như là một tác dụng phụ của việc sử dụng lại mã. Mã tương tự phân bổ các thẻ điều khiển kernel cũng được sử dụng để phân bổ ID tiến trình và ID luồng. Vì các thẻ điều khiển kernel là bội số của bốn, nên ID quá trình và luồng cũng vậy. Đây là một chi tiết triển khai, vì vậy đừng viết mã dựa vào nó. Tôi chỉ nói với bạn để thỏa mãn sự tò mò của bạn.

Nguồn Tại sao ID tiến trình và chủ đề là bội số của bốn?


Tại sao các TAY nhân luôn là bội số của bốn?

Không được biết đến nhiều là hai bit phía dưới của các TAY nhân luôn bằng không; nói cách khác, giá trị số của chúng luôn là bội số của 4. Lưu ý rằng điều này chỉ áp dụng cho các TAY nhân; nó không áp dụng cho tay cầm giả hoặc cho bất kỳ loại tay cầm nào khác (tay cầm USER, tay cầm GDI, tay cầm đa phương tiện ...) Tay cầm hạt nhân là những thứ bạn có thể chuyển cho chức năng CloseHandle.

Tính khả dụng của hai bit dưới cùng được chôn trong tệp tiêu đề 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

Ít nhất là bit dưới cùng của kernel HANDLE luôn bằng 0 được hàm hàm GetQueuedCompletionStatus chỉ ra rằng bạn có thể đặt bit dưới cùng của trình xử lý sự kiện để chặn thông báo cổng hoàn thành. Để làm việc này, bit dưới cùng thường phải bằng không.

Thông tin này không hữu ích cho hầu hết các nhà văn ứng dụng, những người nên tiếp tục coi TAY là giá trị mờ. Những người quan tâm đến các bit tag là những người đang triển khai các thư viện lớp cấp thấp hoặc đang gói các đối tượng kernel bên trong một khung lớn hơn.

Nguồn Tại sao các TAY nhân luôn là bội số của bốn?


đọc thêm



3
Một trích dẫn nói rằng "bạn không nên dựa vào nó vì nó không phải là một phần của hợp đồng lập trình", nhưng sau đó các tuyên bố tiếp theo ntdef.h nói rằng các bit "có sẵn để sử dụng bởi mã ứng dụng như các bit thẻ." Tài liệu trong tệp tiêu đề công khai gần với "hợp đồng lập trình" như bạn có thể nhận được, do đó, yêu cầu đầu tiên là không chính xác.
BlueRaja - Daniel Pflughoeft

2
@BlueRaja, "Không được biết đến nhiều là hai bit bên dưới của các TAY hạt nhân luôn bằng 0, nói cách khác, giá trị số của chúng luôn luôn là bội số của 4. " (Tay cầm USER, tay cầm GDI, tay cầm đa phương tiện ...)
DavidPostill

37
@BlueRaja: xử lý kernel là bội số của bốn và đó là hợp đồng, vì vậy bạn có thể dựa vào nó; id quá trình ( không giống như xử lý quy trình), thay vào đó, tình cờ là bội số của bốn, nhưng đó chỉ là một chi tiết triển khai, vì vậy bạn không nên dựa vào nó.
Matteo Italia

6
@BlueRaja Tôi nghĩ Raymond sẽ nói với bạn rằng bất cứ ai viết tài liệu đều nhìn thế giới qua kính màu hạt nhân và do đó chỉ đề cập đến tay cầm hạt nhân chứ không phải các loại tay cầm khác.
CodeInChaos

1
@Mehrdad: tốt, tay cầm USER và GDI thường không được gọi là tay cầm "kernel" (mặc dù chúng được tạo bởi các thành phần chạy trong chế độ gọi là kernel).
Matteo Italia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.