1. 程式人生 > >2. 彤哥說netty系列之IO的五種模型

2. 彤哥說netty系列之IO的五種模型

你好,我是彤哥,本篇是netty系列的第二篇。

簡介

本文將介紹linux中的五種IO模型,同時也會介紹阻塞/非阻塞與同步/非同步的區別。

何為IO模型

對於一次IO操作,資料會先拷貝到核心空間中,然後再從核心空間拷貝到使用者空間中,所以一次read操作,會經歷兩個階段:

(1)等待資料準備

(2)資料從核心空間拷貝到使用者空間

基於以上兩個階段就產生了五種不同的IO模式。

阻塞IO

從程序發起IO操作,一直等待上述兩個階段完成。

兩階段一起阻塞。

非阻塞IO

程序一直詢問IO準備好了沒有,準備好了再發起讀取操作,這時才把資料從核心空間拷貝到使用者空間。

第一階段不阻塞但要輪詢,第二階段阻塞。

多路複用IO

多個連線使用同一個select去詢問IO準備好了沒有,如果有準備好了的,就返回有資料準備好了,然後對應的連線再發起讀取操作,把資料從核心空間拷貝到使用者空間。

兩階段分開阻塞。

訊號驅動IO

程序發起讀取操作會立即返回,當資料準備好了會以通知的形式告訴程序,程序再發起讀取操作,把資料從核心空間拷貝到使用者空間。

第一階段不阻塞,第二階段阻塞。

非同步IO

程序發起讀取操作會立即返回,等到資料準備好且已經拷貝到使用者空間了再通知程序拿資料。

兩個階段都不阻塞。

IO模式對比

各種IO模式同比如下:

同步非同步的區別在於呼叫作業系統的recvfrom()的時候是否阻塞,可見除了最後的非同步IO其它都是同步IO。

select poll epoll

select 有最大檔案描述符的限制,只能監聽到有幾個檔案描述符就緒了,得遍歷所有檔案描述符獲取就緒的IO。

poll 沒有最大檔案描述符的限制,與select一樣,只能監聽到有幾個檔案描述符就緒了,得遍歷所有檔案描述符獲取就緒的IO。

epoll 沒有最大檔案描述符的限制,它通過回撥的機制,一旦某個檔案描述符就緒了,迅速啟用這個檔案描述符,當程序下一次呼叫epoll_wait()的時候便得到通知。

所以,在有大量空閒連線的時候,epoll的效率要高很多。

彩蛋

Java中的nio使用的是哪種IO模型呢?

答:Java中的nio實際上是new io的縮寫,它使用的是多路複用的IO模型。

參考

本文對IO的五種模型做了很簡短的總結,沒看懂的同學可以看看下面這篇文章,講得很詳細。

https://segmentfault.com/a/1190000003063859

最後,也歡迎來我的公從號彤哥讀原始碼系統地學習原始碼&架構的知識。

相關推薦

2. netty系列IO模型

你好,我是彤哥,本篇是netty系列的第二篇。 簡介 本文將介紹linux中的五種IO模型,同時也會介紹阻塞/非阻塞與同步/非同步的區別。 何為IO模型 對於一次IO操作,資料會先拷貝到核心空間中,然後再從核心空間拷貝到使用者空間中,所以一次read操作,會經歷兩個階段: (1)等待資料準備 (2)資料從

3. netty系列Java BIO NIO AIO進化史

你好,我是彤哥,本篇是netty系列的第三篇。 簡介 上一章我們介紹了IO的五種模型,實際上Java只支援其中的三種,即BIO/NIO/AIO。 本文將介紹Java中這三種IO的進化史,並從使用的角度剖析它們背後的故事。 Java BIO BIO概念解析 BIO,Blocking IO,阻塞IO,它是Ja

4. netty系列Java NIO實現群聊(自己跟自己聊上癮了)

你好,我是彤哥,本篇是netty系列的第四篇。 歡迎來我的公從號彤哥讀原始碼系統地學習原始碼&架構的知識。 簡介 上一章我們一起學習了Java中的BIO/NIO/AIO的故事,本章將帶著大家一起使用純純的NIO實現一個越聊越上癮的“群聊系統”。 業務邏輯分析 首先,我們先來分析一下群聊的功能點:

5. netty系列Java NIO核心元件Channel

你好,我是彤哥,本篇是netty系列的第五篇。 簡介 上一章我們一起學習瞭如何使用Java原生NIO實現群聊系統,這章我們一起來看看Java NIO的核心元件之一——Channel。 思維轉變 首先,我想說的最重要的一個點是,學習NIO思維一定要從BIO那種一個連線一個執行緒的模式轉變成多個連線(Chan

6. netty系列Java NIO核心元件Buffer

——日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第六篇。 簡介 上一章我們一起學習了Java NIO的核心元件Channel,它可以看作是實體與實體之間的連線,而且需要與Buffer互動,這一章我們就來學習一下Buffer的特性。 概念 Buffer用於與Channel互動時使用,通過上一

7. netty系列Java NIO核心元件Selector

——日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第七篇。 簡介 上一章我們一起學習了Java NIO的核心元件Buffer,它通常跟Channel一起使用,但是它們在網路IO中又該如何使用呢,今天我們將一起學習另一個NIO核心元件——Selector,沒有它可以說就幹不起來網路IO。 概念

2.偏頭痛楊的中高階java後端面試題攻略系列io&nio篇(持續更新)

前戲要是以為io就只是用於一個檔案的上傳和下載那你可就大錯特錯了。。。但凡涉及到網路通訊,都離不開io的知識。。。其中NIO是重中之重,想深入學習NIO的童鞋可以去玩netty底層程式碼。切記NIO不能只停留在表面概念階段,這樣被面試官發現會大大的減分。NIO要結合java的

Dubbo系列)服務訂閱(2

# 輔助連結 ## [Dubbo系列之 (一)SPI擴充套件 ](https://www.cnblogs.com/liferecord/p/13445631.html) ## [Dubbo系列之 (二)Registry註冊中心-註冊(1)](https://www.cnblogs.com/liferecord

5Python全棧系列IO多路復用

技術 多線程 課程 網絡連接 write Python全棧之路系列之IO多路復用What is IO Multiplexing?IO多路復用是指內核一旦發現進程指定的一個或者多個IO條件準備讀取,它就通知該進程。舉例說明你是一名老師(線程),上課了(啟動線程),這節課是自習課,學生都在自習

JavaIO()文件系統

系統 選擇 shutdown img lap roo files -1 parent   轉載請註明源出處:http://www.cnblogs.com/lighten/p/6992043.html 1.前言   在講解Java的文件流之前,先來認識一下Java的文件系統的

ElasticStack系列 & query cache 引起性能問題思考

並且 版本 配置 per 大量 嘗試 pos 文檔 測試 問題描述   一個線上集群,執行的 Query DSL 都是一樣的,只是參數不同。統計數據顯示 98% ~ 99% 的查詢相應速度都很快,只需要 4 ~ 6ms,但是有 1% 左右的查詢響應時間在 100ms ~ 2

MySQL常用配置和性能壓力測試:MySQL系列

text imu reat ini -o blocks debug 生成 存在 一、MySQL常用配置 以下所有配置參數以32G內存的服務器為基 1、打開獨立的表空間 innodb_file_per_table = 1 2、MySQL服務所允許的同時會話數的上限,默認為

skyfans每天一個Liunx命令系列:lsof

今天我們繼續來學習PERFORMANCE MONITORING AND STATISTICS(效能監測與統計),今天學習的是什麼命令呢,那就是lsof(列出系統上的所有開啟檔案) Ready Go!!! 文章目錄 今天我們繼續來學習PERFORMANCE MON

Netty 系列 Netty 百萬級推送服務設計要點

Netty 系列之 Netty 百萬級推送服務設計要點 李林鋒 2015 年 1 月 4 日 話題:語言 & 開發架構 1. 背景 1.1. 話題來源 最近很多從事移動網際網路和物聯網開發的同學給我發郵件或者微博私信我,諮詢推送服務相關的問題。問題五花八門,

Linux(centos 7)系列)----maven的安裝和配置

   最近需要做個Jenkins的自動部署,因此需要在伺服器上配置maven,下面是我的配置過程:     1.切換你要存放壓縮包的資料夾     2.選擇線上安裝    wget http://mirror

nettyIO模型

專案總用到了netty框架,看了與netty相關的基礎知識,netty中用到了NIO,如何理解NIO,這就需要先理解I/O模型 I/O模型有5種I/O模型,借用釣魚的故事比較通俗易懂。 有以下五種釣魚方式: 王鐵錘 他先給魚竿上放好魚餌,然後就坐在自己的小板凳上,眼睛一直瞪著魚竿的盡

Netty系列Netty百萬級推送服務設計要點-轉載

1. 背景 1.1. 話題來源 最近很多從事移動網際網路和物聯網開發的同學給我發郵件或者微博私信我,諮詢推送服務相關的問題。問題五花八門,在幫助大家答疑解惑的過程中,我也對問題進行了總結,大概可以歸納為如下幾類: Netty是否可以做推送伺服器? 如果使用Netty開

JAVA小白系列個分支:LinkedList容器深入分析一

上一節我們瀏覽了ArrayList容器,來總結一下? 儲存資料的為一個名叫做elementData的陣列預設容量為10 擴容大小為原容量的一半即originSize+originSize>>2的大小 擴容方式為建立新的陣列並且通過陣列的複製來完成擴容 刪除

IT職場人生系列 語言與技術II

                本文是IT職場人生系列的第十五篇本篇延續了技術與語言I的內容(之十二),蒐集了之後大家的一些評論和我的反饋,整理在這裡。“新人學老技術有風險”的實質其實不是說老技術沒有學習的價值了,而是指新人依託老技術存活,風險很大。我自己曾經是一個C++高手,心裡很清楚如果自己親自”無私地“

JAVA語言入門教學系列IO

本文主要向大家介紹了JAVA語言入門教學系列之IO篇,通過具體的內容向大家展示,希望對大家學習JAVA語言有所幫助。 前戲 有很多同學單純的認為IO不就是一個讀檔案和寫檔案嗎,不重要,只要簡單的複製貼上就OK, 會用個File以及什麼流就算"熟練掌握 "了。 使用場景也就上傳檔案才用的到