協程 IO模型

2022-09-17 00:39:09 字數 2443 閱讀 2413

一、協程

1.定義:

單執行緒實現併發,可以再應用程式當中控制多個任務的切換+儲存狀態。

優點:在應用程式級別的速度要遠遠高於作業系統的切換

缺點:多個任務一旦有乙個任務阻塞住了,沒有及時切換,整個執行緒都將阻塞在原地,該執行緒內的其他任務都不能繼續執行了。

所以,在引入協程之後,就需要檢測單執行緒下所有的io行為,必須實現一旦遇到io就立即切換,少乙個都不行,因為一旦遇到乙個任務阻塞住了,其它的任務都將阻塞住,及時其餘的執行緒都是可以計算的,它們也是無法繼續執行了。

2.協程的目的

程式想要能夠在單執行緒下實現併發,併發即指的是多個任務看起來是同時執行的。

協程的併發=切換+儲存執行暫停時的狀態

二、io模型

分類:阻塞io ( blocking io)

非阻塞io( nonblocking io)

io多路復用( io multiplexing)

非同步io( asynchronous io)

io發生時涉及的物件和步驟:

對於乙個network io 即網路 io (這裡我們以read舉例),它會涉及到兩個系統物件,乙個是呼叫這個 io 的process (or thread),另乙個就是系統核心(kernel)。當乙個read操作發生時,該操作會經歷兩個階段。

#

1 等待資料準備 (waiting for the data to be ready)

#2 將資料從核心拷貝到程序中(copying the data from the kernel to the process)

事先準備:

1、輸入操作:read、readv、recv、recvfrom、recvmsg共5個函式,表示乙個通用的讀檔案裝置的介面。如果有阻塞狀態,則會經歷 wait data 和 copy data 兩個階段,如果事先設定成非阻塞狀態則在 wait data 階段會等不到 data 時丟擲異常。

2、輸出操作:write、writev、send、sendto、sendmsg共5個函式,表示乙個通用的寫檔案,然後向客戶端傳送資料裝置的介面,在傳送資料時,若緩衝區滿了會阻塞在原地,如果設定為非阻塞,則會丟擲異常。

(1)阻塞io(blocking io)

在 linux 中,預設情況下所有的 socket 都是 blocking=true 的狀態。

流程:客戶端應用程式向本地作業系統發起 recvfrom 操作後,在網路 io 中,服務端的 kernel 中一般是不會立即就有資料返回;此時服務端這邊就會處於 wait for data 狀態,而客戶端這邊的程序也因為不能及時收到資料而處於阻塞的狀態,當服務端收到資料之後,服務端的 kernel 還會經歷 copy data 階段,然後再向服務端傳送出資料;因為客戶端再傳送接收資料的過程中一直處於接收的狀態,這個過程就稱為阻塞 io。

特點:在 io 執行的兩個階段(等待接收 data 和 copy data )都被 block 了。

(2)非阻塞 io(non-blocking io)

linux下,可以通過設定socket使其變為non-blocking。

流程:客戶端應用程式的作業系統向服務端的作業系統傳送一條 recvfrom 請求,若服務端的 kenel 中沒有資料,則會立即返回乙個資訊說明還未收到資料,之後客戶端應用程式會不間斷地發出請求接收資料,此時基本上也就是陷入乙個死迴圈了,這個死迴圈就是服務端的 wait for data 階段;當某一次服務端收到資料之後,會立即在kenel 中 copy data ,然後將 data 返回給客戶端。

缺陷:在客戶端不斷向服務端傳送請求資料時,會大量的占用了 cpu 資源,造成極大的浪費。

(3)多路復用 io(io multiplexing)

別名:事件驅動 io(event driven io)

原理:select/epoll 這個function 會不間斷的向服務端作業系統的 socket 發起諮詢是否收到資料,知道某個 socket 收到資料之後,才會向服務端的程序發出一條僅僅是說明服務端已經收到資料的資訊。

流程:在這個流程中,客戶端雖然在 wait for data 階段是沒有阻塞的,但是它會在服務端作業系統 copy data 時,經歷了一小段的阻塞階段。

優點:相對於前面兩個模型來講,select/epoll 可以同時管理很多個的 socket ,解決了客戶端 socket 的 cpu 佔用率過高的問題。

缺點:select 可管理的 socket 終歸時有限的,若在數量過大的情況,也是會影響服務端的執行效率的。

待更。。。

協程和IO模型

協程 1.什麼是協程 單執行緒實現併發 在應用程式裡控制多個任務的切換 儲存狀態 優點 應用程式級別速度要遠遠高於作業系統的切換 缺點 多個任務一旦有乙個阻塞沒有切,整個執行緒都阻塞在原地 該執行緒內的其他的任務都不能執行了 一旦引入協程,就需要檢測單執行緒下所有的io行為,實現遇到io就切換,少乙...

詳解協程,事件驅動模型,I O模型

什麼是事件驅動模型 協程介紹 協程是什麼 協程是微執行緒,他是一種使用者態的輕量級執行緒,它的好處是沒有執行緒切換的開銷,我們開多執行緒,執行緒的上下文切換是耗費cpu的開銷的,但是多協程裡邊,只是乙個控制流調到了另外乙個控制流,它還是單執行緒,所以協程很適合高併發,乙個cpu可以支援上萬的協程,因...

併發程式設計 協程 池,io模型

一 執行緒池 程序池 開程序 開執行緒都需要消耗資源,只不過兩者比較的情況執行緒消耗的資源比較少 在計算機能夠承受範圍之內最大限度的利用計算機 什麼是池?在保證計算機硬體安全的情況下最大限度的利用計算機 池其實是降低了程式的執行效率,但是保證了計算機硬體的安全 硬體的發展跟不上軟體的速度 呼叫fro...