IO介面演化

2021-07-23 21:33:50 字數 1715 閱讀 9197

(1)阻塞

(2)多執行緒/程序

thread-safe 與 deadlock 問題難以解決,開銷大

「執行緒池」旨在減少建立和銷毀執行緒的頻率,其維持一定合理數量的執行緒,並讓空閒的執行緒重新承擔新的執行任務。「連線池」維持連線的快取池,盡量重用已有的連線、減少建立和關閉連線的頻率。這兩種技術都可以很好的降低系統開銷,都被廣泛應用很多大型系統,如apache,mysql

資料庫等。

(3)非阻塞

如果所有裝置都一直沒有資料到達,呼叫者需要反覆查詢做無用功

(4)io復用事件驅動伺服器模型 即select poll

使用 select() 介面同時從多個客戶端接收資料的過程;由於 select() 介面可以同時對多個控制代碼進行讀狀態、寫狀態和錯誤狀態的探測,

單個程序能夠監視的檔案描述符的數量存在最大限制;select需要複製大量的控制代碼資料結構,產生巨大的開銷 ;應用程式需要消耗大量時間去輪詢各個控制代碼才能發現哪些控制代碼發生了事件

(5)epoll

linux 2.5.44中引入的類似select,它把描述符列表交給核心,一旦有事件發生,核心把發生事件的描述符列表通知給程序,這樣就避免了輪詢整個描述符列表。

遺憾的是不同的作業系統特供的 epoll 介面有很大差異,所以使用類似於 epoll 的介面實現具有較好跨平台能力的伺服器會比較困難。

(6)libevent libevent框架本質上是乙個典型的reactor模式,所以只需要弄懂reactor模型,libevent就**不離十了

libevent是乙個事件觸發的網路庫,適用於windows、linux、bsd等多種平台,內部使用select、epoll、kqueue等系統呼叫管理事件機制。

libevent 庫實際上沒有更換select()poll()或其他機制的基礎。而是使用對於每個平台最高效的高效能解決方案在實現外加上乙個包裝器。

為了實際處理每個請求,libevent 庫提供一種事件機制,它作為底層網路後端的包裝器。事件系統讓為連線新增處理函式變得非常簡便,同時降低了底層 i/o 複雜性。這是 libevent 系統的核心。

1)event 及 event_base事件管理包括各種io(socket)、定時器、訊號等事件,也是libevent應用最廣的模組;

2 ) evbuffer  event 及 event_base 快取管理是指evbuffer功能;提供了高效的讀寫方法

3)  evdns  dns是libevent提供的乙個非同步dns查詢功能;

4)  evhttp http是libevent的乙個輕量級http實現,包括伺服器和客戶端

libevent也支援ssl,這對於有安全需求的網路程式非常的重要,但是其支援不是很完善,比如http server的實現就不支援ssl。

(7) libev 比libevent更高效的實現,bug更少。

基礎IO 標準庫IO介面 系統呼叫IO介面

標準庫io介面 fopen fclose fread fwrite fseek file fopen const char path,const char mode r唯讀開啟,檔案不存在報錯 r 讀寫開啟,檔案不存在報錯 w只寫,檔案不存在則建立 若存在則清空原內容 w 讀寫開啟,檔案不存在則建立...

c標準庫I O介面和系統呼叫I O介面

c標準庫i o介面 fopen 函式原型 file fopen const char path,const char mode 功能 開啟檔案,並返回指向該檔案的指標 引數 path 開啟檔案的路徑及檔名 mode 開啟檔案的方式,其可以有以下值 r 唯讀方式開啟,檔案必須存在,若不存在則報錯 r ...

系統檔案I O介面

檔案io是指對檔案進行資料輸入與資料輸出,我們程式的本質就是對輸入的資料進行處理然後輸出,可是資料是在檔案中的,在linux下一切皆檔案,所以程式就是要實現對檔案的讀寫操作 可是我們程式不能直接去操作檔案,這個時候就需要系統提供呼叫介面來供我們使用從而根據系統介面處理讀寫資料。我們在c語言中學習的幾...