Arti asinkron vs sinkron [ditutup]

46

Apa arti kata asinkron dan sinkron dalam ilmu komputer?

Jika Anda google arti kata-kata Anda akan mendapatkan yang berikut:

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?

Mohammad Nazayer
sumber
47
Saya merasa mudah untuk mengatakan: jika saya tidak mengerti bagaimana kodenya bekerja dan jika bug tiba-tiba hilang ketika saya mencari mereka, kodenya mungkin asinkron. :)
Eric Duminil
4
Kebenaran yang menyedihkan adalah bahwa dalam domain pemrograman, seiring waktu kata-kata ini menjadi kebalikan dari apa yang mereka maksudkan. Mungkin ada alasan historis untuk artinya saat ini tetapi tidak ada pembenaran yang baik.
Solomonoff's Secret
3
Pada saat yang sama dengan apa , adalah kuncinya :)
Lightness Races dengan Monica
5
Operasi yang sebenarnya tidak (perlu) terjadi pada saat yang sama dengan fungsi dipanggil vs operasi tidak terjadi pada saat yang sama fungsi dipanggil ... sepertinya tidak terbalik bagi saya? Jika saya menggambarkan suatu fungsi sebagai tidak sinkron, saya mengatakan apa pun yang dilakukannya tidak dijamin akan terjadi pada saat yang sama saat Anda memanggilnya.
Affe
2
"berurutan" dan "tidak berurutan" mungkin merupakan pilihan yang lebih baik secara semantik, tetapi kapal itu memiliki cara, sudah berlayar.
Jared Smith

Jawaban:

47

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:

Sinkron: ada atau terjadi pada saat yang sama.

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).

Asinkron: tidak ada atau terjadi pada saat yang bersamaan.

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.

Doc Brown
sumber
4
Sayang sekali ini memiliki begitu banyak upvotes, karena saya pikir itu salah. Metode sinkron mengeksekusi satu demi satu, karena metode kedua harus menunggu metode (pemblokiran) pertama selesai. Kedua metode itu jelas tidak dijalankan pada saat yang sama.
Robert Harvey
6
Tidak, kurasa tidak. Sinkronisasi dan simultan bukan hal yang sama.
Robert Harvey
1
Saya ingin menegaskan bahwa definisi kamus tidak banyak berguna bagi pengembang perangkat lunak. Mencoba memetakan definisi kamus ke istilah teknis yang kita gunakan mungkin tidak berguna.
Robert Harvey
1
Bagaimanapun, suntingan Anda memang meningkatkan hal-hal, tetapi kata-kata "ada atau terjadi pada saat yang sama" mengacaukan deskripsi Anda. Metode sinkron tidak menjalankan "pada saat yang sama;" mereka mengeksekusi dalam urutan yang terurut , yang membuat mereka sinkron.
Robert Harvey
1
@RobertHarvey Definisi kamus berfungsi dengan baik jika Anda menggunakan perspektif yang benar. Anda semua terobsesi dengan waktu eksekusi. Instruksi memiliki seumur hidup di luar ketika mereka dieksekusi. Instruksi berurutan bergerak secara sinkron seperti halnya peluru dalam revolverer bergerak secara sinkron. Demikian pula instruksi dapat bergerak secara sinkron melalui jalur pipa instruksi. Berhenti terobsesi pada perspektif eksekusi. Banyak omong kosong terjadi pada instruksi sebelum dieksekusi.
candied_orange
20

Saya menemukan bahwa cara terbaik untuk memahaminya adalah sebagai berikut:

  • Sinkron: Kami tahu kapan itu akan terjadi (itu terjadi ketika kode lain ini berakhir).
  • Asinkron: Kami tidak tahu kapan itu akan terjadi.

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"? .

Theraot
sumber
Persis. Deskripsi yang ditemukan oleh OP terdengar lebih banyak tentang paralelisme daripada sinkronisasi (jika itu sebuah kata ...). asynch vs synch adalah tentang kapan aksi dimulai (saat ini ketika saya menyebutnya, atau nanti ketika scheduler memutuskan) sementara paralel berarti "ya mereka terjadi pada saat yang sama" vs berurutan.
Giacomo Alzetta
1
@ GiacomoAlzetta Saya pikir kata itu adalah sinkronisasi. Saya juga menemukan kata-kata yang serupa: sinkronisasi, sinkronisasi, dan sinkronisitas. Mungkin layak pertanyaannya sendiri.
Theraot
12

Asinkron: tidak ada atau terjadi pada saat yang bersamaan.

Sinkron: ada atau terjadi pada saat yang sama.

Atribut async berarti bahwa skrip akan dieksekusi segera setelah diunduh bahkan jika html masih parsing, yang berarti kedua proses ada pada waktu yang sama dengan saya.

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:

  • eksekusi dan parsing benar-benar tidak disinkronkan; keduanya dapat terjadi kapan saja dan dalam urutan apa pun, apa pun yang paling efisien.
  • eksekusi dan penguraian disinkronkan; katakanlah, CPU tidak melakukan apa - apa sambil menunggu I / O selesai.
  • eksekusi dan penguraian disinkronkan, tetapi sementara kami menunggu I / O untuk menyelesaikan, CPU diizinkan untuk melakukan pekerjaan lain, dan kemudian kembali dan melakukan penguraian setelah pengunduhan selesai .

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 awaitoperator 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.

Eric Lippert
sumber
6

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.

DrOnline
sumber
1
Seperti port serial tidak sinkron / sinkron.
jiwopene
2

Bayangkan dua satelit yang mengorbit Bumi.

  • Satelit A memiliki periode rotasi di sekitar Bumi sedemikian rupa sehingga untuk setiap rotasi penuh planet ini, satelit tersebut telah mengelilingi Bumi kurang lebih satu kali .
  • Satelit B memiliki periode rotasi di sekitar Bumi sedemikian rupa sehingga untuk setiap rotasi penuh planet ini, satelit tersebut telah mengelilingi bumi tepat satu kali .

Satelit B dalam contoh di atas adalah dalam orbit geosinkron sebagaimana didefinisikan oleh

memiliki periode rotasi yang sinkron dengan rotasi bumi.

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:

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

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

    await DoThatAsync();

    CheckThat();
}

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 pemanggilan Invoker()tidak mengeksekusi - ada pekerjaan yang bisa dilakukan lakukan. Tentu, mungkin pada titik awaiting DoThatAsync(), 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 antara Invoker()metode sinkron dan dipanggil "ada atau terjadi pada saat yang sama".

8 proton
sumber
Saya sebenarnya suka ini. Secara umum, ini adalah sisi liar dari eksekusi sewenang-wenang sebagai "asinkron" vs. jalur eksekusi yang jelas didefinisikan sebagai "sinkron"
Cruncher
Saya juga berpikir bahwa ini adalah jawaban terbaik.
Barmar
2

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.

Manusia mesin pemotong rumput
sumber
Anda dapat menghapus semua contoh di sini kecuali untuk lomba relai (yang dengan jelas mengilustrasikan konsep perangkat lunak tentang sinkronisasi dan asinkron, sedangkan yang lainnya tidak), dan jawaban Anda akan meningkat secara signifikan.
Robert Harvey
Saya pikir contoh lain menunjukkan aksi simultan vs aksi heterogen, yang saya yakini menyebabkan banyak kebingungan OP.
Lawnmower Man
1

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:

kata sifat sinkron syn · ch · · nous | \ ˈSiŋ-krə-nəs, ˈsin-

1: terjadi, ada, atau muncul pada waktu yang bersamaan [penekanan milikku]

kata sifat asynchronous asyn · chro · nous | \ (ˌ) ā-ˈsiŋ-krə-nəs, -ˈsin- \

1: [...]: tidak sinkron

Peter
sumber
1

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:

  1. Rebus dan tiriskan pasta
  2. Siapkan saus
  3. Campurkan pasta dan saus

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-backmembuat saus untuk mengeringkannya, dan kemudian Anda called-backlagi 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.

bobek
sumber
Ini sebenarnya analogi yang cukup bagus.
Robert Harvey
0

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).

Erik Eidt
sumber
Non-pemblokiran berbeda dari asinkron,
user207421
1
@ user207421 tolong jelaskan, karena saya akan menyebut mereka sinonim dalam konteks ini
Jacob Raihle
0

"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 :-)

meriton - mogok
sumber
0

Saya pikir kunci kebingungan Anda dapat disimpulkan dengan:

Atribut async berarti skrip akan dieksekusi segera setelah diunduh bahkan jika html masih diuraikan

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:

Semua data yang Anda minati sudah ada di memori pada saat Anda mengeksekusi logika Anda

Sedangkan asinkron berarti:

Beberapa data yang Anda minati belum ada dan hanya ada di beberapa titik di masa mendatang

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 asyncskrip 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 asyncproperti bukanlah bahwa skrip dieksekusi segera setelah diunduh - ini berlaku untuk skrip sinkron dan asinkron. Definisi async adalah penguraian html tidak menunggu skrip untuk diunduh .

Slebetman
sumber