1. 程式人生 > >同步與非同步IO區別

同步與非同步IO區別

IO模型

要介紹同步IO與非同步IO,得先介紹Unix5種I/O模型:
1. 阻塞IO
2. 非阻塞IO
3. IO複用(select和poll)
4. 訊號驅動式IO(SIGIO)
5. 非同步IO(aio_系列函式)

5種IO模型都包含兩個階段:
1. 等待資料準備好(等待資料從網路中到達,資料到達後,被複制到核心的緩衝區中)
2. 從核心緩衝區向用戶緩衝區複製資料

分別介紹不同的IO模型,並且使用UDP作為例子,因為UDP整個資料報要麼已經收到,要麼沒有。

阻塞IO

這裡寫圖片描述

程序呼叫recvfrom,該系統呼叫直到資料報到達且被複制到應用程序的緩衝區或者發生錯誤才返回,常見的錯誤是系統呼叫被系統中斷,

非阻塞IO

這裡寫圖片描述

等待資料的階段是非阻塞的,也就是當沒有資料報準備好,recvfrom立即返回一個錯誤,但是當資料包準備好了,recvfrom將資料報從核心緩衝區複製到應用程序緩衝區後返回。

IO複用

這裡寫圖片描述

如圖,io複用模型是阻塞在select或者poll這兩個系統呼叫之上的,而沒有阻塞在真正的I/O系統呼叫如recvfrom之上,它等待資料報套接字變為可讀,當資料報可讀時,呼叫recvfrom把資料報復制到應用程序緩衝區中。

訊號驅動式IO

這裡寫圖片描述

通過sigaction系統呼叫安裝一個訊號處理函式,系統呼叫立即返回,當資料報準備好讀取時,核心產生一個訊號,隨後就可以在訊號處理函式中呼叫recvfrom讀取資料報,將資料從核心空間複製到使用者空間。

非同步IO

這裡寫圖片描述

呼叫aio_系列函式,給核心傳遞描述符、緩衝區指標、緩衝區大小和檔案偏移,該系統呼叫立即返回,當整個IO操作完成,即資料報到達,並且從核心緩衝區被複制到使用者緩衝區後,才產生一個訊號。

IO模型比較

對比幾種模型,可以看出,前4種模型區別主要在第一階段,它們的第二階段是一樣的:在資料從核心複製到呼叫者緩衝區期間,程序是阻塞於recvfrom呼叫,而非同步IO,這兩個階段都要處理完畢。

同步IO/非同步IO

同步IO操作:導致請求程序阻塞,知道IO操作完成。
非同步IO操作:不導致程序阻塞。

這裡寫圖片描述
所以前4種都是同步IO模型,因為發生了阻塞。

阻塞/非阻塞

在處理(網路) IO 的時候,阻塞和非阻塞都是同步IO,阻塞與非阻塞的區分在於網路IO時進行IO操作的執行緒會不會掛起,其實對於某些IO模型來說,阻塞非阻塞其實比較難定義,比如select模型中指使用者執行緒不會阻塞於recvfrom等網路IO操作上,但在select操作本身上是阻塞的,不過因為網路IO並未阻塞的原因仍稱selec模型為非阻塞的模型。

相關推薦

同步非同步IO區別

IO模型 要介紹同步IO與非同步IO,得先介紹Unix5種I/O模型: 1. 阻塞IO 2. 非阻塞IO 3. IO複用(select和poll) 4. 訊號驅動式IO(SIGIO) 5. 非同步IO(aio_系列函式) 5種IO模型都包含兩個階段

java基礎 - 同步非同步區別

同步:傳送一個請求,等待返回,然後再發送下一個請求 非同步:傳送一個請求,不等待返回,隨時可以再發送下一個請求 同步可以避免出現死鎖,讀髒資料的發生,一般共享某一資源的時候用,如果每個人都有修改許可權,同時修改一個檔案,有可能使一個人讀取另一個人已經刪除的內容,就會出錯,同步就會按順

Netty學習之路(一)- 同步非同步IO

本篇部落格主要是講一些基礎,記錄我的學習過程,同時嘗試養成寫部落格的習慣。內容基本來自Netty權威指南加上一丟丟的個人理解。。。。 I/O基礎入門 在jdk1.4以前,java對i/o的支援並不完善,開發人員在開發高效能i/o時會遇到巨大的挑戰與困難,主要問題如下: 沒

[Xcode10 實際操作]八、網路多執行緒-(23)多執行緒的同步非同步區別

本文將演示執行緒的同步與非同步的區別。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 非同步執行緒的執行,是沒有按照順序執行的。 1 import UIKit 2 3 class ViewController: UIViewController

程式同步非同步區別

同步是指:傳送方發出資料後,等接收方發回響應以後才發下一個數據包的通訊方式。   非同步是指:傳送方發出資料後,不等接收方發回響應,接著傳送下個數據包的通訊方式。   ----------------------------------------------------

同步非同步區別

背景:當多個執行緒需要訪問同一個資源時,需要某種順序來確保該資源在某一時刻只能被一個執行緒使用,否則後果不可預料。這個時候需要對資

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

轉自知乎的某條評論……@愚抄 今天看文章發現評論中有人把IO的幾個概念講的通俗易懂,拿來和大家分享一下: 關鍵詞 阻塞同步IO 阻塞非同步IO 非阻塞同步IO 非阻塞非同步IO 段子如下: 老張愛喝茶,廢話不說,煮開水。 出場人物:老張,水壺

Linux下阻塞非阻塞,同步非同步的關係及IO模型

一、阻塞與非阻塞,同步與非同步的關係 1、同步   同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是說事情必須一件一件地做,等前一件做完了才能做下一件事。 2、非同步   非同步,就是在發出一個功能呼叫時,呼叫者不會立刻得到結果。實際處理這個呼叫的部

JAVA NIO 同步非同步區別

什麼是非阻塞?(為什麼我沒有說什麼是IO,既然你都學到NIO了,,,要是不知道什麼是IO的話我也沒辦法咯..) 這篇文章也是簡單介紹NIO,想要看各類原始碼的同學可以繞道了- - 1 ) 非同步非阻塞例子:(網上看到的比較短小精悍的好例子,直接拿過來了) 老張愛喝茶,廢話

CIL鎖,GIL執行緒池的區別,程序池和執行緒池,同步非同步

一.GIL鎖 什麼是GIL? 全域性直譯器鎖,是加在直譯器上的互斥鎖 GC是python自帶的記憶體管理機制,GC的工作原理:python中的記憶體管理使用的是應用計數,每個數會被加上一個整型的計數器,表示這個資料被引用的次數,當這個整數變為0時則表示該資料已經沒有人使用,成為了垃圾資料,當記憶體佔用達到

簡述linux同步非同步、阻塞非阻塞概念以及五種IO模型

1、概念剖析 相信很多從事linux後臺開發工作的都接觸過同步&非同步、阻塞&非阻塞這樣的概念,也相信都曾經產生過誤解,比如認為同步就是阻塞、非同步就是非阻塞,下面我們先剖析下這幾個概念分別是什麼含義。 同步:所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必

IO模型:同步非同步,阻塞非阻塞

Unix下的IO可以區分為5種I/O模型: 阻塞式I/O非阻塞式I/OI/O複用(select和poll)訊號驅動式I/O(SIGIO)非同步I/O Unix下一個輸入操作可分為兩個步驟: 等待資料準備好從核心向程序複製資料 對於一個網路I/O的輸入操作也是一樣:

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

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

並行傳輸序列傳輸(同步通訊非同步通訊區別

1.並行傳輸: 字元編碼的各位(位元)同時傳輸; 2.序列傳輸: 將組成字元的各位序列地發往線路;         有兩種傳輸方式: 1)同步傳輸; 2)非同步傳輸; 序列資料通訊的方向性結構有三種: 1)單工; 2)半雙工;(I2C) 3)全雙工;

Okhttp3.0同步非同步方法使用區別,同時需要注意一些細節問題

一、Okhttp3.0 execute 這是同步請求。對於同步請求在請求時需要開啟子執行緒,請求成功後需要跳轉到UI執行緒修改UI。 new Thread(new Runnable() { @Override public

Windows核心原理-同步IO非同步IO

目錄 Windows核心原理-同步IO與非同步IO 背景 目的 I/O 同步I/O 非同步I/O I/O完成通知 總結

Java執行緒-同步非同步區別

1.                                         &nb

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

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

2017.10.12 C#多執行緒非同步區別

最近在寫個多執行緒處理的程式,又重新溫習了一下相關知識,記錄在這裡。 C#多執行緒與非同步的區別 原文地址:http://kb.cnblogs.com/page/116095/ 多執行緒和非同步操作的異同   多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體

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

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