浅谈异步IO各模型优缺点
本文只讨论OverLapped I/O的三种异步模型及完成端口,像select、SWASelect不作讨论,讨论顺序从劣到优,方便于循序渐进地对比,更容易区分各模型之间的差别。
1. OverLapped I/O 设备内核对象模型,这种模型虽然采用异步,但为了知道对象是否触发,需要一直挂起线程,换个角度来说,与同步的差异不大。
2. OverLapped I/O 事件内核对象模型,这模型比较前一种就先进多了,它可以同时等待多个事件,但是waitForMultipleObject最多只能等待64个事件,也就是说如果server有6400个连接的话,就需要100个线程。我们知道线程之间上下文切换是很耗CPU的。这样在多连接多并发的情况下还是达不到我们期望的高性能。
3. OverLapled I/O 完成例程模型,这模型较之前又有很大的改进。少了单线程最多只能处理64个事件的限制,但它在高性能方面还是存在一个问题,就是它是那个线程请求就那个线程处理,这样会存在个别CPU核空闲着,而个别CPU核又很吃紧的情况。简而言之,少了负载均衡。
4. 完成端口。完成端口是几种模型中最先进的,它预先申请好线程,一般有多少个核就申请多少个线程,这样可以避免线程间切换而浪费CPU无谓的开销。当有请求到来,完成端口会均衡地分配到每个线程中去,从而达到CPU各核之间的负载均衡。
考虑到单文字描述还不够直观对比,下面再给一个简化后对比的表:
|
模型 |
与前一种对比优点 |
缺点 |
|
设备内核对象模型 |
--- |
与同步的差异不大 |
|
事件内核对象模型 |
可以同时等待多个事件 |
每个线程最多只能等待64个事件,多线程下增加了CPU上下文切换的开销 |
|
完成例程模型 |
少了单线程最多只能处理64个事件的限制,减少多线程上下文切换的开销 |
没有CPU的负载均衡 |
|
完成端口 |
使用CPU负载均衡,充分利用CPU各核 |
--- |
浅谈异步IO各模型优缺点的更多相关文章
- 浅谈linux IO csy 360技术 2021-01-18
浅谈linux IO csy 360技术 2021-01-18
- 浅谈异步上传插件 jquery-file-upload插件
当我们需要异步上传文件的时候,我们倾向于在网上查找相关的JQuery插件,jquery-file-upload就是我们经常看到的,但是他的主页是英文的,对于我们这些英语比较差的同学来说,简直就是... ...
- 【Java】浅谈Java IO
注意 本文的代码,为了学习方便,简化代码复杂度,未考虑拆包.粘包等情况的处理.所以仅供学习使用,不能用于实际环境. 阻塞IO,BIO Java1.1发布的IO是BIO.阻塞地连接之后,通过流进行同步阻 ...
- 浅谈Unix I/O模型
关于I/O模型的文章比较多,参考多篇后理解上仍然不太满意,终需自己整理一次,也是编写高吞吐量高性能网络接口模块的基础.这里所说的主要针对网络I/O,近几年面对越来越大的用户请求量,如何优化这些步骤直接 ...
- 浅谈 Unix I/O 模型
原文出处:http://miaoo.in/talk-about-unix-io-model.html 在实际应用中,数据操作通常分为输入和输出,那么以输入为例,在操作系统中,一个数据的输入通常分为以下 ...
- 【转】浅谈Node.js单线程模型
Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这 ...
- 浅谈Java的内存模型以及交互
本文的内存模型只写虚拟机内存模型,物理机的不予描述. Java内存模型 在Java中,虚拟机将运行时区域分成6中,如下图: 程序计数器:用来记录当前线程执行到哪一步操作.在多 ...
- 浅谈 Linux IO
公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 来源于:360云计算 1 前言 Linux IO是文件存储的基础.本文参考了网上博主的一些文章,主要总结了LinuxIO的基 ...
- 浅谈 css3 box盒子模型以及box-flex的使用
display:box;box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 一.使 ...
随机推荐
- JS中escape 方法和C#中的对应
在项目中遇到js中escape过的json字符串,需要在C#中对应模拟编码,记得原来遇到过这个问题,但是当时没记录下来方案, 于是又搜索了一番,发现别人说的都是HttpUtility.UrlEncod ...
- 分享最近写的一个存储过程 SOLVE_LOCK
CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句V_SQL02 VARCHA ...
- javascript DOM小结
一:定义 dom:文档对象模型. dom是针对HTML和XML文档的一个API.dom描绘了一个层次化的节点树,允许开发人员添加.移除.修改页面的某一部分. 1:childNodes(返回当前节点的子 ...
- Python:运算符
#!/usr/bin/python3 #运算符 #算术运算符 print("算术运算符:","+ - * / % **(幂) //(取整)") #比较运算符 p ...
- jacob 操作word
1. 首先下载jacob-1.18.zip,解压后有两个文件jacob.jar 和 jacob.dll.需要把jacob.jar放到你工程的classpath中并且把jacob.dll放到jdk的bi ...
- 【工具篇】xshell
SSH.telnet.串口登录等,类似Secure CRT,蛮好用的. 中文显示乱码的解决方法,file->properties,在Encoding那里修改为UTF-8 修改颜色,点Edit修改 ...
- 微信JS-SDK实际分享功能
为了净化网络,整顿诱导分享及诱导关注行为,微信于2014年12月30日发布了<微信公众平台关于整顿诱导分享及诱导关注行为的公告>,微信平台开发者发现,原有的微信分享功能不能用了,在ipho ...
- openerp import l field size limit
modify the file addons/base_import/models.py add the following line at the very begining of the _con ...
- [BZOJ 1046] [HAOI2007] 上升序列 【DP】
题目链接:BZOJ - 1046 题目分析 先倒着做最长下降子序列,求出 f[i],即以 i 为起点向后的最长上升子序列长度. 注意题目要求的是 xi 的字典序最小,不是数值! 如果输入的 l 大于最 ...
- QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)
=QVariant= [%这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是 ...