1. 程式人生 > >IO與NIO的區別,阻塞與非阻塞的區別

IO與NIO的區別,阻塞與非阻塞的區別

阻塞概念:應用程式在獲取網路資料的時候,如果網路傳輸資料很慢,那麼程式就一直等著,知道傳輸完畢為止。

非阻塞概念:應用程式直接可以獲取到已經轉備好的資料,無需等待。

IO為同步阻塞形式,NIO為同步非阻塞形式、NIO並沒有實現非同步,在JDK1.7之後,升級了NIO庫包,支援非同步阻塞通訊模型即NIO2.0(AIO)

同步與非同步: 同步與非同步一般是面向作業系統和應用程式對IO操作的層面上來區別的。

同步時:應用程式(程式碼)會直接參與IO讀寫操作,並且我們的應用程式會直接阻塞到某一個方法上,直到資料準備就緒;或者採用輪詢的策略實時檢查資料的就緒狀態,如果就緒則獲取資料。

已不是,則所有的IO讀寫操作交給作業系統處理,與我們的應用程式沒有直接關係,我們的程式不需要關係IO讀寫,當作業系統完成IO讀寫操作時,會給我們應用程式傳送通知,我們的應用程式直接拿走資料即可。

同步說的是server伺服器的執行方式;阻塞說的是具體的技術,接受資料方式、狀態(IO、NIO)

阻塞 / 非阻塞描述的是函式,指訪問某個函式時是否會阻塞執行緒(block,執行緒進入阻塞狀態)。

同步 /非同步描述的是執行IO操作的主體是誰,同步是由使用者程序自己去執行最終的IO操作。非同步是使用者程序自己不關係實際IO操作的過程,只需要由核心在IO完成後通知它既可,由核心程序來執行最終的IO操作。

這兩組概念交集在一起參生的非阻塞同步IO和非阻塞非同步IO的概念就不難理解。

非阻塞同步IO指的是使用者呼叫讀寫方法是不阻塞的,立刻返回的,而且需要使用者執行緒來檢查IO狀態。需要注意的是,如果發現有可以操作的IO,那麼實際使用者程序還是會阻塞等待核心複製資料到使用者程序,它與同步阻塞IO的區別是後者全程等待。

非阻塞非同步IO指的是使用者呼叫讀寫方法是不阻塞的,立刻返回,而且使用者不需要關注讀寫,只需要提供回撥操作,核心執行緒在完成讀寫後回撥使用者提供的callback。

這兩個概念的不同造成了程式設計模型的不同。

非阻塞同步IO由於讀寫方法非阻塞,並且需要使用者自己來進行讀寫,所以每次呼叫讀寫方法實際讀寫的位元組數是不確定的,所以需要一個Buffer來儲存每次讀寫的位元組狀態。更重要的是使用者不知道什麼時候完成了讀寫,一般需要用while迴圈判斷Buffer的狀態來跟蹤讀寫。

非阻塞非同步IO由於是核心執行緒進行讀寫,並且在IO完成後會回撥使用者提供的callback,程式設計模型就比較簡單,使用者只需要呼叫讀寫,提供回撥就可以了,比如 read(filename, callback)

select / poll / epoll 從本質上說都是非阻塞同步IO,select會收到IO就緒的狀態,然後通知使用者去處理IO,實際的IO操作還需要使用者等待核心複製操作。

要理解IO就緒和完成的區別。就緒指的是還需要使用者自己去處理,完成指的是核心幫助完成了,使用者不用關心IO過程,只需要提供回撥函式。

理解了非阻塞同步IO和非阻塞非同步IO的區別之後,就不難理解Java NIO的設計了。NIO是圍繞ByteBuffer來進行讀寫的,ByteBuffer是一個緩衝區,用來記錄讀寫的狀態,通過多次檢查ByteBuffer的狀態來確定IO是否完成。

Java 1.7的NIO2.0 引入了非阻塞非同步IO的概念,程式設計模型大大簡化了。使用者只需要關注回撥函式即可。

相關推薦

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

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

IO復用,AIO,BIO,NIO,同步異步阻塞阻塞 區別參考

selector 執行器 有意 write lan 關聯 接收 targe ble 參考https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral

阻塞式/阻塞同步/異步的區別

被鎖 network hat roc 非阻塞io 默認 sock 操作系統 images 阻塞式IO/非阻塞IO 阻塞式IO(blocking-IO) 默認情況下,所有的套接字socket連接都是阻塞式的,在和操作系統交互的過程之中。比如說一個讀操作: 1.因為涉及到網絡數

NIO學習筆記從Linux IO演化模型到Netty—— 究竟如何理解同步、非同步、阻塞阻塞

我的觀點 首先,分開各自理解。 1. 同步:描述兩個(或者多個)個體之間的協調關係。 比如,單執行緒中,methodA呼叫了methodB,methodB返回後,methodA才往下執行,那麼稱A同步呼叫了B。 比如,多執行緒中,執行緒1訪問完某個資源,才到執行緒2訪問。 同步在一定的 互斥基礎上,強調的是有

GIT:fork和clone的區別fetchpull的區別

[1] .cn linu fork bsp sina 指南 lin name 參考資料: [1].Git學習筆記:fork和clone的區別,fetch與pull的區別 [2].在Github和Git上fork之簡單指南 GIT:fork和clone的區別,fetch與p

阻塞(Blocking)阻塞(Non-Blocking)同步(Synchronous)異步(Asynchronous)

sync https 機制 ole 通信機制 syn 同步 ron tro 參考: http://blog.jobbole.com/103290/ https://www.zhihu.com/question/19732473/answer/23434554 http://

同步、異步阻塞阻塞

架構 客戶端 多路復用 錯誤 同步非阻塞 函數 鏈接 調用 同步阻塞 同步阻塞,用戶空間的應用程序執行一個系統調用,這意味著應用程序會一直阻塞,直到系統調用完成為止(數據傳輸完成或者發生錯誤)。 同步非阻塞,設備以非阻塞形式打開,這意味著 io 操作不會立刻完成,需要應用程

引用&引用的使用常引用引用多態引用指針的區別

C/C++什麽是“引用”?申明和使用“引用”要註意哪些問題? 答:引用就是某個目標變量的“別名”(alias),對應用的操作與對變量直接操作效果完全相同。申明一個引用的時候,切記要對其進行初始化。引用聲明完畢後,相當於目標變量名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一

自適應和響應式布局的區別emrem

樣式 都是 變化 使用 元素 屏幕大小 響應式 大小 媒體查詢 自適應布局:不同終端上顯示的文字,圖片,等位置排版都是一樣的,只是大小不同。 響應式布局:通過媒體查詢監聽屏幕大小的變化,做出響應式的改變,在不同設備可能展現不同的樣式效果。 em:是相對其父

Verilog HDL 初級入門知識簡單講解(wire 和 reg 型別的區別 always 和 assign 的區別阻塞”賦值 和 “阻塞賦值”的區別

本文轉載自原作者:姚紀元,原文地址已失效        很多剛學Verilog HDL (硬體描述語言)的朋友肯定會對阻塞賦值和非阻塞賦值比較疑惑,那我們就一起來拋開這層迷霧吧。首先我們要理解兩種變數型別 Net Type(連線型)和 

同步、非同步阻塞阻塞

UNIX下可用的I/O模型: 阻塞式I/O; 非阻塞式I/O; I/O複用(select,poll,epoll…); 訊號驅動式I/O(SIGIO); 非同步I/O(POSIX的aio_系列函式); 阻塞式I/O模型:預設情況下,所有套接字都是阻

IO中的阻塞阻塞同步和非同步及三種IO模型

什麼是同步和非同步?        燒水,我們都是通過熱水壺來燒水的。在很久之前,科技還沒有這麼發達的時候,如果我們要燒水,需要把水壺放到火爐上,我們通過觀察水壺內的水的沸騰程度來判斷水有沒有燒開。隨著科技的發展,現在市面上的水壺都有了提醒功能,當我們把水壺插電

IO中的阻塞阻塞同步和異步及三種IO模型

狀態 阻塞io 舉例 最大的 data- str 被調用 當我 返回 什麽是同步和異步? 燒水,我們都是通過熱水壺來燒水的。在很久之前,科技還沒有這麽發達的時候,如果我們要燒水,需要把水壺放到火爐上,我們通過觀察水壺內的水的沸騰程度來判斷水有沒有燒開。隨著科

Hbase和Hive的區別Hbase傳統資料庫的區別

HBase 於 Hive 的區別,我們簡單的梳理一下 Hive 和 HBase 的應用場景: Hive 適合用來對一段時間內的資料進行分析查詢,例如,用來計算趨勢或者網站的日誌。Hive 不應該用來進行實時的查詢(Hive 的設計目的,也不是支援實時的查詢)。因為它需要很長時間才可以返回結果;H

Java中hasNext()next()的區別hasNextInt()nextInt()的區別hasNextDouble()nextDouble()的區別

轉載自:https://blog.csdn.net/weixin_37770552/article/details/77431961 還有補充:https://zhidao.baidu.com/question/198579166802848525.html java.util.Scanne

攔截器和過濾器區別Struts2SpringMVC的區別

攔截器和過濾器 1.攔截器是基於java反射機制的,而過濾器是基於函式回撥的; 2.攔截器不依賴於servlet容器,而過濾器依賴於servlet容器; 3.攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用; 4.攔截器可以訪問Action上下文、值棧裡的物件,而過

IO通訊模型(二)同步阻塞模式NIO(NonBlocking IO

同步非阻塞模式(NonBlocking IO) 在非阻塞模式中,發出Socket的accept()和read()操作時,如果核心中的資料還沒有準備好,那麼它並不會阻塞使用者程序,而是立刻返回一個資訊。也就是說程序發起一個read操作後,並不需要一直阻塞等待,而是馬上就得到了一個結果。 如果結果發現數據準備

C# 多維陣列 交錯陣列的區別即 [ , ] [ ][ ]的區別

多維陣列的宣告 在宣告時,必須指定陣列的長度,格式為 type [lenght ,lenght ,lengh, ... ] int [,] test1 = new int [3,3];  或宣告時即賦值,由系統推斷長度 int [,] test1 = { {1,2,3},

python深拷貝淺拷貝is==的區別copy()deepcopy()

1.is與==的區別 is是比較兩個引用是否指向了同一個物件 ==是比較兩個物件值是否相等 2.深拷貝與淺拷貝 淺拷貝:對物件的頂層拷貝,可以理解為增加了一個引用,沒有拷貝內容,即沒有新生成拷貝的記憶體空間,兩個指的是同一塊  深拷貝:對一個物件所有層次

同步、非同步阻塞阻塞的辨別理解

所謂同步非同步,只是對於水壺而言,即應用程式。 雖然都能幹活,但響水壺可以在自己完工之後,提示老張水開了。這是普通水壺所不能及的。 同步只能讓呼叫者去輪詢,造成老張效率的低下。 所謂阻塞非阻塞,僅僅對於老張而言。 立等的老張,阻塞;看電視的老張,非阻塞。 情況1和情況3中老張就是阻塞的。雖然3中響水