İş Parçacığı Havuzları
iş parçacığı havuzu, uygulama adına zaman uyumsuz geri çağırmaları verimli bir şekilde yürüten bir çalışan iş parçacıkları koleksiyonudur. İş parçacığı havuzu öncelikli olarak uygulama iş parçacığı sayısını azaltmak ve çalışan iş parçacıklarının yönetimini sağlamak için kullanılır. Uygulamalar iş öğelerini kuyruğa alabilir, işi beklenebilir tanıtıcılarla ilişkilendirebilir, zamanlayıcıya göre otomatik olarak kuyruğa alabilir ve G/Ç ile bağlanabilir.
İş Parçacığı Havuzu Mimarisi
Aşağıdaki uygulamalar iş parçacığı havuzu kullanmaktan yararlanabilir:
- Yüksek düzeyde paralel olan ve zaman uyumsuz olarak çok sayıda küçük iş öğesi (dağıtılmış dizin araması veya ağ G/Ç gibi) gönderebilen bir uygulama.
- Her biri kısa bir süre için çalışan çok sayıda iş parçacığı oluşturan ve yok eden bir uygulama. İş parçacığı havuzunun kullanılması, iş parçacığı yönetiminin karmaşıklığını ve iş parçacığı oluşturma ve yok etmeyle ilgili ek yükü azaltabilir.
- Arka planda ve paralel olarak bağımsız iş öğelerini işleyen bir uygulama (birden çok sekmeyi yükleme gibi).
- Çekirdek nesnelerinde özel bekleme gerçekleştirmesi veya nesnedeki gelen olaylarda engellemesi gereken bir uygulama. İş parçacığı havuzunun kullanılması, iş parçacığı yönetiminin karmaşıklığını azaltabilir ve bağlam anahtarı sayısını azaltarak performansı artırabilir.
- Olayları beklemek için özel garson iş parçacıkları oluşturan bir uygulama.
Özgün iş parçacığı havuzu Windows Vista'da tamamen yeniden oluşturulmuş. Yeni iş parçacığı havuzu, tek bir çalışan iş parçacığı türü sağladığından (hem G/Ç'yi hem de G/Ç olmayanları desteklediğinden), zamanlayıcı iş parçacığı kullanmadığından, tek bir zamanlayıcı kuyruğu sağladığından ve ayrılmış bir kalıcı iş parçacığı sağladığından geliştirilmiştir. Ayrıca temizleme grupları, daha yüksek performans, bağımsız olarak zamanlanan işlem başına birden çok havuz ve yeni bir iş parçacığı havuzu API'sini sağlar.
İş parçacığı havuzu mimarisi aşağıdakilerden oluşur:
- Geri çağırma işlevlerini yürüten çalışan iş parçacıkları
- Birden çok bekleme tutamacı üzerinde bekleyen garson iş parçacıkları
- İş kuyruğu
- Her işlem için varsayılan iş parçacığı havuzu
- Çalışan iş parçacıklarını yöneten bir çalışan fabrikası
En İyi Yöntemler
Yeni iş parçacığı havuzu API', özgün iş parçacığı havuzu API'sinden daha fazla esneklik ve denetim sağlar. Bununla birlikte, birkaç küçük ama önemli fark vardır. Özgün API'de bekleme sıfırlaması otomatikti; yeni API'de beklemenin her seferinde açıkça sıfırlanması gerekir. Özgün API, çağrı işleminin güvenlik bağlamını iş parçacığına aktararak kimliğe bürünmeyi otomatik olarak işledi. Yeni API ile uygulamanın güvenlik bağlamını açıkça ayarlaması gerekir.
İş parçacığı havuzu kullanırken en iyi yöntemler şunlardır:
bir işlemin iş parçacıkları iş parçacığı havuzunu paylaşır. Tek bir çalışan iş parçacığı, tek tek birden çok geri çağırma işlevi yürütebilir. Bu çalışan iş parçacıkları iş parçacığı havuzu tarafından yönetilir. Bu nedenle, iş parçacığında TerminateThread çağırarak veya bir geri çağırma işlevinden exitThreadçağırarak iş parçacığı havuzundan iş parçacığını sonlandırmayın.
G/Ç isteği, iş parçacığı havuzundaki herhangi bir iş parçacığında çalıştırılabilir. bir iş parçacığı havuzu iş parçacığında G/Ç'nin iptali eşitleme gerektirir çünkü cancel işlevi G/Ç isteğini işleyenden farklı bir iş parçacığında çalıştırılabilir ve bu da bilinmeyen bir işlemin iptali ile sonuçlanabilir. Bunu önlemek için, zaman uyumsuz G/Ç için CancelIoEx çağrılırken G/Ç isteğinin başlatıldığı ÖRTÜŞEN yapısını sağlayın veya CancelSynchronousIo veya CancelIoEx işlevini çağırmadan önce hedef iş parçacığında başka hiçbir G/Ç başlatılanamadan emin olmak için kendi eşitlemenizi kullanın.
İşlevden dönmeden önce geri çağırma işlevinde oluşturulan tüm kaynakları temizleyin. Bunlar TLS, güvenlik bağlamları, iş parçacığı önceliği ve COM kaydıdır. Geri çağırma işlevleri de döndürmeden önce iş parçacığı durumunu geri yüklemelidir.
İş parçacığı havuzu tanıtıcıyla tamamlandığını belirtene kadar bekleme tutamaçlarını ve ilişkili nesnelerini canlı tutun.
İş parçacığı havuzunun bunu beklemek yerine yeni iş parçacıkları ayırabilmesi için uzun işlemler (G/Ç temizleme işlemleri veya kaynak temizleme gibi) bekleyen tüm iş parçacıklarını işaretleyin.
İş parçacığı havuzunu kullanan bir DLL'yi kaldırmadan önce tüm iş öğelerini, G/Ç'yi, bekleme işlemlerini ve zamanlayıcıları iptal edin ve geri çağırmaların yürütülmesini bekleyin.
Bir geri çağırmanın tamamlanmasını beklemediğinden emin olarak ve iş parçacığı önceliğini koruyarak iş öğeleri arasındaki ve geri çağırmalar arasındaki bağımlılıkları ortadan kaldırarak kilitlenmelerden kaçının.
Varsayılan iş parçacığı havuzunu kullanan diğer bileşenlerle bir işlemde çok fazla öğeyi çok hızlı kuyruğa alma. İşlem başına Svchost.exede dahil olmak üzere bir varsayılan iş parçacığı havuzu vardır. Varsayılan olarak, her iş parçacığı havuzu en fazla 500 çalışan iş parçacığına sahiptir. hazır/çalışıyor durumundaki çalışan iş parçacığı sayısının işlemci sayısından az olması gerektiğinde iş parçacığı havuzu daha fazla çalışan iş parçacığı oluşturmaya çalışır.
İş parçacığı havuzuyla uyumsuz olduğundan COM tek iş parçacıklı daire modelinden kaçının. STA, iş parçacığının sonraki iş öğesini etkileyebilecek iş parçacığı durumu oluşturur. STA genellikle uzun ömürlüdür ve iş parçacığı havuzunun tersi olan iş parçacığı benzitesine sahiptir.
İş parçacığı önceliğini ve yalıtımını denetlemek, özel özellikler oluşturmak ve yanıt hızını artırmak için yeni bir iş parçacığı havuzu oluşturun. Ancak, ek iş parçacığı havuzları daha fazla sistem kaynağı (iş parçacıkları, çekirdek belleği) gerektirir. Çok fazla havuz cpu çekişmesi olasılığını artırır.
Mümkünse, iş parçacığı havuzu iş parçacığına sinyal vermek için APC tabanlı mekanizma yerine beklenebilir bir nesne kullanın. Sistem iş parçacığı havuzu iş parçacıklarının ömrünü denetlediğinden, APC'ler diğer sinyal mekanizmaları gibi iş parçacığı havuzu iş parçacıklarıyla da çalışmaz, bu nedenle bildirim teslim edilmeden önce bir iş parçacığının sonlandırılması mümkündür.
!tp iş parçacığı havuzu hata ayıklayıcısı uzantısını kullanın. Bu komut aşağıdaki kullanıma sahiptir:
- havuz adresibayrakları
- obj adresbayrakları
- tqueue adresibayrakları
- garson adresi
- çalışan adresi
Havuz, garson ve çalışan için adres sıfırsa, komut tüm nesneleri döküm eder. Garson ve çalışan için adresin atlanması geçerli iş parçacığının dökümünü alır. Aşağıdaki bayraklar tanımlanır: 0x1 (tek satırlı çıkış), 0x2 (döküm üyeleri) ve 0x4 (döküm havuzu iş kuyruğu).
İlgili konular