『IO』BIO,NIO和AIO以及相关名词解析

网络通信中经常用到IO操作,IO操作主要有BIO,NIO以及AIO等几种模式,要弄清这几种IO模式,又需要弄懂阻塞/非阻塞,同步/异步概念。网上对这几种概念的解释各不相同,我在本文中记录下我自己的理解。

一次IO请求操作,主要有数据准备数据拷贝两个阶段。

  • 数据准备阶段是系统内核准备数据,并准备等待被处理,阻塞与否主要发生在这个阶段。
  • 数据拷贝是把数据从系统内核复制到应用程序中的过程。

这是因为"用户内存"并不能使用“系统内存”中的数据,需要将数据从内核拷贝到应用的内存中。

BIO(Blocking IO)指的是同步阻塞IO操作。
NIO(Non-Blocking IO)指的是同步非阻塞IO操作。
AIO(Asynchronous I/O)指的是异步非阻塞IO操作。

首先要弄清同步/异步以及阻塞/非阻塞是两个层次上的概念

同步/异步指的是消息通信机制,一种全局的概念。

  • 同步:应用程序进行IO操作时,会等待结果的出现再返回结果值。
  • 异步:进行IO操作时,应用程序直接返回值(可能是-1),等内核将结果计算出来,再通知应用程序。

阻塞/非阻塞指的是进程在等待请求结果时的状态

  • 阻塞:阻塞指的是当准备数据时,进程会进行等待,不进行其他操作,直到IO数据准备就绪,此过程中进程就像被阻塞了一样。
  • 非阻塞:非阻塞指的是内核准备数据时,用户函数会直接返回而不会等待,用户进程会去定时轮询系统数据是否准备好,在此期间进程可以继续其他操作。

明白了以上概念,再看几种通信模式:

一.BIO

在BIO通信模式下,服务端每收到一个连接(socket),就会创建专门的线程(serversocket)响应该连接,这个连接会一直存在等待读取发来的数据,这个过程会阻塞所在线程,不能做别的事,直到操作结束返回结果值,因此这是同步阻塞。
BIO模式下,服务端连接多个客户端时,会开启多个线程响应连接。

二.NIO

NIO则不会对每个连接都开启单独线程,NIO主要由BufferChannelSelector三部分组成。

  • Buffer是缓存区,用户存放数据,方便复用。
  • Channel是连接数据和缓存区的通道,数据通过通道写入缓存区或者通过通道读出来。相比常规流,通道有双向的并且可以异步读写,在NIO中,Buffer必须和Channel相结合使用。
  • Selector是选择器,上面的Channel需要注册到Selector上,这样选择器就能同事维护多个Channel,当某个Channel的IO请求就绪时,Selector会为其开启一个操作线程,用select的优势在于它可以同时处理多个连接。

相比于BIO,NIO不需要为每个连接开启一个线程,而是统一由Selector管理,当连接没有IO操作时,不需要阻塞线程等待数据,只有当Selector检测到哪个Channel有有效的IO请求时,再为其开启操作线程,节省线程的开销,操作结束后返回结果值,故为同步非阻塞。

三.AIO

AIO则是特殊的API,与BIO和NIO不同,当应用程序访问内核请求数据后,会直接返回,此时操作系统会完成第一第二阶段,当数据准备完毕后再通知应用程序,此过程应用程序可做任意事情,在这一阶段,和NIO不同的是NIO会主动轮询操作系统数据是否准备完毕,而AIO则是等待系统主动通知,再去取数据。这个过程中AIO仅仅向内核发送了请求,直接返回了函数,所谓异步,整个过程由系统完成数据装配,更没有线程阻塞了。

文章内容为个人理解,如有错误欢迎指出。

邮箱:CodingDjz@126.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也...
    闪电是只猫阅读 2,996评论 0 7
  • nio 同步: 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写)。 异步: 委托一小弟拿...
    CatherYan阅读 1,081评论 1 12
  • 这两天了解了一下关于NIO方面的知识,网上关于这一块的介绍只是介绍了一下基本用法,没有系统的解释NIO与阻塞、非阻...
    Ruheng阅读 7,061评论 5 48
  • 破碎零散闪现一段一段, 泛黄黑白滚动一片一片, 从前的昨天的是谁的表演, 记不清想不起在哪里看见, 混乱的嘈杂的片...
    暮色柒光年外阅读 178评论 0 3
  • 我上学了,那一年我十岁。 那是在外婆对母亲反复的唠叨里得到的,也是我在小学校长面前不断的示好换来的。那时校长每天上...
    溪兰弦语阅读 185评论 2 5