node.js 異步I/O

因爲學習了一段時間的node.js了,發現如果對Node.js的原理不理解,很影響編程,所以便看了很多博客和書,包括大名鼎鼎的樸靈的《node.js深入淺出》還有《計算機操作系統》讓我對node.js的原理有了更好的理解,把我的一些理解記錄一下,也希望對正在學習node.js的道友有所幫助

爲什麼需要異步呢? 因爲現在的龐大的人羣已經不是簡單的服務器可以輕鬆勝任了,我們需要提高資源利用率。如果是同步的話,當我們有兩個程序之間存在前趨關係時,也就是說第二個資源對第一個資源有所依賴時,那麼耗時就是兩個時間之和,但我們如果使用異步,這兩個資源並不存在前趨關係,第二個資源並不受第一個資源是否完成的影響,那麼我們就可以享受併發的優勢。極大的提高了資源利用率。

下面來說下非阻塞I/O ,非阻塞I/O和異步並不一樣,解釋下就是非阻塞是我的進程不會被掛起,這叫非阻塞,而異步就是在意的如何得到返回結果,舉個例子,我們去買飯,大姨我要個雞腿飯,如果是同步的話,那我們就一直在那等着,如果是異步,那我們會說,我先去坐着好了叫我,那這樣看來買飯並不能耽誤我對其他事情的請求,也就是我還可以做其他事,等待大姨叫我拿飯就可以了。。所以兩者我倒覺得不能說以一種東西,他們所關注的地方不一樣,或許只能說既然異步那肯定不存在阻塞。。

我們通過上面已經可以理解異步I/O道理是怎麼回事了。那我們會想計算機中是如何實現這樣的異步I/O,因爲上面我們說了一個例子,也就是我們去買飯,只需要等待大姨的回覆就好,不需要我們主動的去問,那計算機如何判斷是否有迴應呢?那邊是事件輪詢,計算機需要一直判斷這個事件是否完全獲取數據。在我使用的window下的異步調用模型IOCP和node.js的異步調用模型十分相似。內部原理採用的線程池模擬異步I/O策略。
這裏寫圖片描述

node.js如何實現異步I/O呢?
首先我們要知道node.js本身的執行模式是-事件循環,所以回調函數在node.js應用廣泛。每一次循環過程我們成爲tick,每一次tick我們查看是否有事件待處理。回調函數就會在這時取出執行。而我們如何判斷每個tick是否有事件還需要執行呢,這時候就需要引入觀察者,通過觀察者詢問我們就可以知道是否有事件要執行。

發佈了83 篇原創文章 · 獲贊 68 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章