Mengapa tidak ada ID proses Windows yang aneh?

160

Ada banyak cara untuk memeriksa ID proses di Windows.

Misalnya, menggunakan perintah PowerShell:

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

Kami melihat output berikut:

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

Semua ID proses adalah angka genap dan, di samping itu, semuanya adalah kelipatan dari 4 .

Tidak ada ID proses aneh pada versi Windows yang didasarkan pada Windows NT.

Apa alasannya?

Peter Hahndorf
sumber
6
Mungkin menarik: Beberapa detail tentang linux - justskins.com/forums/why-are-process-ids-204416.html
Dave
13
Memang tidak ada. Itu aneh.
AndreKR

Jawaban:

168

"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


DavidPostill
sumber
3
Satu kutipan mengatakan "Anda tidak harus bergantung pada itu karena itu bukan bagian dari kontrak pemrograman," tetapi kemudian klaim berikutnya ntdef.h mengatakan bit tersebut "tersedia untuk digunakan oleh kode aplikasi sebagai bit tag." Dokumentasi dalam file header publik hampir sama dengan "kontrak pemrograman" seperti yang Anda dapatkan, sehingga klaim pertama salah.
BlueRaja - Danny Pflughoeft
2
@BlueRaja, "Tidak terlalu terkenal adalah bahwa dua bit terbawah dari HANDLE kernel selalu nol; dengan kata lain, nilai numeriknya selalu kelipatan 4. " Kode dalam ntdef.h juga berlaku untuk jenis pegangan lainnya. (Pegangan USER, pegangan GDI, pegangan multimedia ...)
DavidPostill
37
@BlueRaja: pegangan kernel adalah kelipatan empat dan itu bersifat kontrak, jadi Anda bisa mengandalkannya; Proses id (yang tidak sama dengan proses menangani), sebaliknya, terjadi menjadi kelipatan empat, tapi itu hanya sebuah implementasi detail, sehingga Anda tidak harus bergantung pada itu.
Matteo Italia
6
@ BlueRaja Saya pikir Raymond akan memberi tahu Anda bahwa siapa pun yang menulis dokumentasi memandang dunia melalui kacamata berwarna kernel dan dengan demikian hanya merujuk ke pegangan kernel dan bukan jenis pegangan lainnya.
CodesInChaos
1
@Mehrdad: well, USER dan GDI handle biasanya tidak disebut handle "kernel" (walaupun itu dihasilkan oleh komponen yang berjalan dalam apa yang disebut mode kernel).
Matteo Italia