Aracılığıyla paylaş


Zamanlama Öncelikleri

İş parçacıkları, zamanlama önceliğine göre çalışacak şekilde zamanlanır. Her iş parçacığına bir zamanlama önceliği atanır. Öncelik düzeyleri sıfırdan (en düşük öncelik) 31'e (en yüksek öncelik) kadar değişir. Yalnızca sıfır sayfalı iş parçacığının önceliği sıfır olabilir. (Sıfır sayfalı iş parçacığı, çalıştırılması gereken başka iş parçacığı olmadığında boş sayfaların sıfırlanmasından sorumlu bir sistem iş parçacığıdır.)

Sistem, tüm iş parçacıklarını aynı öncelikte eşit şekilde değerlendirir. Sistem, en yüksek önceliğe sahip tüm iş parçacıklarına döngüsel olarak zaman dilimleri atar. Bu iş parçacıklarının hiçbiri çalışmaya hazır değilse, sistem, bir sonraki en yüksek önceliğe sahip tüm iş parçacıklarına sıra tabanlı bir biçimde zaman dilimleri atar. Daha yüksek öncelikli bir iş parçacığı çalıştırılmaya kullanılabilir hale gelirse, sistem düşük öncelikli iş parçacığını yürütmeyi durdurur (zaman dilimini kullanmayı bitirmesine izin vermeden) ve yüksek öncelikli iş parçacığına tam zamanlı bir dilim atar. Daha fazla bilgi için Bağlam Değişimleribölümüne bakın.

Her bir iş parçacığının önceliği, aşağıdaki ölçütlere göre belirlenir.

  • İşleminin öncelik sınıfı
  • İş parçacığının, işlem öncelik sınıfı içindeki öncelik düzeyi

Öncelik sınıfı ve öncelik düzeyi, iş parçacığının temel öncelik oluşturmak için birleştirilir. Bir iş parçacığının dinamik önceliği hakkında bilgi için bkz. Priority Boosts.

Öncelik Sınıfı

Her işlem aşağıdaki öncelik sınıflarından birine aittir:

IDLE_PRIORITY_CLASS
Normal Altı Öncelik Sınıfı
Normal_Öncelik_Sınıfı
NORMALİN ÜSTÜ ÖNCELİK SINIFI
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

Varsayılan olarak, bir işlemin öncelik sınıfı NORMAL_PRIORITY_CLASS. Bir alt işlemin oluşturduğunuzda öncelik sınıfını belirtmek için CreateProcess işlevini kullanın. Çağrı işlemi IDLE_PRIORITY_CLASS veya BELOW_NORMAL_PRIORITY_CLASS ise, yeni işlem bu sınıfı devralır. bir işlemin geçerli öncelik sınıfını belirlemek için GetPriorityClass işlevini ve bir işlemin öncelik sınıfını değiştirmek için SetPriorityClassişlevinikullanın.

Ekran koruyucular veya bir ekranı düzenli aralıklarla güncelleştiren uygulamalar gibi sistemi izleyen işlemler IDLE_PRIORITY_CLASS kullanmalıdır. Bu, yüksek önceliğe sahip olmayan bu işlemin iş parçacıklarının daha yüksek öncelikli iş parçacıklarına müdahale etmesini engeller.

HIGH_PRIORITY_CLASS dikkatli kullanın. Bir iş parçacığı uzun süreler için en yüksek öncelik düzeyinde çalışıyorsa, sistemdeki diğer iş parçacıkları işlemci süresini alamaz. Aynı anda birden fazla iş parçacığı yüksek önceliğe ayarlanırsa, iş parçacıkları etkinliklerini kaybeder. Yüksek öncelikli sınıf, zaman açısından kritik olaylara yanıt vermesi gereken thread'ler için ayrılmalıdır. Uygulamanız yüksek öncelikli sınıfı gerektiren bir görev gerçekleştiriyorsa ve geri kalan görevleri normal öncelikliyse, uygulamanın öncelik sınıfını geçici olarak yükseltmek için SetPriorityClass kullanın; ardından zaman açısından kritik görev tamamlandıktan sonra bunu azaltın. Başka bir strateji, iş parçacıklarını çoğunlukla durduran ve yalnızca kritik görevler gerektiğinde onları uyandıran yüksek öncelikli bir işlem oluşturmaktır. Önemli nokta, yüksek öncelikli bir iş parçacığının ancak zaman açısından kritik bir işi olduğunda ve bu işin kısa bir süre için yürütülmesi gerektiğinde çalışması gerektiğidir.

Fare girişini, klavye girişini ve arka plan diski temizlemeyi yöneten sistem iş parçacıklarını kestiği için REALTIME_PRIORITY_CLASS neredeyse hiç kullanmamalısınız. Bu sınıf, doğrudan donanımla "konuşan" veya sınırlı kesintileri olması gereken kısa görevler gerçekleştiren uygulamalar için uygun olabilir.

Öncelik Düzeyi

Her öncelik sınıfındaki öncelik düzeyleri şunlardır:

THREAD_PRIORITY_IDLE
THREAD_ONCELIK_EN_DUSUK
İP_ÖNCELİĞİ_NORMALİN_ALTINDA
THREAD_PRIORITY_NORMAL
NORMALİN ÜZERİNDE İŞ PARÇACIK ÖNCELİĞİ
İŞ_PARÇACIĞI_ÖNCELİĞİ_EN_YÜKSEK
THREAD_PRIORITY_TIME_CRITICAL

Tüm iş parçacıkları THREAD_PRIORITY_NORMAL kullanılarak oluşturulur. Bu, iş parçacığı önceliğinin işlem önceliği sınıfıyla aynı olduğu anlamına gelir. bir iş parçacığı oluşturduktan sonra, SetThreadPriority işlevini kullanarak işlemdeki diğer iş parçacıklarına göre önceliğini ayarlayın.

Tipik bir strateji, uygulamanın kullanıcıya yanıt vermesini sağlamak için işlemin giriş iş parçacığı için THREAD_PRIORITY_ABOVE_NORMAL veya THREAD_PRIORITY_HIGHEST kullanmaktır. Arka plan iş parçacıkları, özellikle işlemci yoğun olanlar, gerektiğinde kesintiye uğrayabilmelerini sağlamak için THREAD_PRIORITY_BELOW_NORMAL veya THREAD_PRIORITY_LOWEST olarak ayarlanabilir. Ancak, daha düşük önceliğe sahip başka bir iş parçacığının bir görevi tamamlamasını bekleyen bir iş parçacığınız varsa, bekleyen yüksek öncelikli iş parçacığının yürütülmesini engellediğinizden emin olun. Bunu yapmak için, bekleme işlevini, kritik bölümü veya Sleep işlevini, SleepExveya SwitchToThread işlevini kullanın. Bu, iş parçacığının bir döngü yürütmesi için tercih edilir. Aksi takdirde, daha düşük önceliğe sahip iş parçacığı hiçbir zaman zamanlanmadığı için, işlem çıkmaza girebilir.

İş parçacığının geçerli öncelik düzeyini belirlemek için GetThreadPriorityişlevinikullanın.

Temel Öncelik

İşlem öncelik sınıfı ve iş parçacığı öncelik düzeyi, her iş parçacığının temel önceliğini oluşturmak için birleştirilir.

Aşağıdaki tabloda, işlem öncelik sınıfı ve iş parçacığı öncelik değeri birleşimleri için temel öncelik gösterilmektedir.

İşlem önceliği sınıfı İş parçacığı öncelik düzeyi Temel öncelik
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
EN_DÜŞÜK_ÖNCELİK 2
THREAD_PRIORITY_BELOW_NORMAL 3
İŞ PARÇACIĞI_ÖNCELİĞİ_NORMAL 4
THREAD_PRIORITY_ABOVE_NORMAL 5
İŞPARÇASI_ÖNCELİĞİ_ENYÜKSEK 6
THREAD_PRIORITY_ZAMAN_KRİTİK 15
Normal Altı Öncelik Sınıfı THREAD_PRIORITY_IDLE 1
EN_DÜŞÜK_İŞ_PARÇASI_ÖNCELİĞİ 4
İŞ PARÇACIĞI_ÖNCELİĞİ_NORMALİN_ALTINDA 5
THREAD_PRIORITY_NORMAL 6
THREAD_ÖNCELİĞİ_NORMALİN_ÜSTÜNDE 7
THREAD_PRIORITY_ENYÜKSEK 8
İŞ PARÇACIĞI_ÖNCELİĞİ_ZAMAN_KRİTİK 15
Normal_Öncelik_Sınıfı THREAD_PRIORITY_IDLE 1
THREAD_ÖNCELİK_EN_DÜŞÜK 6
İŞ PARÇACIĞI_ÖNCELİĞİ_NORMALİN_ALTINDA 7
İŞ PARÇASI_ÖNCELİĞİ_NORMAL 8
THREAD_PRIORITY_ABOVE_NORMAL 9
THREAD_PRIORITY_HIGHEST 10
THREAD_PRIORITY_TIME_CRITICAL (ZAMAN KRİTİK ÖNCELİĞİ) 15
Normalin Üstünde Öncelik Sınıfı THREAD_PRIORITY_IDLE 1
İŞ PARÇACIĞI_ÖNCELİK_EN DÜŞÜK 8
THREAD_PRIORITY_BELOW_NORMAL (Normal Altı Öncelik) 9
THREAD_PRIORITY_NORMAL (Normal Öncelik) 10
İP_ÖNCELİĞİ_NORMALİN_ÜSTÜNDE 11
İŞPARÇASI_ÖNCELİK_EN_YÜKSEK 12
THREAD_PRIORITY_TIME_CRITICAL 15
YÜKSEK_ÖNCELİKLİ_SINIF THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 11
İPLİK_ÖNCELİĞİ_NORMALİN_ALTINDA 12
KONU_ÖNCELİĞİ_NORMAL 13
İŞ PARÇACIĞI_ÖNCELİĞİ_NORMALİN_ÜSTÜNDE 14
THREAD_PRIORITY_EN_YÜKSEK (THREAD_PRIORITY_HIGHEST) 15
THREAD_PRIORITY_TIME_CRITICAL 15
Gerçekzamanlı Öncelik Sınıfı Öncelik Düzeyi - Boşta 16
EN DÜŞÜK İŞ PARÇACIĞI ÖNCELİĞİ 22
İŞ PARÇASI_ÖNCELİĞİ_NORMALİN_ALTINDA 23
THREAD_ÖNCELİK_NORMAL 24
THREAD_ÖNCELİĞİ_NORMALİN_ÜSTÜNDE 25
En Yüksek Öncelikli İş Parçacığı 26
THREAD_PRIORITY_TIME_CRITICAL 31