您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Node.js是不是單線程嗎”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Node.js是不是單線程嗎”這篇文章吧。
在操作系統(tǒng)中,對(duì)進(jìn)程的解釋:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序在一個(gè)數(shù)據(jù)集上的一次動(dòng)態(tài)執(zhí)行的過程,是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,是應(yīng)用程序運(yùn)行的載體。
是應(yīng)用程序的一次運(yùn)行過程(動(dòng)態(tài)概念)
是系統(tǒng)分配和調(diào)度資源的基本單位(進(jìn)程是一般由程序、數(shù)據(jù)集合和進(jìn)程控制塊三部分組成)
每個(gè)進(jìn)程有自己獨(dú)立的空間地址,數(shù)據(jù)棧(各進(jìn)程間數(shù)據(jù)不共享,可通過其他方式進(jìn)行通信)進(jìn)程一般有初始態(tài),執(zhí)行態(tài),等待狀態(tài),就緒狀態(tài),終止?fàn)顟B(tài)五種狀態(tài)
線程是程序執(zhí)行中一個(gè)單一的順序控制流程,是程序執(zhí)行流的最小單元,是處理器調(diào)度和分派的基本單位。
任務(wù)調(diào)度和執(zhí)行的最小單位
一個(gè)進(jìn)程中代碼單一執(zhí)行路線
線程是程序執(zhí)行的最小單位,進(jìn)程是操作系統(tǒng)分配資源的最小單位一個(gè)進(jìn)程由一個(gè)或多個(gè)線程組成,線程是一個(gè)進(jìn)程中代碼的不同執(zhí)行路線進(jìn)程間相互獨(dú)立,但同一進(jìn)程下各線程之間共享程序的內(nèi)存空間線程上下文切換比進(jìn)程上下文切換要快
node是單線程的,即一個(gè)進(jìn)程只開一個(gè)線程node?!就扑]學(xué)習(xí):《nodejs 教程》】
真的單線程嗎?
Node 雖然是單線程,但是其底層是多線程的。事件循環(huán)中,libuv庫(kù)從事件隊(duì)列中取出任務(wù)再分配給不同的線程進(jìn)行處理?,F(xiàn)在硬件條件沒有以前那么落后,如果只使用單線程進(jìn)行操作,則會(huì)浪費(fèi)資源。所以,為了實(shí)現(xiàn)多進(jìn)程處理,充分發(fā)揮多核CPU的優(yōu)勢(shì),Node中提供了child_process模塊和cluster模塊。
child_process模塊用于開啟多個(gè)子進(jìn)程,子進(jìn)程中運(yùn)行不同的命令或執(zhí)行node.js模塊文件、可執(zhí)行文件
Cluster模塊,集群模塊,用于實(shí)現(xiàn)在Node.js應(yīng)用程序中開啟多個(gè)子進(jìn)程,每個(gè)子進(jìn)程中運(yùn)行一個(gè)Node.js應(yīng)用程序副本的處理
child_process.spawn():適用于返回大量數(shù)據(jù),例如圖像處理,二進(jìn)制數(shù)據(jù)處理。
child_process.exec():適用于小量數(shù)據(jù),maxBuffer 默認(rèn)值為 200 * 1024 超出這個(gè)默認(rèn)值將會(huì)導(dǎo)致程序崩潰,數(shù)據(jù)量過大可采用 spawn。
child_process.execFile():類似 child_process.exec(),區(qū)別是不能通過 shell 來執(zhí)行,不支持像 I/O 重定向和文件查找這樣的行為
child_process.fork(): 衍生新的進(jìn)程,進(jìn)程之間是相互獨(dú)立的,每個(gè)進(jìn)程都有自己的 V8 實(shí)例、內(nèi)存,系統(tǒng)資源是有限的,不建議衍生太多的子進(jìn)程出來,通常根據(jù)系統(tǒng)* CPU 核心數(shù)設(shè)置。
cluster.fork([env]) 開啟子進(jìn)程,子進(jìn)程中創(chuàng)建一個(gè)Node.js應(yīng)用程序的實(shí)例
isMaster屬性和isWorker屬性用于判斷是運(yùn)行在主進(jìn)程中,還是運(yùn)行在子進(jìn)程中
Workers屬性用于獲取所有子進(jìn)程中運(yùn)行的worker對(duì)象
擴(kuò)展一下,多線程之間如何通信?
四種:
消息傳遞(管道、FIFO、消息隊(duì)列)
信號(hào)量(互斥量、條件變量、讀寫鎖)
共享內(nèi)存(匿名、命名)
遠(yuǎn)程過程調(diào)用
進(jìn)程間的通信不僅在node中會(huì)遇到,其實(shí)在其他語言都會(huì)遇到的,當(dāng)然在面試中也是必提問的問題吧。
以上是“Node.js是不是單線程嗎”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。