前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础-常见IO五种模型

Java基础-常见IO五种模型

作者头像
才疏学浅的木子
发布2023-10-17 08:30:15
1450
发布2023-10-17 08:30:15
举报
文章被收录于专栏:CSDN文章

用户空间与内核空间

进程的寻址空间会划分为两部分:内核空间用户空间 用户空间只能执行受限的命令,而且不能直接调用系统资源,必须通过内核提供的接口来访问 内核空间可以执行特权命令。调用一切系统资源

阻塞IO

在这里插入图片描述
在这里插入图片描述

在客户端连接数量不高的情况下,是没问题的。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量

非阻塞IO

在这里插入图片描述
在这里插入图片描述

应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的。

IO多路复用

如果调用recvform时,恰好没有数据,阻塞IO会使进程阻塞,非阻塞IO使CPU空转,不能充分发挥CPU作用 如果调用recvform时恰好有数据,则用户进程进入第二个阶段,读取并处理数据

文件描述符: 简称FD,是一个从0开始递增的无符号整数,用来关联Linux中的一个文件。在Linux中一切皆文件。 IO多路复用: 是利用单个线程来同时监听多个FD,并在某个FD可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源 不同监听FD的方式、通知的方式有多种实现,常见的有: select poll epoll 差异 select和poll只会通知进程有FD就绪,但不确定具体是那个FD,需要用户进程逐个遍历FD来确认 epoll则会通知用户进程FD就绪的同时,把已就绪的FD写入用户空间

在这里插入图片描述
在这里插入图片描述

IO多路复用-select

在这里插入图片描述
在这里插入图片描述

缺点 需要将整个fd_set从用户空间拷贝到内核空间,select结束还要再次拷贝回用户空间 select无法得知具体是那个fd就绪,需要遍历整个fd_set fd_set监听的fd数量不能超过1024

IO多路复用-poll

在这里插入图片描述
在这里插入图片描述

流程 创建pollfd数组,向其中添加关注fd信息,数组大小自定义 调用poll函数,将pollfd数组拷贝到内核空间,转链表存储,无上限 内核遍历fd,判断是否就绪 数据就绪或超时后,拷贝pollfd数组到用户空间,返回就绪fd数量 用户进程判断n是否大于0 大于0则遍历pollfd数组,找到就绪数组

与select对比 select模式中的fd_set大小固定为1024,而pollfd在内核中采用链表,理论上无上限 监听FD越多,每次遍历消耗时间也越久,性能反而会下降

IO多路复用-epoll

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基于epoll实例中的红黑树保存要监听的FD,理论上无上限,而且增删改查效率都非常高,性能不会随着监听的FD数量增多而下降 每个FD只需执行一次epoll_ctl添加到红黑树,以后每次epol_wait无需传递任何参数,无需重复拷贝FD到内核空间 内核会将就绪的FD直接拷贝到用户空间的指定位置,用户进程无需遍历所有的FD就知道就绪的FD是谁

IO多路复用-事件通知机制

当FD有数据可读时,我们调用epoll_wait就可以得到通知,但是事件通知的模型有两种: LevelTriggered:简称LT,当FD有数据可读时,会重复通知多次,直到数据处理完成 EdgeTriggered:简称ET,当FD有数据可读时,只会通知一次,不管数据是否处理完成

信号驱动IO

信号驱动IO是与内核建立SIGIO的信号关联并设置回调,当内核有FD就绪时,会发出SIGIO信号通知用户,期间用户应用可以执行其它业务,无需阻塞等待

在这里插入图片描述
在这里插入图片描述

当有大量IO操作时,信号较多,SIGIO处理函数不能及时处理可能导致信号队列溢出 而且内核空间与用户空间的频繁交互性能较低

异步IO

异步IO的整个过程都是非阻塞的,用户进程调用完异步API后就可以去做其它事情,内核等待数据就绪并拷贝到用户空间才会递交信号

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用户空间与内核空间
  • 阻塞IO
  • 非阻塞IO
  • IO多路复用
    • IO多路复用-select
      • IO多路复用-poll
        • IO多路复用-epoll
          • IO多路复用-事件通知机制
          • 信号驱动IO
          • 异步IO
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档