Rumah >hujung hadapan web >tutorial js >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.
Kami secara amnya memanggil kejadian program sebagai proses, yang merupakan unit asas peruntukan sumber dan penjadualan oleh sistem pengendalian. secara amnya merangkumi bahagian berikut:
进程表
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. 进程表项
进程控制块
Keadaan berjalan: Proses sedang berjalan pada masa ini dan menduduki CPU
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; ;Urutan mod pengguna ialah urutan terbina sepenuhnya dalam ruang pengguna Ciri utamanya adalah seperti 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
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;
Coroutine
memudahkan penukaran aliran kawalan dan memudahkan model pengaturcaraan.
async/await
mengembalikan
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; }
updateUserName
ialah kawalan keadaan semasa operasi sebenar: updateUserNameAsync
getUserById
user
Semasa pelaksanaan fungsi 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. true
Melalui 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 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.
Operasi I/O
yang lengkap perlu melalui peringkat berikut:
I/O
ke kernel; kernel 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 selepas A memanggil B, B serta-merta memberikan pemberitahuan kepada A bahawa permintaan telah diterima, dan kemudian memberitahu A tentang keputusan pelaksanaan melalui 回调
异步
, jadi perhatian khusus diperlukan: 阻塞/非阻塞
同步/异步
阻塞/非阻塞
调用者
同步/异步
被调用者
, mari lihat 阻塞/非阻塞
khusus. 同步/异步
I/O 模型
, 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:
I/O
Model ini hanya sesuai untuk aplikasi dengan konkurensi kecil Ini kerana satu permintaan I/O
I/O
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/O
Ciri: Memandangkan model ini memerlukan pengguna untuk terus bertanya tentang status kesediaan operasi
(biasanya menggunakan gelungI/O
Sebelum operasi while
siap, proses (benang) pengguna tidak akan disekat Selepas operasi I/O
I/O
I/O
. I/O
I/O
Kriteria untuk menilai operasi I/O
同步 I/O
atau 异步 I/O
ialah mekanisme komunikasi antara proses (benang) pengguna dan operasi
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 异步
I/O
I/O
I/O
JavaScript berjalan dalam mod satu benang di bawah V8, dan amat sukar untuk melaksanakan berbilang benang untuknya; majoriti aplikasi rangkaian adalah
I/O
I/O
Benang 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.
Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: I/O
tutorial 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!