1. 程式人生 > >IO模型介紹以及同步非同步阻塞非阻塞的區別

IO模型介紹以及同步非同步阻塞非阻塞的區別

先說一下幾個單詞。

阻塞:使用者程序訪問資料時,如果未完成IO,等待IO操作完成或者進行系統呼叫來判斷IO是否完成
非阻塞:使用者程序訪問資料時,會馬上返回一個狀態值,無論是否完成

同步:使用者程序發起IO(就緒判斷)後,輪詢核心狀態
非同步:使用者程序發起IO後,可以做其他事情,等待核心通知

介紹一下IO模型

 

網路IO模型和檔案IO模型是一樣的,上圖是IO的5種模型,包括阻塞IO、非阻塞IO、多路複用IO、訊號驅動的IO、非同步IO。

一次IO包括兩個過程,核心資料準備 、把資料從核心空間copy到使用者空間。

1、阻塞IO(recvfrom系統呼叫)是在兩個過程應用都處於阻塞狀態。

2、非阻塞IO(recvfrom系統呼叫)是應用發出IO操作後可以立刻返回,通過輪詢盤判斷資料是否準備好,在copy資料階段阻塞應用。

3、多路複用IO(select 、recvfrom系統呼叫)是阻塞呼叫select,查詢可用的套接字,如果有套接字可用,那麼就阻塞呼叫(recvfrom)完成資料的copy過程。linux select就是這種模型,缺點是一次select會掃描所有的socket。

4、訊號驅動的IO(SIGIO、recvfrom)是應用發出SIG IO後立刻返回,核心中資料準備好後,通知應用,由應用進行阻塞recvfrom呼叫從核心copy資料。linux epoll就是基於事件的就緒通知方式,省去了所有socket的掃描開銷。

      epoll,kqueue比select高階,select是在核心裡做輪詢操作, epoll是使用回撥機制, 消耗的資源更少. 套接字比較多的時候,每次select()都要通過遍歷Socket來完成排程,不管哪個Socket是活躍的,都遍歷一遍。這會浪費很多CPU時間。epoll給套接字註冊某個回撥函式,當他們活躍時,自動完成相關操作,那就避免了輪詢。

5、非同步IO(aio-read)是應用發出aio-read後馬上返回,資料準備好後,由作業系統把資料copy到應用,並通知應用資料copy完成。

     當然除了以上的IO模式,還有直接IO(應用繞過核心直接訪問磁碟檔案),記憶體對映MMap(建立記憶體和檔案的對映關係),這兩種模式在linux 2.6上本質上沒有差異。

直接IO在資料庫引擎中用的比較多,資料庫的buffer繞過檔案系統cache,直接訪問硬碟。Mongodb中就是用到mmap,無需呼叫read、write系統呼叫。

同步、非同步、阻塞、非阻塞一般有這麼幾種組合:

同步非阻塞,典型代表是java NIO

非同步阻塞,典型代表是select,epoll

非同步非阻塞,典型代表是aio

併發設計中的模式,有以下兩種:

Reactor(NIO)和Preactor(AIO),都是處理派發/分離操作IO事件的。
派發/分離事件就是將單獨的IO事件通知到上層模組。不同之處是,Preactor用於非同步,Reactor用於同步。
可以看出,兩個模式的相同點,都是對某個IO事件的事件通知(即告訴某個模組,這個IO操作可以進行或已經完成)。
在結構上,兩者也有相同點:dispatch負責提交IO操作(非同步)、查詢裝置是否可操作(同步),然後當條件滿足時,就回調handler。
不同點在於,非同步情況下(Preactor),當回撥handler時,表示IO操作已經完成;同步情況下(Reactor),回撥handler時,表示
IO裝置可以進行某個操作(can read or can write),handler這個時候開始提交操作。

Reactor和Proactor模式的主要區別就是真正的讀取和寫入操作是有誰來完成的,Reactor中需要應用程式自己讀取或者寫入資料,而Proactor模式中,應用程式不需要進行實際的讀寫過程,它只需要從快取區讀取或者寫入即可,作業系統會讀取快取區或者寫入快取區到真正的IO裝置。

http://blog.csdn.net/yangbutao/article/details/8351423

相關推薦

IO模型介紹以及同步非同步阻塞阻塞區別

先說一下幾個單詞。 阻塞:使用者程序訪問資料時,如果未完成IO,等待IO操作完成或者進行系統呼叫來判斷IO是否完成 非阻塞:使用者程序訪問資料時,會馬上返回一個狀態值,無論是否完成 同步:使用者程序發起IO(就緒判斷)後,輪詢核心狀態 非同步:使用者程序發起IO後,可

深入瞭解幾種IO模型阻塞阻塞同步非同步

一般來說,Linux下系統IO主要就是通過以下幾個函式open(),close(),read(),write(),send(),recv(),lseek(),今天就以recv()為例來介紹下IO模型中的同步非同步,阻塞非阻塞的區別。先說阻塞與非阻塞的區別,recv()函式預設

同步非同步,阻塞阻塞 和nginx的IO模型

http://www.cnblogs.com/wxl-dede/p/5134636.html 總結:一個IO操作基本包括兩個階段: (1)等待資料準備就緒 (2)從核心向程序複製資料 如果是: 同步阻塞:那麼會一直阻塞下去。資料沒有就緒,那麼需要等待,拷貝資料也需要等待。

linux下的 I/O 模型同步/非同步阻塞/阻塞介紹

同步/非同步,阻塞/非阻塞 一提到網路程式設計中的 I/O 模型,總會涉及到這幾個概念,但是這幾個名詞又容易混淆,於是我想總結一下。 我們先看一下在《UNIX網路程式設計:卷一》中講到的5中 UNIX 下的 I/O 模型,分別是 阻塞式 I/O 非阻塞式

python# 程序/執行緒/協程 # IO:同步/非同步/阻塞/阻塞 # greenlet gevent # 事件驅動與非同步IO # Select\Poll\Epoll非同步IO 以及selector

# 程序/執行緒/協程 # IO:同步/非同步/阻塞/非阻塞 # greenlet gevent # 事件驅動與非同步IO # Select\Poll\Epoll非同步IO 以及selectors模組 # Python佇列/RabbitMQ佇列   ###########

同步非同步阻塞阻塞到5種IO模型

同步非同步、阻塞非阻塞 同步與非同步 同步與非同步在不同的場景下有不同的概念,在IO模型中的同步非同步,主要區別在當任務A呼叫任務B的過程中,程序A是否繼續進行。 如果A等待B的結果,則為同步 如果A不等待B的結果,則為非同步 同步狀態下任務A的

同步非同步 阻塞阻塞 Linux網路io模型

一,概念描述同步與非同步#首先來解釋同步和非同步的概念,這兩個概念與訊息的通知機制有關。也就是同步與非同步主要是從訊息通知機制角度來說的。概念描述:所謂同步就是一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麼

Java 同步/非同步IO,阻塞/阻塞IO

對於IO,有同步,非同步,阻塞,非阻塞的分類,最近才稍微對這些分類有一些理解,下面記錄一下: 首先,我們需要劃分IO,我們對IO操作分為兩個步驟,1:程式發出IO請求,2:完成實際IO操作,阻塞、非阻塞是針對第一步劃分的,而同步、非同步是針對第二部劃分的。 阻塞/非阻塞:首先,我覺得應該理解

Windows I/O模型同步/非同步阻塞/阻塞

同步  所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。按照這個定義,其實絕大多數函式都是同步呼叫(例如sin, isdigit等)。但是一般而言,我們在說同步、非同步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。最常見的例子就是 SendMessag

java 同步/非同步IO阻塞/阻塞IO 關係和概念解析

I/O的模型 首先要宣告的一點一定要把同步/非同步 阻塞/非阻塞 以及I/O這三者的概念區別開來,同步大部分是阻塞 的,非同步大部分是非阻塞的,但是它們之間並沒有必然的因果關係 同步與非同步 兩者產生需要有個前提——是否有多個任務或事件發生,只有滿足

IO操作中的同步/非同步阻塞/阻塞的含義

前言 學好IO是java程式設計師從初級到高階進階學習的必經之路,像Netty這種優秀網路框架是必須要學習的,說到Netty就離不開java的IO模型,我們知道BIO、NIO、AIO分別是同步阻塞IO、同步非阻塞IO、非同步非阻塞IO,那麼這裡說的同步和非同步

簡明網路I/O模型---同步非同步阻塞阻塞之惑

網路I/O模型 人多了,就會有問題。web剛出現的時候,光顧的人很少。近年來網路應用規模逐漸擴大,應用的架構也需要隨之改變。C10k的問題,讓工程師們需要思考服務的效能與應用的併發能力。 網路應用需要處理的無非就是兩大類問題,網路I/O,資料計算。相對於後者,網路I/O的延

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

一個IO操作,需要2步。 以read為例,  read --> sys_Read --> 驅動中的buffer資料 OR 網路中的udp/tcp報文 等等 同步/非同步 是否阻塞在第二步。 也就是 sys_Read -->

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

網路I/O模型---同步非同步阻塞非阻塞之惑 網路I/O模型 人多了,就會有問題。web剛出現的時候,光顧的人很少。近年來網路應用規模逐漸擴大,應用的架構也需要隨之改變。C10k的問題,讓工程師們需要思考服務的效能與應用的併發能力。 網路應用需要處理的無非就是兩大類問題,網

同步非同步阻塞阻塞Reactor模式和Proactor模式 (目前JAVA的NIO就屬於同步阻塞IO

在高效能的 I/O 設計中,有兩個比較著名的模式 Reactor 和 Proactor 模式,其中 Reactor 模式用於同步 I/O ,而 Proactor 運用於非同步 I/O 操作。        在比較這兩個模式之前,我們首先的搞明白幾個概念,什麼是阻塞和非阻

Linux IO模型同步異步阻塞阻塞等)的幾篇好文章

linux poll shu ppc pad tid per 多路復用 div 聊聊同步、異步、阻塞與非阻塞聊聊Linux 五種IO模型聊聊IO多路復用之select、poll、epoll詳解 ? Linux IO模型(同步異步阻塞非阻塞等)的幾篇好文章

[轉]簡明網路I/O模型---同步非同步阻塞阻塞之惑

網路I/O模型 人多了,就會有問題。web剛出現的時候,光顧的人很少。近年來網路應用規模逐漸擴大,應用的架構也需要隨之改變。C10k的問題,讓工程師們需要思考服務的效能與應用的併發能力。 網路應用需要處理的無非就是兩大類問題,網路I/O,資料計算。相對於後者,網路I/O的延遲,給應用帶來的效能瓶頸大於

IO同步非同步阻塞阻塞區別

更詳細解釋見http://yaocoder.blog.51cto.com/2668309/1308899 一、同步與非同步 同步/非同步, 它們是訊息的通知機制1. 概念解釋A. 同步所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。按照這個定義,其實

IO同步非同步阻塞阻塞

AIO 簡介 Linux 非同步 I/O 是 Linux 核心中提供的一個相當新的增強。它是 2.6 版本核心的一個標準特性,但是我們在 2.4 版本核心的補丁中也可以找到它。AIO 背後的基本思想是允許程序發起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍後或在

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

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