Câu hỏi Tại sao không có ID quá trình Windows lẻ?


Có nhiều cách để kiểm tra các 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 ta thấy kết quả sau:

  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 đều là số và, ngoài ra, tất cả chúng đều là bội số của 4.

Không có ID quá trình 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ì?


158
2017-07-06 08:21


gốc


Có thể thú vị: Một số chi tiết về linux - justskins.com/forums/why-are-process-ids-204416.html - Dave
Thật vậy không có bất kỳ. Thật ki quặc. - AndreKR


Các câu trả lời:


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

Mã tương tự phân bổ các trình điều khiển hạt nhân cũng được sử dụng để   cấp phát quy trình và ID luồng. Kể từ khi xử lý hạt nhân là một bội số   của bốn, vì vậy quá trình xử lý và ID luồng.


Tại sao quá trình và ID chuỗi bội số của bốn?

Trên các hệ điều hành dựa trên Windows NT, quá trình và ID luồng xảy ra   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, nó 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ó là   không phải là một phần của hợp đồng lập trình. Ví dụ: quy trình Windows 95   và ID luồng không phải lúc nào cũng là bội số của bốn. (Bằng cách so sánh,   lý do mà xử lý hạt nhân luôn là bội số của bốn là một phần của   đặc điểm kỹ thuật và sẽ được đảm bảo trong tương lai gần.)

Quy trình và ID luồng là bội số của bốn dưới dạng tác dụng phụ của mã   tái sử dụng. Mã tương tự phân bổ các trình điều khiển hạt nhân cũng được sử dụng để   cấp phát quy trình và ID luồng. Kể từ khi xử lý hạt nhân là một bội số   của bốn, vì vậy quá trình xử lý và ID luồng. Đây là một triển khai   chi tiết, do đó, khô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 quá trình và ID chuỗi bội số của bốn?


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

Không nổi tiếng lắm là hai bit dưới cùng của HANDLE hạt nhân là   luô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ố   4. Lưu ý rằng điều này chỉ áp dụng cho các HANDLE hạt nhân; nó không áp dụng   để xử lý giả hoặc bất kỳ loại xử lý nào khác (USER xử lý, GDI   xử lý, xử lý đa phương tiện ...) Trình xử lý hạt nhân là những thứ bạn có thể vượt qua   vào chức năng CloseHandle.

Sự sẵn có của hai bit dưới được chôn trong ntdef.h   tập tin tiêu đề:

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

Rằng ít nhất bit dưới cùng của HANDLEs hạt nhân luôn bằng 0   được hàm GetQueuedCompletionStatus ngụ ý, cho biết   bạn có thể đặt bit dưới cùng của xử lý sự kiện để ngăn chặn   thông báo cổng hoàn thành. Để làm việc này, phía dưới   bit 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,   nên tiếp tục coi HANDLE là giá trị mờ đục. Những người   sẽ quan tâm đến bit thẻ là những người đang triển khai   thư viện lớp cấp thấp hoặc đang gói các đối tượng hạt nhân bên trong   khung lớn hơn.

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


đọc thêm



166
2017-07-06 09:13



Một trích dẫn nói "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 đó tuyên bố tiếp theo ntdef.h nói rằng các bit là "có sẵn để sử dụng bởi mã ứng dụng dưới dạng các bit thẻ."  Tài liệu trong tệp tiêu đề công khai gần giống với "hợp đồng lập trình" như bạn có thể nhận được, vì vậy yêu cầu đầu tiên không chính xác. - BlueRaja - Danny Pflughoeft
@BlueRaja, "Không nổi tiếng lắm là hai bit dưới cùng của hạt nhân HANDLE luô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."Mã trong ntdef.h cũng áp dụng cho các loại xử lý khác (USER xử lý, xử lý GDI, xử lý đa phương tiện ...) - DavidPostill♦
@BlueRaja: xử lý hạt nhân là nhiều trong số bốn và đó là hợp đồng, vì vậy bạn có thể dựa vào nó; id quá trình (đó là không phải giống như xử lý quy trình), thay vào đó, xảy ra 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
@BlueRaja Tôi nghĩ Raymond sẽ nói với bạn rằng bất cứ ai đã viết tài liệu này nhìn thế giới qua kính màu hạt nhân và do đó chỉ được gọi là xử lý hạt nhân chứ không phải các loại xử lý khác. - CodesInChaos
@Mehrdad: tốt, USER và GDI xử lý thường không được gọi là "hạt nhân" xử lý (mặc dù chúng được tạo ra bởi các thành phần chạy trong chế độ hạt nhân được gọi là). - Matteo Italia