栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Netty笔记--IO模型

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Netty笔记--IO模型

文章目录
  • 前言
  • 一、同步阻塞IO
    • 1、阻塞IO
    • 2、同步IO
  • 二、同步非阻塞IO
    • 1、非阻塞IO
  • 三、IO多路复用模型
    • 1、异步IO
    • 2、Epoll怎么实现的?
    • 3、此处可以放个红黑树的博文链接
    • 4、select、poll、epoll模型的区别
  • 四、异步IO
    • 1.异步IO
  • 总结


前言

上层程序的IO操作,并不涉及物理设备级别的读写,而是数据在“内核缓冲区”和“进程缓冲区”之间的读写。
IO分为四种模型,同步阻塞IO(Blocking IO)、同步非阻塞IO(Non-blocking IO)、IO多路复用(IO Multiplexing)、异步IO(Asynchronous IO)。而Java中的NIO实际上属于第三种模型(IO多路复用)。
下文参考自书籍《Netty、Redis、Zookeeper高并发实战》、B站《Netty面试题集合》,以及其他网络资料。


提示:以下是本篇文章正文内容,下面案例可供参考

一、同步阻塞IO 1、阻塞IO

阻塞IO,指的是需要内核IO操作彻底完成后,才返回到用户空间执行用户的操作。阻塞指的是用户空间程序的执行状态。传统的IO模型都是同步阻塞IO。在Java中,默认创建的socket都是阻塞的。

2、同步IO

同步IO,是一种用户空间与内核空间的IO发起方式。同步IO是指用户空间的线程是主动发起IO请求的一方,内核空间是被动接受方。

二、同步非阻塞IO 1、非阻塞IO

非阻塞IO,指的是用户空间的程序不需要等待内核IO操作彻底完成,可以立即返回用户空间执行用户的操作,即处于非阻塞的状态,与此同时内核会立即返回给用户一个状态值。

三、IO多路复用模型

即经典的Reactor反应器设计模式,有时也称为异步阻塞IO,Java中的Selector选择器和Linux中的epoll都是这种模型。

1、异步IO

异步IO,是指系统内核是主动发起IO请求的一方,用户空间的线程是被动接受方。

2、Epoll怎么实现的?

参考回答:

Linux epoll机制是通过红黑树和双向链表实现的。 首先通过epoll_create()系统调用在内核中创建一个eventpoll类型的句柄,其中包括红黑树根节点和双向链表头节点。然后通过epoll_ctl()系统调用,向epoll对象的红黑树结构中添加、删除、修改感兴趣的事件,返回0标识成功,返回-1表示失败。最后通过epoll_wait()系统调用判断双向链表是否为空,如果为空则阻塞。当文件描述符状态改变,fd上的回调函数被调用,该函数将fd加入到双向链表中,此时epoll_wait函数被唤醒,返回就绪好的事件。

摘自牛客网 请你回答一下epoll怎么实现的

3、此处可以放个红黑树的博文链接

待后续整理

4、select、poll、epoll模型的区别

(1)select==>时间复杂度O(n)

它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

(2)poll==>时间复杂度O(n)

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.

(3)epoll==>时间复杂度O(1)

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))

————————————————
摘抄自深入理解select、poll和epoll及区别

四、异步IO 1.异步IO

异步IO,指的是用户空间与内核空间的调用方式反过来。用户空间的线程变成被动接受者,而内核空间成了主动调用者。这有点类似于Java中比较典型的回调模式,用户空间的线程向内核空间注册了各种IO事件的回调函数,由内核去主动调用。

总结

B站《Netty面试题集合》中演示了相关模型的代码,待后续提供github连接。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号