完成端口学习笔记(一):完成端口+控制台 实现文件拷贝

本文介绍了如何使用IO完成端口(IOCP)结合控制台实现单线程文件拷贝。从IO概念出发,探讨了IO端口、IO接口等,然后详细讲解了IOCP的工作原理,最后展示了如何创建IOCP并进行文件拷贝操作,通过PostQueuedCompletionStatus和GetQueuedCompletionStatus函数控制文件拷贝流程。
摘要由CSDN通过智能技术生成

        最近在整理手里一个项目的后台服务端归档程序,重新梳理了一下有关“完成端口”的知识,发现还是有很多模棱两可的地方,下面记录一下再次学习的点滴,该篇博文还会有后续的补充章节,不知道什么时间会再补充^_^。


IO概念

        还记得,自己对IO的初步了解还是从BIOS开始的,那时候就建立了IO即代表输入和输出(input & output)的印象。但是跟IO关联的词有很多,很容易产生歧义,例如IO端口、IO接口、IO空间、IO请求或者IO操作等等。学习就是一个“排除不确定因素”的过程,下面我们来简单的对比一下跟IO相关的概念:

(1)IO设备:大家都知道计算机有一个核心叫做CPU,它用来管理整个计算机,在管理过程中CPU与其他组件之间的交互无非就是读或写,换个词来说就是输入或输出。那么除了CPU以外,计算机的其他组件都可被当成输入或者输出设备,简称为IO设备。

(2)IO端口:每个连接到I/O总线上的设备都有自己的I/O地址集,即所谓的I/O端口(I/O port)。I/O端口还可以被映射到物理地址空间,因此处理器和I/O设备之间的通信就可以直接使用内存进行操作的汇编指令(如mov、and、or等)。现代的硬件设备更倾向于映射I/O,这样的处理速度较快,并可以与DMA结合起来使用。(摘自《深入分析Linux内核源码》)

(3)IO接口:接口在现实世界中有多种意义,例如我们平时最常说的USB接口,这往往是两种设备之间交互的一个渠道。这里我们指的是“处于一组I/O端口与对应的设备控制器之间的一种硬件电路”。它起到翻译器的作用,即把I/O端口中的值转换成设备所需要的命令和数据。从另一个角度,它检测设备状态的变化,并对其状态寄存器作用的I/O端口进行相应的更新。(摘自《深入分析Linux内核源码》)

(4)IO空间:很多硬件都有自己的内存,通常称之为I/O空间。例如所有比较新的显卡都有独立的RAM显存。用它来存储要在屏幕上显示的屏幕影像。

(5)IO请求:了解了上述几个IO词汇的定义后,IO请求或者说IO操作就容易理解多了。按字面意思来解释,就是CPU与IO设备进行交互时发送的指令请求,可以直观的理解为IO请求指令。要了解这个IO请求指令,就要介绍一些关于操作系统“设备管理”的相关内容。所谓的设备管理是操作系统对设备处理的一种抽象。即所有硬件设备都被看成普通文件,可以通过用操作普通文件相同的系统调用来打开、关闭、读取和写入设备。系统中每个设备都有一种设备特殊文件来表示,例如系统中第一个IDE硬盘被表示成/dev/hda。(摘自《深入分析Linux内核源码》)

(6)IO操作:IO操作与IO请求是差不多的概念,就是指操作系统与IO设备进行的一种交互,当然这种操作可以由用户自己发起,有操作系统来实现,而操作系统要控制IO设备往往需要通过驱动程序,基本示意图如下:


IOCP——IO完成端口


        好了,介绍完了IO的相关概念,下面进入主题“完成端口”。在Jeffrey Richter的描述中,IO完成端口是Wnidows系统提供的最复杂的内核对象,是一种解决并发IO请求的最佳模型,是用来实现高容量网路服务器的最佳方法(一听到内核就让人头疼,由于本人能力有限,这里就不深入了,有兴趣的读者可以自行脑补)。既然是一个对象,那么就直接分析一下操作系统眼中的完成端口的具体定义吧。Windows中利用CreateIoCompletionPort命令创建完成端口对象时,系统内部自动创建了5个相应的数据结构,分别是:设备列表(Device List)、IO完成请求队列(I/O Completion Queue-FIFO)、等待线程队列(WaitingThread List-LIFO)、释放线程队列(Released Thread List)和暂停线程队列(Paused Thread List)。示意图(图片节选自《Windows via C/C++》英文版 第五版)如下:


        

        文章中的图片不是很清楚,这里将其中的英文描述简单的列在下面的表格中,

设备列表

ADD

每当调用CreateIoCompletionPort绑定到某个设备时,系统会将该设备句柄添加到设备列表中;

REMOVE

每当调用CloseHandle关闭了某个设备句柄时,系统会将该设句柄从设备列表中删除;

I/O操作

完成队列

ADD

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zssure

己欲立而立人,己欲达而达人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值