"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