浅谈异步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实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 一.使 ...
随机推荐
- android SDK 代理配置(东北大学)
启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 在『Andro ...
- oracle-snapshot too old 示例
一.快照太老例子: 1.创建一个很小的undo表空间,并且不自动扩展. create undo tablespace undo_small datafile '/u01/app/oracl ...
- 用java写bp神经网络(四)
接上篇. 在(一)和(二)中,程序的体系是Net,Propagation,Trainer,Learner,DataProvider.这篇重构这个体系. Net 首先是Net,在上篇重新定义了激活函数和 ...
- VS 编程常见错误及解决方法
1. VS2013 无法打开包括文件:“cv.h"等一些头文件 解决方法: cv.h是build\include文件夹下的头文件,所在文件夹位置是D:\Program Files (x86) ...
- SGU 133.Border
水题不说了 #include <iostream> #include <cstring> #include <cstdio> #include <cmath& ...
- SGU 221.Big Bishops(DP)
题意: 给一个n*n(n<=50)的棋盘,放上k个主教(斜走),求能放置的种类总数. Solution : 同SGU 220,加个高精度就好了. code #include <iostre ...
- wordpress整站搬家总结
去年图便宜,也没准备认真写博文,所以花了几百元钱买了个国内空间(域名已经备案).购买了以后,放了一个wordpress博客,没事的时候写写博文,但从没有抽出时间去写,文章的质量也不追求.一开始还可以, ...
- NPOI读写Excel0307
#region NPOI 操作 Excel 2007 /// <summary> /// 将Excel文件中的数据读出到DataTable中(xlsx) /// </summary& ...
- js 强制转换
强制转换为布尔类型: <script> var text =Boolean(0) //=>以下转换的类型都为false text = Boolean(0.0) text = Bool ...
- One-day-学习笔记-商品成交时发送短信
个人学习笔记(one) 根据需求:商品成交时发送短信 html代码省略..... Model代码省略..... /* * --------------------------------------- ...