2016-08-20 16 views
8

Bir async çağrısının sonucunu işlemek için IO iş parçacığı olmadığında ne olacağını merak ediyorum.Eşzamansız sonucu işlemek için IO iş parçacığı yoksa ne olur?

Eşzamansız bir web isteği hazırladığınızı varsayalım (bir sunucu uygulamasında tüm async kodları iş parçacığı havuzu tarafından el ile işlenir). İşletim sistemi, sizin için bir sonuç olduğunda sinyal verecektir ve ne zaman olduğunda, soketten gelen baytları okumak için bir IO iş parçacığına ihtiyacınız olacaktır. IO iş parçacığı yoksa, hepsi kullanımda olduğundan (iş parçacığı havuzu tarafından ayarlanan maks. Değere kadar) ne olur? Bir iplik mevcut olana kadar sinyalin bekleyebileceği bir kuyruk var mı? Yoksa sinyal duyulmuyor mu? İkincisi olursa, beklemede bekleyen kod ne olur?

+0

Bir bilgisayardan çok fazla şey yapmasını istediğinizde gerçekleşen olağan şey: sadece yavaşlar. Bu çok derinden gömülü ve aslında CLR'nin bir parçası değil, [IHostIOCompletionManager arayüzü] (https://msdn.microsoft.com/en-us/library/ms164490 (v = vs.110) .aspx) işi bitirir . Hangi ana bilgisayarı kullandığınıza bağlı. Pratikte, SetMaxThreads() 'ın * completionPortThreads * argümanının tamamen yok sayıldığını ve eşzamanlı * yürütme * (beklemede değil) io tamamlamalarının işlemci sayısı sayısına eşit olduğunu varsaymak genellikle güvenlidir. –

cevap

5

İplik havuzunu kısıtlamadıkça, gerektiğinde yeni I/O iş parçacıkları oluşturacaktır. Sinyal, alınana kadar I/O Completion Port (IOCP) olarak adlandırılan kuyruk benzeri bir yapıda bekler; sinyaller kaybolmaz.

+0

İş parçacığı havuzu, IO (ve çalışan) iş parçacığı sayısı için bir maksimum değere sahiptir. Bu sinyalleri işlemek için o değerin üzerine çıkacağını mı söylüyorsun? Ya da, eğer biz en az değilsek, yeni bir konu yaratılacaksa, aksi takdirde IOCP sırasına mı oturur? – shortspider

+1

Hayır, gitmeyecek, sınırı aşmayacak, ancak önerildiği gibi, sırasını beklemek için sıraya girecek ve IO iş parçacığı sayısında kısıtlama varsa, bekleme süresi uzayacaktır. –

2

OS ön için kullanılması ve IOExcel, Word, Pdf, Ppt gibi ihtiyacı olan birden fazla uygulama açmak sonra eğer concurrency çok kapsamını yoktu zaman en, eskilere dönelim, sistem buna beri ve asılmıştı tepkisiz görünür hepsini bir arada ele alamazsınız, ancak daha fazla istek beklemeye son verdiğinizde ve sistem çökmezse, hepsinin şanslarını yakalayıp tekrar etkinleştiğini göreceksiniz.

Bu, tipik bir kullanım durumu olan IO requests işlenmeyi bekleyen sıraya alındı, bunların hiçbiri sistem çökmesine kadar ve hiçbiri gerçekleşmediği sürece, bu genellikle şu an uygulanamayacak kadar sağlam değil, Mavi'yi hatırla ölüm ekranı, hala olabilir ve IO istekleri kaybolacak tek nokta budur.

Aslında Windows'daki Threading'in özü, eşzamanlılıktan önce bile sağlamlığı tanıtmaktır, böylece işlem için sıraya alınmış hiçbir şey kaybolmaz. Zamanın hiçbir noktasında, gereken sayıda iş parçacığı oluşturmak için sınırını aşacaktır.

İlgili konular