1. 程式人生 > >常見I/O模型

常見I/O模型

五種常見的io模型

  1. 阻塞式io:阻塞IO:在核心將資料準備好之前,系統呼叫會一直等待所有的套接字, 預設都是阻塞方式.
  2. 非阻塞io:如果核心還未將資料準備好,系統呼叫仍然會直接返回,並且返回EWOULDBLOCK錯誤碼.
  3. 訊號驅動io:核心將資料準備好的時候, 使⽤用SIGIO訊號通知應⽤用程式進行IO操作.
  4. io多路轉接:雖然從流程圖上看起來和阻塞IO類似實際上最核心在於IO多路轉接能夠同時等待多個檔案描述符的就緒狀態.
  5. 非同步io:由核心在資料拷貝完成時, 通知應用程式(而訊號驅動是告訴應用程式何時可以開始拷貝資料).

任何IO過程中, 都包含兩個步驟.

  • 第一是等待, 第二是拷貝資料.而且在實際的應用場景中, 等待消耗的時間往往都遠遠高於拷貝的時間.讓IO更高效, 最核心的辦法就是讓等待的時間儘量少.

I/O多路轉接之select

select 系統呼叫的用途是:在指定的一段時間內,監聽使用者感興趣的檔案描述符上的可讀、可寫、和異常等事件。該函式允許程序指示核心等待多個事件中的任何一個事件發生,並且只在有一個或多個事件發生或者經歷一段指定的時間後才喚醒它。
select函式原型:

/* According to POSIX.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

引數解釋:
1. maxfds 引數指定被監聽的(待測定)檔案描述符的個數,它通常被設定為select監聽的所有檔案描述符的最大值加一,因為檔案描述符是從0開始計數的。
2. readfds、writefds、exceptfds 三個引數分別指向可讀、可寫和異常等事件對應的檔案描述符集合。應用程式呼叫select函式,通過這三個引數傳入自己感興趣的描述符。select函式返回時,核心將修改它們來通知應用程式哪些檔案描述符已經就緒。*輸入輸出型引數*


3. 引數timeout為結構timeval,⽤用來設定select()的等待時間

timeval 結構體的定義如下:

struct timeval {
               long    tv_sec;         /* seconds */
               long    tv_usec;        /* microseconds */
           };

引數timeout取值:

  • NULL:則表⽰示select()沒有timeout,select將⼀一直被阻塞,直到某個⽂檔案描述符上發生了事件;
  • 0:僅檢測描述符集合的狀態,然後⽴立即返回,並不等待外部事件的發⽣生。
  • 特定的時間值:如果在指定的時間段⾥裡沒有事件發⽣生,select將超時返回。

關於fd_set結構
每個fd_set結構體中僅包含一個整型陣列,該陣列的每個元素中的每一位(bit)標記一個檔案描述符。
提供了一組操作fd_set的介面, 來比較⽅方便的操作點陣圖.

void FD_CLR(int fd, fd_set *set); // 用來清除描述片語set中相關fd 的位
int FD_ISSET(int fd, fd_set *set); // 用來測試描述片語set中相關fd 的位是否為真
void FD_SET(int fd, fd_set *set); // 用來設定描述片語set中相關fd的位
void FD_ZERO(fd_set *set); // 用來清除描述片語set的全部位

函式返回值:

  • 執行成功則返回檔案描述詞狀態已改變的個數
  • 如果返回0代表在描述詞狀態改變前已超過timeout時間,沒有返回。
  • 當有錯誤發生時則返回-1,錯誤原因存於errno,此時引數readfds,writefds, exceptfds和timeout的值變成不可預測。

錯誤值可能為: * EBADF 檔案描述詞為無效的或該檔案已關閉 * EINTR 此呼叫被訊號所中斷 * EINVAL
引數n 為負值。 * ENOMEM 核心記憶體不足
socket就緒條件:
讀就緒:

  • socket核心中, 接收緩衝區中的位元組數, ⼤大於等於低⽔水位標記SO_RCVLOWAT. 此時可以⽆阻塞的讀該檔案描述符, 並且返回值⼤大於0;
  • socket TCP通訊中, 對端關閉連線, 此時對該socket讀, 則返回0;
  • 監聽的socket上有新的連線請求;
  • socket上有未處理的錯誤;

寫就緒

  • socket核心中, 傳送緩衝區中的可用位元組數(傳送緩衝區的空閒位置⼤小), 大於等於低⽔水位標記SO_SNDLOWAT, 此時可以⽆無阻塞的寫, 並且返回值⼤大於0;
  • socket的寫操作被關閉(close或者shutdown).對⼀個寫操作被關閉的socket進⾏行寫操作, 會觸發SIGPIPE訊號;
  • socket使⽤非阻塞connect連線成功或失敗之後;
  • ocket上有未讀取的錯誤;

異常就緒

  • socket上收到帶外資料.

相關推薦

常見I/O模型

五種常見的io模型 阻塞式io:阻塞IO:在核心將資料準備好之前,系統呼叫會一直等待所有的套接字, 預設都是阻塞方式. 非阻塞io:如果核心還未將資料準備好,系統呼叫仍然會直接返回,並且返回E

網路I/O模型--5種常見的網路I/O模型

  阻塞與非阻塞   阻塞就是卡在那兒什麼也不做,雙方之間也沒有資訊溝通。   非阻塞就是即使對方不能馬上完成請求,雙方之間也有資訊的溝通。 同步與非同步   同步就是一件事件只由一個過程處理完成,不論阻塞與非阻塞,最後完成這個事情的都是同一個過程   非同步就是一件事由兩個過程完成,前

常見的網絡 I/O 模型

性能 tail clas 處理程序 系統 只需要 同步 來源 io復用 基礎概念: 同步、異步、阻塞、非阻塞 同步 & 異步 同步與異步是針對多個事件(線程/進程)來說的。 如果事件A需要等待事件B的完成才能完成,這種串行執行機制可以說是同步的,這是一種可靠的任務

Java NIO:淺析I/O模型

問題 區別 ror borde ket .cn dex selector 以及 學習Java的同學註意了!!! 學習過程中遇到什麽問題或者想獲取學習資源的話,歡迎加入Java學習交流群:618528494 我們一起學Java!   也許很多朋友在學習NIO的時候都會

Linux網絡I/O模型簡介

線程 開始 同步阻塞 lin 進程 bio 輪詢 檢查 開發 一、I/O基礎入門 java1.4之前的早期版本,java對I/O的支持並不完善,開發人員在開發高性能I/O程序的時候,會面臨一些巨大的挑戰和困難,主要問題如下。 1、沒用數據緩沖區,I/O性能存在問題; 2、沒

I/O模型

libuv func io模型 conn sock 簡單 回調 bsp read 網絡IO的本質是socket的讀取,socket在linux系統被抽象為流,IO可以理解為對流的操作。剛才說了,對於一次IO訪問(以read舉例),數據會先被拷貝到操作系統內核的緩沖區中,然後

一.Windows I/O模型之選擇(select)模型

寫入 lap 調用 pla lose 結構 fd_set 關閉 監視 1.選擇(select)模型:選擇模型:通過一個fd_set集合管理套接字,在滿足套接字需求後,通知套接字。讓套接字進行工作。避免套接字進入阻塞模式,進行無謂的等待。選擇模型的核心的FD_SET集合和se

web服務處理過程,各種I/O模型詳解,

web服務處理過程 各種i/o模型詳解 一, 進程,線程?進程是具有一定獨立功能的,在計算機中已經運行的程序的實體。在linux2.4以前,進程是基本運作的單位,在只是線程的系統中,線程才是最基本的運作單位,而進程只是線程的容器,程序本身只是指令,數據及其組織形式的描述,進程才是程序的真正運行實例。若

SOCKET重疊I/O模型

offset 否則 其中 tran internal 如果 要求 定義 ber 1重疊模型的優點1可以運行在支持Winsock2的所有Windows平臺,而不像完成端口只支持NT系統2比起阻塞,select,WSAAsyncSelect以及WSAEventSelect等模型

網絡I/O模型---同步異步阻塞非阻塞之惑

本質 結果 順序執行 其中 ges package 混合 signal 同時 網絡I/O模型 人多了,就會有問題。web剛出現的時候,光顧的人很少。近年來網絡應用規模逐漸擴大,應用的架構也需要隨之改變。C10k的問題,讓工程師們需要思考服務的性能與應用的並發能力。 網絡應

Java NIO(一)I/O模型概述

簡單的 什麽是 -c nbsp 流程 pos 文件 star 非阻塞 基本概念講述 什麽是同步? 同步就是:如果有多個任務或者事件要發生,這些任務或者事件必須逐個地進行,一個事件或者任務的執行會導致整個流程的暫時等待,這些事件沒有辦法並發地執行。 什麽是異步? 異步

Linux網絡I/O模型

I/O模型一、用戶空間I/O操作的兩個階段1、等待數據準備階段 此階段主要是將數據先加載至內核空間(內存緩沖區)2、數據從內核復制到進程的階段 此階段主要是將數據從內核空間(內存緩沖區)復制到用戶空間中進程的內存中去二、五種網絡I/O模型1、Blocking I/O,阻塞 I/O2、Non-blo

Python開發——15.協程與I/O模型

沒有 mage F5 quest 資源 輸入數據 準備 cor 異步 一、協程(Coroutine) 1.知識背景 協程又稱微線程,是一種用戶態的輕量級線程。子程序,或者稱為函數,在所有語言中都是層級調用,比如A調用B,B在執行過程中又調用了C,C執行完畢返回,B執行完畢返

一文讀懂高性能網絡編程中的I/O模型

好的 min tcp 輸入 其中 那些事 follow hand 實現 1、前言 隨著互聯網的發展,面對海量用戶高並發業務,傳統的阻塞式的服務端架構模式已經無能為力。本文(和下篇《高性能網絡編程(六):一文讀懂高性能網絡編程中的線程模型》)旨在為大家提供有用的高性能網絡編程

網絡I/O模型

使用 block 兩種 nbsp 定時器 attach ui編程 協程 三種 事件驅動模型 與傳統編程模式不同,事件驅動程序在啟動之後,就在那等待,等待什麽呢?等待被事件觸發。傳統編程下也有“等待”的時候,比如在代碼塊D中,你定義了一個input(),需要用戶輸入數據。但這

I/O 模型與 Java

本文主要記錄 Java 中 I/O 模型及相關知識點 。另,由於自身知識水平有限,如有不正之處,望各位能夠諒解,歡迎批評指正! 一、I/O 基礎   由於 Java 中 I/O 相關的 API ,無論是 BIO 還是 NIO,都是相對抽象的。所以我先整理一下 I/O 的基礎知識,瞭解一下作業系統是如何處理

socket阻塞與非阻塞 同步與非同步 I/O模型

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

I/O模型介紹

I/O介紹 I/O: 網路IO:本質是socket讀取 磁碟IO: 每次IO,都要經由兩個階段: 第一步:將資料從磁碟檔案先載入至核心記憶體空間(緩衝區),等待資料準 備完成,時間較長 第二步:將資料從核心緩衝區複製到使用者空間的程序的記憶體中,時間較短 I/O模型 Linux下的五種I/

socket阻塞與非阻塞,同步與非同步、I/O模型(轉載只為查閱方便,若有侵權,立刪)

socket阻塞與非阻塞,同步與非同步 作者:huangguisu     1. 概念理解        在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unbl

I/O模型(非同步事件)

非同步事件    WSAEventSelect模型是WindowsSockets提供的另外一個有用的非同步I/O模型。該模型允許一個或多個套接字上接收以事件為基礎的網路事件通知。Windows Sockets應用程式在建立套接字後,呼叫WSAEventSlect()函式,將一