曾经我作为一个初学者,学习到IO完成端口时,简直就想直接跳过去,几乎是看进去就是一团雾,出来了也看不清。但是,为了学会它,就硬着头皮看,一回生二回熟,就这样,慢慢思考研究,阅读其他人的分析,最后才能说出点一二。所以,在此,完全是站在初学者的角度来看IO完成端口的,相信我所想所疑惑的,也正是大家所疑惑的,希望本系列的文章能够帮助大家拨开疑云。
首先,我必须对“IO完成端口”这个词汇进行解释。相信大多数朋友对这个词就不甚理解。IO是Input OutPut的英文缩写,就是输入输出的意思。输入输出可能大家知道,也可能不知道,从哪到哪叫做输入,从哪到哪叫做输出?或许这么一问,你还真说不出一个所以然吧。因为曾经我也是对这个不解。我们通常听说的IO,是一个特定的词汇。而中心的主体是CPU,IO就是针对CPU来说的。而数据流向则是流向CPU的方向,这就是输入的方向。从CPU流向外面,就是输出的方向。这个是IO的通常的意思。然而很多时候还有更狭窄的意思,就是特指磁盘等慢速设备的数据读写,当然,数据流向还是一致的。当然,在不同的场合,也有不一样。因为看你的主体是谁。如果主体说的是磁盘,当然输入指的肯定是将数据流向磁盘保存,相反就是输出。这一点,请大家仔细斟酌。再不要被各种IO迷惑了。
“完成”这个词汇,就比较好理解。这个意思是,你提交一个IO请求到设备,直到完成,然后设备返回一个结果。整个过程就是完成的概念。不过这里重点强调的是最终完成的状态,强调完成后会通知你。
“端口”,这个概念就是最可恶的。大家都被这个词给迷惑了。端口,大家第一反应就是TCP/IP上的端口。也就把这个端口与TCP/IP的端口当做成是一样的东西了。这样想就大错特错了。“IO完成端口”,并不是一个真的端口,它只是一个内核对象,和文件内核对象、互斥内核对象一样的东西。但是因为它和这些内核对象不一样,有专门的机制,所以就很特别,也很复杂。我这么一说,大家是不是也就明白,这里的端口只是一个内核对象而已。那么问题来了,为什么把它叫做端口呢?大家或许也是最想问的一个问题。根据IO完成端口的设计,整个运行逻辑和端口的运作模式很类似,微软也就取名端口,意思是把这个内核对象抽象成端口,本来是让大家容易接受这个概念的,不料却反而迷惑了好多人。
IO完成端口的名字,也就解释得差不多了。IO完成端口只是一个内核对象而已,和其他的同步互斥内核对象就是一个东西,没什么特别的。只不过,特别的地方在于使用方式。大家一提到IO完成端口,就自然而然联系到IO处理。其实IO作为内核对象,也可以用于同步的。大家不要觉得这个很神奇,其实就很自然的。只不过,IO完成端口主要是为IO处理设计的,所以一般都用于处理IO。
然后讲解一下IO完成端口的产生原因。相信通过以上的讲解,大家对IO完成端口并不会完全的惧怕了吧。