首页 > 其他分享 >各种IO模型

各种IO模型

时间:2023-01-05 13:59:06浏览次数:29  
标签:kernel 各种 模型 用户 线程 内核 IO select

BIO(Blocking IO)

阻塞式同步IO

性能最差,响应最快

用户调用read,会阻塞并等待数据就绪,直到数据就绪,才返回

 

NIO(non-blocking IO)

非阻塞式同步IO

(基本不会直接用)性能也差,因为要用户来轮询

用户需要来轮询是否数据就绪,调用read,如果数据未准备好,就会返回错误,用户可以继续做别的事情,如果就绪,就可以读取

 

NIO(java new IO)/ IO多路复用

简单的说就是:内核帮你管理多个io,但是需要用户自己去询问是否有socket就绪(select),就绪了就继续读

内核会去轮询/监控socket/文件描述符是否数据有读入/就绪, 而不是用户去轮询,一旦某个socket/文件描述符就绪,会通知reader来读取

减少了用户态和内核态的切换, 有select和epoll

也可以算是阻塞同步,因为有个专门的select线程,select会阻塞到有socket数据就绪为止

 

(1)进行select/epoll系统调用,查询可以读的连接。kernel会查询所有select的可查询socket列表,当任何一个socket中的数据准备好了,select就会返回。

当用户进程调用了select,那么整个线程会被block(阻塞掉)。

(2)用户线程获得了目标连接后,发起read系统调用,用户线程阻塞。内核开始复制数据。它就会将数据从kernel内核缓冲区,拷贝到用户缓冲区(用户内存),然后kernel返回结果。

(3)用户线程才解除block的状态,用户线程终于真正读取到数据,继续执行。

AIO(Asynchronous IO

非阻塞异步

和多路复用的区别,个人感觉就是,多路复用是用户去主动问内核,有没有可用的socket,而AIO是内核通知用户数据好了

(1)当用户线程调用了read系统调用,立刻就可以开始去做其它的事,用户线程不阻塞。

(2)内核(kernel)就开始了IO的第一个阶段:准备数据。当kernel一直等到数据准备好了,它就会将数据从kernel内核缓冲区,拷贝到用户缓冲区(用户内存)。

(3)kernel会给用户线程发送一个信号(signal),或者回调用户线程注册的回调接口,告诉用户线程read操作完成了。

(4)用户线程读取用户缓冲区的数据,完成后续的业务操作。

 

原文链接:https://blog.csdn.net/u014453898/article/details/109811000

标签:kernel,各种,模型,用户,线程,内核,IO,select
From: https://www.cnblogs.com/huainanyin/p/17027321.html

相关文章

  • profession computing -- ethic
      Equality,DiversityandComputing:ImplicitBiasandStereotypeThreatJusticeandDiscrimination      SurveillanceandPrivacy:  ......
  • java.io.IOException: Permission denied——文件导出时报错
    背景业务系统中,有一个导出,就是很普通的列表查询,然后可以点击导出,生成一个文件。就这么一个功能。使用的excel工具类是:org.apache.poi.xssf用的poi这个工具类。问题......
  • dremio ManagedStoragePlugin 简单说明
    ManagedStoragePlugin从字面意思可以看出就是托管存储插件,从目前官方的设计来说就是将自己开发的存储扩展,包装为dremio可以管理的插件(统一模型以及统一处理)ManagedSto......
  • dremio SourceCatalog 服务说明
    SourceCatalog主要进行source的管理,包含了获取信息,创建,更新,删除,包含了不同的实现SourceCatalog服务定义/***Interfacetoperformactionsonsources.......
  • Unity创建Animation动画无法播放问题
    前提:我是要使用animation的方式去播放动画,而不是animator状态机;是针对unity自己制作的动画,而不是外部导入进来的动画。 发现一个问题,我在unity中给一个cube创建一个animat......
  • Unity3D之sprite动画(Animation)的制作
    实例说明:忍者跑酷的player动画制作。。。这些都是用Sprite做的动画。。。在prioject面板里的一组sprite里面点击,之后看属性面板的SpriteEditor对这组Sprite进行编辑。。。......
  • 2022 ICPC Gran Premio de Mexico Repechaje
    链接:https://codeforces.com/gym/104120A.AverageWalk#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;voidsolve(){intn;cin>>n......
  • visual studio学习VS 配置 VC++ 目录
    1、​​visualstudio新手使用教程​​2、头文件与lib库​​【VisualStudio】VS中添加头文件和lib库的方法​​​​VS2010中VC++目录和C/C++之间的区别。VC++Directories......
  • git,gradle,android studio的代理设置
    一、git设置1、git可以通过命令行设置代理参考这篇博客#!/bin/bashcase$1inon)gitconfig--globalhttp.proxy'socks5://127.0.0.1:1080'gitconfig--globalhttps.pr......
  • 【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Even
    问题描述在通过AzureFunction消费EventHub中的消息时,我们从Function的 TriggerDetails日志中,可以获得当前Funciton中处理的消息是哪一个分区(PartitionID),偏移量O......