1. 程式人生 > >Netty與NIO

Netty與NIO

Linux的 網路IO

一、簡介

1、Linux上所有外部裝置都抽象為file
2、對一個檔案的讀寫會呼叫kernel命令,返回file descriptor (fd);
3、對一個socket的讀寫會呼叫kernel命令,返回socketfd
4、描述符實際就是一個數字,指向核心中一個結構體(檔案路徑、資料區等一些屬性)

二、Linux 對Socket IO模型的抽象

1、阻塞IO

預設條件,所有file操作都是阻塞的(以socket為例)::在程序空間中呼叫recvfrom,呼叫在資料包到達並被複制到應用程序的緩衝區中或者發生錯誤返回前 都會等待,即阻塞。
這裡寫圖片描述

2、非阻塞IO

程序反覆呼叫recvFrom(輪詢)確認緩衝區資料是否準備好。若沒有準備好,返回EWOULDBLOCK 錯誤, 而當資料準備好後,系統程序開始從核心複製資料到使用者空間。可見,在“等待資料準備就緒”期間,應用程序並不是“阻塞”的狀態,而是不斷“輪詢”的
(同步非阻塞?)
非阻塞IO

3、IO複用模型

Linux提供select/poll ,程序通過將一個或多個fd傳給系統的selct /poll 呼叫,阻塞在select操作上,如此,select/poll可偵測多個fd是否處於就緒狀態

select/poll 順序掃描fd是否就緒,且支援的fd數量有限,因此使用受限。
而epoll:基於事件驅動方式代替順序掃描,效能更好。若有fd就緒,立刻回撥

IO複用模型

(注意:IO複用模型中,在等待資料就緒期間,程序會阻塞在select呼叫,等待socket變可讀上;同時在資料從核心複製到使用者空間的過程中,程序依然是阻塞的???)

4、訊號驅動IO

先開啟套介面訊號驅動IO,再通過系統呼叫sigaction執行訊號處理函式(呼叫後立刻返回,非阻塞的)。當資料準備就緒,為程序生成SIGIO訊號,通過訊號回撥通過recvfrom讀資料,通知主迴圈函式處理資料。
訊號驅動IO

5、AIO

程序告知核心啟動某操作,並讓核心完成整個操作後(包括資料從核心複製到使用者空間)再通知應用程序。
與訊號驅動IO不同的是:訊號驅動IO由核心通知何時開始一個IO;AIO由核心通知何時一個IO已經完成

JavaNIO是基於epoll的多路複用技術

AIO

三、IO多路複用

多個client接入請求,可以利用多執行緒或者IO多路複用技術處理。
後者,是通過把多個IO的阻塞複用到同一個select阻塞上,從而使系統在單執行緒情況下能同時處理多個客戶端請求。
與傳統多執行緒或多程序模型相比: 不需要額外建立程序、執行緒,也不需要維護這些程序、執行緒,降低系統維護量、系統開銷。

IO多路複用的場景:
1)伺服器同時處理多個監聽中、多個連線狀態的套接字
2)伺服器要同時處理多種網路協議的套接字

Linux中支援IO多路複用的有select pselect poll epoll ,最終還是選擇了epoll .epoll好處:
1)支援一個程序開啟的fd不受限制(當然小於OS的最大支援控制代碼)
select最大缺陷:單程序開啟的程序FD有限制,預設1024.對於要支援萬個TCP的伺服器來說太少。
cat /proc/sys/fs/file -max 看最大控制代碼,1G記憶體機器約10W控制代碼
2)IO不隨FD數目增加線性下降
傳統select/poll:socket集合很大,由於網路延時、鏈路空閒,少部分socket活躍,select/poll
線性掃描,效率線性下降。
epoll只對活躍的socket操作::**epoll根據fd上的callback函式實現,只有活躍的socket才主動呼叫
callback,idle的socket不會。如此,epoll 實現了偽AIO**。
當活躍socket多時,select/poll效率比epoll更高,當活躍socket少時,epoll效率更高
3)使用mmap加速核心與使用者空間的訊息。
epoll通過核心和使用者空間mmap同一塊記憶體來實現
4)epoll API比較簡單

四、JavaIO演進

Java4 -NIO
Java7 -NIO 2.0 ::提供AIO,非同步操作檔案、socket

相關推薦

漫談Java IO之 NettyNIO服務器

解碼 讀取 重要 char ada 管道通信 ble 發送 mage 前面介紹了基本的網絡模型以及IO與NIO,那麽有了NIO來開發非阻塞服務器,大家就滿足了嗎?有了技術支持,就回去追求效率,因此就產生了很多NIO的框架對NIO進行封裝——這就是大名鼎鼎的Netty。

NettyNIO

Linux的 網路IO 一、簡介 1、Linux上所有外部裝置都抽象為file。 2、對一個檔案的讀寫會呼叫kernel命令,返回file descriptor (fd); 3、對一個socket的讀寫會呼叫kernel命令,返回socketfd

Netty實踐NIO原理

length throw mes 有一個 stat socket 完成 pre 多線程模型 一、阻塞IO與非阻塞IO Linux網絡IO模型(5種) (1)阻塞IO模型 所有文件操作都是阻塞的,以套接字接口為例,在進程空間中調用recvfrom,系統調用直到數據包到達且被復

java高級視頻課程Dubbo、Redis、ActiveMQ、Nginx、Mycat、Spring、MongoDB、ZeroMQ、Git、Nosql、Jvm、Mecached、NettyNio、Mina

strong 程序設計 queue隊列 frp lin 海量數據 並發解決方案 elkstack line * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架構師、集群、

BIONIO、AIO的區別(轉)

特定 應用 api 請求 對數 bind 成才 io模式 事件分發 IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 一、BIO 在JDK1.4出來之前,我們建立網絡連接的時候采用BIO模式,需要先在服務端啟動一個ServerS

【圖靈學院15】極致優化-高性能網絡編程之BIONIO區別

ice redis let bject 模型 vao 傳輸 示例 ava 一、Java IO概念 1. 一個http請求節點   數據傳輸 1)網絡傳輸   TCP、UDP 2)通信模型   BIO、NIO、AIO   數據處理 3)應用協議   HTTP、RMI、WEB

Java NIO:IONIO的區別

文件 目的 讀取數據 簡單的 什麽 毫無 log 再處理 很多 一、概念 NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在Java API中提供了

IONIO的區別

rom tool div 線程 靈活性 計算 何事 一個 不知道 一、概念 NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在Java API中提供了兩套

BIONIO、AIO的區別

繼續 主動 基於 網絡連接 創建 局限 出現 nio mar IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 一、BIO 在 JDK1.4出來之前,我們建立網絡連接的時候采用BIO模式,需要先在服務端啟動一個ServerSock

IO方式的認知“BIONIO、AIO的區別”

同步和異步 返回 對數 阻塞io 簡單 borde ng- 一定的 兩種 轉自:http://blog.csdn.net/skiof007/article/details/52873421 ------------------------------------------

Java IONIO的總結、比較

one 何事 數據對象 容易 緩沖 rst 字符流 LEDE 如何 一、IO流總結   1、Java I/O主要包括如下3層次:   流式部分——最主要的部分。如:OutputStream、InputStream、Writer、Reader等  非流式部分——如:File類

IONIO

連續 測試 import bsp 兩個 同時 col team 關閉 IO 流的概念: java中數據的傳輸以流的形式體現(向水在管道中流動一樣) 流的分類 流按流向分為:輸入流,輸出流。 輸入流:程序從外部讀取數據

BIONIO、AIO的區別 【轉載】

不堪 ext 開啟 單獨 選擇 調用 visible 解決 react IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 一、BIO 在JDK1.4出來之前,我們建立網絡連接的時候采用BIO模式,需要先在服務端啟動一個Server

通訊中的BIONIO

從BIO到NIO BIO阻塞式的IO,NIO非阻塞式的IO。這裡從一個通訊的併發問題講起。 我們知道當併發量大的時候我們能夠採用的解決或者是擴充套件方式有兩種:橫向擴充套件(增大執行緒的數目),縱向擴充套件(使得每個執行緒得到良好的使用)。   在併發量大的時候我們可以

IO NIO

回調函數 tail 網絡數 epo 技術 判斷 比較 模型 article 阻塞概念:應用程序在獲取網絡數據的時候,如果網絡傳輸數據很慢,那麽程序就一直等著,知道傳輸完畢為止。 非阻塞概念:應用程序直接可以獲取到已經轉備好的數據,無需等待。 IO為同步阻塞形式,NIO為同步

深入Java網路程式設計NIO(二)

Java NIO 與 Netty NIO NIO的特性/NIO與IO區別: 1)IO是面向流的,NIO是面向緩衝區的; 2)IO流是阻塞的,NIO流是不阻塞的; 3)NIO有選擇器,而IO沒有。 讀資料和寫資料方式: 從通道進行資料讀取 :建立一個緩衝區,然後請求通道讀取資料。

NIONettyNIO基礎)

1、阻塞與非阻塞 阻塞與非阻塞是描述程序在訪問某個資源時,資料是否準備就緒的的一種處理方式。當資料沒有準備就緒時: 阻塞:執行緒持續等待資源中資料準備完成,直到返回響應結果。 非阻塞:執行緒直接返回結果,不會持續等待資源準備資料結束後才響應結果。   2、同

Java網路程式設計NIO

1. 計算機網路程式設計基礎 1.七層模型 七層模型(OSI,Open System Interconnection參考模型),是參考是國際標準化組織制定的一個用於計算機或通訊系統間互聯的標準體系。它是一個七層抽象的模型,不僅包括一系列抽象的術語和概念,也包括具體的協議。 經典的描述如下:

基於Netty5.0中級案例五之NettyC#Socket收發字串進行通訊

package com.itstack.netty; import java.nio.charset.Charset; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel

NettySpringBoot整合

Netty與Spring Boot的整合 ​ 最近有朋友向我詢問一些Netty與SpringBoot整合的相關問題,這裡,我就總結了一下基本整合流程,也就是說,這篇文章 ,預設大家是對netty與Spring,SpringMVC的整合是沒有什麼問題的。現在,就進入正題吧。 Se