五種網路IO模型簡介

2021-09-25 12:24:35 字數 882 閱讀 6158

linux的socket在預設情況都是阻塞的,當使用者程序請求讀取網路資料的時候,如果資料還沒有到達,程序就會被阻塞,一直等到資料到達,並且資料從kernel拷貝到使用者程序的記憶體後,才會解除阻塞狀態,重新開始執行。

當使用者程序請求讀取資料的時候,如果資料還沒準備好,kernel會立即返回乙個error,這樣使用者程序就不會被阻塞。當使用者程序發現返回的是error的時候,就知道暫時沒有資料可讀,可以先處理其他事,過一會再請求讀取資料,其實就乙個迴圈訪問。當資料準備好之後,kernel再次收到讀取請求,會立即將資料從kernel拷貝到使用者程序的記憶體(資料拷貝的過程是阻塞的),然後返回。

這種模型也叫做事件驅動i/o(event driven i/o),是用來解決單執行緒處理多併發問題的,比較典型的例子就是redis。眾所周知,redis是乙個單執行緒的服務,但是卻可以處理很高的併發,其底層原理就是多路復用i/o。

在多路復用i/o模型下,使用者程序不會先直接對接socket介面,而是先呼叫系統的select函式,kernel會「監視」所有select負責的socket,當任何乙個socket中的資料準備好了,select就會返回。這時,使用者程序再呼叫read操作,kernel將資料從kernel拷貝到使用者程序的記憶體並返回。使用者程序在呼叫select函式和讀取資料的時候都是處於阻塞狀態。

使用者程序在發起read呼叫之後,就不再管了,直接去處理其他的事情。kernel收到呼叫請求後會先立即返回避免阻塞程序,在資料準備完成之後,會將資料從kernel拷貝到使用者程序的記憶體,並傳送乙個signal給使用者程序,告訴使用者程序read呼叫完成了。

使用者程序預先向kernel註冊乙個訊號處理函式,然後使用者程序立即返回,不阻塞,這時使用者程序可以處理其他事情。當資料準備完成後,kernel會傳送乙個訊號通知使用者程序,使用者程序便在訊號處理函式中開始把資料拷貝的使用者空間中,這個過程是阻塞的。

五種網路IO模型

一 概述 在網路程式設計中,阻塞 非阻塞 同步 非同步經常被提到,下面談一下i o在生活中的釣魚場景 純屬虛構,如有雷同,純屬巧合 1.阻塞式i o 開始釣魚,眼睛一直盯著,魚兒上鉤拉桿。2.非阻塞式i o 開始釣魚,你一直懷疑魚兒在偷吃魚餌,一直拉桿,沒有魚,然後重複放杆拉桿,直到有釣上魚。3.i...

Unix下五種IO模型簡介

阻塞式io 阻塞式io模型是最一般的io模型。在這種模型下,io函式呼叫 read write等等 都會在操作完成或者發生中斷以後才會返回。如果指定的運算元據沒有就緒,或者操作需要的外部條件 比如緩衝區 尚未符合要求,操作會一直阻塞。非阻塞式io 相對於阻塞式io模型,非阻塞式io的特點就是 當所請...

五 IO模型簡介

針對網路io blocking io 阻塞io nonblocking io 非阻塞io io multiplexing io多路復用 signal driven io 訊號驅動io asynchronous io 非同步io 服務端import socket import select 當監管的物...