**:預備知識.md
對於一次i/o操作(以讀操作為例),資料會先被拷貝到作業系統核心的緩衝區中,然後從作業系統核心的緩衝區拷貝到應用程式的緩衝區(這種方式稱為標準i/o或快取i/o,大多數檔案系統的預設i/o都是這種方式),最後交給程序。所以說,當乙個讀操作發生時(寫操作與之類似),它會經歷兩個階段:(1)等待資料準備就緒;(2)將資料從核心拷貝到程序中。
由於存在這兩個階段,因此產生了以下幾種i/o模式:
阻塞 i/o(blocking i/o):程序發起讀操作,如果核心資料尚未就緒,程序會阻塞等待資料直到核心資料就緒並拷貝到程序的記憶體中。
非阻塞 i/o(non-blocking i/o):程序發起讀操作,如果核心資料尚未就緒,程序不阻塞而是收到核心返回的錯誤資訊,程序收到錯誤資訊可以再次發起讀操作,一旦核心資料準備就緒,就立即將資料拷貝到了使用者記憶體中,然後返回。
多路i/o復用( i/o multiplexing):監聽多個i/o物件,當i/o物件有變化(資料就緒)的時候就通知使用者程序。多路i/o復用的優勢並不在於單個i/o操作能處理得更快,而是在於能處理更多的i/o操作。
非同步 i/o(asynchronous i/o):程序發起讀操作後就可以去做別的事情了,核心收到非同步讀操作後會立即返回,所以使用者程序不阻塞,當核心資料準備就緒時,核心傳送乙個訊號給使用者程序,告訴它讀操作完成了。
通常,我們編寫乙個處理使用者請求的伺服器程式時,有以下三種方式可供選擇:
每收到乙個請求,建立乙個新的程序,來處理該請求;
每收到乙個請求,建立乙個新的執行緒,來處理該請求;
每收到乙個請求,放入乙個事件列表,讓主程序通過非阻塞i/o方式來處理請求。
第1種方式實現比較簡單,但由於建立程序開銷比較大,會導致伺服器效能比較差;
第2種方式,由於要涉及到執行緒的同步,有可能會面臨競爭、死鎖等問題;
第3種方式,就是所謂事件驅動的方式,它利用了多路i/o復用和非同步i/o的優點,雖然**邏輯比前面兩種都複雜,但能達到最好的效能,這也是目前大多數網路伺服器採用的方式。
Python 事件驅動與非同步IO
一 事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含乙個事件迴圈,當外部事件發生時使用 機制來出發相應的處理。另外兩種常見的程式設計正規化是 單執行緒 同步以及多執行緒程式設計。1 讓我們用例子來比較和對比一下單執行緒 多執行緒以及事件驅動程式設計模型。下圖展示...
詳解協程,事件驅動模型,I O模型
什麼是事件驅動模型 協程介紹 協程是什麼 協程是微執行緒,他是一種使用者態的輕量級執行緒,它的好處是沒有執行緒切換的開銷,我們開多執行緒,執行緒的上下文切換是耗費cpu的開銷的,但是多協程裡邊,只是乙個控制流調到了另外乙個控制流,它還是單執行緒,所以協程很適合高併發,乙個cpu可以支援上萬的協程,因...
事件驅動和請求合併
今天看了seda的event driven模型,還有seda主頁上面的一些 覺得非常棒。我覺得在event driven的模型上,加上 請求合併 的演算法,這樣的框架,將會提高現在很多系統的併發效能。seda的event driven模型,就是把系統分成若干個stage,每個stage負責一部分功能...