Aracılığıyla paylaş


G/Ç Tamamlama Bağlantı Noktaları

G/Ç tamamlama bağlantı noktaları, çok işlemcili bir sistemde birden çok zaman uyumsuz G/Ç isteğini işlemek için verimli bir iş parçacığı modeli sağlar. Bir işlem G/Ç tamamlama bağlantı noktası oluşturduğunda, sistem tek amacı bu isteklere hizmet vermek olan iş parçacıkları için ilişkili bir kuyruk nesnesi oluşturur. Birçok eşzamanlı zaman uyumsuz G/Ç isteğini işleyen işlemler, G/Ç tamamlama bağlantı noktalarını önceden ayrılmış bir iş parçacığı havuzuyla birlikte kullanarak, G/Ç isteği aldıklarında iş parçacıkları oluşturmaktan daha hızlı ve verimli bir şekilde bunu yapabilir.

G/Ç Tamamlama Bağlantı Noktaları Nasıl Çalışır?

CreateIoCompletionPort işlevi bir G/Ç tamamlama bağlantı noktası oluşturur ve bir veya daha fazla dosya tutamacını bu bağlantı noktasıyla ilişkilendirir. Bu dosya tanıtıcılarından birinde zaman uyumsuz G/Ç işlemi tamamlandığında, bir G/Ç tamamlama paketi, ilişkili G/Ç tamamlama bağlantı noktasına ilk önce giden (FIFO) sırada kuyruğa alınır. Bu mekanizmanın güçlü kullanımlarından biri, birden çok dosya tutamacı için eşitleme noktasını tek bir nesnede birleştirmektir, ancak başka yararlı uygulamalar da vardır. Paketler FIFO sırasında kuyruğa alınırken farklı bir sırada sıralanabilir.

Not

Burada kullanılan dosya tanıtıcısı terimi, yalnızca disk üzerindeki bir dosyayı değil çakışan G/Ç uç noktasını temsil eden bir sistem soyutlaması anlamına gelir. Örneğin, bir ağ uç noktası, TCP yuvası, adlandırılmış kanal veya posta yuvası olabilir. Çakışan G/Ç'leri destekleyen tüm sistem nesneleri kullanılabilir. İlgili G/Ç işlevlerinin listesi için bu konunun sonuna bakın.

 

Dosya tanıtıcısı bir tamamlama bağlantı noktasıyla ilişkilendirildiğinde, paket tamamlanma bağlantı noktasından kaldırılana kadar geçirilen durum bloğu güncelleştirilmez. Tek özel durum, özgün işlemin zaman uyumlu olarak bir hatayla döndürülüyor olmasıdır. bir iş parçacığı (ana iş parçacığı veya ana iş parçacığı tarafından oluşturulan) GetQueuedCompletionStatus işlevini kullanarak doğrudan zaman uyumsuz G/Ç'nin tamamlanmasını beklemek yerine bir tamamlama paketinin G/Ç tamamlama bağlantı noktasına kuyruğa alınmasını bekler. G/Ç tamamlama bağlantı noktası üzerinde yürütmelerini engelleyen iş parçacıkları, ilk giren son çıkış (LIFO) sırasında serbest bırakılır ve sonraki tamamlama paketi bu iş parçacığı için G/Ç tamamlama bağlantı noktasının FIFO kuyruğundan alınır. Başka bir deyişle, bir iş parçacığına bir tamamlama paketi yayımlandığında, sistem bu bağlantı noktasıyla ilişkili son (en son) iş parçacığını serbest bırakır ve en eski G/Ç tamamlaması için tamamlama bilgilerini geçirir.

Belirtilen G/Ç tamamlama bağlantı noktası için herhangi bir sayıda iş parçacığı GetQueuedCompletionStatusçağırabilse de, belirtilen bir iş parçacığı GetQueuedCompletionStatus ilk kez çağırdığında, üç şeyden biri gerçekleşene kadar belirtilen G/Ç tamamlama bağlantı noktasıyla ilişkilendirilir: İş parçacığından çıkılır, farklı bir G/Ç tamamlama bağlantı noktası belirtir, veya G/Ç tamamlama bağlantı noktasını kapatır. Başka bir deyişle, tek bir iş parçacığı en fazla bir G/Ç tamamlama bağlantı noktasıyla ilişkilendirilebilir.

Bir tamamlama paketi G/Ç tamamlama bağlantı noktasına kuyruğa alındığında, sistem önce bu bağlantı noktasıyla ilişkili kaç iş parçacığının çalıştığını denetler. Çalışan iş parçacığı sayısı eşzamanlılık değerinden küçükse (sonraki bölümde anlatılacaktır), bekleyen iş parçacıklarından birinin (en son) tamamlama paketini işlemesine izin verilir. Çalışan bir iş parçacığı işlemeyi tamamladığında, genellikle GetQueuedCompletionStatus yeniden çağırır; bu noktada bir sonraki tamamlama paketiyle birlikte döner veya kuyruk boşsa bekler.

İş parçacıkları PostQueuedCompletionStatus işlevini kullanarak tamamlama paketlerini G/Ç tamamlama bağlantı noktasının kuyruğuna yerleştirebilir. Bunu yaptığınızda, tamamlama bağlantı noktası G/Ç sisteminden G/Ç tamamlama paketlerini almaya ek olarak işlemin diğer iş parçacıklarından iletişim almak için kullanılabilir. PostQueuedCompletionStatus işlevi, bir uygulamanın zaman uyumsuz G/Ç işlemi başlatmadan kendi özel amaçlı tamamlama paketlerini G/Ç tamamlama bağlantı noktasına kuyruğa almalarını sağlar. Bu, örneğin dış olayları çalışan iş parçacıklarına bildirmek için yararlıdır.

G/Ç tamamlama bağlantı noktası tanıtıcısı ve söz konusu G/Ç tamamlama bağlantı noktasıyla ilişkilendirilmiş her dosya tanıtıcısı, G/Ç tamamlama bağlantı noktasınabaşvuruları olarak bilinir. G/Ç tamamlama bağlantı noktası, daha fazla başvuru olmadığında serbest bırakılır. Bu nedenle, G/Ç tamamlama bağlantı noktasını ve ilişkili sistem kaynaklarını serbest bırakmak için bu tanıtıcıların tümü düzgün bir şekilde kapatılmalıdır. Bu koşullar karşılandıktan sonra, bir uygulamanın CloseHandle işlevini çağırarak G/Ç tamamlama bağlantı noktası tanıtıcısını kapatması gerekir.

Not

G/Ç tamamlama bağlantı noktası, onu oluşturan işlemle ilişkilendirilir ve işlemler arasında paylaşılabilir değildir. Ancak, aynı işlemdeki iş parçacıkları arasında tek bir tanıtıcı paylaşılabilir.

 

İş Parçacıkları ve Eşzamanlılık

Bir G/Ç tamamlama bağlantı noktasının dikkatle dikkate alınması gereken en önemli özelliği eşzamanlılık değeridir. Tamamlanma bağlantı noktasının eşzamanlılık değeri, NumberOfConcurrentThreads parametresi aracılığıyla CreateIoCompletionPort ile oluşturulduğunda belirtilir. Bu değer, tamamlanma bağlantı noktasıyla ilişkili çalıştırılabilir iş parçacığı sayısını sınırlar. Tamamlanma bağlantı noktasıyla ilişkili çalıştırılabilir iş parçacıklarının toplam sayısı eşzamanlılık değerine ulaştığında, çalıştırılabilir iş parçacıklarının sayısı eşzamanlılık değerinin altına düşene kadar sistem bu tamamlama bağlantı noktasıyla ilişkili sonraki iş parçacıklarının yürütülmesini engeller.

En verimli senaryo, kuyrukta bekleyen tamamlama paketleri olduğunda gerçekleşir, ancak bağlantı noktası eşzamanlılık sınırına ulaştığından hiçbir bekleme gerçekleşemez. GetQueuedCompletionStatus işlev çağrısında bekleyen bir ve birden çok iş parçacığının eşzamanlılık değeriyle neler olduğunu düşünün. Bu durumda, kuyrukta her zaman bekleyen tamamlama paketleri varsa, çalışan iş parçacığı GetQueuedCompletionStatus çağırdığında, daha önce belirtildiği gibi iş parçacığı kuyruğu LIFO olduğundan yürütmeyi engellemez. Bunun yerine, bu iş parçacığı bir sonraki kuyruğa alınan tamamlama paketini hemen alır. Çalışan iş parçacığı sürekli tamamlama paketlerini topladığı ve diğer iş parçacıklarının çalıştırılamadığından, iş parçacığı bağlam anahtarları gerçekleşmez.

Not

Önceki örnekte, ek iş parçacıkları işe yaramaz ve hiçbir zaman çalıştırılmamaktadır, ancak çalışan iş parçacığının hiçbir zaman başka bir mekanizma tarafından bekleme durumuna alınmadığını, ilişkili G/Ç tamamlama bağlantı noktasını sonlandırdığını veya başka bir şekilde kapattığını varsayar. Uygulamayı tasarlarken bu tür iş parçacığı yürütmenin tüm sonuçlarına dikkat edin.

 

Eşzamanlılık değeri için seçecek en iyi genel maksimum değer, bilgisayardaki CPU sayısıdır. İşleminiz uzun bir hesaplama gerektiriyorsa, daha büyük bir eşzamanlılık değeri daha fazla iş parçacığının çalışmasına izin verir. Her tamamlama paketinin tamamlanması daha uzun sürebilir, ancak aynı anda daha fazla tamamlama paketi işlenir. Uygulamanız için en iyi etkiyi elde etmek için profil oluşturma araçlarıyla birlikte eşzamanlılık değeriyle denemeler yapabilirsiniz.

Sistem ayrıca getQueuedCompletionStatusbekleyen bir iş parçacığının, aynı G/Ç tamamlama bağlantı noktasıyla ilişkilendirilmiş başka bir çalışan iş parçacığının başka nedenlerle bekleme durumuna girmesi durumunda (örneğin SuspendThread işlevi) tamamlama paketini işlemesine olanak tanır. Bekleme durumundaki iş parçacığı yeniden çalışmaya başladığında, etkin iş parçacığı sayısının eşzamanlılık değerini aştığı kısa bir süre olabilir. Ancak sistem, etkin iş parçacıklarının sayısı eşzamanlılık değerinin altına düşene kadar yeni etkin iş parçacıklarına izin vermeyerek bu sayıyı hızla azaltır. Bu, uygulamanızın iş parçacığı havuzunda eşzamanlılık değerinden daha fazla iş parçacığı oluşturmasını sağlamak için bir nedendir. İş parçacığı havuzu yönetimi bu konunun kapsamı dışındadır, ancak iş parçacığı havuzunda sistemdeki işlemcilerin en az iki katı iş parçacığı olması iyi bir kuraldır. İş parçacığı havuzu hakkında ek bilgi için bkz. İş Parçacığı Havuzları.

Desteklenen G/Ç İşlevleri

G/Ç tamamlama bağlantı noktaları kullanılarak tamamlanan G/Ç işlemlerini başlatmak için aşağıdaki işlevler kullanılabilir. G/Ç tamamlama bağlantı noktası mekanizmasını etkinleştirmek için işlevine ÖRTÜŞEN yapısının bir örneğini ve daha önce G/Ç tamamlama bağlantı noktasıyla ilişkilendirilmiş bir dosya tanıtıcısını (CreateIoCompletionPortçağrısıyla) geçirmeniz gerekir:

İşlemler ve İş Parçacıkları hakkında

BindIoCompletionCallback

CreateIoCompletionPort

GetQueuedCompletionStatus

GetQueuedCompletionStatusEx

PostQueuedCompletionStatus