IOCP简单了解

news2024/12/30 2:49:11

1.IOCP是什么

IOCP是Input/Output Completion Ports的简称,中文翻译为完成端口,完成是应用程序向系统发起一个IO操作,系统会在操作结束后,将IO操作完成结果通知应用程序,端口指的是机制

2.重叠IO(Overlapped)

针对一个Socket可以发起多个IO操作,无需等待上一个IO完成,尽管调用IO操作是按顺序的,但是IO操作完成通知是随机的无序的

3.实现流程

在这里插入图片描述

2.原理

IOCP的基本原理是通过事件驱动的方式来处理I/O请求,以避免传统的阻塞式I/O操作带来的性能问题,具体来说,IOCP通过一下几个步骤完成异步I/O操作:

  • 1.应用程序首先创建一个或多个 I/O 端口,并将它们关联到套接字或文件句柄上
  • 2.当应用程序需要进行 I/O 操作时,它调用系统级别的 API,将请求提交到 I/O 端口上
  • 3.操作系统内核将 I/O 请求与相应的 I/O 端口关联,并立即返回,使得应用程序可以继续执行其他操作。
  • 4.内核在后台异步地执行 I/O 操作,并将结果存储在完成队列中。
  • 5.当 I/O 操作完成时,内核会通知完成端口,并将完成信息添加到完成队列中。
  • 6.应用程序通过调用 GetQueuedCompletionStatus() 函数获取完成队列中的已完成请求,并按需处理它们。
  • 7.如果完成队列为空,则应用程序可以等待新的完成事件发生,或者继续执行其他操作。

3.函数

3.1CreateIoCompletionPort

这个函数是个本身具有多重功能的函数(Windows平台上这样的函数并不多),需要用不同的方式来调用,以实现不同的功能

HANDLE WINAPI CreateIoCompletionPort(
  __in          HANDLE FileHandle,
  __in          HANDLE ExistingCompletionPort,
  __in          ULONG_PTR CompletionKey,
  __in          DWORD NumberOfConcurrentThreads
);
  • 创建内核
HANDLE hICP = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,1);

前三个参数在这种情况下是没有意义的,只需要全部传递NULL即可,第一个参数不是NULL而是INVALID_HANDLE_VALUE,因为第一个参数按照定义是一个文件的句柄,也就是需要IOCP操作的文件句柄,而代表“NULL”文件句柄的实际值是INVALID_HANDLE_VALUE,这是因为NULL实际等于0,而0这个文件句柄被用于特殊用途,所以要用INVALID_HANDLE_VALUE来代表“NULL”意义的文件,INVALID_HANDLE_VALUE的值是-1或者0xFFFFFFFF。最后一个参数NumberOfConcurrentThreads默认的推荐值就是CPU个数的2倍了

3.2GetQueuedCompletionStatus

BOOL WINAPI GetQueuedCompletionStatus(
  __in          HANDLE CompletionPort,
  __out         LPDWORD lpNumberOfBytes,
  __out         PULONG_PTR lpCompletionKey,
  __out         LPOVERLAPPED* lpOverlapped,
  __in          DWORD dwMilliseconds
);
  • 第一个参数就是我们之前创建的那个完成端口内核对象的句柄,这个参数实际也就是告诉系统,我们当前的线程是归哪个完成端口对象来调度。
  • 第二个参数是一个比较有用的参数,在函数返回后它将告诉我们这一次的IO操作实际传输或者接收了多少个字节的信息,这对于我们校验数据收发完整性非常有用。
  • 第三个参数是与完成端口句柄绑定的一个一对一的数据指针
  • 第四个参数就是重叠操作的数据结构
  • 第五个参数是一个等待的毫秒数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/832686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Compose应用案例(利用docker compose安装lnmp实例)

目录 Compose应用案例 一、前提配置 (一)安装docker-ce(Linux安装Docker) (二)安装docker-compose 二、安装docker compose部署lnmp (一)目录结构: (二…

SpringBoot、SpringCloud 版本查看

1、SpringBoot 官网地址 https://spring.io/projects/spring-boot#learn spring-boot-starter-parent 版本列表可查看: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent 2、SpringCloud 官网地址 https://spring.io/pro…

pycharm安装

去官网下载安装包: 然后运行: (左边第二个绿色字备注得有点子不对,这个勾选上的话,就是说在你的桌面上右击pycharm时会显示你的项目,你可以选择后直接打开。还是挺方便的一个功能,看自己需求要不…

Linux C++ 链接数据库并对数据库进行一些简单的操作

一.引言(写在之前) 在我们进行网络业务代码书写的时候,我们总是避免对产生的数据进行增删改查,为此,本小博主在这里简历分享一下自己在Linux中C语言与数据之间交互的代码的入门介绍。 二.代码书写以及一些变量和函数的…

Redis持久化两种方案以及对比差异

1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为R…

vmware网络配置

效果: 虚拟机和物理机网络互通; 虚拟机可以上外网 环境: vmware version 17.0.0 Centos 7.9 配置 1,vmware 菜单 - 编辑 - Virtual Network Edit 2, 选择VMnet8 VMnet information:NAT; 勾选2个…

第一百二十一天学习记录:线性代数:矩阵乘法运算(宋浩板书)

在编程和学习数据结构的过程中,发现有些算法会用到矩阵和矩阵的乘法运算,因此先将这一个知识点学习一下。 矩阵和行列式的区别 各种矩阵的概念 矩阵运算 乘法☆ 总结三条不满足

并发 如何创建线程 多线程

进程:一个程序的执行过程 线程:一个方法就是一个线程 并发:多个线程抢夺一个资源 操作同一个对象 创建线程方法1 //创建线程方法1 继承Thread类 重写润方法 调用start开启线程 public class TestThead extends Thread{Overridepublic voi…

Linux常用命令(Linux入门)

Linux常用命令 文章目录 Linux常用命令1、Linux命令初体验2、文件目录操作命令2.1、ls2.2、cd2.3、cat2.4、more2.5、tail2.6、mkdir2.7、rmdir2.8、rm 3、拷贝移动命令3.1、cp3.1、mv 4、打包压缩命令tar命令 5、文本编辑命令vi/vim 6、查找命令6.1、find6.2、grep 1、Linux命…

学习记录——SegNetr、EGE-UNet、R2AU-Net、PHNet、CFNet

SegNetr: Rethinking the local-global interactions and skip connections in U-shaped networks 前导: 集中于设计复杂的自注意力模块,以弥补基于卷积操作捕获长距离上下文依赖的不足,从而增加了网络的参数和计算复杂性;过于简…

Git Bash 教程!【不是所有人都会用Git】

我不太会用github...... 写这篇文章希望能顺利...... 【写在前面】介绍一下git bash的复制粘贴的快捷键,以防后续不会: 开始: 首先下一个windows:git for windows(地址:Git - Downloading Package (git-scm.com)) &a…

递归 shell指令

递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位 #include <myhead.h>int fun(int n) {if(n>0){printf("%d ",n%10);return 1fun(n/10); } }int main(int argc, const char *argv[]) {int n0;printf("请输入一个数&#xff1a;\n"…

JavaScript场景应用:Canvas实战开发一个二维折线图插件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f3c6;本文已…

MySQL概述与体系结构

文章目录 一、MySQL概述1.1 MySQL与redis的区别1.2 数据处理分类1.3 SQL1.4 数据类型 二、数据库设计三范式2.1 范式一2.2 范式二2.3 范式三2.4 反范式 三、MySQL体系结构3.1 结构组成3.2 连接池 四、sql语句执行过程4.1 select语句4.2 CRUD执行过程 一、MySQL概述 1.1 MySQL与…

复现沙箱逃逸漏洞

什么是沙箱(sandbox) 在计算机安全性方面&#xff0c;沙箱&#xff08;沙盒、sanbox&#xff09;是分离运行程序的安全机制&#xff0c;提供一个隔离环境以运行程序。通常情况下&#xff0c;在沙箱环境下运行的程序访问计算机资源会受到限制或者禁止&#xff0c;资源包括内存、…

小白到运维工程师自学之路 第六十四集 (dockerfile构建tomcat、mysql、lnmp、redis镜像)

一、tomcat&#xff08;更换jdk&#xff09; mkdir tomcat cd tomcat/ tar xf jdk-8u191-linux-x64.tar.gz tar xf apache-tomcat-8.5.40.tar.gzvim Dockerfile FROM centos:7 MAINTAINER Crushlinux <syh163.com> ADD jdk1.8.0_191 /usr/local/java ENV JAVA_HOME /us…

使用Canvas裁剪图片

使用Canvas裁剪图片 概述 在Web开发中&#xff0c;我们经常需要对图片进行裁剪&#xff0c;以满足不同尺寸需求或者实现图片的局部展示。本篇博客将带您深入了解如何使用Canvas技术来实现图片的裁剪功能。我们将通过一个实例来演示如何利用Canvas绘制图片&#xff0c;并通过蒙…

二叉树的相关题目

目录 1、根据二叉树创建字符串 2、二叉树的层序遍历 3、二叉树的最近公共祖先 4、搜索二叉树与双向链表 5、从前序与中序遍历序列构造二叉树 6、 从中序与后序遍历序列构造二叉树 7、二叉树的前序遍历&#xff08;非递归实现&#xff09; 8、二叉树的中序遍历&#xff08…

宋浩高等数学笔记(十)重积分

本章更新第10章重积分&#xff0c;关于三重积分的应用部分暂时略过&#xff0c;本部分在考察的时候不会很难&#xff0c;困难在于对重积分本质的理解&#xff0c;以及极坐标下相关公式的计算。类比普通的定积分&#xff0c;如果对一个宽度不均匀的函数&#xff0c;求积分分后相…

工厂模式详解与应用场景

摘要&#xff1a; 工厂模式是一种常见的设计模式&#xff0c;它可以帮助我们在面向对象的程序设计中更好地组织和管理对象的创建过程。本文将详细介绍工厂模式的概念、三种常见的工厂模式应用场景&#xff0c;并提供高质量的C代码示例&#xff0c;旨在帮助初学者更好地理解和应…