Mari kita bincangkan tentang proses, rangkaian, coroutine dan model konkurensi dalam Node.js

青灯夜游
Lepaskan: 2022-07-19 20:11:07
ke hadapan
2486 orang telah melayarinya

Mari kita bincangkan tentang proses, rangkaian, coroutine dan model konkurensi dalam Node.js

Node.js kini telah menjadi ahli kotak alat untuk membina perkhidmatan aplikasi rangkaian konkurensi tinggi Mengapa Node.js menjadi kegemaran orang ramai? Artikel ini akan bermula dengan konsep asas proses, utas, coroutine dan model I/O serta memberi anda pengenalan menyeluruh tentang perkara ini tentang Node.js dan model concurrency.

Proses

Kami secara amnya memanggil kejadian program sebagai proses, yang merupakan unit asas peruntukan sumber dan penjadualan oleh sistem pengendalian. secara amnya merangkumi bahagian berikut:

  • Program: kod yang akan dilaksanakan, digunakan untuk menerangkan fungsi yang akan dilengkapkan oleh proses; proses, termasuk Data, memori yang diperuntukkan secara dinamik, timbunan fungsi pemprosesan pengguna, program boleh diubah suai dan maklumat lain
  • proses kemasukan jadual: Untuk melaksanakan model proses, sistem pengendalian mengekalkan jadual yang dipanggil
  • . Setiap proses menduduki satu
  • (juga dipanggil 进程表 Entri ini mengandungi maklumat status proses penting seperti pembilang program, penuding tindanan, peruntukan memori, status fail yang dibuka, maklumat penjadualan, dan lain-lain, dengan itu memastikan proses itu digantung. Selepas itu, sistem pengendalian dapat menghidupkan semula proses dengan betul. 进程表项进程控制块
  • Proses ini mempunyai ciri-ciri berikut:

Dinamik: Intipati proses ialah pelaksanaan program dalam sistem berbilang atur cara Proses dijana secara dinamik dan dimusnahkan secara dinamik ;
  • Konkurensi: Sebarang proses boleh dilaksanakan serentak dengan proses lain; peruntukan sistem dan penjadualan sumber ;
  • Asynchronous: Disebabkan oleh kekangan bersama antara proses, proses tersebut mempunyai pelaksanaan terputus-putus, iaitu, proses maju pada kelajuan yang bebas dan tidak dapat diramalkan.
  • Perlu diingat bahawa jika program dijalankan dua kali, walaupun sistem pengendalian boleh membolehkan mereka berkongsi kod (iaitu, hanya satu salinan kod dalam ingatan), ia tidak boleh berubah program yang sedang berjalan Hakikat bahawa kedua-dua contoh adalah dua proses yang berbeza.
  • Semasa pelaksanaan proses, disebabkan pelbagai sebab seperti gangguan dan penjadualan CPU, proses akan bertukar antara keadaan berikut:

Keadaan berjalan: Proses sedang berjalan pada masa ini dan menduduki CPU Mari kita bincangkan tentang proses, rangkaian, coroutine dan model konkurensi dalam Node.js

Keadaan sedia: Proses sedia pada masa ini dan boleh dijalankan pada bila-bila masa, tetapi ia dihentikan buat sementara waktu kerana proses lain sedang berjalan; ;
  • Keadaan disekat: Proses berada dalam keadaan disekat pada masa ini Melainkan peristiwa luaran berlaku (seperti data input papan kekunci telah tiba), proses tidak akan dapat dijalankan.
  • Seperti yang dapat dilihat daripada rajah pensuisan keadaan proses di atas, proses boleh bertukar daripada keadaan berjalan kepada keadaan sedia dan keadaan menyekat, tetapi hanya keadaan sedia boleh ditukar terus kepada larian keadaan ini kerana:
Peralihan daripada keadaan berjalan kepada keadaan sedia disebabkan oleh penjadual proses, kerana sistem percaya bahawa proses semasa telah mengambil terlalu banyak masa CPU dan memutuskan untuk membiarkan yang lain proses menggunakan masa CPU; dan penjadual proses adalah sistem pengendalian Sebahagiannya, proses itu tidak merasakan kewujudan penjadual

Beralih dari keadaan berjalan ke keadaan menyekat adalah disebabkan oleh proses itu sendiri; sebab (seperti menunggu input papan kekunci pengguna Proses tidak boleh terus dilaksanakan dan hanya boleh menggantung dan menunggu sesuatu peristiwa (seperti data input papan kekunci telah tiba) berlaku apabila peristiwa yang berkaitan berlaku, proses mula-mula ditukar ke keadaan sedia. Jika tiada proses lain sedang berjalan pada masa ini, ia akan bertukar dengan segera kepada keadaan berjalan. Jika tidak, proses akan kekal dalam keadaan sedia dan menunggu proses itu.
  • Benang

Kadangkala, kita perlu menggunakan benang untuk menyelesaikan masalah berikut:

Apabila bilangan proses meningkat , Kos pertukaran antara proses akan menjadi lebih tinggi dan lebih tinggi, dan kadar penggunaan berkesan CPU akan menjadi lebih rendah dan lebih rendah Dalam kes yang teruk, ia boleh menyebabkan sistem menjadi beku dan fenomena lain; mempunyai ruang ingatan bebasnya sendiri, dan ruang ingatan antara setiap proses diasingkan antara satu sama lain, dan beberapa tugas mungkin perlu berkongsi beberapa data, jadi penyegerakan data antara berbilang proses adalah terlalu rumit.

    Mengenai benang, kita perlu mengetahui perkara berikut:
  • Benang ialah aliran kawalan berjujukan tunggal dalam pelaksanaan program, dan merupakan unit terkecil daripada sistem pengendalian boleh menjadualkan operasi , ia termasuk dalam proses dan merupakan unit berjalan sebenar dalam proses; proses Semua rangkaian berkongsi ruang memori proses (termasuk kod, data, timbunan, dsb.) dan beberapa maklumat sumber (seperti fail terbuka dan isyarat sistem
Benang dalam satu proses tidak kelihatan dalam proses lain.

    Sekarang kita memahami ciri asas utas, mari bercakap tentang beberapa jenis urutan biasa.
  • Benang mod kernel
  • Benang mod kernel ialah benang yang disokong secara langsung oleh sistem pengendalian Ciri-ciri utamanya adalah seperti berikut:
    • Penciptaan, penjadualan, penyegerakan dan pemusnahan benang diselesaikan oleh kernel sistem, tetapi overhednya agak mahal
    • Inti boleh memetakan benang mod kernel kepada setiap pemproses, membuat ia mudah untuk Teras pemproses sepadan dengan utas kernel, dengan itu bersaing sepenuhnya untuk dan menggunakan sumber CPU
    • hanya boleh mengakses kod dan data teras
    • penyegerakan sumber dan perkongsian data; kurang cekap daripada penyegerakan sumber proses dan kecekapan perkongsian data.

    Urutan mod pengguna

    Urutan mod pengguna ialah urutan terbina sepenuhnya dalam ruang pengguna Ciri utamanya adalah seperti berikut:

    • Penciptaan, penjadualan, penyegerakan dan pemusnahan benang diselesaikan oleh ruang pengguna, dan overhednya sangat rendah
    • Memandangkan benang mod pengguna diselenggara oleh ruang pengguna, kernel tidak; merasakan kewujudan benang mod pengguna sama sekali, jadi kernel sahaja Proses yang dimilikinya melakukan penjadualan dan peruntukan sumber, dan penjadualan dan peruntukan sumber benang dalam proses dikendalikan oleh program itu sendiri urutan mod pengguna untuk disekat dalam panggilan sistem, dan keseluruhan proses akan disekat; > Penyegerakan sumber dan perkongsian data lebih cekap.
    • Lightweight Process (LWP)

    Lightweight Process (LWP) ialah benang pengguna yang dibina di atas dan disokong oleh kernel berikut:

    Ruang pengguna hanya boleh menggunakan benang kernel melalui proses ringan (LWP), yang boleh dianggap sebagai jambatan antara benang mod pengguna dan benang kernel Oleh itu, hanya yang pertama sahaja dengan menyokong utas kernel bolehkah kita mempunyai proses ringan (LWP);

    • Kebanyakan operasi proses ringan (LWP) memerlukan ruang pengguna untuk memulakan panggilan sistem ini Kosnya agak tinggi (. memerlukan pertukaran antara mod pengguna dan mod kernel); benang kernel, ia boleh bersaing sepenuhnya dan menggunakan sumber CPU di seluruh sistem

    • Setiap proses ringan (LWP) ialah unit penjadualan Benang bebas, supaya walaupun proses ringan (LWP) disekat dalam panggilan sistem; , ia tidak akan menjejaskan pelaksanaan keseluruhan proses;
    • Proses ringan (LWP) perlu menggunakan sumber kernel (terutamanya merujuk kepada Ruang tindanan benang kernel), yang menjadikannya mustahil untuk menyokong sejumlah besar proses ringan (LWP) dalam sistem;

    • boleh mengakses semua ruang alamat dan sistem proses yang menjadi miliknya.
      • Ringkasan
      Di atas kita telah membincangkan secara ringkas jenis benang biasa (benang mod kernel, benang mod pengguna, proses ringan) Pengenalan, setiap daripada mereka mempunyai skop aplikasinya sendiri Dalam penggunaan sebenar, mereka boleh digabungkan secara bebas dan digunakan mengikut keperluan anda sendiri, seperti model satu-satu, banyak-ke-satu, banyak-ke-banyak dan lain-lain. . Disebabkan keterbatasan ruang, artikel ini saya tidak akan memperkenalkan terlalu banyak tentang perkara ini, dan pelajar yang berminat boleh melakukan penyelidikan mereka sendiri.
    • Coroutine

    Coroutine, juga dipanggil Fiber, ialah sejenis benang yang dibina di atas benang dan diuruskan oleh pembangun sendiri untuk penjadualan pelaksanaan , penyelenggaraan negeri dan gelagat lain , ciri utamanya ialah:

    Oleh kerana penjadualan pelaksanaan tidak memerlukan penukaran konteks, ia mempunyai kecekapan pelaksanaan yang baik; dalam komunikasi benang;

    memudahkan penukaran aliran kawalan dan memudahkan model pengaturcaraan.

    Dalam JavaScript, yang sering kita gunakan ialah pelaksanaan coroutine, seperti contoh berikut:

    Dalam contoh di atas, fungsi dan
      ialah:
    • memanggil fungsi
    • dan memberikan nilai pulangannya kepada pembolehubah
    • kaedah
    ;

    async/await mengembalikan

    kepada pemanggil. Perbezaan utama antara
    function updateUserName(id, name) {
      const user = getUserById(id);
      user.updateName(name);
      return true;
    }
    
    async function updateUserNameAsync(id, name) {
      const user = await getUserById(id);
      await user.updateName(name);
      return true;
    }
    Salin selepas log masuk

    updateUserName ialah kawalan keadaan semasa operasi sebenar: updateUserNameAsync

      Semasa pelaksanaan fungsi
    • , ikut urutan logik yang dinyatakan di atas Dilaksanakan dalam urutan getUserByIduser Semasa pelaksanaan fungsi
    • , ia juga dilaksanakan mengikut turutan mengikut urutan logik yang dinyatakan di atas, kecuali apabila
    • ditemui, user akan digantung dan disimpan Keadaan atur cara semasa di kedudukan penggantungan tidak akan bangun semula sehingga serpihan program selepas updateName kembali, dan memulihkan keadaan program sebelum menggantung, dan kemudian terus melaksanakan segmen program seterusnya.
    • trueMelalui analisis di atas, kita boleh meneka dengan berani: Apa yang perlu diselesaikan oleh coroutine bukanlah masalah konkurensi program yang perlu diselesaikan oleh proses dan utas, tetapi masalah yang dihadapi semasa memproses tugas tak segerak (seperti Fail operasi, permintaan rangkaian, dsb.); sebelum
    • , kami hanya boleh mengendalikan tugasan tak segerak melalui fungsi panggil balik, yang boleh menyebabkan kami jatuh ke dalam
    dan menghasilkan kucar-kacir kod yang secara amnya sukar untuk dikekalkan. kita boleh mencapai tujuan menyegerakkan kod tak segerak.

    Apa yang perlu diingat ialah keupayaan teras coroutine ialah dapat menggantung program tertentu dan mengekalkan keadaan kedudukan penggantungan program, dan menyambung semula pada kedudukan yang digantung pada satu ketika pada masa hadapan, dan meneruskan pelaksanaan selepas kedudukan penggantungan program seterusnya.

    Model I/O

    Operasi I/O yang lengkap perlu melalui peringkat berikut:

    • Proses pengguna melepasi sistem panggilan memulakan permintaan operasi I/O ke kernel; kernel
    • memproses permintaan operasi I/O (dibahagikan kepada fasa penyediaan dan fasa pelaksanaan sebenar), dan mengembalikan hasil pemprosesan kepada urutan pengguna.

    Kita boleh membahagikan operasi I/O secara kasar kepada empat jenis: 阻塞 I/O, 非阻塞 I/O, 同步 I/O, 异步 I/O Sebelum membincangkan jenis ini, kita mula-mula membiasakan diri dengan perkara berikut dua jenis: Konsep kumpulan (dengan andaian di sini bahawa perkhidmatan A memanggil perkhidmatan B):

    • 阻塞/非阻塞:

      • Jika A hanya selepas menerima respons daripada B Kembali, maka panggilannya adalah 阻塞调用;
      • Jika A kembali serta-merta selepas memanggil B (iaitu, tidak perlu menunggu B untuk menyelesaikan pelaksanaan), maka panggilannya adalah 非阻塞调用.
    • 同步/异步:

      • Jika B hanya memberitahu A selepas pelaksanaan selesai, maka perkhidmatan B ialah 同步; 🎜>Jika selepas A memanggil B, B serta-merta memberikan pemberitahuan kepada A bahawa permintaan telah diterima, dan kemudian memberitahu A tentang keputusan pelaksanaan melalui
      • selepas pelaksanaan selesai, maka perkhidmatan B ialah
      • . 回调异步
    • Ramai orang sering mengelirukan
    dengan

    , jadi perhatian khusus diperlukan: 阻塞/非阻塞同步/异步

      Untuk perkhidmatan Untuk
    • ; 阻塞/非阻塞调用者
    • untuk
    • perkhidmatan. 同步/异步被调用者
    • Sekarang kita faham
    dan

    , mari lihat 阻塞/非阻塞 khusus. 同步/异步I/O 模型

    Menyekat I/O

    Definisi: Selepas proses (benang) pengguna memulakan panggilan sistem

    , proses (benang) pengguna akan segera

    , sehingga keseluruhan operasi I/O diproses dan hasilnya dikembalikan kepada proses pengguna (benang), proses pengguna (benang) boleh melepaskan keadaan 阻塞 dan terus melakukan operasi seterusnya. I/O阻塞Ciri:

    Memandangkan model ini menyekat proses (benang) pengguna, model ini tidak menggunakan sumber CPU
    • sedang melaksanakan operasi
    • Apabila pengguna memasuki proses (benang), dia tidak boleh melakukan operasi lain;
    • I/O Model ini hanya sesuai untuk aplikasi dengan konkurensi kecil Ini kerana satu permintaan
    • boleh menyekat proses (benang) masuk, jadi untuk dapat Untuk membalas permintaan
    • tepat pada masanya, adalah perlu untuk memperuntukkan proses (benang) masuk untuk setiap permintaan, yang akan menyebabkan pendudukan sumber yang besar, dan untuk permintaan sambungan yang lama, sejak masuk ( benang) sumber benang tidak boleh dikeluarkan untuk masa yang lama, jika permintaan baharu seterusnya akan menyebabkan kesesakan prestasi yang serius. I/OI/O
    I/O tidak menyekat

    Definisi:

    Proses pengguna memulakan
      selepas panggilan sistem , jika Operasi
    • belum sedia, panggilan I/O akan mengembalikan ralat, dan pengguna tidak perlu menunggu apabila memasuki proses (benang), tetapi menggunakan tinjauan untuk mengesan sama ada operasi I/O sudah sedia; operasi 🎜>I/O sudah sedia, operasi I/O sebenar akan menyekat utas pengguna sehingga hasil pelaksanaan dikembalikan ke utas pengguna.
    • I/OCiri:

    Memandangkan model ini memerlukan pengguna untuk terus bertanya tentang status kesediaan operasi

    (biasanya menggunakan gelung
      ), model ini model perlu menduduki CPU dan menggunakan sumber CPU;
    • I/O Sebelum operasi while siap, proses (benang) pengguna tidak akan disekat Selepas operasi
    • siap,
    • yang berikutnya 🎜> operasi akan disekat Pengguna memasuki proses (benang); I/OI/OI/O
    • I/O Segerak (tak segerak)
    Selepas pengguna memulakan panggilan sistem

    dalam proses (benang), jika panggilan akan Jika proses (benang) pengguna disekat, maka panggilan akan menjadi

    , jika tidak, ia akan menjadi

    . I/OI/OKriteria untuk menilai operasi I/O 同步 I/O atau 异步 I/O ialah mekanisme komunikasi antara proses (benang) pengguna dan operasi

    , antaranya:

    Dalam kes

    • 同步, interaksi antara proses pengguna (benang) dan I/O disegerakkan melalui penimbal kernel, iaitu, kernel akan menyegerakkan hasil pelaksanaan operasi I/O ke penimbal, dan kemudian Salin data dalam penimbal ke proses pengguna (benang) Proses ini akan menyekat proses pengguna (benang) sehingga operasi I/O selesai; 🎜>, proses pengguna (benang) adalah sama seperti Interaksi
    • disegerakkan secara langsung melalui kernel, iaitu, kernel akan terus menyalin hasil pelaksanaan operasi
    • ke utas pengguna tidak akan menyekat urutan pengguna. 异步I/OI/O
    • Model konkurensi Node.js

    Node.js menggunakan model tak segerak berbenang tunggal, dipacu peristiwa sebab mengapa Alasan untuk memilih model ini ialah:

    I/OJavaScript berjalan dalam mod satu benang di bawah V8, dan amat sukar untuk melaksanakan berbilang benang untuknya; majoriti aplikasi rangkaian adalah

    Intensif, cara mengurus sumber berbilang benang secara munasabah dan cekap sambil memastikan keselarasan tinggi adalah lebih rumit daripada pengurusan sumber berbenang tunggal.
    • Ringkasnya, untuk tujuan kesederhanaan dan kecekapan, Node.js mengguna pakai model asynchronous
    • berbenang tunggal, dipacu peristiwa dan melaksanakannya melalui EventLoop bagi utas utama dan utas Pekerja tambahan Modelnya: I/O
    Selepas proses Node.js dimulakan, utas utama Node.js akan mencipta EventLoop Fungsi utama EventLoop adalah untuk mendaftarkan fungsi panggil balik acara dan laksana ia dalam gelung acara masa hadapan;

    I/OBenang Pekerja digunakan untuk melaksanakan tugas acara tertentu (dilaksanakan secara serentak dalam utas lain selain daripada utas utama), dan kemudian mengembalikan hasil pelaksanaan kepada EventLoop bagi utas utama supaya bahawa EventLoop boleh melaksanakan panggilan balik untuk fungsi yang berkaitan.

    • Perlu diambil perhatian bahawa Node.js tidak sesuai untuk melaksanakan tugasan intensif CPU (iaitu, memerlukan banyak pengiraan) ini kerana kod EventLoop dan JavaScript (tugas acara bukan tak segerak kod) dijalankan dalam utas yang sama (iaitu, utas utama). daya pemprosesan pelayan dan mungkin menyebabkan pelayan menjadi tidak bertindak balas.
    • Ringkasan

    Node.js ialah teknologi yang perlu dihadapi oleh pembangun bahagian hadapan sekarang malah pada masa hadapan Walau bagaimanapun, kebanyakan pembangun bahagian hadapan hanya tahu Node.js kekal di permukaan, untuk membolehkan semua orang lebih memahami model konkurensi Node.js, artikel ini mula-mula memperkenalkan proses, urutan dan coroutine, kemudian memperkenalkan model

    yang berbeza, dan akhirnya membuat pengenalan ringkas kepada model konkurensi Node.js memperkenalkan. Walaupun diperkenalkan Tidak banyak ruang pada model konkurensi Node.js, tetapi saya percaya ia tidak akan berubah tanpa meninggalkan asalnya Setelah anda menguasai asas yang berkaitan dan kemudian memahami dengan mendalam reka bentuk dan pelaksanaan Node.js, anda akan mendapat dua kali hasilnya dengan separuh usaha. Akhirnya, jika terdapat sebarang kesilapan dalam artikel ini, saya harap anda dapat membetulkannya.

    Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: I/Otutorial nodejs

    !

Atas ialah kandungan terperinci Mari kita bincangkan tentang proses, rangkaian, coroutine dan model konkurensi dalam Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!