Netty之I/O模型

UNIX提供的5种IO模型:

  • 阻塞模型
    在这里插入图片描述

  • 阻塞IO模型:
    在这里插入图片描述

  • IO复用模型:
    在这里插入图片描述

  • 信号驱动IO模型:
    在这里插入图片描述

在这里插入图片描述

对于五种IO模型我这里用自己的白话再复述一遍,加深理解,如果要看权威的解释可以自己去看《Netty权威指南》。

阻塞IO

  1. 进程:那老头,有数据要我处理没有。
  2. 内核:大爷,现在没有数据,我现在就去准备,您老先等等。
  3. 内核把数据准备好,并从内核复制到用户控件。
  4. 内核:大爷,有数据了,给您,您慢走。

非阻塞IO

  1. 进程:那哥们儿,有数据要处理不?
  2. 内核:暂时没有数据。
  3. 进程:好勒,我先干别的去了。
  4. 进行通过轮询的方式不断问内核有没有要处理的数据,直到。
  5. 进程:哥们儿,有数据要处理不?
  6. 内核:挨千刀的,一直问一直问,数据在这里,拿起爬。
  7. 进程:好勒,我先拿走处理了,等下我还要来问哦。

IO复用

  1. 进程:那哥们儿,我要A/B/C这些数据,有没得?
  2. 内核:都没有,你先等着。
  3. 内核去准备数据,直到其中某个数据准备好。
  4. 内核:小子,数据A准备好了,可以取了。
  5. 进程:哦,数据A有了哈,那谁,可以拿走了,我继续等等剩下的数据。

信号驱动IO

  1. 进程:兄弟,我要数据A,这是我电话,有数据了给我打电话。
  2. 内核准备数据,直到数据准备好。
  3. 内核:有数据了,需要的时候来取嘛。
  4. 进程:嘿,兄弟,又见面了,数据给我吧。
  5. 内核:给你了,拿走吧。

异步IO

  1. 进程:兄弟,我要数据A,有了麻烦给我邮寄过来,我先回去了。
  2. 内核准备数据,直到数据准备好,并复制到用户缓冲区。
  3. 内核:给进程打电话说数据已经给你邮寄过去了,你签收一下。

epoll

目前支持IO多路复用的系统调用有select、pselect、poll、epoll。epoll相对select做了以下改进:

  1. 支持一个进程打开的socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数)。

    select单个进程所能打开的FD受限制与FD_SIZE,默认值是1024
    1GB内存的机器上大约是10万个句柄,可以通过cat/proc/sys/fs/file-max查看

  2. IO效率不会随着FD数目的增加而线性下降。

    select/poll每次调用都会线性的扫描全部的socket集合,导致效率呈线性下降。
    epoll是根据每个fd上面的callback函数实现的。那么只有“活跃”的socket才会去主动调用callback函数,其他idle状态则不会。

  3. 使用mmap加速内核与用户空间的消息传递

mmap:一种内存映射文件的方法。
epoll使用你mmap让内核与用户空间共享同一块内存

  1. epoll的API更简单

IO发展史

  1. JDK1.0到JDK1.3,IO库非常原始。
  2. JDK1.4 NIO以JSR-51的身份正式随JDK发布。新增了java.nio包,提供了进行异步IO的开发API和类库。
  3. JDK1.7 进行了NIO升级,被称为NIO2.0.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值