Linu epoll 三種模式

2021-08-04 02:22:45 字數 1107 閱讀 3837

io操作方式

阻塞等待

好處:不占用cpu寶貴的時間片

缺點:同一時刻只能處理乙個操作,效率低

非阻塞,忙輪詢

好處:提高了程式的執行效率

缺點:需要占用更多的cpu和系統資源

解決方案:

1.select(最高鏈結1024個檔案描述)/poll(陣列無限制)

只會提示有幾個客戶端鏈結, 需要伺服器遍歷找出是哪些?

2.epoll

不止提示有幾個客戶端鏈結, 還會提供是哪些鏈結資訊

i/o多路轉接技術

1.先構造一張有關檔案描述符的列表,將要監聽的檔案描述符新增到該檔案

2.然後呼叫乙個函式,監聽該表中的檔案描述符,直到這些描述符表中的乙個進行i/o操作時,該函式才返回。

該函式為阻塞函式

函式對檔案描述符的檢測操作是由核心完成的

3.在返回時,它告訴程序有多少(哪些)描述符要進行i/o操作。

1.水平觸發模式-根據讀來解釋

只要fd對應的緩衝區有資料

epoll_wait返回

返回的次數與傳送資料的次數沒有關係

epoll預設的工作模式

2.邊沿觸發模式-et

fd - 預設阻塞屬性

客戶端給server傳送資料

發一次資料 server 的 epoll_wait返回一次

不在乎資料是否讀完

如果讀不完,如何全部讀出來?

while(recv())

資料讀完之後recv會阻塞

解決阻塞問題

設定非阻塞 - fd

3. 邊沿非阻塞觸發

效率最高

如何設定非阻塞

1.open()

設定flags

必須 o_wdrw | o_nonblock

終端檔案: /dev/tty

2.fcntl

int flag = fcntl(fd, f_getfl);

flag |= o_nonblock;

fcntl(fd, f_setfl, flag);

將緩衝區的全部資料都讀出

while(recv() > 0)

當緩衝區資料讀完之後 , 返回為0

三種工廠模式

本文介紹設計模式中的工廠模式。工廠模式,顧名思義,就是本來我們需要某樣東西,需要自己造,可有了工廠呢?我需要該東西時,只需告訴工廠,工廠就會生產該東西,一定程度上,把使用者和生產者分開了。解耦了。追本溯源,假設我們現在有乙個類a,類a裡需要類b的乙個物件,一般的處理是這樣,b b new b 但這樣...

vi三種模式

vi 編輯器 寫原始檔 vi 檔名 三種模式 命令模式 wq 儲存退出 q 強制退出 w 儲存 q 退出 插入模式 a i o a i o esc 可視模式 v 可視 ins 替換 y p d 複製作用 gcc 編譯器 翻譯別的型別 gcc 原始檔 a.out gcc 原始檔 o 名字 編譯錯誤時不...

三種工廠模式

include include include using namespace std class operation double geta const double getb const void seta double x void setb double y virtual double g...