Eşzamansız ve Çoklu Okuma - Bir fark var mı?


133

Eşzamansız bir çağrı her zaman yeni bir iş parçacığı oluşturur mu? İkisi arasındaki fark nedir?

Eşzamansız bir çağrı her zaman yeni bir iş parçacığı oluşturur veya kullanır mı?

Wikipedia diyor ki :

Bilgisayar programlamasında, asenkron olaylar, ana program akışından bağımsız olarak gerçekleşen olaylardır. Eşzamansız eylemler, engellemeyen bir düzende yürütülen ve ana program akışının işlemeye devam etmesini sağlayan eylemlerdir.

Zaman uyumsuz aramaların tek iş parçacıkları üzerinde yapılabileceğini biliyorum. Bu nasıl mümkün olabilir?



1
JavaScript'in iş parçacığı yoktur, ancak eşzamansız yöntem çağrıları vardır.
Ajedi32

1
Bir sürecin birden çok alt süreci yönettiği herhangi bir sistem, kontrol süreci alt süreçlerin eşzamansız çalışmasını sağlayabilir. JavaScript söz konusu olduğunda, tarayıcı hesaplama akışını sağlar. Bazı işlevler eşzamansız bir çağrı yaptığında, tarayıcı bu işlevin içeriğini saklayabilir. Artık aynı tek tarayıcı iş parçacığı, başka bir işlevin yürütülmesine devam etmek için bağlamı değiştirebilir. Geleneksel çok evreli programlarda ise, bir iş parçacığı başka bir iş parçacığının farklı bir işlevi çalıştırmasına izin vermek için bir işlev bloğu gerçekleştirir. Her iş parçacığı kendi işlevini eşzamanlı olarak gerçekleştirir.
Mike

Yanıtlar:


82

Bu soru cevaplanamayacak kadar genel.

Genel durumda, zaman uyumsuz bir çağrı mutlaka yeni bir iş parçacığı oluşturmaz. Önceden var olan bir iş parçacığı havuzu veya harici süreç başka yollarla bunu uygulamanın bir yolu budur. Büyük ölçüde dile, nesne modeline (varsa) ve çalışma süresi ortamına bağlıdır.

Eşzamansız, yalnızca çağıran iş parçacığının oturup yanıtı beklemediği veya çağn dizisinde zaman uyumsuz etkinlik gerçekleşmediği anlamına gelir.

Bunun ötesinde, daha spesifik olmanız gerekecek.


7
Yani temelde şunu söylemekte haklıyım: Çoklu iş parçacığı == Çok işlemciden [ideal olarak] yararlanabilen işlemci yoğun görevlerde işlem faydaları sağlamak için birden çok iş parçacığı kullanmak ve eşzamansız durumlarda avantajlar. Asynchrony == bir şeyi yapan bir süreçtir, süreci çağıran durumun tamamlanmasını beklemek zorunda değildir. (Bunu yapmak için birden çok iş parçacığı kullanmayabilir, yani diğer donanım bileşenleri sorumluluk alabilir).
Evan Sevy

6
@Michael - Eşzamansız programlamanın tek bir iş parçacığında nasıl olabileceğini bir örnekle açıklar mısınız?
Kumar Vaibhav

7
@KumarVaibhav - en yaygın örnek, tek bir iş parçacığının bir kuyruktaki öğeler üzerinde çalışmasıdır (örneğin, Windows ileti kuyruğu). Program, öğeleri kendi kuyruğuna gönderme alışkanlığındaysa (ortak bir model), öğeyi gönderen kod biti işlemin bitmesini beklemek yerine yalnızca geri döner. Operasyon zamanı geldiğinde ana döngü tarafından halledilecektir.
Michael Kohne

3
Kodun nasıl yazıldığı ve nasıl yürütüldüğü arasında bir fark olabilir. Örneğin, C # 'da zaman uyumsuz bir görevi başlatan bir yönteme sahip olabilirim, yöntemim tamamen zaman uyumsuzdur ve görevin tamamlanmasını beklemeden başka şeyler yapabilir. Bununla birlikte, CLR ayrıca görevimi satır içi yapmaya ve eşzamanlı olarak yürütmeye karar verebilir.
Mike

hangi iş parçacığı beklenen görevi yürütür? a-sync ile işaretlenen yöntem await anahtar sözcüğüne ulaşana kadar eşzamanlı olarak yürütülür, bu noktada hangi evre bu beklenebilir görevi yürütür?

102

Zaman uyumsuz olarak gerçekleşmesi gereken işlem CPU'nun çalışmasını gerektirmediğinde, bu işlem başka bir iş parçacığı oluşturmadan yapılabilir. Örneğin, eşzamansız işlem G / Ç ise, CPU'nun G / Ç'nin tamamlanmasını beklemesi gerekmez. Sadece işlemi başlatması gerekir ve daha sonra G / Ç donanımı (disk denetleyicisi, ağ arabirimi vb.) G / Ç çalışırken diğer işlere geçebilir. Donanım, CPU'yu kesintiye uğratarak CPU'nun bittiğini bilmesini sağlar ve ardından işletim sistemi olayı uygulamanıza iletir.

Genellikle daha yüksek seviyeli soyutlamalar ve API'ler, işletim sisteminden ve temel donanımdan temin edilebilen temel eşzamansız API'leri ortaya çıkarmaz. Bu durumlarda, ortaya çıkan iş parçacığı yalnızca bir G / Ç işlemini bekliyor olsa bile eşzamansız işlemler yapmak için evreler oluşturmak genellikle daha kolaydır.

Eşzamansız işlem CPU'nun çalışmasını gerektiriyorsa, bu işlemin gerçekten eşzamansız olması için genellikle başka bir iş parçacığında gerçekleşmesi gerekir. O zaman bile, birden fazla yürütme birimi varsa, gerçekten yalnızca eşzamansız olacaktır.


1
İyi açıkladı, teşekkür ederim; ama burada bir sorum var. Örneğin, eşzamansız işlem G / Ç ise, CPU G / Ç'nin tamamlanmasını beklemek zorunda değildir. Sadece işlemi başlatması gerekir "demiştiniz. Sorum şu ki, program tek iş parçacıklı olduğunda ve kod satırı 3'te bir G / Ç işlemi çağırdığınızı söylüyorsunuz, sonra 3. satırdaki işlemi başlatıp 4. satırı G / Ç işleminin tamamlanmasını beklemeden nasıl yürütebilirsiniz. ? Benim için, G / Ç işleminin tamamlanmasını beklemeden çalıştırılacak 4. satıra ulaşmak için kodu 3. satıra yeni bir iş parçacığına yerleştirmem gerekiyor. [Java pgm perspektifi]
örümcek adam

1
Bunun nedeni, CPU'nun beklemesi gerekmese de, CPU I / O işleminin tamamlanmasını bekleyecektir ... Sanırım ikinci paragrafınız sorgumun cevabıdır. Böyle bir durumda, Java'da, asenkron çağrıların farklı bir iş parçacığında yürütülmesi gerektiği sonucuna varmam gerekiyor. Yanılıyor muyum yoksa ben yeni SO qn göndermek için varsa bana bildirin Lütfen bana doğru
örümcek adam

@spiderman Node.js gibi bazı dillerin eşzamansız bir programlama modeli vardır. Dil ve çalışma zamanı, GÇ işlemi tamamlanmadan önce bile 4. satırın aynı iş parçacığında yürütülmesine izin veren yerleşik öğeler sağlar. Bu, 3. satırın GÇ bittiğinde çalışma zamanının başlatacağı bir geri arama sağlayarak elde edilir.
jrahhali

@spiderman belki ... işletim sisteminin Async işlevi sadece yanlış veya doğrudan bir şey döndürür.
Byeongin Yoon

18

Hayır, eşzamansız çağrılar her zaman iş parçacıklarını içermez.

Genellikle, arayanla paralel olarak devam eden bir tür işlem başlatırlar. Ancak bu işlem başka bir işlem tarafından, işletim sistemi tarafından, diğer donanımlar (bir disk denetleyicisi gibi), ağdaki başka bir bilgisayar veya bir insan tarafından gerçekleştirilebilir. İşleri paralel olarak halletmenin tek yolu ipler değildir.



12

Çoklu iş parçacığı, aynı süreçte birden fazla işlemin gerçekleşmesini ifade eder. Zaman uyumsuz programlama süreçler arasında yayılırken. Örneğin, işlemlerim bir web hizmetini çağırırsa, iş parçacığının web hizmeti dönene kadar beklemesi gerekmez. Burada, iş parçacığının başka bir makinedeki bir işlemin tamamlanmasını beklememesini sağlayan zaman uyumsuz programlama kullanıyoruz. Ve web servisinden yanıt almaya başladığında, web servisinin isteği işlemeyi tamamladığını söylemek için ana iş parçacığını kesebilir. Artık ana iş parçacığı sonucu işleyebilir.


Biraz katılmıyorum. Eşzamansız GÇ tamamlamayı kullanarak aynı anda birden çok isteği işleyen tek bir iş parçacıklı HTTP sunucusu yazdım. Zaman uyumsuz bir şeyin birden çok yürütme yolunda olmasını gerektirmez, yalnızca birden çok işlem akışının çakışabileceği anlamına gelir. Buna bakmanın bir başka yolu da, tek iş parçacıklı bir işletim sisteminde "eşzamanlı" çalışan 2 işlemim olabilir. Her sürecin bakış açısından, eşzamanlı olarak çalışıyorlar. Ancak, işletim sistemi açısından, asenkron çalışıyor.
Mike

11

İleti döngüsünü kullanan önleyici olmayan zamanlardan (sürüm 2.13, 3.0, 3.1, vb.) Bu yana, gerçek iş parçacıkları desteklemeden çok önce, Windows her zaman zaman uyumsuz işleme sahipti. Yani sorunuzu cevaplamak için, hayır, eşzamansız işlem yapmak için bir iş parçacığı oluşturmak gerekli değildir.


@dmckee - Farklı sistemlerin benzer şekillerde nasıl geliştiği ilginç.
Otávio Décio

8

Eşzamansız aramaların, aramayı başlatanla aynı sistem / cihazda gerçekleşmesine bile gerek yoktur. Yani soru şu ise, eşzamansız bir çağrı mevcut süreçte bir iş parçacığı gerektiriyor mu, cevap hayır. Ancak, eşzamansız talebi işleyen bir yerde bir yürütme dizisi olmalıdır.

Yürütme dizisi belirsiz bir terimdir. İlk Macintosh ve Windows işletim sistemleri gibi işbirliğine dayalı görev sistemlerinde, yürütme iş parçacığı, isteği başka bir yığın, komut işaretçisi vb. Çalıştıran süreçle aynı olabilir. , tipik olarak süreç içi ise (yani aynı süreç içinde) başka bir iş parçacığı tarafından veya süreçler arası ise başka bir süreç tarafından işlenen çağrıları ifade eder.

Süreçler arası (veya süreçler arası) iletişimin (IPC) genellikle süreç içi iletişimi içerecek şekilde genelleştirildiğini unutmayın, çünkü verileri kilitleme ve senkronize etme teknikleri, ayrı yürütme iş parçacıkları hangi işlemde çalıştığına bakılmaksızın genellikle aynıdır.


7

Bazı sistemler, geri aramaları kullanan bazı tesisler için çekirdekteki eşzamanlılıktan yararlanmanıza izin verir. Oldukça belirsiz bir örnek için, eşzamansız GÇ geri aramaları, engellemesiz internet ayırıcılarını Mac Sistem 6-8'in önleme içermeyen çoklu görev günlerinde geri uygulamak için kullanıldı.

Eğer dişler olmadan programlamak "in" Eğer eş zamanlı yürütülmesine var Bu şekilde akışları gibi .


5

Eşzamansız sadece, programınızın bir şeyin (işlev çağrısı, aygıt vb.) Bitmesini beklemesini engellemediğiniz anlamına gelir. Ayrı bir iş parçacığında uygulanabilir, ancak eşzamanlı görevler için özel bir iş parçacığı kullanmak ve bir tür olay sistemi aracılığıyla iletişim kurmak ve böylece eşzamansız benzeri davranış elde etmek de yaygındır.

Tek iş parçacıklı eşzamansız program örnekleri vardır. Gibi bir şey:

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results

2

Eşzamansız aramaların doğası, uygulamanın arama devam ederken çalışmaya devam etmesini istiyorsanız, ya yeni bir iş parçacığı yaratmanız ya da en azından yalnızca kendi amaçları için oluşturduğunuz başka bir iş parçacığını kullanmanız gerekecek şekildedir. zaman uyumsuz geri aramaların işlenmesi.

Bazen duruma bağlı olarak, bir eşzamansız yöntemi çağırmak, ancak kullanıcıya eşzamanlı görünmesini sağlamak isteyebilirsiniz (yani, eşzamansız yöntem tamamlandığına dair sinyal verene kadar engelleyin). Bu, WaitForSingleObject gibi Win32 API'leri aracılığıyla gerçekleştirilebilir .


Bu bazı sistemlerde geçerlidir, ancak hepsi için geçerli değildir. Unix, çekirdeğe başka bir iş parçacığı demediğiniz sürece, başka bir iş parçacığı oluşturmanızı veya kullanmanızı gerektirmez, ki sanırım ona bakmanın bir yolu budur.
Craig S

Bu, Windows için de geçerli değil. Örneğin, örtüşen G / Ç eşzamansızdır.
Jason Orendorff
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.