Kişi tek bir iş parçacığı ve durum makinesi kullanarak, Java gibi üst düzey bir dilde çoklu iş parçacığı işlevselliğini nasıl elde eder? Örneğin, gerçekleştirilecek 2 etkinlik varsa (hesaplamalar yapıyor ve G / Ç yapıyorsa) ve bir etkinlik engelleyebiliyorsa ne olur?
Anlattığınız şeye , işlemlerin CPU'ya verildiği ve belirli bir zaman veya faaliyet miktarından sonra gönüllü olarak bırakması beklenen kooperatif çoklu görev adı verilir. İşlemciyi kullanmaya devam ederek ya da tüm işleri engelleyerek ve bir donanım izleme zamanlayıcısına sahip olmaktan kaçınan, işbirliği yapmayan bir görev, görevleri denetleyen kodun yapabileceği hiçbir şey yoktur.
Modern sistemlerde gördüğünüze, preemptive multitasking adı verilir ; bu, görevlerin CPU'dan vazgeçmek zorunda kalmayacağı, çünkü süpervizör, donanım tarafından üretilen bir kesinti geldiğinde onlar için yapar. Süpervizördeki kesme servis rutini, CPU'nun durumunu kurtarır ve bir sonraki dilimin görevi bir zaman dilimini hakettiği kabul edildiğinde geri yükler, ardından bir sonraki çalıştırılacak olan şeyden durumu geri yükler ve hiçbir şey olmamış gibi tekrar atlar. . Bu eyleme bağlam anahtarı denir ve pahalı olabilir.
"Sadece devlet makinesi" yönteminin kullanılması, yüksek seviyeli dillerde çoklu iş parçacılığına alternatif bir yöntem midir?
Mantıklı mı? Emin. Aklı başında? Ara sıra. İş parçacığı kullanmanız veya bir tür ev yapımı kooperatif çoklu görev (örn. Devlet makineleri) kullanmanız, yapmak istediğiniz travmalara bağlıdır.
Konular, her birini veri alanını başkalarıyla paylaşan kendi programları olarak değerlendirebileceğiniz noktaya göre görev tasarımını basitleştirir. Bu, eldeki işe odaklanma özgürlüğünü verir ve her seferinde bir yineleme çalışması için gereken tüm yönetim ve temizlik işlerini yapmaz. Ancak hiçbir iyilik cezasız kalmayacağından, bağlam anahtarlarında tüm bu kolaylıkları ödersiniz. Minimal iş yaptıktan sonra (gönüllü olarak veya G / Ç gibi engelleyebilecek bir şey yaparak) CPU'yu veren birçok iş parçacığı olması bağlam geçişi yaparken çok fazla işlemci zamanı tüketebilir. Bu, özellikle eğer blokaj işlemleriniz çok nadiren bloke olursa geçerlidir.
İşbirliği rotasının daha anlamlı olduğu bazı durumlar vardır. Bir keresinde, yoklama gerektiren bellek eşlemeli bir arabirim aracılığıyla birçok veri kanalını aktaran bir donanım için bazı kullanıcı yazılımları yazmak zorunda kaldım. Her kanal, iş parçacığı olarak çalışmasına izin verebilecek veya tek bir yoklama döngüsünü art arda yürütebilecek şekilde inşa edilmiş bir nesneydi.
Çok okuyuculu sürümün performansı, tam olarak yukarıda ana hatlarıyla açıkladığım sebepten dolayı hiç de iyi değildi: her iş parçacığı minimum iş yapıyordu ve sonra CPU'yu diğer kanalların biraz zaman alabilmesi için bağlamsal anahtarlara dönüştürüyordu. Önceden işlenene kadar iş parçacıklarının serbest çalışmasına izin vermek, ancak donanıma bir arabellek taşması yaşanmadan önce bazı kanallara servis yapılmamasına neden oldu, çünkü bunlar yakında bir zaman dilimi alamadılar.
Her kanalın yinelemesini bile yapan tek dişli versiyon, haşlanmış bir maymun gibi koştu ve sistem üzerindeki yük bir kaya gibi düştü. Ek performans için ödediğim ceza, görevleri kendim yapmak zorunda kalmaktı. Bu durumda, yapılacak kod, geliştirme ve sürdürme maliyetinin performans iyileştirmeye değeceği kadar basitti. Sanırım bu gerçekten çok önemli. Konularım bazı sistem çağrısının geri dönmesini beklerken oturanlar olsaydı, alıştırma muhtemelen buna değmezdi.
Bu beni Cox'un yorumuna götürür: iplikler sadece devlet makineleri yazamayan insanlar için değildir . Bazı insanlar bunu yapabilme yeteneğine sahiptir ancak işin daha erken veya daha az karmaşık bir şekilde yapılması için bir konserve durum makinesi (örneğin bir iplik) kullanmayı tercih ederler.