Prioritas Penjadwalan
Threads dijadwalkan untuk berjalan berdasarkan prioritas penjadwalan mereka. Setiap utas diberi prioritas penjadwalan. Tingkat prioritas berkisar dari nol (prioritas terendah) hingga 31 (prioritas tertinggi). Hanya utas halaman nol 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 secara setara. Sistem menetapkan irisan waktu secara bergilir ke semua utas dengan prioritas tertinggi. Jika tidak ada dari utas ini yang siap dijalankan, sistem menetapkan irisan waktu secara bergiliran ke semua utas dengan prioritas tertinggi berikutnya. Jika utas berprioritas lebih tinggi tersedia untuk dijalankan, sistem berhenti menjalankan utas berprioritas lebih rendah (tanpa mengizinkannya untuk menyelesaikan menggunakan ikatan waktunya) dan menetapkan ikatan waktu penuh ke utas berprioritas lebih tinggi. Untuk informasi selengkapnya, lihat Pergantian 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 menghasilkan prioritas dasar sebuah utas. Untuk informasi tentang prioritas dinamis utas, lihat Priority Boosts.
Kelas Prioritas
Setiap proses termasuk dalam salah satu kelas prioritas berikut:
- KELAS_PRIORITAS_IDLE
KELAS_PRIORITAS_DI_BAWAH_NORMAL
KELAS_PRIORITAS_NORMAL
ABOVE_NORMAL_PRIORITY_CLASS
KELAS_PRIORITAS_TINGGI
REALTIME_PRIORITY_CLASS
Secara bawaan, kelas prioritas dari sebuah proses adalah NORMAL_PRIORITY_CLASS. Gunakan fungsi CreateProcess untuk menentukan kelas prioritas dari proses turunan saat Anda membuatnya. Jika proses panggilan adalah IDLE_PRIORITY_CLASS atau BELOW_NORMAL_PRIORITY_CLASS, proses baru akan mewarisi kelas ini. Gunakan fungsiGetPriorityClassuntuk menentukan kelas prioritas proses saat ini dan fungsisetPriorityClassuntuk 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 benang diberi prioritas tinggi pada saat yang sama, benang tersebut 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 dengan membuat proses dengan prioritas tinggi di mana sebagian besar utasnya diblokir selama sebagian besar waktu. Proses ini akan membangunkan utas hanya ketika tugas-tugas penting perlu dilakukan. Poin pentingnya adalah bahwa utas prioritas tinggi harus dijalankan untuk waktu yang singkat, dan hanya ketika memiliki pekerjaan penting untuk dilakukan.
Anda seharusnya hampir tidak pernah menggunakan REALTIME_PRIORITY_CLASS, karena ini mengganggu utas sistem yang mengelola input mouse, input keyboard, dan pembilasan 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
PRIORITAS_UTAS_TERENDAH
PRIORITAS_THREAD_DI_BAWAH_NORMAL
THREAD_PRIORITY_NORMAL
PRIORITAS_UTAS_DI_ATAS_NORMAL
Prioritas_Tertinggi_Berulir
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. Thread latar belakang, terutama yang memerlukan banyak pemrosesan, dapat disetel ke THREAD_PRIORITY_BELOW_NORMAL atau THREAD_PRIORITY_LOWEST, untuk memastikan mereka dapat diprioritaskan lebih rendah jika perlu. Namun, jika Anda memiliki utas yang menunggu utas lain dengan prioritas lebih rendah untuk menyelesaikan beberapa tugas, pastikan untuk menghentikan eksekusi dari utas prioritas tinggi yang sedang menunggu. Untuk melakukan ini, gunakan fungsi tunggu , bagian kritis , atau fungsi Sleep , fungsi SleepEx , atau fungsi SwitchToThread . Lebih baik jika proses tidak harus melakukan perulangan. Jika tidak, prosesnya mungkin mengalami kebuntuan (deadlock), karena utas dengan prioritas 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 menunjukkan 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 | |
PRIORITAS_BENANG_TERENDAH | 2 | ||
THREAD_PRIORITY_BELOW_NORMAL | 3 | ||
THREAD_PRIORITY_NORMAL | 4 | ||
PRIORITAS_UTAS_DI_ATAS_NORMAL | 5 | ||
THREAD_PRIORITY_HIGHEST | 6 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
THREAD_PRIORITAS_TERENDAH | 4 | ||
THREAD_PRIORITY_BELOW_NORMAL | 5 | ||
Prioritas_Thread_Normal | 6 | ||
THREAD_PRIORITY_ABOVE_NORMAL (Prioritas Utas Di Atas Normal) | 7 | ||
TINGKAT_PRIORITAS_UTAMA (THREAD_PRIORITY_HIGHEST) | 8 | ||
PRIORITAS_UTAS_WAKTU_KRITIS | 15 | ||
NORMAL_PRIORITY_CLASS (kelas_prioritas_normal) | THREAD_PRIORITY_IDLE | 1 | |
Prioritas Benang Terendah | 6 | ||
Prioritas_Benang_Di_Bawah_Normal | 7 | ||
PRIORITAS_UTAS_NORMAL | 8 | ||
Prioritas Thread Di Atas Normal | 9 | ||
THREAD_PRIORITY_TERTINGGI | 10 | ||
Prioritas_Thread_Waktu_Kritis | 15 | ||
KELAS_PRIORITAS_DI_ATAS_NORMAL | THREAD_PRIORITY_IDLE | 1 | |
PRIORITAS_UTAS_TERENDAH | 8 | ||
THREAD_PRIORITY_BELOW_NORMAL (Prioritas Utas Dibawah Normal) | 9 | ||
Prioritas Benang Normal (THREAD_PRIORITY_NORMAL) | 10 | ||
PRIORITAS_UTAS_DI_ATAS_NORMAL | 11 | ||
THREAD_PRIORITY_HIGHEST | 12 | ||
Prioritas_Thread_Waktu_Kritis | 15 | ||
HIGH_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
PRIORITAS_UTAS_TERENDAH | 11 | ||
PRIORITAS_THREAD_DIBAWAH_NORMAL | 12 | ||
THREAD_PRIORITY_NORMAL | 13 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 14 | ||
THREAD_PRIORITY_HIGHEST (Prioritas Benang Tertinggi) | 15 | ||
Prioritas_Utas_Waktu_Kritis | 15 | ||
REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 16 | |
THREAD_PRIORITY_TERENDAH (prioritas utas terendah) | 22 | ||
Prioritas Thread di Bawah Normal | 23 | ||
THREAD_PRIORITY_NORMAL | 24 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 25 | ||
Prioritas thread tertinggi (THREAD_PRIORITY_HIGHEST) | 26 | ||
THREAD_PRIORITY_WAKTU_KRITIS | 31 |