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.