1. 程式人生 > 實用技巧 >協程在io多路複用中的應用

協程在io多路複用中的應用

阻塞式IO

在這裡插入圖片描述

  • socket的所有操作都由作業系統來提供,也就是通過系統呼叫來完成

  • 每建立一個socket,就會在檔案描述符表中對應增加一條記錄,而返回給應用程式的只有一個socket描述符,每個TCPsocket建立的時候,作業系統都會為它分配讀緩衝區和寫緩衝區

  • 要獲得資料就要從讀緩衝區讀取過來,同樣的要通過socket傳送資料,就要寫入些緩衝區

在這裡插入圖片描述

  • 當要寫入的資料沒有地方,或者讀取的資料沒有時候,就要有cpu一致在阻塞的等待,這就是阻塞式IO

在高併發場景下傢俱排程開銷

非阻塞式IO

就是讓出cpu,需要頻繁的檢查socket是否可讀可寫

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-j8UMZ9Gy-1602686263692)(gorutine.assets/image-20201014221251560.png)]

IO多路複用

將要監聽的socket加入監聽集合

,這樣就可以通過一次系統呼叫,同時監聽多個socket,有socket就緒了,就可以逐個執行了,既不會為等待某個socket而阻塞,也不會陷入忙等待之中

在這裡插入圖片描述

Select IO多路複用

在這裡插入圖片描述

  • 開啟檔案描述符個數為1024個
  • 每次都要傳入所有監聽集合來看是否有就緒的socket
  • 每次都要便利所有集合才知道哪個socket就緒

poll IO多路複用

可開啟的檔案描述符個數為最多的檔案描述符個數

其他依然存在

epoll IO多路複用

在這裡插入圖片描述

每個socke它有自己的資料結構,新增或者刪除的時候都會傳入一個結構體,epoll——wait等待就緒結果

問題

  • 一個socket可讀,但是隻讀到半個socket請求,沒讀完

在這裡插入圖片描述

在這裡插入圖片描述
面向協程排程

  • 如果是用於監聽埠的fd就緒了,就建立連線建立一個新的fd,交給一個協程來負責

在這裡插入圖片描述

封裝

在這裡插入圖片描述