Apakah sebenarnya perbezaan antara segerak/tak segerak dan menyekat/tidak menyekat?
怪我咯
怪我咯 2017-05-17 10:08:42
0
4
936

Setakat yang saya faham, penyegerakan/penyekatan adalah konsep yang sama Pelanggan sedang menunggu resit daripada pelayan Jika pelayan tidak mengembalikan resit, pelanggan tidak akan meneruskan; tidak menunggu resit daripada pelayan , pergi terus ke bawah, tunggu sehingga pemprosesan bahagian pelayan selesai, dan kemudian panggil fungsi panggil balik tak segerak untuk memberitahu klien.

Tetapi secara khusus, saya tidak dapat membezakan antara penyegerakan dan penyekatan serta asynchronous dan non-block. Bolehkah sesiapa menjelaskan kekeliruan itu?

怪我咯
怪我咯

走同样的路,发现不同的人生

membalas semua(4)
習慣沉默

Cadangkan catatan blog untuk bercakap tentang lima model IO Linux. Ia ditulis dengan sangat baik. Biar saya beritahu anda ini secara ringkas.
Pertama sekali, hanya penyegerakan mempunyai apa yang dipanggil menyekat dan tidak menyekat, asynchronous tidak. Salah faham yang biasa ialah kami berpendapat asynchronous bermaksud tidak menyekat, tetapi ini tidak berlaku. Perbezaan antara penyegerakan dan ketidaksegerakan di sini ialah sama ada terdapat sebarang sekatan dalam "keseluruhan proses" rangkaian IO atau cakera IO adalah keseluruhan proses.
Ambil panggilan sistem baca sebagai contoh Sebagai urutan pengguna, apabila anda memulakan panggilan sistem baca, ia boleh dibahagikan kepada dua operasi,

.
  • Yang pertama ialah bacaan data: membaca data dari cakera ke ruang kernel Kita semua tahu bahawa membaca adalah panggilan sistem dan benang peringkat pengguna tidak boleh mengendalikannya hanya kepada benang kernel untuk diproses, dan kernel benang mesti Cari data dahulu dan membacanya ke dalam ruang kernel.

  • Yang kedua ialah salinan data: membaca data dari ruang kernel ke ruang pengguna. Kemudian benang pengguna boleh menggunakan data ini.

Secara ringkasnya,

  • Penyegerakan bermakna kedua-dua proses di atas disekat, dan urutan pengguna anda telah menunggu.

  • Tidak menyekat bermakna anda tidak disekat dalam proses pertama di atas, tetapi urutan pengguna mesti sentiasa bertanya kepada OS sama ada data telah disalin dari cakera ke ruang dalaman Jika salinan selesai, ia akan disekat semasa proses penyalinan data. Jadi semua proses penyegerakan menyekat dalam fasa kedua, walaupun ini adalah panggilan tidak menyekat.

  • Multiplexing: Seperti tidak menyekat, ia juga menyekat pada peringkat kedua, tetapi pada peringkat pertama, anda tidak lagi bertanya sistem pengendalian itu sendiri, tetapi secara seragam diserahkan kepada benang kernel untuk diproses (polling dilaksanakan di Linux , dan versi epoll yang dipertingkatkan), apabila bacaan data anda selesai, urutan ini menghantar isyarat kepada urutan pengguna yang pada asalnya memulakan panggilan sistem, dan kemudian urutan pengguna memasuki penyekatan dan memulakan penyalinan data.

  • Asynchronous: Kedua-dua proses di atas adalah tidak menyekat.

Di atas hanyalah penerangan ringkas, semoga membantu

PHPzhong

Konsep penyegerakan dan tak segerak terutamanya menerangkan aspek IO. Ringkasnya, perbezaan utama antara penyegerakan dan tak segerak ialah cara untuk memberitahu proses panggilan atau urutan Pemberitahuan pemulangan segera adalah segerak, manakala pemberitahuan melalui panggilan balik berdaftar adalah tidak segerak. Menyekat dan tidak menyekat terutamanya menggambarkan situasi pemulangan panggilan fungsi. Fungsi yang kembali serta-merta adalah tidak menyekat, dan fungsi yang digantung ialah menyekat.

Sebagai analogi mudah, jika anda pergi ke restoran untuk memesan makanan.

sekatan segerak

Anda memberitahu kerani pesanan bahawa anda mahu mee daging lembu Taiwan Selepas mendengar ini, kerani pesanan pergi ke dapur dan mengambil sedikit masa untuk membawanya kepada anda. Dalam tempoh masa ini, anda menunggu dengan bodoh di meja depan tanpa sebarang jawapan atau melakukan apa-apa (menyekat) Anda tidak menerima sebarang balasan selepas membuat pesanan Proses menunggu adalah komunikasi segera.

segerak tidak menyekat

Anda memberitahu kerani pesanan bahawa anda mahukan mi daging lembu Lanzhou, dan kerani pesanan menjawab bahawa ia akan mengambil masa lima minit. Kemudian anda berfikir sejenak, anda boleh menyemak siaran dalam masa lima minit dan melakukan perkara lain untuk menghilangkan kebosanan anda. Tetapi tidak lama kemudian anda lapar, dan anda bertanya setiap minit sama ada ia okay, tetapi jawapan yang anda dapat ialah ia masih belum okey, dan anda tidak akan bersemuka sehingga 5 minit kemudian. Semasa menunggu, anda tidak melahu dan boleh melakukan perkara lain. Ini tidak menyekat. Memandangkan anda masih aktif meminta keputusan dan menunggu balasan pesanan, ini masih segerak.

Menyekat tak segerak dan tidak menyekat

Asynchronous yang dipanggil bermakna anda tidak perlu meminta keputusan secara aktif, tetapi mendaftarkan fungsi panggil balik. Iaitu, selepas anda membuat pesanan anda, kerani pesanan memberikan anda nombor. Terdapat mesin di sebelah anda Apabila tiba giliran anda, mesin akan menghubungi nombor anda. Proses memberitahu anda dipanggil tak segerak Jika anda duduk di tepi dan tidak melakukan apa-apa, maka anda berada dalam keadaan tersekat. Jika anda menyemak imbas halaman web di sebelah, ia tidak menyekat.

Jadi perbezaan antara segerak dan tak segerak terutamanya terletak pada kaedah pemberitahuan mesej Penyekatan dan bukan penyekatan terletak pada keadaan apabila panggilan fungsi sedang menunggu pemberitahuan, iaitu, sama ada ia digantung, supaya. benang atau proses semasa, dan sama ada ia boleh terus melakukan perkara lain.

Biasanya terdapat cara coroutine untuk mencapai bukan penyekatan tak segerak. Iaitu, apabila panggilan fungsi menemui IO, selepas mendaftarkan fungsi panggil balik, ia menangguhkan dan kembali Kerana ia kembali, ia tidak menyekat Kemudian apabila IO selesai, fungsi panggil balik memberitahu fungsi yang digantung untuk bangun, yang adalah tak segerak.

phpcn_u1582

Secara amnya, menyekat dan tidak menyekat merujuk sama ada panggilan IO kembali serta-merta (non-blocking) atau menunggu selesai sebelum kembali (blocking). Penyegerakan dan tak segerak ialah konsep yang luas dan merupakan manifestasi penyekatan dan bukan penyekatan.

给我你的怀抱

Sebenarnya, anda memahaminya dengan betul Penyegerakan bermakna bahawa tidak akan ada ketidakkonsistenan dalam data dan satu-benang dilaksanakan secara berurutan. Habis penyegerakan bermakna data tidak seragam Contohnya, apabila terdapat berbilang utas, data yang digunakan oleh utas ini mungkin diubah suai oleh utas lain, menyebabkan data tidak segerak. Menyekat dan tidak menyekat merujuk kepada sama ada untuk menunggu fungsi untuk kembali apabila benang berjalan, ia akan sentiasa menunggu Jika ia berbilang benang, ia tidak akan menunggu untuk pelaksanaan ke bawah masa, penyahsegerakan cenderung berlaku.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan