当前位置: 首页 > news >正文

IOCP vs EPOLL

基本概念

  • IO对象:文件、管道、磁盘、socket ...
  • IO操作:就是一次读或者写的请求
    • Windows: ReadFile、WriteFile、WSASend、WSARecv、AcceptEx ...
    • Linux: read、write、send、recv、accept ...

EPOLL

  1. epoll_create 创建一个epoll对象(在linux里对象一般都是通过文件描述符来访问的,文件描述符更符合linux的术语,下面统一叫FD(File Descriptor)吧)
  2. epoll_ctl 将IO对象关联到这个epoll对象
  3. epoll_wait 获取发生IO事件的IO对象

epoll_event,里面包含了事件的类型(.events),还有一个联合体data,这个data里你可以直接放IO对象的fd(.data.fd),或者放一个你自己的指针(.data.ptr),他的作用就是 让你能够找到发生事件的IO对象

IOCP

使用IOCP你要搞明白两个结构

  1. OVERLAPPED
    OVERLAPPED的英文含义是重叠,在编程中意义就是你可以在一个异步IO未完成之前,再进行一次IO操作。这个结构和每一次读写操作有关,就是你每调用一次IO函数,都要传一个这样的结构。一般的流程是:调用一个可以异步的IO函数,传入一个OVERLAPPED结构体指针,等这个IO的数据到达/送到了,系统再将这个OVERLAPPED指针还给你, 这个结构是和每一次IO操作相关的
  2. complete_key
    这个其实不是结构体,只是GetQueuedCompletionStatus函数的一个指针类型的参数,他的作用是让你找到发生事件的IO对象,和epoll_event里的.data.ptr的作用是一样的

总结

这两种机制都是通过将IO对象关联到一个 统一管理IO事件的对象 (Windows: CompletePortQueue, Linux:epoll-fd) 中来实现异步操作,不同的是:

  • Windows的IOCP除了要将IO对象关联到IOCP对象之外,还需要调用一个异步的IO函数并传入OVERLAPPED结构来告诉IOCP你要进行IO,这相当于你告诉IOCP你这次要监听哪种事件,而且事件每发生一次,你还得再调用一次异步IO函数再告诉IOCP一次。当事件发生时,IOCP机制会将数据直接拷贝到和OVERLAPPED结构关联的缓冲区里,你直接用就可以了
  • linux的epoll只需要将IO对象关联到epoll对象,并设置好关心的事件类型,当事件发生的时候才去调用IO函数获取数据,然后再使用数据

EPOLL看起来更像是 异步通知、IOCP看起来像是 异步传输

在IOCP里,识别IO事件是通过调用具体的IO函数并传入自定义的OVERLAPPED结构来实现的,在epoll里统一通过epoll_event的events字段指定。可以看出,linux的epoll模型在使用上更简单一些

使用异步的IO接口可以 用一个获少量的线程接管所有IO对象的事件,这样就避免了多线程同步模型里对那些没有IO事件发生的对象无意义的等待,大大提高了CPU利用率和网络吞吐率

转载于:https://www.cnblogs.com/luzhlon/p/7511939.html

相关文章:

  • 体验Windows Mobile 6.5 (模拟器)
  • 这是要逆天么,看我控制台程序玩Microsoft XPS Document 打印
  • Spring Cloud中负载均衡器概览
  • 文件特殊权限:SUID,SGID,SBIT
  • 11.03 在外链接中用OR逻辑
  • 将文件名从1变为000001
  • 重构之美-跨越Web标准,触碰语义网[分离:通用也许是个美丽陷阱]
  • shell脚本(1)
  • 笔记-Kotlin学习
  • 【Unity Shader】五、Shader纹理映射,及纹理的缩放和偏移
  • img 样式单和属性
  • 统计学基于SPSS贾俊平 授课笔记 发布作业 spss19cn 软件下载地址及破解包spss19_10039 下载地址...
  • zabbix监控模板大全
  • 2017杭州云栖大会—移动云专场【赠票】
  • seaJS源码
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • ES10 特性的完整指南
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JAVA并发编程--1.基础概念
  • Java知识点总结(JavaIO-打印流)
  • Python 基础起步 (十) 什么叫函数?
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • STAR法则
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 聊聊directory traversal attack
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 深度学习中的信息论知识详解
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 一起参Ember.js讨论、问答社区。
  • 移动端唤起键盘时取消position:fixed定位
  • 优秀架构师必须掌握的架构思维
  • 在Docker Swarm上部署Apache Storm:第1部分
  • !!java web学习笔记(一到五)
  • # 安徽锐锋科技IDMS系统简介
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #ifdef 的技巧用法
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (+4)2.2UML建模图
  • (1)bark-ml
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)Eureka服务搭建,服务注册,服务发现
  • (接口封装)
  • (转)重识new
  • (轉)JSON.stringify 语法实例讲解
  • (轉貼) UML中文FAQ (OO) (UML)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .form文件_一篇文章学会文件上传
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET 材料检测系统崩溃分析
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @font-face 用字体画图标