Apa arti kata asinkron dan sinkron dalam ilmu komputer?
Jika Anda google arti kata-kata Anda akan mendapatkan yang berikut:
Asinkron: tidak ada atau terjadi pada saat yang bersamaan .
Sinkron: ada atau terjadi pada saat yang sama .
Tapi sepertinya mereka digunakan untuk menyampaikan makna yang berlawanan dalam pemrograman atau ilmu komputer:
Atribut HTML async berarti bahwa skrip akan dieksekusi segera setelah diunduh bahkan jika HTML masih parsing atau mengunduh, yang berarti kedua proses, skrip dan HTML, ada dan terjadi pada saat yang sama dengan saya.
Apakah istilah-istilah ini digunakan untuk menyampaikan makna yang berlawanan dalam ilmu komputer atau apakah saya kehilangan intinya?
architecture
terminology
Mohammad Nazayer
sumber
sumber
Jawaban:
Saya ingin memberi Anda jawaban yang terkait langsung dengan definisi yang Anda temukan. Ketika satu tugas T1 memulai tugas kedua T2, itu bisa terjadi dengan cara berikut:
Jadi T2 dijamin akan dimulai dan dieksekusi di dalam irisan waktu T1 . T1 "menunggu" untuk akhir T2 dan dapat melanjutkan pemrosesan sesudahnya. Dalam hal ini, T1 dan T2 terjadi "pada saat yang sama" (bukan "secara paralel", tetapi dalam interval waktu yang berdekatan).
Jadi waktu eksekusi T2 sekarang tidak terkait dengan T1. Ini dapat dieksekusi secara paralel, mungkin terjadi satu detik, satu menit atau beberapa jam kemudian, dan T2 masih dapat berjalan ketika T1 telah berakhir (jadi untuk memproses hasil T2, tugas baru T3 mungkin diperlukan). Dalam hal ini, T1 dan T2 tidak "terjadi pada waktu yang sama (interval)".
Tentu saja, saya setuju, definisi literal tampak ambigu ketika melihat bahwa operasi asinkron saat ini sering digunakan untuk membuat eksekusi paralel.
sumber
Saya menemukan bahwa cara terbaik untuk memahaminya adalah sebagai berikut:
Catatan: sementara kita dapat menjadwalkan kode untuk dieksekusi pada waktu jam tertentu, dalam praktiknya kita tidak tahu kapan itu akan terjadi, karena dapat ditunda - bahkan mengabaikan mengacaukan jam sistem - karena sistem sibuk melakukan sesuatu yang lain. Selain itu, bahkan jika kami memiliki jaminan bahwa itu akan terjadi tepat pada jam tertentu, kami tidak yakin di mana pelaksanaan program kami akan pada waktu itu. Jadi, tidak, kode yang dijadwalkan untuk waktu jam tidak sinkron.
Harap perhatikan bahwa dalam pengembangan perangkat lunak kami akan mengatakan, misalnya, bahwa suatu tugas tidak sama dengan sesuatu tentang tugas tersebut secara terpisah. Namun, jika Anda ingin mendefinisikannya dalam hal terjadi pada saat yang sama atau tidak memerlukan setidaknya memiliki sesuatu yang lain untuk membandingkan tugas.
Banyak platform dapat melakukan paralelisme dan pengalihan tugas, beberapa memiliki paralelisme terbatas, beberapa tidak dapat melakukan paralelisme sama sekali dan hanya bergantung pada pengalihan tugas ... Selain itu, beberapa platform tidak dapat mengganggu tugas dan harus menyelesaikannya sebelum menjalankan yang lain ... Tugas asinkron adalah abstraksi atas semua itu, sehingga sistem dapat memutuskan bagaimana menjalankan tugas untuk platform yang diberikan tanpa pengembang mengkhawatirkannya (terlalu banyak).
Perlu juga dicatat bahwa kita dapat membuat konsep, dan biasanya kita abstrak, mendapatkan input eksternal sebagai tugas yang tidak sinkron. Misalnya: mendapatkan teks dari input pengguna. Kami tidak tahu kapan pengguna akan mengetik. Ini juga berlaku untuk membaca dari penyimpanan permanen, mendapatkan data melalui jaringan, atau sistem eksternal lainnya.
Ngomong-ngomong, meskipun beberapa hal secara fundamental tidak sinkron, kita biasanya bisa berpura-pura tidak sinkron. Kami melakukannya dengan meminta perangkat lunak memblokir eksekusi saat ini - dan tidak melakukan hal lain - hingga selesai. Artinya, kita dapat mengambil sesuatu yang tidak sinkron dan membungkusnya dengan API yang sinkron.
API asinkron akan memungkinkan Anda untuk melanjutkan eksekusi meskipun operasi yang diminta tidak selesai, yang tidak sinkron. Dan dari sana Anda mendapatkan ide asinkron - dalam perangkat lunak - berarti terjadi pada saat yang bersamaan (bersamaan).
Perlu dicatat bahwa asinkron tidak berarti bersamaan. Dalam beberapa kasus, platform hanya dapat menjalankan tugas asinkron setelah tugas saat ini selesai. Itu akan berurutan (meskipun urutan pelaksanaan tugas asinkron belum tentu dijamin), tidak akan bersamaan (tidak ada tumpang tindih dalam periode eksekusi), namun akan asinkron.
Oh, omong-omong, di beberapa platform sistem dapat memutuskan untuk menyejajarkan tugas asinkron, dan karenanya menjalankannya di sana sebagai operasi sinkron (dengan asumsi bisa, itu tidak layak untuk setiap tugas).
Sekali lagi, asinkron berarti Anda tidak tahu kapan itu akan terjadi.
Anda mungkin juga tertarik dengan Perbedaan antara eksekusi "bersamaan" dan "paralel"? .
sumber
Ini memang membingungkan!
Pertimbangkan alih-alih arti disinkronkan dan tidak disinkronkan . Dua hal disinkronkan jika waktu satu tergantung pada yang lain, dan tidak disinkronkan jika waktunya tidak terkait.
Dalam contoh alur kerja asinkron Anda, kami memiliki dua hal yang terjadi: eksekusi skrip dan parsing html. Dua hal ini tidak disinkronkan ; waktu operasi eksekusi dan waktu operasi parsing tidak saling bergantung. Jika kami membuat alur kerja sinkron , maka operasi akan disinkronkan . Katakanlah, eksekusi tidak dimulai sampai parsing sudah pasti berakhir.
Tetapi penting untuk menyadari bahwa sebenarnya ada tiga kemungkinan di sini:
Setelah Anda memahami hal itu, tujuan alur kerja async dalam bahasa pemrograman populer menjadi lebih jelas:
Alur kerja yang tidak sinkron membantu kami menerapkan operasi latensi tinggi secara efisien karena kami tidak dibatasi untuk memesan hal-hal yang tidak terkait waktu. Jika parsing adalah latensi tinggi dan I / O terikat, dan eksekusi skrip adalah latensi tinggi dan CPU terikat, kita bisa mendapatkan kemenangan dengan sepenuhnya atau sebagian tidak menyinkronkan operasi tersebut.
The
await
operator dalam bahasa seperti C # adalah operasi memesan pada alur kerja asynchronous. Menunggu adalah menunggu yang tidak sinkron ; itu adalah titik di mana kita mengungkapkan hubungan pemesanan antara dua bagian dari alur kerja asynchronous, dan mengatakan bahwa ada adalah sebuah "terjadi sebelum" hubungan antara kode sebelum menunggu dan kode setelah menunggu. Inilah cara kami menerapkan opsi ketiga .Jika itu terlalu abstrak, pikirkan beberapa contoh dunia nyata. Ketika Anda mengirim surat - operasi I / O terikat latensi tinggi - Anda masih dapat melakukan pekerjaan yang intensif CPU - mengerjakan pekerjaan rumah matematika, katakan - saat Anda menunggu untuk mendapatkan balasan surat Anda. Operasi mengerjakan pekerjaan rumah matematika Anda dan membaca email Anda tidak disinkronkan.
Tapi anggaplah sekarang Anda mengirim surat dan jawabannya berisi nomor yang harus Anda lakukan pajak Anda. Sekarang Anda tidak dapat melakukan pekerjaan CPU - menghitung pajak Anda - sampai operasi I / O selesai. Tapi Anda masih bisa memotong rumput saat menunggu . Itu alur kerja asinkron yang telah menyatakan hubungan waktu antara bagian-bagiannya.
sumber
Saya seorang insinyur listrik, dan kami berurusan dengan sinkron vs asinkron di sirkuit logika (gerbang logika).
Katakanlah Anda memiliki gerbang-AND (atau gerbang apa saja), yang memiliki dua input, dan sebuah output.
Jika tidak sinkron, output akan diperbarui saat input mana pun berubah sehingga output berubah. Beginilah contoh Anda bekerja - program yang Anda sebutkan.
Namun, jika gerbang itu juga memiliki jam (misalnya, gelombang kuadrat periode 1 detik) yang melekat padanya, di mana ia memperbarui detak setiap detik, karena gelombang kuadrat bergerak dari rendah ke tinggi, itu sinkron. Itu terikat pada frekuensi jam. Jadi itu sinkron. Anda dapat menyambungkan jam itu ke banyak sirkuit, dan mereka akan beroperasi dalam ritme satu sama lain - tersinkronisasi. Jika program Anda hanya memeriksa apakah itu dibaca untuk dijalankan setiap detik, itu juga akan disinkronkan.
sumber
Bayangkan dua satelit yang mengorbit Bumi.
Satelit B dalam contoh di atas adalah dalam orbit geosinkron sebagaimana didefinisikan oleh
Seseorang tidak berpendapat bahwa satelit A adalah geosinkron hanya karena "ada atau terjadi [s] pada saat yang sama" dengan planet ini. Faktanya, satelit B itu sendiri juga tidak relevan - yang relevan adalah periode rotasi yang disinkronkan dengan periode rotasi dengan Bumi. Ini bukan tentang keberadaan benda secara simultan; ini tentang hubungan antara objek. Pegang pemikiran ini.
Misalkan saya memberi tahu Anda dua utas pada suatu sistem sedang berjalan pada saat yang sama. Thread A (TA) mengambil data untuk Proses A dan Thread B (TB) mengambil data untuk Proses B. Saya bertanya kepada Anda, "Apakah TA dan TB tidak sinkron?". Respons Anda adalah, "Bagaimana saya bisa tahu? Saya harus melihat kode yang memanggil mereka dalam proses masing-masing." Untuk itu saya akan membalas dalam upaya saya untuk menjadi rumit, "Tetapi saya katakan kepada Anda bahwa TA dan TB pasti berjalan pada saat yang sama."
Dan Anda, sebagai individu yang cukup pintar, akan merespons, "Sekali lagi - mereka mungkin berjalan bersamaan tetapi saya tidak memiliki petunjuk jika mereka berjalan secara tidak sinkron berkaitan dengan proses mereka masing-masing yang melibatkan mereka. TA dan TB yang berjalan secara tidak sinkron satu sama lain benar - benar membuat tidak masuk akal karena mereka tidak dilahirkan dari proses yang sama. "
Jadi sekarang kita harus mendapatkan intuisi bahwa keberadaan suatu hubungan adalah apa yang relevan di sini, bukan hanya keberadaan kedua utas itu sendiri. Ketika suatu metode dieksekusi secara tidak sinkron, apa yang kami katakan adalah bahwa pelaksanaan metode itu tidak " TIDAK perlu ada atau terjadi pada saat yang sama" seperti eksekusi metode yang memanggilnya. Ambil contoh berikut:
Dari diskusi kita tentang satelit sebelumnya, "Ini bukan tentang keberadaan simultan dari objek; ini tentang hubungan antara objek." Ini bukan tentang keberadaan metode pemanggilan dan metode pemanggilan; ini tentang keberadaan hubungan antara eksekusi penyerang dan eksekusi yang dipanggil. Jika kami melihat utas sistem kami dan menemukan bahwa
DoThatAsync()
itu dipanggil tetapi tidak dieksekusi, mungkin menunggu di penjadwal atau I / O lainnya, itu tidak berarti bahwa metode pemanggilanInvoker()
tidak mengeksekusi - ada pekerjaan yang bisa dilakukan lakukan. Tentu, mungkin pada titikawait
ingDoThatAsync()
, tapi itu tidak dijamin. Ini tidak berlaku untuk fungsi-fungsi lain begitu mereka dipanggil - jika mereka berhenti,Invoker()
berhenti - tidak peduli apa. Ini dijamin. Eksekusi antaraInvoker()
metode sinkron dan dipanggil "ada atau terjadi pada saat yang sama".sumber
Contoh Beton
Saya ingin menambahkan beberapa contoh di dunia nyata, dan menghubungkannya ke dunia rekayasa perangkat lunak. Pertama, pertimbangkan sesuatu yang saya harap cocok dengan definisi intuitif Anda tentang "sinkron": kilatan kunang-kunang , dalam beberapa keadaan. Kedua, pertimbangkan lomba estafet Olimpiade 4x100 putri . Ketiga, perhatikan kiasan lama dari film-film militer: "Men, selaraskan jam tanganmu!"
Sekarang, mari kita pikirkan apa yang sedang terjadi. Mari kita mulai dengan mengamati bahwa semua ini adalah proses , atau entitas yang diperpanjang dalam waktu . Tidak masuk akal untuk mengatakan bahwa mangkuk "sinkron" dan batu "async." Kedua, butuh dua untuk tango . Anda tidak dapat mengatakan bahwa "seorang pelari adalah sinkronisasi". Sinkronkan dengan apa? Akhirnya, agar dua proses melakukan sesuatu pada saat yang sama, kecuali mereka sudah memiliki frekuensi dan fase yang sama persis, satu atau keduanya harus menunggu .
Analisis
Ketika definisi kamus mengatakan dua entitas dalam sinkronisasi "terjadi atau ada pada saat yang sama", itu sangat sesuai dengan konsep cahaya dari kunang-kunang. Sayangnya, mengatakan bahwa cahaya "sinkron" adalah cara ceroboh untuk mengatakan bahwa proses pencahayaan kunang - kunang disinkronkan.
Jadi bagaimana sekelompok kunang-kunang, yang mungkin tidak memiliki Apple SmartWatch dan NTP untuk membimbing mereka, berhasil mem-flash ujung belakang mereka pada saat yang sama? Yah, itu sangat mudah jika mereka memiliki sarana untuk mengatur tempo yang konsisten dan dapat membuat sedikit penyesuaian untuk itu. Mereka hanya berkedip, dan jika lebih banyak orang melakukan flash tepat setelah mereka, mereka melambat (menambah penundaan), sedangkan jika lebih banyak berkedip tepat sebelum mereka, mereka mempercepat (mengurangi penundaan). Jadi mereka dapat menggunakan proses umpan balik sederhana untuk sampai pada dasarnya pada tempo dan fase yang sama. Pengamatan penting di sini adalah untuk mencatat bahwa mereka mencapai sinkronisasi dengan menunggu saat yang tepat untuk mem-flash .
Balapan 4x100 menarik karena Anda melihat kedua bentuk waktu proses dalam aksi: pelari dalam tim disinkronkan, sedangkan pelari di tim yang berbeda adalah "async". Pelari kedua dalam relai harus menunggu sampai pelari pertama memasuki zona transfer . Hand-off adalah acara sinkron antara kedua pelari tersebut. Namun, pelari di lajur yang berbeda tidak peduli apa yang terjadi di lajur lain , dan tentu saja tidak memperlambat dan melakukan hand-off secara sinkron. Setiap jalur pelari tidak sinkron sehubungan dengan satu sama lain. Sekali lagi, kita melihat bahwa sinkronisasi mensyaratkan menunggu, sedangkan asynchrony tidak.
Akhirnya, prajurit di kompi (peleton, tim pemadam kebakaran, dll.) Harus menyinkronkan arloji mereka sehingga mereka dapat menyerang musuh pada saat bersamaan . Mungkin beberapa tentara tiba di posisi mereka di depan yang lain, atau memiliki kesempatan untuk menembak musuh lebih cepat. Tetapi serangan simultan umumnya lebih efektif daripada serangan serampangan karena unsur kejutan. Jadi untuk mencapai sinkronisasi, banyak tentara harus menunggu waktu yang ditentukan untuk bertindak.
Mendefinisikan Fitur
Mengapa penekanan ini menunggu? Yah, itu karena menunggu adalah fitur penentu yang membedakan proses sinkron dan asinkron. Jika Anda memiliki dua proses yang tidak Anda ketahui, Anda harus, secara default, menganggap bahwa keduanya tidak sinkron. Misalnya, pengiriman paket dan ambulans yang dikendarai kemungkinan besar tidak disinkronkan. Untuk menunjukkan bahwa dua proses, pada kenyataannya, disinkronkan, Anda perlu menemukan momen yang sangat istimewa: titik sinkronisasi .
Pengemudi yang mengantar paket dan ambulans yang membawa seseorang ke rumah sakit biasanya tidak membagikan poin waktu yang kami identifikasi sebagai "titik sinkronisasi". Di sisi lain, kunang-kunang yang berkedip serentak memiliki titik sinkronisasi setiap kali mereka berkedip, pelari estafet memiliki titik sinkronisasi setiap kali mereka melepaskan tongkat pemukul, dan tentara memiliki titik sinkronisasi ketika mereka meluncurkan serangan mereka. Jika Anda dapat mengidentifikasi satu atau beberapa titik sinkronisasi, maka proses akan disinkronkan . Ini harus mudah dimengerti, karena "syn-" adalah awalan bahasa Yunani yang berarti "dengan" atau "bersama", dan "chrono" adalah akar bahasa Yunani untuk "waktu". "Disinkronkan" secara harfiah berarti "pada saat yang sama",
Batas
Perhatikan bahwa "sinkronisasi" tidak selalu berlaku untuk seluruh masa hidup salah satu atau kedua proses. Saya berpendapat bahwa itu hanya berlaku untuk "waktu tunggu hingga dan termasuk titik sinkronisasi" (s) ". Dengan demikian, dua proses dapat beroperasi secara tidak sinkron sampai mereka mencapai keadaan di mana mereka perlu berkomunikasi, kemudian mereka menjadi tersinkronisasi, bertukar informasi, dan kemudian melanjutkan secara tidak sinkron. Contoh sederhana adalah bertemu seseorang untuk minum kopi. Jelas, rapat adalah titik sinkronisasi (atau banyak, lebih tepatnya), dan fakta bahwa dua orang tiba pada titik itu menunjukkan sinkronisasi. Namun, kami tidak akan mengatakan itu karena dua orang bertemu untuk minum kopi, dua kehidupan manusia itu"disinkronkan". Mungkin itulah satu-satunya momen instan dalam kehidupan mereka yang mereka temui, dan semua hal lain yang mereka lakukan adalah independen.
Ini juga bukan kasus yang kebetulan bertemu menunjukkan sinkroni. Jika dua orang asing saling berpapasan di jalan, fakta bahwa mereka berada di tempat tertentu pada suatu waktu tidak membuktikan keserasian. Juga tidak ada fakta bahwa satu orang duduk di bangku menunggu bus, dan yang lainnya kebetulan lewat. Proses hanya sinkron ketika mereka bertemu untuk suatu tujuan .
Koneksi Perangkat Lunak
Sekarang, mari kita pikirkan tentang tugas yang sangat mendasar dalam perangkat lunak: membaca dari file. Seperti yang mungkin Anda ketahui, penyimpanan massal biasanya ribuan hingga jutaan kali lebih lambat daripada cache atau memori utama. Untuk alasan ini, sistem operasi dan perpustakaan bahasa pemrograman umumnya menawarkan operasi I / O yang sinkron dan asinkron. Sekarang, bahkan jika program Anda hanya memiliki satu utas, Anda harus menganggap OS sebagai "proses terpisah" untuk keperluan diskusi ini.
Sinkronkan
Ketika Anda membuat "I / O sinkron membaca", utas Anda harus menunggu hingga data tersedia, pada titik mana itu berlanjut. Ini sangat mirip dengan pelari estafet yang menyerahkan tongkat estafet ke pelari berikutnya, tetapi bayangkan sebuah estafet dengan hanya dua pelari yang berjalan sepanjang lintasan, dan pelari kedua juga menyerahkan kembali ke pelari yang pertama.
Dalam hal ini, utas program Anda dan proses I / O OS tidak "terjadi (berakting) pada saat yang sama", dan jadi aneh rasanya mengatakan bahwa proses ini "disinkronkan". Tapi itu cara yang salah untuk melihatnya! Itu seperti mengatakan: "Pelari di tim estafet tidak berlari pada saat yang sama, jadi mereka tidak disinkronkan." Faktanya, kedua pernyataan itu salah! Pelari dalam tim estafet melakukan dan harus berlari pada waktu yang sama, tetapi hanya pada saat yang sangat spesifik: penyerahan tongkat estafet. Faktanya, hanya momen spesial ini selama balapan yang meyakinkan kami bahwa tim estafet telah disinkronkan untuk memulainya! Jika kita melihat permintaan dan respons I / O sebagai "tongkat",
Di sisi lain, jika kita berpikir tentang sesuatu seperti Analisis Elemen Hingga pada superkomputer, kita melihat bahwa ribuan proses harus bekerja dalam langkah kunci untuk memperbarui keadaan global yang masif. Bahkan jika beberapa node menyelesaikan pekerjaan mereka untuk langkah waktu tertentu sebelum yang lain, mereka semua harus menunggu langkah waktu untuk menyelesaikan karena hasilnya menyebar ke tetangga melalui ruang. Sinkronisasi semacam ini seperti kunang-kunang: semua aktor melakukan tugas yang sama.
Varietas proses
Untuk alasan ini, kami dapat menemukan beberapa istilah untuk membantu kami melihat bahwa ada tiga jenis hal yang terjadi: "sinkronisasi homogen", "sinkronisasi heterogen", dan "sinkronisasi berurutan". Jadi ketika para aktor melakukan tugas yang sama secara bersamaan (FEA, kunang-kunang), mereka "homogen". Ketika mereka melakukan tugas yang berbeda secara bersamaan (tentara berlari vs merangkak vs berenang ke tujuan mereka, fisika vs suara vs benang AI dalam permainan), mereka "heterogen". Ketika mereka melakukan tugas satu per satu, mereka "berurutan" (relay runner, memblokir I / O). Mereka mungkin terlihat sangat berbeda, tetapi mereka memiliki satu properti penting: semua jenis aktor melakukan beberapa penantian untuk memastikan bahwa setiap orang tiba pada titik sinkronisasi pada saat yang sama. di antara titik-titik sinkronisasi, atau "melakukan tindakan yang sama" tidak relevan dengan properti sinkronisasi.
Pipeline render dalam GPU sinkron karena mereka semua harus menyelesaikan frame bersama, dan memulai frame baru bersama. Mereka homogen karena mereka melakukan jenis pekerjaan yang sama, dan mereka semua aktif bersama. Tetapi loop permainan utama dari server dan memblokir I / O thread yang memproses input jarak jauh heterogen karena mereka melakukan berbagai jenis pekerjaan, dan beberapa thread I / O tidak akan melakukan apa-apa sama sekali, karena tidak semua koneksi digunakan. Meski begitu, mereka disinkronkan, karena mereka harus berbagi keadaan secara atom (pemain tidak harus melihat pembaruan dunia permainan parsial, dan server juga tidak hanya melihat sebagian input pemain).
Async
Sekarang, mari kita pertimbangkan "async I / O read". Ketika program Anda mengirim permintaan ke OS untuk membaca sedikit data dari penyimpanan, panggilan akan segera kembali . Mari kita abaikan panggilan balik dan fokus pada pemungutan suara. Secara umum, saat data tersedia untuk program Anda tidak sesuai dengan titik waktu tertentu sejauh menyangkut utas program Anda. Jika program Anda tidak secara eksplisit menunggu data, maka utas tersebut tidak akan tahu persis kapan momen itu terjadi. Itu hanya akan menemukan bahwa data sedang menunggu saat berikutnya memeriksa.
Tidak ada waktu pertemuan khusus di mana OS dan utas program setuju untuk menyerahkan data. Mereka seperti dua kapal yang lewat di malam hari. Asynchrony ditandai dengan tidak adanya menunggu. Tentu saja, utas program seringkali berakhir pada menunggu operasi I / O, tetapi tidak perlu. Itu bisa dengan senang melanjutkan melakukan perhitungan lain saat pengambilan I / O terjadi, dan hanya memeriksa nanti ketika ada waktu luang. Tentu saja, begitu OS selesai mengambil data, ia juga tidak menunggu. Itu hanya menempatkan data di tempat yang nyaman dan melanjutkan bisnisnya. Dalam hal ini, itu seperti program menyerahkan tongkat ke OS, dan OS muncul kemudian, menjatuhkan tongkat di tanah bersama dengan data, dan berjalan keluar dari trek. Program mungkin atau mungkin tidak menunggu untuk menerima hand-off.
Paralelisme
Ketika kita menandai fungsi sebagai "async" dalam perangkat lunak, itu sering berarti kita menginginkan paralelisme . Tetapi ingat bahwa paralelisme tidak menyiratkan sinkronisasi . Kunang-kunang adalah contoh yang baik, karena mereka juga menunjukkan perilaku sinkron dan asinkron. Sementara sebagian besar lalat melintas serempak, banyak yang jelas tidak selaras dengan anggota kelompok lainnya dan melintas lebih acak. Lalat-lalat itu mungkin bertindak secara simultan , tetapi tidak semuanya disinkronkan .
Sekarang ketika kita menandai beberapa kode sebagai "async", itu terlihat lucu, karena itu menyiratkan bahwa sisa kode yang tidak ditandai adalah "sinkronisasi". Apa artinya itu? Bukankah kita bersikeras bahwa "sinkronisasi" memerlukan dua tango? Tetapi bagaimana jika kita berbicara tentang mengeksekusi kode dalam satu utas? Dalam hal ini, kita perlu mengambil langkah mundur dan berpikir tentang program sebagai urutan negara dan transisi antara negara-negara tersebut. Pernyataan dalam suatu program menyebabkan transisi negara. Kita dapat menganggapnya sebagai "proses mikro" yang dimulai dan berhenti dengan pernyataan. Titik-titik urutan yang ditentukan oleh bahasa tersebut, pada kenyataannya, adalah titik sinkronisasi dari "proses-mikro" ini. Dan dengan demikian, kita dapat melihat single-threaded,
Integritas bahasa pemrograman menjamin bahwa pembaruan negara tidak mengganggu pernyataan, dan titik urutan menentukan batas di mana kompiler tidak diizinkan untuk membuat optimasi yang dapat diamati. Misalnya, urutan evaluasi ekspresi dalam pernyataan mungkin tidak ditentukan atau tidak ditentukan, memberikan kebebasan kompilator untuk mengoptimalkan pernyataan dalam berbagai cara. Tetapi pada saat pernyataan berikutnya dimulai, program harus dalam keadaan yang terdefinisi dengan baik, jika PL itu sendiri sehat.
Sekarang, sudah jelas apa yang kita maksud dengan "async". Ini berarti persis bahwa kontrak sinkronisasi yang tersirat dalam satu blok kode dikecualikan untuk blok async. Diperbolehkan untuk memperbarui status program secara independen, tanpa jaminan keselamatan yang biasanya ditunjukkan oleh model perhitungan sekuensial (konsisten, sinkron). Tentu saja, ini berarti bahwa kita perlu berhati-hati agar tidak merusak keadaan program dengan tidak konsisten. Ini biasanya berarti bahwa kami memperkenalkan sinkronisasi eksplisit dan terbatas untuk berkoordinasi dengan blok async. Perhatikan bahwa ini berarti blok async dapat asinkron dan sinkron pada waktu yang berbeda! Tetapi mengingat bahwa sinkronisasi hanya menunjukkan keberadaan titik sinkronisasi, kita seharusnya tidak kesulitan menerima gagasan ini.
sumber
Salah satu cara untuk memikirkannya adalah instruksi SIMD , seperti AVX . Berikut ini beberapa contoh penggunaannya.
Instruksi SIMD sinkron memungkinkan Anda melakukan banyak perhitungan pada waktu yang bersamaan , di utas yang sama, dengan mengoperasikan Instruksi Tunggal tentang Banyak Data.
Sementara multithreading asynchrone memungkinkan Anda untuk melakukan beberapa perhitungan pada waktu "mungkin" "agak" "mirip".
Gabungkan ini dengan definisi berikut:
sumber
Sebuah analogi yang membuat saya mengerti perbedaan antara Sync vs Async vs Multi-threaded adalah dari seorang juru masak di dapur.
Bayangkan Anda membuat pasta. Anda memiliki tiga langkah:
Metode sinkron. Dalam skenario sinkron hanya ada satu orang (utas) melakukan semua pekerjaan secara berurutan. Pertama Anda merebus pasta dan Anda berdiri di sana menyaksikannya mendidih. Lalu Anda tiriskan dan sisihkan. Lalu Anda menyiapkan saus. Saat saus siap Anda ambil pasta, campur dengan saus dan hidangan Anda siap. Masalahnya di sini adalah itu tidak efisien. Karena Anda bekerja secara berurutan secara sinkron, Anda tidak bisa mengerjakan saus saat pasta mendidih. Jadi, itu membuat Anda membuang waktu, dan pasta Anda menjadi dingin ketika saus sedang disiapkan.
Metode asinkron. Dalam skenario ini, masih ada hanya satu juru masak (utas), tetapi saat pasta mendidih Anda pergi dan membuat saus Anda. Ketika pasta direbus, Anda
called-back
membuat saus untuk mengeringkannya, dan kemudian Andacalled-back
lagi untuk menyelesaikan saus. Ini lebih efisien sekarang, karena Anda menghemat waktu dan pasta Anda tidak perlu menunggu selama itu.Metode multi-utas. Sekarang, bayangkan Anda menyewa juru masak baru. Sekarang Anda memiliki dua koki (utas). Sementara satu juru masak melakukan pasta, juru masak kedua membuat saus Apakah perlu dalam skenario ini? Tidak, karena membuat pasta cukup sederhana agar efisien dengan metode asinkron. Dan, mengelola beberapa koki adalah biaya tambahan. Tetapi jika Anda membuat hidangan yang lebih rumit atau lebih banyak sekaligus, beberapa koki berguna.
sumber
Pertanyaan yang bagus, dan istilah-istilah yang sering digunakan dalam berbagai cara yang mengarah pada kebingungan.
Jawaban saya adalah bahwa istilah-istilah ini relatif - dan apa yang terkait dengan itu adalah program utama yang mengeksekusi (atau kadang-kadang untuk utas).
Istilah-istilah ini menentukan sesuatu tentang operasi internal & waktu program, apakah pesan dikirim atau diterima dengan cara pemblokiran (sinkronisasi) atau dengan cara yang tidak menghalangi (async). Jika utas (utama) diblokir dengan mengirim atau menerima, itu adalah "sinkronisasi" dan jika entah bagaimana interruptuble maka itu adalah "async". Untuk mengulangi, istilah-istilah ini adalah tentang implementasi yang berfungsi (reguler) sekaligus menangani acara.
(IMHO, tentu saja) begitu sebuah pesan muncul, tidak ada yang namanya sinkronisasi vs. async. Dalam olahpesan ada pengirim dan penerima, masing-masing dari mereka dapat memiliki sinkronisasi atau implementasi async independen dari yang lain - tetapi begitu sebuah pesan ada di kawat, itu hanya sebuah pesan, tidak ada lagi sinkronisasi atau async. Kami dapat mengklasifikasikan pesan sebagai permintaan atau balasan atau pesan satu arah, tetapi itu ortogonal untuk disinkronkan dan async (yang merujuk pada apakah implementasi memblokir menunggu atau dapat terganggu dengan cara tertentu).
sumber
"sinkron" berarti bahwa dua peristiwa terjadi pada saat yang sama - tetapi yang peristiwa?
Ketika kami mengatakan "eksekusi sinkron", kami berarti bahwa penelepon dan callee mengeksekusi (yaitu pada stack) pada saat yang sama. Mungkin itu makna yang Anda cari.
Ketika kita mengatakan "gerbang logika sinkron", berarti gerbang logika disinkronkan dengan jam cpu.
Ketika kami mengatakan "model sinkron" dalam konteks sistem terdistribusi, kami maksudkan bahwa semua node menjalankan program mereka dalam langkah-kunci, dan pesan yang dikirim dalam langkah n dijamin akan tiba pada awal langkah n +1.
Ketika Spesifikasi Bahasa Jawa mengatakan bahwa utas "disinkronkan dengan" yang lain, itu berarti bahwa tindakan di utas yang berbeda terjadi "pada saat yang sama" (sehubungan dengan yang terjadi sebelum hubungan). Dan ketika mereka mengatakan bahwa dua utas "menyinkronkan akses ke suatu objek", mereka sebenarnya berarti bahwa utas disinkronkan satu sama lain untuk memastikan mereka tidak pernah bekerja pada objek pada saat yang sama.
... dan saya cukup yakin Anda dapat menerapkan kata itu dalam konteks yang lebih banyak lagi, karena "sesuatu terjadi pada saat yang sama" adalah ide yang cukup umum :-)
sumber
Saya pikir kunci kebingungan Anda dapat disimpulkan dengan:
Yang perlu disadari adalah kalimat ini tidak masuk akal karena menggambarkan situasi yang mustahil. Jika HTML masih parsing maka proses unduhan skrip bahkan tidak akan dimulai jika asinkron.
Dalam pemrograman, sinkron berarti:
Sedangkan asinkron berarti:
Memang, aspek pemrograman asinkron yang tidak hadir ini biasanya membingungkan orang.
Cara skrip dimuat secara normal adalah penguraian html dijeda, kemudian skrip diunduh, ketika pengunduhan skrip selesai dijalankan dan kemudian penguraian html dilanjutkan. Penguraian html dan eksekusi skrip terjadi pada waktu "sama" (arti waktu yang sama bersamaan, tidak bersamaan).
Cara
async
skrip dimuat adalah html melihat tag skrip dan kemudian mengingat untuk mengunduh skrip di masa mendatang tetapi terus diurai. Penguraian html tidak dijeda untuk mengunduh skrip. Kemudian , setelah penguraian html selesai, semua skrip async diunduh dan dieksekusi. Penguraian html dan eksekusi skrip tidak terjadi secara bersamaan (sekali lagi, arti waktu yang sama secara bersamaan, dalam hal ini dieksekusi secara terpisah).Jadi untuk meringkas:
Script sinkron diurai bersama dengan html.
Skrip asinkron diuraikan secara terpisah di masa mendatang.
Jadi definisi dari
async
properti bukanlah bahwa skrip dieksekusi segera setelah diunduh - ini berlaku untuk skrip sinkron dan asinkron. Definisi async adalah penguraian html tidak menunggu skrip untuk diunduh .sumber