加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长资讯 > 动态 > 正文

从网络I/O模型到Netty

发布时间:2021-04-12 11:43:37 所属栏目:动态 来源:互联网
导读:的进程的IO可以注册到一个复用器(selector)上,然后用一个进程调用select,select会监听所有注册进来的IO。 举个例子。 在BIO模式中,一个老师(应用进程/线程)只能同时处理一个同学(IO流)的问题。如果有10个同学,就需要配置10个老师来做一对一的讲解。 在IO

的进程的IO可以注册到一个复用器(selector)上,然后用一个进程调用select,select会监听所有注册进来的IO。

举个例子。

在BIO模式中,一个老师(应用进程/线程)只能同时处理一个同学(IO流)的问题。如果有10个同学,就需要配置10个老师来做一对一的讲解。

在IO多路复用模型中。我们给 老师 配置了一个 班长(复用器Selector)。班长 负责观察班级里的10个同学谁要提问,一旦有同学举手,班长就反馈老师去处理这个举手同学的问题。

这样一来,只需要1个老师,老师 只需要注意 班长 的反馈,就能及时处理对应的 同学 的问题了。

下面我们具体来看看I/O多路复用的三种实现:select、poll、epoll。

  • 需要注意的是,select,poll,epoll都是IO多路复用的实现方式,而且本质上都是同步I/O,因为它们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。
  • 而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

2. select

数的作用是:

通过轮询,可以同时监视多个文件描述符是否发生了读、写、异常这三类IO事件。

最后返回发生IO事件的文件描述符数量,以及读事件、写事件、异常事件这三种事件分别发生在哪些文件描述符中(readfds、writefds、errorfds三个参数)。

  • 文件描述符(File descriptor)是计算机中的一个术语,用于表述指向文件的引用的抽象化概念。
  • Linux下一切皆文件,包括IO设备也是。因此要对某个设备进行操作,就需要打开此设备文件,打开文件就会获得该文件的文件描述符fd( file discriptor),它就是一个很小的整数。

我们结合 老师-班长-同学 的模型来理解下这个过程。

  • 老师把学生名单(xxxxfds)给班长,让班长关注班级里的所有同学。
  • 班长时刻轮训班级里每个同学的状态(轮训所有fd_set),直到 超时 或者 有同学举手。
  • 一旦有同学举手,班长就会把学生名单上有变化的学生名字做标记,并把一共多少个学生有变化返回给 老师。
  • 老师可以获得举手同学的数量,并在学生名单(xxxxfds)上看的有哪几个同学发生了事件(读、写、异常)。
  • 老师拿到学生名单后,轮训班级里面的每个同学状态,根据具体的 读、写、异常事件 来进行IO处理。

特别注意,在select函数下,老师仅仅知道有学生发生变化了,但到底是哪些学生发生变化,他需要 轮询 一遍同学名单(xxxfds),找出举手的同学,然后和他进行交流。

select的缺点比较明显:

  • 具有O(n)的无差别轮询时间复杂度,每次调用需要轮询fd_set,同时处理得越多,轮询时间就越长。
  • 每次调用select函数,都需要把 所有 fd_set从 用户态 拷贝到 内核态 进行轮训,如果fd_set比较大,对性能影响就非常大。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读