IO模型有哪些,BIO、NIO、AIO了解吗?

IO即输入输出,根据冯诺依曼结构结构计算机结构分为5个:大部分体系结构计算器、控制器、输入、输入设备、输入设备、

站在我们程序员的角度来看,首先要了解一些概念:

IO就是计算机系统与外部设备之间的通信过程,然后把读写文件,一行一行。

站在计算机操作系统的角度:

实际上IO是分为用户空间(User space)内核空间(Kernel space)的,在程序发起IO操作,实际IO是需要用户空间(程序)进入我们从内核空间(操作系统指令),才能这样访问文件。

文件IO: 读取:需要将系统内核空间将数据准备好给应用程序的用户空间写入:需要将应用程序的用户空间将数据准备好拷贝给内核空间

网络IO: 接收网络请求:网络--》网卡--》内核空间--》用户空间发送网络请求:用户空间--》内核空间--》网卡--》网络

同步异步:

要同步,就是在发出一个调用时,在没有得到结果之前,该调用才返回。但是如果调用返回,就得到返回值了。

而异步则是此时,调用在发出,调用就直接返回了,所以没有返回结果。渴望,当一个瞬间过程调用发出后,调用者不会很快得到结果。频率调用发出后,被调用者通过状态、通知来通知调用者,或通过调用功能处理这个调用。

再现非:

重新调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果才能返回。

IO的模型一般分为四种:

  • ①同步定时IO(Blocking IO):即BIO,传统的IO模型。

  • ②同步非阻塞IO(Non-blocking IO),即NIO,默认创建的socket都是使用的,非特定IO要求的socket被设置为NONBLOCK。这里所说的NIO不是Java的注意NIO(New IO)库。

  • ③多路姐妹IO(IO Multiplexing:即经典的Reactor设计模式,有时也有个别中的特定IO,Java中的Selector和Linux中的epoll都是这种模型(Redis单线程为什么速度还那么快,就是因为因为用了多路我IO和维护操作的原因)

  • ④异步IO(Asynchronous IO):即经典的Proactor设计模式,也非异步IO

1、生物:

我们现在使用的也是这种BIO,用输入流的wirte和read,同步播放的,只有等待文件读完,我们才能进行下一步。

服务器模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果不做任何事情会造成这个连接的线程连接

 扫VX 领Java资料,前端,测试,python等等资料都有

2、蔚来

图片

著名的 Netty 就是使用 NIO。

同步非外部,服务实现模式为一个请求一个线程,即客户端发送的请求都注册到多路连接器上,多路樱桃器轮询到连接有I/O请求时才启动一个线程处理。

3、多路美食IO

图片

Redis就是这种多路IO

服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理

arrow_double_down

译文:

说的我/O 亲爱的,多个我/O 可以一个过程。 select()和poll()来执行I/O多路投票。在Linux2.6中日期的epoll()是select()的升级版,提供了升级的。可以在一个过程中处理大量的 I/O。

初级版I/O姐妹

一个过程接受了1000个连接尾,这个过程每次从头到尾的问这10000个连接:有I/O没? ”然后过程就一直从头到尾问这 10000 个连接,如果这 10000 个连接都没有 I/O 事件,就会造成 CPU 的空转,并且效率也很低,不好。

那么,如果发明了一个代理,每次都能够知道我的某个特定的事件发生了,就可以无意义的空转加入?代理,最近又出现了一个民意调查的代理,感觉的本质是一样的)。

升级版I/O生日

选择()

选择可以同时观察I/O事件,在许多国外的时候,可能是当前的程序重启,当有一个或多个流有I/O事件时,就从真实的事件中爆发,然后我们的就会轮询导致所有的流(于是可以把“忙”字去掉了)。

while true {   select(streams[])   for i in streams[] {             if i has data                   read until unavailable } }    12345671234567复制错误复制成功

select()采用轮询的方式来检查是否有新的情况,当发现数量时,性能欠佳。 (可能有一个,甚至是,我们自己无私轮船询价所有流量,可以挖掘出全部数据流数据,或者他们进行数据的了解)。——来自知乎

生活实例

小明家楼下有一个收发室,每次有快递到了就先代收,但收发室也不知道是小明的快递;但小明去取的时候,要查询所有代收的快递。

高级版I/O父母

轮询()

epoll的能更高效的检查大量FD,UNIX中提供了类似功能的kqueue的调用。epoll的可以理解为事件调查,不同于忙轮询和无差别轮询,当连接有I / O流事件产生的时候,epoll的会去告诉流程哪些连接有I/O流产生,然后流程就去这个过程事件。这时候我们对这些流的操作事件就是这样。(复杂度降低到O(k),为产生产生I/O事件的流的个数,也有认为O(1)的)

4、一体机

图片

Nginx 采用了非常非典型的方式工作。

活实例

非当地取快递:小明收到快递的信息后,快递等,还在旁边敲击代码、边刷微信。

与异步,重点是通知的方式;有哪些非消息同步消息,重点是等时候的行为。 所以,就有了下面4种组合方式

1. 同步阻塞:小明收到信息后,啥都不能干,下楼干等快递; 2. 同步非阻塞:小明收到信息后,边刷微博,边等着取快递; 3. 异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递; 4. 异步非阻塞:小明收到信息后,边刷着微博,边等快递员通知他取快递。

 扫VX 领Java资料,前端,测试,python等等资料都有

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值