本文只讨论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各模型优缺点的更多相关文章

  1. 浅谈linux IO csy 360技术 2021-01-18

    浅谈linux IO csy 360技术 2021-01-18

  2. 浅谈异步上传插件 jquery-file-upload插件

    当我们需要异步上传文件的时候,我们倾向于在网上查找相关的JQuery插件,jquery-file-upload就是我们经常看到的,但是他的主页是英文的,对于我们这些英语比较差的同学来说,简直就是... ...

  3. 【Java】浅谈Java IO

    注意 本文的代码,为了学习方便,简化代码复杂度,未考虑拆包.粘包等情况的处理.所以仅供学习使用,不能用于实际环境. 阻塞IO,BIO Java1.1发布的IO是BIO.阻塞地连接之后,通过流进行同步阻 ...

  4. 浅谈Unix I/O模型

    关于I/O模型的文章比较多,参考多篇后理解上仍然不太满意,终需自己整理一次,也是编写高吞吐量高性能网络接口模块的基础.这里所说的主要针对网络I/O,近几年面对越来越大的用户请求量,如何优化这些步骤直接 ...

  5. 浅谈 Unix I/O 模型

    原文出处:http://miaoo.in/talk-about-unix-io-model.html 在实际应用中,数据操作通常分为输入和输出,那么以输入为例,在操作系统中,一个数据的输入通常分为以下 ...

  6. 【转】浅谈Node.js单线程模型

    Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这 ...

  7. 浅谈Java的内存模型以及交互

    本文的内存模型只写虚拟机内存模型,物理机的不予描述. Java内存模型 在Java中,虚拟机将运行时区域分成6中,如下图:              程序计数器:用来记录当前线程执行到哪一步操作.在多 ...

  8. 浅谈 Linux IO

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 来源于:360云计算 1 前言 Linux IO是文件存储的基础.本文参考了网上博主的一些文章,主要总结了LinuxIO的基 ...

  9. 浅谈 css3 box盒子模型以及box-flex的使用

    display:box;box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分.   一.使 ...

随机推荐

  1. Java 基础(一)

    Java不只是一种语言,更是一个完整的平台,有一个庞大的库,其中包含了很多可重用的代码和一个提供诸如安全性.跨操作系统的可移植性以及自动垃圾收集等服务的执行环境. javaSE: 整个java技术的核 ...

  2. python中的几种集成分类器

    from sklearn import ensemble 集成分类器(ensemble): 1.bagging(ensemble.bagging.BaggingClassifier) 对随机选取的子样 ...

  3. 『重构--改善既有代码的设计』读书笔记----Introduce Foreign Method

    当你无法获得一个类的源代码或者没有权限去修改这个类的时候,你对于这种为你服务的类,你可能会出现需要别的需求的时候,比如一个Date类,你需要能够让他本身直接返回出他的后一天的对象,但他没有,这个时候你 ...

  4. javascript 函数声明问题

    (function(){ //运行正常 test1(); function test1() { console.log('123'); }; })() (function(){ //出错,test2未 ...

  5. asp.net MVC 从其它项目复制过来的Area里面的Controllers文件读取不到

    从其实项目复制过来的Controllers,在访问时显示不存在文件 检查一下对应的area里面的AreaRegistration文件的命名空间是否一致

  6. 矩形嵌套问题-ACM集训

    参考 http://blog.csdn.net/xujinsmile/article/details/7861412 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形 ...

  7. Java常量和变量

    1.Java运行原理 编译+解释型语言: 程序代码经编译后转换为一种称为java字节码(.class文件)的中间语言 file.java--->Class.class java虚拟机JVM将字节 ...

  8. js touch触屏原理分析

    之前我们做过许多触屏的特效,那么,今天,我们来分析下js的触屏原理.事实上,大家百度一下js touch基本上可以找到这文章“指尖下的js ——多触式web前端开发之一:对于Touch的处理”,我想这 ...

  9. C#【数据库】 Access类

    using System; using System.Data; using System.Data.OleDb; namespace AccessDb { /**//// <summary&g ...

  10. Vim的学习心得

    现在的工作是在unix平台,平时是用UE的ftp功能来写代码的,有时候文件大了,传输就很慢,而且经常不是很稳定.下定决心要学学Vim(现在应该没有人用原始的vi了吧),在经过二周的使用后,发现Vim实 ...