(1)流
▪ 可以進⾏i/o操作的核心物件
▪ ⽂件、管道、套接字……
▪ 流的⼊⼝:⽂件描述符(fd)
(2)i/o操作
所有對流的讀寫操作,我們都可 以稱之為io操作。
(3)阻塞
阻塞等待 不佔⽤cpu寶貴的時間⽚
⾮阻塞忙輪詢 佔⽤cpu,系統資源
在處理意⻅資料的接收場景時, 我們建議優先選擇阻塞等待的⽅ 式, 不浪費效能資源
(4)阻塞等待缺點:
不能夠很好的處理 多個(i/o)請求的問題
同⼀個阻塞,同⼀時刻只能處理⼀個流的阻塞監聽
(5)多路io復⽤
既能夠阻塞等待,不浪費資源
也能夠同⼀時刻監聽多個io請求的狀態
⽅法⼀ : 阻塞等待+多程序/多執行緒
需要開闢執行緒浪費資源
⽅法⼆:⾮阻塞+忙輪詢
whilecpu在⼤量的做判斷,while和fortrue
}}
cpu的利⽤率不⾼
方法三:多路io復⽤機制 select(與平台⽆關)
監聽的io數量有限,預設是1024個
不會精準的告訴開發者,哪些io是可讀可寫的,需要遍歷
while方法四:多路io復⽤機制 epoll(linux)true
}}
通過 /proc/sys/fd/file-max檢視)
while(1) 建立epolltrue
}
int epoll_create(int size);
(2) 控制epoll
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
(3) 等待epoll
int epoll_wait(int epfd, struct epoll_event *event, int maxevents, int timeout);
(4) 使⽤epoll程式設計主流程⻣架
⽔平觸發:
⽔平觸發的主要特點是,如果⽤戶在監聽epoll事件,當核心有事件的時候,會拷⻉給⽤戶態事 件,但是如果⽤戶只處理了⼀次,那麼剩下沒有處理的會在下⼀次epoll_wait再次返回該事 件。
預設就是⽔平觸發模式
邊緣觸發:
邊緣觸發,相對跟⽔平觸發相反,當核心有事件到達, 只會通知⽤戶⼀次,⾄於⽤戶處理還是不處理, 以後將不會再通知。這樣減少了拷⻉過程,增加了效能,但是相對來說,如果⽤戶⻢⻁忘記處理,將會產 ⽣事件丟的情況。
在給事件進⾏繫結的時候,通過epollet來設定
阻塞IO與非阻塞IO
阻塞io,當前程序因不滿足一些條件,而被掛起,即阻塞,cpu改去服務其它程序,read乙個普通檔案,就馬上執行,read乙個滑鼠,可是滑鼠沒有動,於是就阻塞了,阻塞的好處,利於os效能的發揮,cpu發揮高,雖然個體的費了點時間,但是總的效率得到了提高,阻塞在多路io的時候,缺陷就出來了,比如2路io...
非阻塞IO與阻塞IO
非阻塞式呼叫的問題 kibuv提供了乙個執行緒池 阻塞於非阻塞對於被呼叫者,即系統層面,系統為程式提供了阻塞呼叫和非阻塞呼叫,同步和非同步是對於呼叫者,就是自己的程式,發七呼叫,沒有其他操作,只是等待結果這個過程就是同步,發起呼叫後會等待結果,繼續完成其他的工作,等有回掉再執行,這個過程就是非同步的...
epoll水平觸發 邊沿觸發與非阻塞I O模型
epoll作為多路i o復用在linux的實現,無論是在模型方面,還是執行效率方面,相較於select和poll都有了較大改進。水平觸發 凡是epoll負責的輸入輸出源緩衝區有資料可讀或者可寫,epoll wait 就不會阻塞,或者說會通知。邊沿觸發 凡是epoll負責的輸入輸出源的緩衝區有新的資料...