"Mengapa tidak ada proses Windows Id aneh?"
Kode yang sama yang mengalokasikan pegangan kernel juga digunakan untuk mengalokasikan ID proses dan utas. Karena pegangan kernel adalah kelipatan empat, demikian pula ID proses dan utas.
Mengapa ID proses dan utas berlipat ganda dari empat?
Pada sistem operasi berbasis Windows NT, ID proses dan utas selalu merupakan kelipatan empat. Apakah ini hanya kebetulan?
Ya, itu hanya kebetulan, dan Anda tidak boleh bergantung padanya karena itu bukan bagian dari kontrak pemrograman. Misalnya, proses Windows 95 dan ID utas tidak selalu merupakan kelipatan empat. (Sebagai perbandingan, alasan bahwa kernel selalu menangani kelipatan empat adalah bagian dari spesifikasi dan akan dijamin untuk masa mendatang.)
ID proses dan utas adalah kelipatan empat sebagai efek samping dari penggunaan kembali kode. Kode yang sama yang mengalokasikan pegangan kernel juga digunakan untuk mengalokasikan ID proses dan utas. Karena pegangan kernel adalah kelipatan empat, demikian pula ID proses dan utas. Ini adalah detail implementasi, jadi jangan menulis kode yang bergantung padanya. Saya hanya memberitahu Anda untuk memuaskan keingintahuan Anda.
Sumber Mengapa ID proses dan utas berlipat dari empat?
Mengapa HANDLE kernel selalu merupakan kelipatan empat?
Tidak terlalu dikenal adalah bahwa dua bit terbawah dari HANDLE kernel selalu nol; dengan kata lain, nilai numeriknya selalu kelipatan 4. Perhatikan bahwa ini hanya berlaku untuk HANDLE kernel; itu tidak berlaku untuk pseudo-handle atau untuk jenis pegangan lain (pegangan USER, pegangan GDI, multimedia menangani ...) Pegangan kernel adalah hal-hal yang dapat Anda lewati ke fungsi CloseHandle.
Ketersediaan dua bit terbawah dikubur dalam file header 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
Paling tidak bit inti dari HANDLEs kernel selalu nol disiratkan oleh fungsi GetQueuedCompletionStatus, yang menunjukkan bahwa Anda dapat mengatur bit bagian bawah dari event handle untuk menekan notifikasi penyelesaian port. Agar ini berfungsi, bit bawah biasanya harus nol.
Informasi ini tidak berguna untuk sebagian besar penulis aplikasi, yang harus terus memperlakukan HANDLE sebagai nilai buram. Orang-orang yang tertarik pada bit tag adalah mereka yang mengimplementasikan pustaka kelas tingkat rendah atau sedang membungkus objek kernel di dalam kerangka kerja yang lebih besar.
Source Mengapa kernel HANDLE selalu merupakan kelipatan empat?
Bacaan lebih lanjut