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...