Prioritas Penjadwalan
Utas dijadwalkan untuk berjalan berdasarkan prioritas penjadwalannya. Setiap utas diberi prioritas penjadwalan. Tingkat prioritas berkisar dari nol (prioritas terendah) hingga 31 (prioritas tertinggi). Hanya utas nol halaman yang dapat memiliki prioritas nol. (Utas nol halaman adalah utas sistem yang bertanggung jawab untuk nol halaman gratis ketika tidak ada utas lain yang perlu dijalankan.)
Sistem memperlakukan semua utas dengan prioritas yang sama dengan yang sama. Sistem ini menetapkan irisan waktu secara round-robin ke semua utas dengan prioritas tertinggi. Jika tidak ada utas ini yang siap dijalankan, sistem menetapkan irisan waktu dengan cara round-robin ke semua utas dengan prioritas tertinggi berikutnya. Jika utas berprioritas lebih tinggi tersedia untuk dijalankan, sistem berhenti menjalankan utas berprioritas lebih rendah (tanpa mengizinkannya selesai menggunakan ikatan waktunya) dan menetapkan ikatan waktu penuh ke utas berprioritas lebih tinggi. Untuk informasi selengkapnya, lihat Pengalihan Konteks.
Prioritas setiap utas ditentukan oleh kriteria berikut:
- Kelas prioritas prosesnya
- Tingkat prioritas utas dalam kelas prioritas prosesnya
Kelas prioritas dan tingkat prioritas digabungkan untuk membentuk prioritas dasar utas. Untuk informasi tentang prioritas dinamis utas, lihat Peningkatan Prioritas.
Kelas Prioritas
Setiap proses termasuk dalam salah satu kelas prioritas berikut:
- IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
Secara default, kelas prioritas proses NORMAL_PRIORITY_CLASS. Gunakan fungsi CreateProcess untuk menentukan kelas prioritas proses anak saat Anda membuatnya. Jika proses panggilan IDLE_PRIORITY_CLASS atau BELOW_NORMAL_PRIORITY_CLASS, proses baru akan mewarisi kelas ini. Gunakan fungsi GetPriorityClass untuk menentukan kelas prioritas proses saat ini dan fungsi SetPriorityClass untuk mengubah kelas prioritas proses.
Proses yang memantau sistem, seperti pengaman layar atau aplikasi yang memperbarui tampilan secara berkala, harus menggunakan IDLE_PRIORITY_CLASS. Ini mencegah utas proses ini, yang tidak memiliki prioritas tinggi, mengganggu utas prioritas yang lebih tinggi.
Gunakan HIGH_PRIORITY_CLASS dengan hati-hati. Jika utas berjalan pada tingkat prioritas tertinggi untuk jangka waktu yang lama, utas lain dalam sistem tidak akan mendapatkan waktu prosesor. Jika beberapa utas diatur pada prioritas tinggi pada saat yang sama, utas kehilangan efektivitasnya. Kelas prioritas tinggi harus dicadangkan untuk utas yang harus merespons peristiwa kritis waktu. Jika aplikasi Anda melakukan satu tugas yang memerlukan kelas prioritas tinggi sementara tugas lainnya adalah prioritas normal, gunakan SetPriorityClass untuk menaikkan kelas prioritas aplikasi untuk sementara; kemudian kurangi setelah tugas kritis waktu selesai. Strategi lain adalah membuat proses prioritas tinggi yang sebagian besar alurnya diblokir, membangunkan utas hanya ketika tugas penting diperlukan. Poin pentingnya adalah bahwa utas prioritas tinggi harus dijalankan untuk waktu yang singkat, dan hanya ketika memiliki pekerjaan kritis waktu untuk dilakukan.
Anda hampir tidak boleh menggunakan REALTIME_PRIORITY_CLASS, karena ini mengganggu utas sistem yang mengelola input mouse, input keyboard, dan flushing disk latar belakang. Kelas ini dapat sesuai untuk aplikasi yang "berbicara" langsung ke perangkat keras atau yang melakukan tugas singkat yang seharusnya memiliki gangguan terbatas.
Tingkat Prioritas
Berikut ini adalah tingkat prioritas dalam setiap kelas prioritas:
- THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL
Semua utas dibuat menggunakan THREAD_PRIORITY_NORMAL. Ini berarti bahwa prioritas utas sama dengan kelas prioritas proses. Setelah Anda membuat utas, gunakan fungsi SetThreadPriority untuk menyesuaikan prioritasnya relatif terhadap utas lain dalam proses.
Strategi umumnya adalah menggunakan THREAD_PRIORITY_ABOVE_NORMAL atau THREAD_PRIORITY_HIGHEST untuk utas input proses, untuk memastikan bahwa aplikasi responsif terhadap pengguna. Utas latar belakang, terutama yang intensif prosesor, dapat diatur ke THREAD_PRIORITY_BELOW_NORMAL atau THREAD_PRIORITY_LOWEST, untuk memastikan bahwa mereka dapat didahului jika perlu. Namun, jika Anda memiliki utas yang menunggu utas lain dengan prioritas yang lebih rendah untuk menyelesaikan beberapa tugas, pastikan untuk memblokir eksekusi utas prioritas tinggi yang menunggu. Untuk melakukan ini, gunakan fungsi tunggu, bagian penting, atau fungsi Tidur , SleepEx, atau fungsi SwitchToThread . Ini lebih disukai agar utas menjalankan perulangan. Jika tidak, prosesnya mungkin menjadi kebuntuan, karena utas dengan prioritas yang lebih rendah tidak pernah dijadwalkan.
Untuk menentukan tingkat prioritas utas saat ini, gunakan fungsi GetThreadPriority .
Prioritas Dasar
Kelas prioritas proses dan tingkat prioritas utas digabungkan untuk membentuk prioritas dasar setiap utas.
Tabel berikut ini memperlihatkan prioritas dasar untuk kombinasi kelas prioritas proses dan nilai prioritas utas.
Kelas prioritas proses | Tingkat prioritas utas | Prioritas dasar | |
---|---|---|---|
IDLE_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
THREAD_PRIORITY_LOWEST | 2 | ||
THREAD_PRIORITY_BELOW_NORMAL | 3 | ||
THREAD_PRIORITY_NORMAL | 4 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 5 | ||
THREAD_PRIORITY_HIGHEST | 6 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
THREAD_PRIORITY_LOWEST | 4 | ||
THREAD_PRIORITY_BELOW_NORMAL | 5 | ||
THREAD_PRIORITY_NORMAL | 6 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 7 | ||
THREAD_PRIORITY_HIGHEST | 8 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
THREAD_PRIORITY_LOWEST | 6 | ||
THREAD_PRIORITY_BELOW_NORMAL | 7 | ||
THREAD_PRIORITY_NORMAL | 8 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 9 | ||
THREAD_PRIORITY_HIGHEST | 10 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
THREAD_PRIORITY_LOWEST | 8 | ||
THREAD_PRIORITY_BELOW_NORMAL | 9 | ||
THREAD_PRIORITY_NORMAL | 10 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 11 | ||
THREAD_PRIORITY_HIGHEST | 12 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
HIGH_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
THREAD_PRIORITY_LOWEST | 11 | ||
THREAD_PRIORITY_BELOW_NORMAL | 12 | ||
THREAD_PRIORITY_NORMAL | 13 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 14 | ||
THREAD_PRIORITY_HIGHEST | 15 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 16 | |
THREAD_PRIORITY_LOWEST | 22 | ||
THREAD_PRIORITY_BELOW_NORMAL | 23 | ||
THREAD_PRIORITY_NORMAL | 24 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 25 | ||
THREAD_PRIORITY_HIGHEST | 26 | ||
THREAD_PRIORITY_TIME_CRITICAL | 31 |