IO 模式的理解和衍生

news/2024/7/9 19:25:15 标签: java, epoll, python

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

2014年的时候我接触了 tornado (非阻塞式服务器), 里面有个概念叫做非阻塞。一开始我以为这个是某些 web 服务特有的,其实不是,这些功能应该要要依附于服务的操作系统(比如:Linux)。

 

问题一、 Linux 层面应该有如下一些 IO 模式

 

1. 阻塞I/O(blocking I/O)

 

2. 非阻塞I/O (nonblocking I/O)[ 轮训,这个轮训只轮训自己的通道] [连接数有优势] [拷贝数据阻塞]

 

3. I/O复用(select 和poll) (I/O multiplexing)[轮训,且轮训所有通道, 哪个好了,就给哪个返回, 比如select 可以同时处理多个阻塞I/O 操作][拷贝数据阻塞]

 

4. 信号驱动I/O (signal driven I/O (SIGIO))[不常用] [拷贝数据阻塞]

 

5. 异步I/O (asynchronous I/O (the POSIX aio_functions))[不需要轮训, 内核告诉用户已经完成了] [数据拷贝完成通知用户]

 

前四种都是同步,只有最后一种才是异步IO。为什么这么说呢?因为前面4种拷贝数据还需要请求一次,最后一种是拷贝数据完成了后通知用户进程。

 

 

问题二、 select, poll, epoll 的区别

 

select, poll, epoll 都是多路IO复用的解决方案;

 

select: 受限于 fd 查询标志位。每次轮训 socket 的个数为 fd 的size个数(不管当前socket 是否已经执行完成了,所以浪费性能,如果说可以把那些已经完成的socket做个标记,那么就可以不需要轮训所有的socket连接了)

 

poll : 本质和select 没什么区别,唯一区别是不受限于 fd 标记个数,使用链表来存储socket的连接状态,所以他能够保持 socket 连接数足够多。

 

epoll: 不是轮训机制,使用消息机制;

 

问题三、 fd (File Descriptor)标志位是什么

 

是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;

简单点说就是 linux 文件被打开(io)的个数;

但是Linux 系统会限制进程对文件打开的个数(比如是n),所以这个fd里面的值应该不超过n;

 

所以

 

其实在 Tornado 中所说的异步非阻塞其实和 linux中的关系不大;后来看了Torando 中的例子,其实就是一个回调操作,和Ajax的操作有点类似;

同步操作

from tornado.httpclient import HTTPClient

def synchronous_fetch(url):
    http_client = HTTPClient()
    response = http_client.fetch(url)
    return response.body

 

异步操作

 

from tornado.httpclient import AsyncHTTPClientdef asynchronous_fetch(url, callback):
    http_client = AsyncHTTPClient()
    def handle_response(response):
        callback(response.body)
    http_client.fetch(url, callback=handle_response)

 

问题四、为什么Java web 中没有这种操作(异步处理请求)

 

其实是有的,现在大部分 java web 都是基于 servlet 的,在 servlet 3.0 开始就引入了异步机制。也是一个回调,使用异步,能够加大的同一台电脑对请求数处理的吞吐量。所以理论上来讲,异步操作比同步操作在单位时间内处理的请求应该更多。

 

[参考]:http://blog.csdn.net/historyasamirror/article/details/5778378(io 模型)

[参考]:https://segmentfault.com/a/1190000003063859 (io 模型)

[参考]:http://blog.csdn.net/jay900323/article/details/18141217 (io 模型)

[参考]:http://blog.csdn.net/cywosp/article/details/38965239(fd)

[参考]: https://zhangxh20.github.io/2017/07/03/asyncservlet/(servlet 异步处理请求)

转载于:https://my.oschina.net/jiemachina/blog/1544718


http://www.niftyadmin.cn/n/1558960.html

相关文章

自定义Flink时间窗口

需求说明 Flink提供的常用简单窗口有:TumblingEventTimeWindows,TumblingProcessingTimeWindows,SlidingEventTimeWindows,SlidingProcessingTimeWindows等。对于初学者来说,这些窗口并不能满足特定的需求,例如:当接收到活动告警后,延迟一分钟,这一分钟内如果有对应清…

剑指 Offer 11之旋转数组的最小数字(相关话题:二分法)

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1(时间…

架构师之路-创业互联网公司如何搭建自己的技术架构

适用范围 本文主要针对中小型互联网公司,特别适用于手机APP或者pc的后台架构,基本可以支撑5万日活 本文会对可能用到的相关技术进行技术选型的说明,以及技术的架构介绍,技术架构的介绍课程后面有地址,可以点进去查看。…

LeetCode5852之最小化目标值与所选元素的差(相关话题:回溯,记忆化搜索,剪枝,归并排序)

题目描述 给你一个大小为 m x n 的整数矩阵 mat 和一个整数 target 。 从矩阵的 每一行 中选择一个整数,你的目标是 最小化 所有选中元素之 和 与目标值 target 的 绝对差 。返回 最小的绝对差 。a 和 b 两数字的 绝对差 是 a - b 的绝对值。 示例 1:…

SpringMVC拦截器实现登录认证

项目结构如图: 需要的jar:有springMVC配置需要的jar和jstl需要的jar SpringMVC包的作用说明: aopalliance.jar:这个包是AOP联盟的API包,里面包含了针对面向切面的接口。通常spring等其它具备动态织入功能的框架依赖这个jar spring-core.jar:这…

深入了解Hdfs和Yarn架构

目录 Hdfs 1.元数据节点和数据节点 2.合并流程 3.数据的分发遵循就近原则 Yarn 1主从架构<

重命名Apache日志,新日志文件会放在哪里

重命名access.log为access.log.bak,请问新的apache日志会放在哪?本文转自51cto的李导的博客2017-09-30-08:11:41原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lidao.blog.51cto.com/3…

数据分析上钻,下钻,切片,转轴含义的理解

字面解释 字面意思解释(根本核心是一样的,图表,地图,数据分析BI可能在实际的操作当中有细微的差别,固然暂且说是字面意义): 上钻:从当前数据往上回归到上一层数据。例如:(某数据的分类下面分为品名)从品名列表收拢到分类列表。 下钻:从当前数据往下展开下一层数据…