協程在io多路複用中的應用
阿新 • • 發佈:2020-10-15
阻塞式IO
在這裡插入圖片描述
-
socket的所有操作都由作業系統來提供,也就是通過系統呼叫來完成
-
每建立一個socket,就會在檔案描述符表中對應增加一條記錄,
而返回給應用程式的只有一個socket描述符,每個TCPsocket建立的時候,作業系統都會為它分配讀緩衝區和寫緩衝區
-
要獲得資料就要從讀緩衝區讀取過來,同樣的要通過socket傳送資料,就要寫入些緩衝區
- 當要寫入的資料沒有地方,或者讀取的資料沒有時候,就要有cpu一致在阻塞的等待,這就是阻塞式IO
在高併發場景下傢俱排程開銷
非阻塞式IO
就是讓出cpu,需要頻繁的檢查socket是否可讀可寫
IO多路複用
將要監聽的socket加入監聽集合
,這樣就可以通過一次系統呼叫,同時監聽多個socket,有socket就緒了,就可以逐個執行了,既不會為等待某個socket而阻塞,也不會陷入忙等待之中
Select IO多路複用
- 開啟檔案描述符個數為1024個
- 每次都要傳入所有監聽集合來看是否有就緒的socket
- 每次都要便利所有集合才知道哪個socket就緒
poll IO多路複用
可開啟的檔案描述符個數為最多的檔案描述符個數
其他依然存在
epoll IO多路複用
每個socke它有自己的資料結構,新增或者刪除的時候都會傳入一個結構體,epoll——wait等待就緒結果
問題
- 一個socket可讀,但是隻讀到半個socket請求,沒讀完
面向協程排程
- 如果是用於監聽埠的fd就緒了,就建立連線建立一個新的fd,交給一個協程來負責