Asenkron vs senkronize anlamı [kapalı]


46

Bilgisayar biliminde asenkron ve senkron kelimelerin anlamı nedir ?

Kelimelerin anlamlarını google’a çevirirseniz aşağıdakileri alırsınız:

Fakat programlama veya bilgisayar bilimlerindeki zıt anlamları iletmek için kullanılmış gibi görünüyorlar:

HTML async niteliği , HTML'nin hala ayrıştırılması veya indirilmesi durumunda bile betiğin indirildiği anda yürütüleceği anlamına gelir; bu, hem süreçler hem de betiğin hem de HTML'nin var olduğu ve aynı anda meydana geldiği anlamına gelir.

Bu terimler bilgisayar bilimlerinde zıt anlamı ifade etmek için mi kullanılıyor, yoksa ben noktayı mı eksik hissediyorum?


47
Söylemesi kolay buluyorum: Kodun nasıl çalıştığını anlamadığım takdirde ve onları ararken aniden ortadan kaybolması durumunda, kod muhtemelen eşzamansızdır. :)
Eric Duminil

4
Üzücü gerçek, programlama alanında, zamanla bu kelimelerin, aksi takdirde ne anlama geldiklerini tam tersi anlamına geldiğidir. Şimdiki anlamlarının tarihsel nedenleri olabilir, ancak iyi bir gerekçe yoktur.
Solomonoff'un Sırrı

3
Aynı şekilde zamanda neyi , anahtar :) olduğunu
Monica ile Hafiflik Yarışları

5
Gerçek operasyon değil işlevi operasyonu vs çağrılır olarak (zorunlu) aynı anda meydana gelmez işlevi çağrıldığında aynı anda meydana bana geriye görünmüyor ...? Bir fonksiyonu asenkron olarak tanımlarsam, ne yaparsanız yapın, onu çağırırken aynı anda gerçekleşmesi garanti edilmez diyorum.
Affe

2
"sıralı" ve "sıralı olmayan" anlamsal olarak daha iyi seçimler olabilirdi, ancak bu gemi çoktan yola çıktı.
Jared Smith,

Yanıtlar:


47

Size bulduğunuz tanımlarla doğrudan ilgili olan bir cevap vermek istiyorum. Bir görev T1 ikinci bir görev T2 başlattığında, aşağıdaki şekilde olabilir:

Senkron: Mevcut veya aynı anda meydana gelenler.

Bu yüzden T2'nin, T1'in zaman diliminde başlatılması ve yürütülmesi garanti edilir . T1, T2'nin sona ermesini bekler ve daha sonra işleme devam edebilir. Bu anlamda, T1 ve T2 "aynı anda" ("paralel" değil, bitişik bir zaman aralığında) meydana gelir.

Eşzamansız: mevcut değil veya aynı anda bulunmuyor.

Dolayısıyla, T2'nin yürütme süresi şimdi T1 ile ilişkili değildir. Paralel olarak gerçekleştirilebilir, bir saniye, bir dakika veya birkaç saat sonra gerçekleşebilir ve T1 sona erdiğinde T2 hala çalışabilir (T2'nin bir sonucunu işlemek için, yeni bir T3 görevi gerekli olabilir). Bu anlamda, T1 ve T2 "aynı anda meydana gelmiyor (aralık)" değil.

Tabii ki, kabul ediyorum, bugünlerde asenkron işlemlerin çoğu kez paralel işlemler oluşturmak için kullanıldığını görünce, kelimenin tam anlamıyla belirsiz göründüğü görülüyor.


4
Bunun çok fazla kötü olması çok kötü, çünkü yanlış olduğunu düşünüyorum. Eşzamanlı yöntemler birbiri ardına hemen uygulanır, çünkü ikinci yöntem ilk (engelleme) yönteminin tamamlanmasını beklemek zorundadır. Bu iki yöntem kararlı olan değil , aynı zamanda yürütülmesi.
Robert Harvey,

6
Hayır, yaptığımı sanmıyorum. Eşzamanlılık ve eşzamanlılık aynı şeyler değildir.
Robert Harvey,

1
Sözlük tanımlarının yazılım geliştiriciler için pek kullanılmadığını belirtmeye istekliyim. Sözlük tanımlarını kullandığımız teknik terimlerle eşleştirmeye çalışmak muhtemelen yararsızdır.
Robert Harvey,

1
Her durumda, düzenlemeniz işleri iyileştirir, ancak "aynı anda var olan veya aynı anda oluşan" sözcükleri açıklamalarınızı karıştırır. Senkron yöntemler "aynı anda;" sıralı bir sırayla yürütürler , bu da onları senkronize eden şeydir.
Robert Harvey,

1
@RobertHarvey Doğru perspektif kullanıyorsanız, sözlük tanımları mükemmel çalışıyor. Hepiniz infaz zamanı konusunda takıntılısınız. Talimatların yürütüldüğü zaman dışında bir ömrü vardır. Sıralı talimatlar aynı anda hareket eder, aynı zamanda bir tabancadaki kurşunlar aynı anda hareket eder. Benzer şekilde talimatlar, talimat boru hatlarında senkronize olarak hareket edebilir. Yürütme perspektifine takıntı yapmayı bırakın. Yapılmadan önce talimatlarda çok fazla saçmalık olur.
candied_orange

20

Bunu anlamanın en iyi yolunun aşağıdaki olduğunu buluyorum:

  • Senkron: Ne zaman olacağını biliyoruz (bu diğer kod sona erdiğinde olur).
  • Asenkron: Ne zaman olacağını bilmiyoruz.

Not: Kodun belirli bir saatte çalıştırılmasını planlarken, uygulamada ne zaman olacağını bilmiyoruz, çünkü geciktirilebilir - sistem saati ile uğraşmayı bile göz ardı ederek - sistem başka bir şey yapmakla meşgul. Ayrıca, tam olarak belirli bir saatte gerçekleşeceğini garanti etmiş olsak bile, programımızın yürütülmesinin o zaman nerede olacağından emin değiliz. Yani, hayır, saat için planlanan kod senkronize değil.


Lütfen, yazılım geliştirmede, örneğin bir görevin izole edilen görevle ilgili olarak eşzamansız olduğunu söyleyeceğimize dikkat edin. Bununla birlikte, aynı anda meydana gelen terimlerle tanımlamak istiyorsanız veya görevi en azından karşılaştırmak için başka bir şeye sahip olmanız gerekmiyorsa.

Pek çok platform hem paralellik hem de görev değiştirme işlemini yapabilir, bazıları sınırlı paralelliklere sahiptir, bazıları hiçbir şekilde paralellik yapamaz ve yalnızca görev anahtarlamaya güvenirler ... Ayrıca, bazı platformlar bir görevi kesemez ve farklı bir tane gerçekleştirmeden önce bunları tamamlamaları gerekir. ... Eşzamansız görev, tüm bunlar üzerinde bir soyutlamadır, öyle ki sistem, geliştirici için endişelenmeden verilen platform için görevlerin nasıl yürütüleceğine karar verebilir (çok fazla).

Asenkron bir görev olarak dış girdi almayı kavramsallaştırdığımızı ve genellikle soyutladığımızı da belirtmek gerekir. Örneğin: kullanıcı girişinden metin almak. Kullanıcının ne zaman yazacağını bilmiyoruz. Bu aynı zamanda kalıcı depolamadan okumak, ağ üzerinden veri almak veya herhangi bir harici sistem için de geçerlidir.


Bu arada, bazı şeylerin temelde asenkronize olmasına rağmen, genellikle olmadıklarını iddia edebiliriz. Bunu, yazılımı mevcut yürütmeyi engelleyerek - ve başka hiçbir şey yapmadan - tamamlanana kadar yapıyoruz. Yani, senkronize olmayan bir şeyi alıp senkronize bir API'ye sarabiliriz.

Eşzamansız bir API, istenen işlem tamamlanmasa da eşzamanlı olanı olmamasına rağmen yürütmeye devam etmenizi sağlar. Ve oradan asenkron - fikir yazılımında - aynı anda (aynı anda) meydana gelen anlamına gelir.

Zaman uyumsuzun eşzamanlı olmadığı anlamına geldiğine dikkat çekmek önemlidir. Bazı durumlarda platform, asenkron görevi yalnızca geçerli görev tamamlandıktan sonra yürütebilir. Bu ardışık olacaktır (asenkron işin yürütme sırası zorunlu olarak garanti edilmese de), eşzamanlı olmaz (yürütme sürelerinde örtüşme olmaz), ancak asenkron olur.

Oh, bu arada, bazı platformlarda sistem asenkron görevi yerine getirmeye karar verebilir ve böylece tam burada bir senkronizasyon işlemi olarak yürütebilir (varsayabilir, bu her görev için uygun değildir).

Yine, asenkron sadece ne zaman olacağını bilmediğiniz anlamına gelir.


Ayrıca ilginizi çekebilir "Eşzamanlı" ve "paralel" yürütme arasındaki fark? .


Kesinlikle. OP tarafından bulunan açıklama, eşzamanlılıktan çok paralellikten çok daha fazla ses çıkarır (eğer bir kelime ...). eşzamansız vs senkronizasyon, eylemin başladığı zaman (şu anda onu çağırdığımda veya programlayıcının karar verdiğinde daha sonra), paralel "sırayla aynı anda gerçekleşiyorlar" sıralaması anlamına gelir.
Giacomo Alzetta

1
@GiacomoAlzetta Kelimenin senkronizasyon olduğunu düşünüyorum. Benzer kelimeler de buldum: senkronizasyon, senkronizasyon ve senkronizasyon. Muhtemelen kendi sorusuna değer.
Theraot

12

Eşzamansız: mevcut değil veya aynı anda bulunmuyor.

Senkron: Mevcut veya aynı anda meydana gelenler.

Eşzamansız özellik, betiğin html hala ayrıştırılıyor olsa bile indirilir yüklenmez yürütüleceği anlamına gelir, bu da her iki işlemin de aynı anda var olduğu anlamına gelir.

Bu gerçekten kafa karıştırıcı!

Bunun yerine senkronize edilmiş ve senkronize edilmemiş anlamlarını düşünün . Birinin zamanlaması diğerine bağlıysa iki şey senkronize edilir, zamanlamaları birbiriyle ilişkili değilse senkronize edilmez.

Örnek eşzamansız iş akışınızda, gerçekleşecek iki şey var: script yürütme ve html ayrıştırma. Bu iki şey senkronize edilmedi ; yürütme işleminin zamanlaması ve ayrıştırma işleminin zamanlaması birbirine bağlı değildir. İş akışını senkronize edersek , işlemler senkronize olur . Diyelim ki, ayrıştırma kesinlikle sona erene kadar yürütme başlamıyor.

Ancak burada aslında üç olasılık olduğunu fark etmek önemlidir:

  • yürütme ve ayrıştırma gerçekten eşitlenmedi; her ikisi de her zaman ve her hangi bir sırada, en verimli olanı olabilirler.
  • yürütme ve ayrıştırma senkronize edilir; diyelim ki, G / Ç işleminin tamamlanmasını beklerken CPU hiçbir şey yapmaz .
  • yürütme ve ayrıştırma eşitlenir, ancak G / Ç'nin tamamlanmasını beklerken CPU'nun başka bir iş yapmasına izin verilir ve ardından indirme işlemi tamamlandıktan sonra geri dönüp ayrıştırma işlemi gerçekleştirilir .

Bunu kavradığınızda, popüler programlama dillerinde zaman uyumsuz iş akışlarının amacı daha net hale gelir:

  • Eşzamansız iş akışları, yüksek gecikmeli işlemleri verimli bir şekilde uygulamamıza yardımcı olur, çünkü zamanla ilgisiz şeyler sipariş etme zorunluluğu yoktur. Ayrıştırma yüksek gecikmeli ve G / Ç ile sınırlanmışsa ve komut dosyası yürütme yüksek gecikmeli ve CPU bağlıysa, bu işlemleri tamamen veya kısmen senkronize ederek kazanabiliriz.

  • awaitC # gibi dillerde operatör asenkron iş akışları üzerinde sipariş operasyonudur. Bekleyen, zaman uyumsuz bir beklemedir ; biz bir asenkron iş akışının iki kesimi arasında bir sipariş ilişkiyi ifade eder ve orada söylemek bir noktadır olan bir bekliyor öncesi kodu ve bekliyor sonra kod arasındaki ilişki "önce olur". Üçüncü seçeneği bu şekilde uygularız .

Bunların hepsi çok soyutsa, bazı gerçek dünya örneklerini düşünün. Bir mektup gönderdiğinizde - yüksek gecikmeli bir G / Ç sınırı işlemi - hala mektuba bir cevap almak için beklerken hala CPU-yoğun iş - matematik ödevi yapabilirsiniz. Matematik ödevini yapma ve postalarını okuma işlemleri senkronize edilmedi.

Ancak, şimdi bir mektup gönderdiğinizi ve yanıtın vergilerinizi yapmanız için gereken bir sayı içerdiğini varsayalım. Artık CPU çalışmasını yapamazsınız - vergilerinizi hesaplayarak - G / Ç işlemi tamamlanana kadar. Ama beklerken hala çimleri biçebilirsin . Bu, parçaları arasında zamanlama ilişkisini ifade eden asenkronize bir iş akışıdır.


6

Ben elektrik mühendisiyim ve biz mantık devrelerinde (mantık kapıları) senkron ve asenkron çalışma yaptık.

Diyelim ki iki girişi olan bir AND-geçidi (veya herhangi bir geçidi) ve bir çıktısı var.

Eşzamansız ise, herhangi bir giriş değiştiği şekilde herhangi bir giriş değiştiği anda çıkışını güncelleştirir. Örnek bu şekilde çalıştı - bahsettiğiniz program.

Bununla birlikte, eğer bu kapı aynı zamanda bir saate (örneğin, 1 saniye periyotluk kare dalga) bağlıysa, kare dalga düşükten yükseğe doğru giderken her saniyenin ritminde güncellenir, eşzamanlı olur. Saatin frekansına bağlıdır. Yani senkronize. O saati birçok devreye bağlayabilirsiniz ve birbirleriyle ritim içinde çalışırlardı - senkronize. Programınız yalnızca saniyede bir çalışıp çalışmadığını kontrol etmişse, senkronize edilir.


1
Asenkron / senkron seri port gibi.
jiwopene

2

Dünyayı çevreleyen iki uydu hayal edin.

  • A uydusunun, Gezegenin her bir tam dönüşü için, uydunun Dünya'nın etrafında bir kereden fazla ya da daha az gittiği şekilde, Dünya çevresinde bir dönme süresi vardır .
  • B uydusunun, Gezegenin her bir tam dönüşü için uydunun Dünya'nın tam olarak bir kez gittiği şekilde, Dünya'nın etrafında bir dönme süresi vardır .

Yukarıdaki örnekteki B uydusu, tarafından tanımlandığı şekilde geosenkron senkron yörüngededir.

yeryüzünün dönüşüyle ​​aynı dönme periyoduna sahip.

Biri, uydu uydusunun jeosenkron olduğunu, çünkü gezegenin "aynı anda var olduğunu ya da ortaya çıktığını" iddia etmiyor. Aslında, B uydusunun kendisi de konuyla alakalı değildir - konuyla alakalı olan, Dünya'nın rotasyon periyoduna senkronize edilmiş rotasyon periyodudur. Nesnelerin eşzamanlı mevcudiyeti ile ilgili değil; Bu nesneler arasındaki ilişki hakkında. Bu düşünceye tutun.

Diyelim ki bir sistemdeki iki iş parçacığı aynı anda çalışıyor. İş parçacığı A (TA), işlem A için veri alıyor ve iş parçacığı B (TB) işlem B için veri alıyor. Size "TA ve TB eşzamansız mı?" Cevabınız "Nasıl bilebilirim? Kimliği kendi işlemlerinde çağıran kodu görmek zorundayım." Aldatma girişimimde yanıltıcı olacağım, "Ama sana TA ve TB'nin kesinlikle aynı anda çalıştığını söylüyorum."

Onlar çalışıyor olabilir - Ya sen, oldukça zeki birey olma, Yine", yanıt vereceğini eş zamanlı ancak çalıştırıyorsanız, hiçbir ipucu uyumsuz . TA ve TB için uyumsuz çalışan onları çağrılan kendi süreçlerine ilişkin olarak birbirlerine gerçekten yapar anlamsız çünkü aynı süreçten doğmadılar ”dedi.

Bu yüzden, şu anda bir ilişkinin varlığının burada konuyla alakalı olan, sadece bu iki konunun kendi varlığının değil, aynı olduğu konusunda bir sezgiyi kazanmalıyız. Bir yöntem zaman uyumsuz yürütüldüğünde, ne söylüyorsun yöntemin yürütülmesine "yapmasıdır DEĞİL onu çağrılan yöntemin yürütülmesi ile aynı anda var ya gerçekleşmesi gerek". Aşağıdaki örneği ele alalım:

func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}

Daha önce uydular hakkında yaptığımız tartışmalardan, "Nesnelerin eşzamanlı mevcudiyeti ile ilgili değil; nesneler arasındaki ilişkiyle ilgili." Çağrılan bir yöntemin ve çağrılan yöntemin varlığı ile ilgili değildir; Bu, istilacının yürütülmesi ile istilacının yürütülmesi arasında bir ilişkinin varlığı ile ilgilidir. Sistem konularımıza baktığımızda ve bunun DoThatAsync()çağrıldığını, ancak yürütülmediğini fark edersek , zamanlayıcıyı veya başka bir G / Ç'yi bekliyordur, bu mutlaka çağrı yönteminin Invoker()çalışmadığı anlamına gelmez - orada işe yarayabilir Yapmak Tabii, bu noktada olabilir awaiting DoThatAsync(), ama bu garanti edilmemektedir. Bu, çağrıldıktan sonra diğer işlevler için doğru değildir - dururlarsa,Invoker()Durur - ne olursa olsun. Bu garantilidir. Invoker()Ve çağrılan senkronize yöntem arasındaki uygulama "aynı anda var veya gerçekleşiyor".


Bunu gerçekten seviyorum. Genel olarak "eşzamanlı" olarak tanımlanan açık bir yürütme yoluna karşılık "eşzamansız" olarak keyfi yürütmenin vahşi batısında bulunur
Cruncher 19

Ayrıca bunun en iyi cevap olduğunu düşünüyorum.
Barmar

2

Beton örnekleri

Bazı gerçek dünya örnekleri eklemek ve bunları yazılım mühendisliği dünyasına bağlamak istiyorum. Öncelikle, sezgisel "senkronize" tanımınıza uyduğunu umduğum bir şeyi düşünün: ateşböceklerinin parlaması , bazı durumlarda. İkincisi, 4x100 kadınların olimpik bayrak yarışı düşünün . Üçüncüsü, askeri filmlerden çıkan eski tırnağı düşünün: "Erkekler, saatlerinizi senkronize edin!"

Şimdi, neler olduğunu düşünelim. Bunların hepsinin süreçler ya da zaman içinde uzayan varlıklar olduğunu gözlemleyerek başlayalım . Bir kasenin "eşzamanlı" ve kaya "async" olduğunu söylemek mantıklı değil. İkincisi, iki tangoya alır . "Bir koşucunun senkronize olduğunu" söyleyemezsiniz. Neyle senkronize et? Son olarak, iki işlemin aynı anda bir şey yapması için, tam olarak aynı frekans ve faza sahip olmadıkça, birisinin veya her ikisinin beklemesi gerekir .

analiz

Sözlük tanımı, eşzamanlı olarak iki varlık "aynı anda meydana gelir ya da var" deyince, bu ateşböceklerinden gelen ışık kavramına çok iyi uyar. Ne yazık ki, ışığın "senkronize" olduğunu söylemek ateş böceği aydınlatma işlemlerinin senkronize edildiğini söylemenin özensiz bir yoludur .

Öyleyse, Apple SmartWatch ve NTP'ye sahip olmaları muhtemel olmayan bir grup ateşböceği arka uçlarını aynı anda yakmayı nasıl başarabilir? Tutarlı bir tempo belirleme imkânları varsa ve küçük ayarlamalar yapabilirlerse bu oldukça kolaydır. Sadece yanıp sönerler ve eğer onlardan hemen sonra daha fazla insan yanıp sönerse, yavaşlarlar (gecikmeyi arttırır), oysa hemen önce flaşlar hızlanırsa, hızlanır (gecikmeyi azaltır). Böylece, aynı temele ve aşamaya ulaşmak için basit bir geri bildirim süreci kullanabilirler. Buradaki önemli gözlem , doğru anın yanıp sönmesini bekleyerek senkronizasyonu sağladıklarını not etmektir .

Gördüğünüz çünkü 4x100 yarış ilginçtir hem koşucular: eylem süreç zamanlama formları içinde koşucular ise, bir ekip eşitlenir farklı takımlara "zaman uyumsuz" dir. Röledeki ikinci koşucu, ilk koşucu transfer bölgesine girene kadar beklemelidir . Dağıtma, bu iki koşucu arasında senkronize bir olaydır. Bununla birlikte, farklı şeritlerdeki koşucular başka bir şeritte neler olup bittiğini umursamıyorlar ve kesinlikle yavaşlamıyorlar ve ellerini senkronize ediyorlar. Her koşucu şeridi birbirine göre asenkrondir. Yine, senkronizasyonun beklemede olduğunu, asenkronizasyonun yapılmadığını görüyoruz.

Son olarak, bir şirketteki askerler (takım, itfaiye ekibi, vb.) Saatlerini senkronize etmeli, böylece düşmana aynı anda saldırabilirler . Bazı askerlerin diğerlerinden önce kendi pozisyonlarına ulaşması ya da düşmanı daha erken kovma fırsatı olabilir. Ancak eşzamanlı bir saldırı genellikle sürpriz unsuru nedeniyle meydana gelen bir saldırıdan daha etkilidir. Bu yüzden senkronizasyonu sağlamak için askerlerin birçoğunun harekete geçmesi için belirlenen zamanı beklemesi gerekir .

Özelliğin Tanımlanması

Bu neden beklemeye vurgu yapıyor? Çünkü beklemek, senkronu asenkron işlemlerden ayıran tanımlayıcı özelliktir. Hakkında hiçbir şey bilmediğiniz iki işleminiz varsa, bunların varsayılan olarak eşzamansız olduklarını varsaymalısınız. Örneğin, bir paket teslimatı ve bir ambulans sürüşü büyük olasılıkla senkronize edilmemiştir . İki işlemin aslında senkronize olduğunu göstermek için, zaman içinde çok özel bir an bulmanız gerekir: senkronizasyon noktası .

Bir paketi bırakan bir teslimat sürücüsü ve birini hastaneye götüren ambulans, genellikle "senkronizasyon noktası" olarak tanımladığımız herhangi bir noktayı paylaşmaz. Öte yandan, hep birlikte yanıp sönen ateşböcekleri, her ateşlendiklerinde bir eşzamanlama noktasına sahipler, röle koşucuları her copu bıraktıklarında bir eşzamanlama noktasına sahipler ve askerler saldırılarını başlattıklarında bir eşzamanlama noktasına sahipler. Bir veya daha fazla senkronizasyon noktası tanımlayabiliyorsanız, işlemler senkronize edilir . Bunu anlamak kolay olmalı, çünkü "syn-", "ile" veya "birlikte" anlamına gelen bir Yunan öneki ve "chrono", "zaman" için Yunan köküdür . "Senkronize" anlamıyla "aynı anda" anlamına gelir,

Sınırlar

"Senkronizasyon" un, işlemlerden herhangi birinin veya her ikisinin ömrü boyunca mutlaka geçerli olmadığına dikkat edin . Bunun sadece "senkronizasyon noktaları / noktaları dahil olmak üzere bekleme süresi" için geçerli olduğunu savunuyorum. Böylece, iki işlem iletişim kurmaları gereken bir duruma ulaşana kadar eşzamansız olarak çalışabilir, daha sonra eşzamanlı hale gelebilir, bilgi alışverişinde bulunabilir ve ardından eşzamansız olarak devam edebilir. Basit bir örnek kahve için biriyle buluşmak Açıkçası, buluşma bir senkronizasyon noktasıdır (veya daha doğrusu) ve bu noktada iki kişinin vardığı gerçeği, senkronizasyonu gösterir. Ancak, iki insanın kahve için buluştuğu için, bu iki insanın yaşamında olduğunu söyleyemeyiz."senkronize edilmiştir". Hayatlarında tanıştığı tek an bu olabilir ve yaptıkları diğer her şey bağımsız değildir.

Aynı zamanda, tesadüfen karşılayanların senkronizasyon göstermesi de söz konusu değildir. Sokakta iki yabancı birbirlerini geçerse, belirli bir yerde olmaları gerçekte senkronizasyonu kanıtlamaz. Bir kişinin otobüsü bekleyen bir bankta oturduğu ve bir başkasının da yürüdüğü gerçeği de yoktur. İşlemler yalnızca bir amaç için karşılaştıklarında senkronize olur .

Yazılım Bağlantısı

Şimdi, yazılımdaki çok temel bir görevi düşünelim: bir dosyadan okuma. Muhtemelen bildiğiniz gibi, toplu depolama genellikle önbellekten veya ana bellekten binlerce ila milyon kat daha yavaştır. Bu nedenle işletim sistemleri ve programlama dili kütüphaneleri genellikle hem senkron hem de asenkron I / O işlemleri sunar. Şimdi, programınız yalnızca bir iş parçacığına sahip olsa bile, işletim sistemini bu tartışma amaçları için "ayrı bir işlem" olarak düşünmelisiniz.

Eşitleme

Bir "senkronize G / Ç okuması" yaptığınızda, iş parçacığınızın veri kullanılabilir duruma gelinceye kadar beklemesi gerekir . Bu, bastonu bir sonraki koşucuya bırakan bir röle koşucusu gibidir, ancak bunun yerine sadece iki koşucunun pist boyunca döndüğünü ve ikinci koşucu da ilkine geri döndüğünü hayal edin.

Bu durumda, program iş parçacığınız ve işletim sistemi giriş / çıkış işlemi "aynı anda gerçekleşmiyor (aynı anda gerçekleşmiyor") ve bu nedenle bu işlemlerin "eşitlendiğini" söylemek garip görünüyor. Ama buna bakmak için yanlış yol! Şöyle diyor: "Bir röle takımındaki koşucular aynı anda koşmuyorlar, bu yüzden senkronize değiller." Aslında, her iki ifade de yanlış! Bir bayrak takımında koşucular yapmak ve gereken ama sadece çok özel anda, aynı anda çalıştırın: el-off baton. Aslında, yarış sırasında yalnızca röle takımlarının başlangıç ​​için senkronize edildiğine bizi ikna eden özel an! G / Ç isteğini ve cevabını "baton" olarak görürsek,

Öte yandan, bir süper bilgisayarda Sonlu Elemanlar Analizi gibi bir şey düşünürsek, devasa bir küresel durumu güncellemek için binlerce sürecin kilit adımda çalışması gerektiğini görüyoruz. Düğümlerin bazıları çalışmalarını diğerlerinden önce belirli bir zaman aşaması için tamamlasalar bile, sonuçlarının uzayda komşulara yayılması nedeniyle, zaman adımının tamamlanmasını beklemeleri gerekir. Bu tür bir senkronizasyon ateşböcekleri gibidir: tüm aktörler aynı tür görevleri yerine getirirler.

Proses Çeşitliliği

Bu nedenle, üç çeşit şey olduğunu görmemize yardımcı olacak birkaç terim icat edebiliriz: "homojen senkronizasyon", "heterojen senkronizasyon" ve "sıralı senkronizasyon". Böylece oyuncular aynı görevi aynı anda gerçekleştirirken (FEA, ateşböcekleri), "homojen" olurlar. Aynı anda farklı görevleri yerine getirirken (askerler koşuyor, sürünüyor, hedeflerine doğru yüzüyorlar, bir oyunda fizik ve sese karşı AI konuları), "heterojen" oluyorlar. Her seferinde bir görev gerçekleştirirken "sıralıdır" (röle koşucular, G / Ç engelleme). Çok farklı görünebilirler, ancak tek bir temel özelliği paylaşıyorlar: her tür oyuncu, herkesin aynı anda senkronizasyon noktasına gelmesini sağlamak için biraz bekletiyor. senkronizasyon noktaları arasında veya “aynı işlemi yapmak”, senkronizasyon özelliğiyle ilgisizdir.

Bir GPU'daki oluşturma boru hatları senkronizedir, çünkü hepsinin çerçeveyi birlikte bitirmesi ve yeni bir çerçeveyi birlikte başlatması gerekir. Homojendirler çünkü aynı işi yapıyorlar ve hepsi birlikte aktifler. Ancak bir sunucunun ana oyun döngüsü ve uzak girdiyi işleyen engelleyici G / Ç dizileri çok farklı türden işler yaptıkları için heterojendir ve G / Ç dizilerinin bazıları hiçbir şey yapmaz, çünkü hepsi bağlantılar kullanılır. Buna rağmen, senkronize edilirler, çünkü durumu atomik olarak paylaşmaları gerekir (bir oyuncu kısmi bir oyun dünyası güncellemesi görmemeli ve sunucu yalnızca bir oyuncu girişi parçası görmemeli).

zaman uyumsuz

Şimdi bir "zaman uyumsuz G / Ç okuması" düşünelim. Programınız işletim sistemine bir miktar veri okuma yetkisi gönderdiğinde, çağrı derhal geri döner . Geri aramaları görmezden gelelim ve oylamaya odaklanalım. Genel olarak, verilerinizin programınız için uygun olduğu an, programınızın iş parçacığı söz konusu olduğunda herhangi bir özel noktaya karşılık gelmez. Programınız açıkça veri beklemiyorsa, o zaman ne zaman konu tam olarak bilemez. Yalnızca verilerin bir sonraki kontrolünde beklediğini keşfedecektir.

İşletim sistemi ve program iş parçacığının verileri teslim etmeyi kabul ettiği özel bir toplantı zamanı yoktur. Geceleyin geçen iki gemi gibiler. Eşzamansız bekleme bu eksikliği ile karakterize edilir. Tabii ki, program iş parçacığı genellikle sonuçta G / Ç işlemini beklerken sona erer, ancak buna gerek kalmaz. G / Ç alımı gerçekleşirken başka hesaplamalar yapmaya devam edebilir ve yalnızca boş zamana sahip olduğunda kontrol edebilir. Tabii ki, işletim sistemi veri toplama işlemini tamamladıktan sonra, beklemeye de oturmuyor. Sadece verileri uygun bir yere koyar ve işi ile ilgili devam eder. Bu durumda, programın bastonu işletim sistemine vermesi gibi ve işletim sistemi daha sonra gelir, bastonu veriyle birlikte yere bırakır ve raydan çıkar. Program, elden teslim almayı beklemekte ya da beklemiyor olabilir.

paralellik

Bir işlevi yazılımda "asenkron" olarak işaretlediğimizde, bu genellikle paralellik istediğimiz anlamına gelir . Ancak, paralelliğin senkronizasyon anlamına gelmediğini unutmayın . Ateşböcekleri iyi bir örnektir, çünkü hem senkronize hem de asenkronize davranışlar sergilediler. Sineklerin çoğu birlik içinde parladı, birçoğu açıkça grubun geri kalanıyla uyumsuz ve daha rasgele parladı. Sinekler aynı anda hareket ediyor olabilirler , ancak hepsi senkronize edilmedi .

Şimdi bazı kodları "eşzamansız" olarak işaretlediğimizde komik görünüyor, çünkü işaretlenmemiş kodun geri kalanının "sync" olduğu anlamına geliyor. Bu ne anlama geliyor? "Senkronizasyon" un tango için iki tane istediği konusunda ısrar etmedik mi? Peki ya tek bir iş parçacığında kod çalıştırma hakkında konuşuyorsak? Bu durumda, bir adım geriye gitmemiz ve bir programı bir devletler dizisi ve bu ülkeler arasındaki geçişler olarak düşünmemiz gerekir. Bir programdaki ifade, durum geçişine neden olur. Bunu, ifadeyle başlayan ve duran bir "mikro süreç" olarak düşünebiliriz. Dil tarafından tanımlanan sıralama noktaları, aslında, bu "mikro işlemlerin" senkronizasyon noktalarıdır . Ve böylece, bir iş parçacığı görebiliriz

Programlama dilinin bütünlüğü, durum güncellemelerinin ifadeler arasında karışmamasını garanti eder ve sıralama noktaları, derleyicinin gözlemlenebilir optimizasyon yapmasına izin verilmeyen sınırları tanımlar. Örneğin, bir ifade içindeki ifadelerin değerlendirme sırası tanımlayıcıya tanımlanmamış veya belirtilmemiş olabilir, bu da derleyiciye ifadeyi çeşitli şekillerde optimize etme özgürlüğü verir. Ancak bir sonraki ifade başladığında, PL'nin kendisi sağlamsa, program iyi tanımlanmış bir durumda olmalıdır.

Şimdiye kadar, "async" ile ne demek istediğimizi açıkça belirtmek gerekir. Bu tam olarak, bir kod bloğu içindeki zımni senkronizasyon sözleşmesinin zaman uyumsuz blok için muaf tutulduğu anlamına gelir. Normalde ardışık (ly tutarlı, senkronize) hesaplama modeli tarafından belirtilen güvenlik garantisi olmadan program durumunu bağımsız olarak güncellemeye izin verilir. Elbette bu, program durumunu tutarsızlıkla yok etmememiz için özel dikkat göstermemiz gerektiği anlamına gelir. Bu genellikle , zaman uyumsuz blokla koordine etmek için sınırlı ve açık bir senkronizasyon uyguladığımız anlamına gelir . Not Bu demektir ki zaman uyumsuz blok asenkron her ikisi de olabilir ve farklı zamanlarda senkron! Ancak, senkronizasyonun sadece bir senkronizasyon noktasının varlığına işaret ettiğini hatırlamak, bu fikri kabul etmekte sorun yaşamamalıyız.


Aktarma yarışı (burada diğerleri senkronize etmese de yazılım senkronizasyon ve asenkronite kavramlarını açıkça gösterir) dışında tüm örneklerinizi burada kaldırabilirsiniz ve cevabınız önemli ölçüde iyileşir.
Robert Harvey,

Diğer örneklerin, OP'nin kargaşasının çoğuna neden olduğuna inandığım eş zamanlı eylemi ve heterojen eylemi gösterdiğini düşünüyorum.
Bahçıvan

1

Bunu düşünmenin bir yolu AVX gibi SIMD talimatları . İşte nasıl kullanıldığına dair bazı örnekler .

Eşzamanlı SIMD talimatları , aynı anda , aynı iş parçacığında, Birden Çok Veride Tek Bir Talimat çalıştırarak birden fazla hesaplama yapmanızı sağlar .

Asenkron çoklu okuma, "muhtemelen" "biraz" "benzer" zamanlarda birden fazla hesaplama yapmanızı sağlar.

Bunu aşağıdaki tanımlarla birleştirin:

senkron sıfat senkronizasyonu · chro · nous | \ ˈSiŋ-krə-nəs, -sin-

1: tam olarak aynı anda meydana gelen, var olan veya ortaya çıkan [benimkine önem veren]

zaman uyumsuz sıfat asyn · chro · nous | \ (ˌ) ā-ˈsiŋ-krə-nəs, -ˈsin- \

1: [...]: senkronize değil


1

Sync vs Async vs Multi-threaded arasındaki farkı anlamamı sağlayan bir analoji, mutfaktaki bir aşçıdır.

Makarna yaptığını hayal et. Üç adımınız var:

  1. Makarnayı kaynatın ve süzün
  2. Sos hazırlayın
  3. Makarna ve sosu birleştirin

Senkron yöntemi. Senkron senaryoda, tüm işi sırayla yapan yalnızca bir kişi (iş parçacığı) vardır. İlk önce makarnayı kaynatın ve orada durup kaynamasını seyredin. Sonra boşaltır ve bir kenara bırakırsınız. Sonra sosu hazırla. Sos hazır olduğunda makarnayı alın, sosla karıştırın ve yemeğiniz hazır. Buradaki sorun verimsiz. Ardışık olarak eşzamanlı çalıştığınızdan, makarna kaynarken sos üzerinde çalışamazsınız. Böylece, zamanınızı boşa harcadı ve sos hazırlanırken makarnanız soğudu.

Eşzamansız yöntem Bu senaryoda, hala sadece bir aşçı var (iş parçacığı), ama makarna kaynar iken gidip sosu hazırla. Makarna haşlandığında, suyunu called-backsüzmek için sosu yapmak üzeresiniz , ve sonra called-backsosu bitirmek için tekrar geliyorsunuz . Bu şimdi daha verimli, çünkü zamandan tasarruf ettiniz ve makarnanızın sosu o kadar uzun süre beklemesi gerekmiyordu.

Çok dişli yöntem. Şimdi, yeni bir aşçı tuttuğunu hayal et. Şimdi iki aşçı var (iş parçacığı). Bir aşçı makarna yaparken, ikinci aşçı sos yapıyor. Bu senaryoda gerekli midir? Hayır, çünkü makarna yapmak asenkron yöntemle verimli olacak kadar basittir. Ve, birden fazla aşçıyı yönetmek, ek yüküdür. Ancak aynı anda daha karmaşık bir yemek veya daha fazla yemek yapıyorsanız, birden fazla aşçı faydalı olur.


Bu aslında oldukça iyi bir benzetme.
Robert Harvey,

0

İyi bir soru ve sık sık karışıklığa yol açan farklı şekillerde kullanılan terimler.

Cevabım, bu terimlerin göreceli olduğu - ve göreceli oldukları şey, yürütülmekte olan ana programdır (veya bazen bir iş parçacığına).

Bu terimler, bir programın dahili çalışması ve zamanlaması hakkında, mesajların engelleme biçiminde (senkronizasyon) veya engellemesiz bir şekilde (zaman uyumsuz) gönderilip gönderilmeyeceği ile ilgili bir şey belirtir. Bir (ana) iş parçacığı gönderme veya alma ile engellenirse, bu "sync" olur ve bir şekilde kesilirse "async" olur. Yinelemek için, bu terimler hem (normal) çalışan hem de olayları işleyen uygulamalar ile ilgilidir.

(IMHO, elbette) bir mesaj telde bulunduğunda, senk vs zaman uyumsuz diye bir şey yoktur. Mesajlaşmada, bir gönderici ve bir alıcı vardır, her biri diğerinden bağımsız bir senkronizasyon veya eşzamansız uygulamaya sahip olabilir - ancak bir mesaj tel üzerinde olduğunda, bu sadece bir mesajdır, artık eşzamanlı veya eşzamansız değildir. Bir mesajı bir istek ya da cevap ya da tek yönlü bir mesaj olarak sınıflandırabiliriz, ancak bu senkronizasyon ve zaman uyumsuzluğuna diktir (uygulamanın beklemeyi engelleyip engellemediği veya bir şekilde kesintiye uğrayabildiği anlamına gelir).


Blokaj olmayan asenkron, farklı
user207421

1
@ user207421, lütfen detaylandırın, çünkü onlara bu bağlamda eşanlamlıları
diyeceğim

0

"senkronize", iki olayın aynı anda meydana geldiği anlamına gelir - ama hangi olaylar?

"Senkron yürütme" derken, arayan ve callee'nin aynı anda yürütüldüğü anlamına gelir. Muhtemelen peşinde olduğun anlam budur.

"Senkron mantık geçidi" derken, mantık geçidinin cpu saati ile senkronize edildiğini kastediyoruz.

Dağıtık sistemler bağlamında "senkron model" derken, tüm düğümlerin programlarını kilit adımda yürüttüğünü ve n. Adımda gönderilen mesajların n + 1 adımının başında geleceğini garanti ediyoruz.

Java Dil Belirtimi bir iş parçacığının "diğeriyle" eşitlendiğini söylediğinde, farklı iş parçacıklarındaki eylemlerin "aynı anda" (ilişkiden önce gerçekleşmesiyle ilgili olarak) gerçekleştiği anlamına gelir. Ve iki iş parçacığının "bir nesneye erişimi senkronize ettiğini" söylediklerinde, aslında nesnelerin aynı anda asla nesnede çalışmamasını sağlamak için birbirleriyle senkronize edildikleri anlamına gelir .

... ve kelimeyi daha fazla bağlamda uygulayabileceğinizden eminim, çünkü "aynı anda olan şeyler" oldukça genel bir fikir :-)


0

Sanırım kafa karışıklığınızın anahtarı şöyle özetlenebilir:

Zaman uyumsuz özelliği , html hala ayrıştırılsa bile betiğin indirildiği anda çalıştırılacağı anlamına gelir

Gerçekleşmesi gereken şey, bu cümlenin anlamsız olduğu, çünkü imkansız bir durumu tanımladığıdır. HTML hala ayrışıyorsa , komut dosyası indirme işlemi zaman uyumsuz olsa bile başlamaz .

Programlamada senkron demek:

İlgilendiğiniz tüm veriler, mantığınızı yürüttüğünüz zaman bellekte zaten var.

Asenkron, şu anlama gelir:

İlgilendiğiniz verilerin bir kısmı henüz mevcut değil ve yalnızca gelecekte bir noktada var olabilir.

Aslında, asenkron programlamanın şu anda olmayan, genellikle insanları şaşırtan yönüdür.

Komut dosyaları normal olarak nasıl yüklenirse html ayrıştırma duraklatılır, daha sonra komut dosyası indirme işlemi tamamlandığında komut dosyası indirilir ve ardından html ayrıştırma devam eder. Html ayrıştırma ve komut dosyası çalıştırma işlemi "aynı" zamanda gerçekleşir (aynı anda birlikte, aynı anda değil).

Nasıl asynckomut yüklenir html komut dosyası etiketi görür ve daha sonra komut dosyası indirmek için hatırlar olan geleceğe ancak ayrıştırmak devam ediyor. HTML ayrıştırma komut dosyası indirme için duraklatılmadı. Daha sonra, html ayrıştırma işlemi tamamlandıktan sonra, tüm zaman uyumsuz komut dosyaları indirilir ve yürütülür. Html ayrıştırma ve komut dosyası yürütme işlemi aynı anda gerçekleşmez (yine, birlikte aynı zaman anlamına gelir, bu durumda ayrı olarak yürütülürler).

Özetlemek gerekirse:

  • Senkron komut dosyaları html ile birlikte ayrıştırılır.

  • Zaman uyumsuz komut dosyaları gelecekte ayrı ayrı ayrıştırılır.

Bu nedenle, asyncözelliğin tanımı , komut dosyası indirilir yüklenmez yürütülmez değildir - bu, hem senkron hem de asenkron komut dosyaları için geçerlidir. Zaman uyumsuzluğun tanımı , html ayrıştırmanın komut dosyasının indirilmesini beklememesidir .

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.