Trang chủ » làm thế nào để » Tại sao không có ID tiến trình Windows được đánh số lẻ?

    Tại sao không có ID tiến trình Windows được đánh số lẻ?

    Nếu bạn thích mày mò với Windows và học hỏi khi bạn đi, bạn có thể nhận thấy rằng quy trình và ID luồng của Windows được đánh số chẵn và bội số của bốn. Tại sao vậy? Bài hỏi và trả lời của SuperUser hôm nay có câu trả lời cho câu hỏi của người đọc tò mò.

    Phiên hỏi và trả lời hôm nay đến với chúng tôi nhờ sự hỗ trợ của SuperUser - một phân ngành của Stack Exchange, một nhóm các trang web Hỏi & Đáp do cộng đồng điều khiển.

    Câu hỏi

    Người đọc siêu người dùng Peter Hahndorf muốn biết tại sao không có ID tiến trình Windows số lẻ:

    Có nhiều cách để xem ID tiến trình trong Windows. Sử dụng PowerShell:

    Tôi nhận được kết quả này:

    Như bạn có thể thấy, tất cả các ID quá trình đều được đánh số chẵn, không chỉ vậy, chúng còn là bội số của bốn. Bạn có thể trông khó như bạn muốn và bạn sẽ không bao giờ tìm thấy ID tiến trình được đánh số lẻ, ít nhất là không có trên bất kỳ phiên bản nào dựa trên Windows NT. Lý do cho điều này là gì?

    Tại sao không có ID tiến trình Windows được đánh số lẻ?

    Câu trả lời

    Người đóng góp cho SuperUser DavidPostill có câu trả lời cho chúng tôi:

    Tại sao không có ID tiến trình Windows được đánh số 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 nhân là bội số của bốn, nên ID tiến 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 xử lý và luồng xử lý 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. Khi so sánh, lý do các nhân xử lý 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 tái sử dụng 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 nhân là bội số của bốn, nên ID tiến trình và luồng cũng vậy. Đây là một chi tiết thực hiện, 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 xử lý kernel luôn là bội số của bốn?

    Một điều không được biết đến nhiều là hai bit phía dưới của các thẻ điều khiển kernel luôn bằng 0; nói cách khác, giá trị số của chúng luôn là bội số của bốn. Lưu ý rằng điều này chỉ áp dụng cho xử lý kernel; 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, v.v.). Xử lý hạt nhân là những thứ bạn có thể chuyển cho hàm CloseHandle.

    Ít nhất bit dưới cùng của các thẻ điều khiển kernel luôn bằng 0 được hàm ngụ ý của hàm GetQueuedCompletionStatus, cho biết rằng bạn có thể đặt bit dưới cùng của 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, nên tiếp tục coi các thẻ điều khiển là các 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 xử lý kernel luôn là bội số của bốn?

    Đọc thêm

    Điều mới cũ: Phát triển thực tế xuyên suốt sự phát triển của Windows của Raymond Chen (Kỹ sư thiết kế phần mềm chính tại Microsoft)


    Có một cái gì đó để thêm vào lời giải thích? Tắt âm thanh trong các ý kiến. Bạn muốn đọc thêm câu trả lời từ những người dùng Stack Exchange am hiểu công nghệ khác? Kiểm tra chủ đề thảo luận đầy đủ ở đây.