Windows核心编程【10】小结

第十章 同步设备I/O与异步设备I/O

1、本章介绍的技术可以用来设计高性能、伸缩性好、响应性好,而且健壮的应用。一个伸缩性好的应用程序在处理大量并发操作时和处理少数并发操作时同样高效。
2、在Windows应用程序中,线程是最好的工具,可以用来对工作进行划分。
3、通过I/O完成端口,可以让线程在读取设备和写入设备的时候不必等待设备的响应,从而显著地提高吞吐量。
4、I/O完成端口最初被设计用来处理设备I/O,但这么多年来,MS已经构架出了越来越多能够非常好地适应I/O完成端口模型的操作系统设施。其中一个例子就是作业内核对象,它对进程进行监视并向I/O完成端口发送事件通知。
5、I/O完成端口也可以和设备I/O完全无关,简单地说,它是一种有无数用途的绝佳的线程间通信机制。


一、打开和关闭设备

1、Windows的优势之一是它所支持的设备数量。就这里讨论而言,把设备定义为能够与之进行通信的任何东西。各种设备及其常见用途:

2、本章将讨论应用程序如何与这些设备进行通信而不必等待设备响应。Windows极可能的对开发人员隐藏设备之间的差异。虽然不比过分关心设备的类型,但各个设备之间线程存在着差异。
3、下表列出了各种设备以及用来打开它们的函数

4、上表中的每个函数都返回一个用来标识设备的句柄,可以将该句柄传给许多函数来与设备进行通信。
5、在完成对设备的操作后,必须将其关闭。对大多数设备来说,最常用的CloseHandle;如果是套接字,那么closesocket。可以调用GetFileType来查处设备的类型。返回值如下表

6、CreateFile函数(MSDN更加详细也更新 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx)当然可以用来创建和打开磁盘文件,但同样可以打开许多其他设备。其需要许多函数,这使得我们在打开设备的时候有相当大的灵活性。
7、调用CreateFile的时候,参数pszName即表示设备的类型,也表示该类设备的某个实例。
8、参数dwDesiredAccess用来指定我们想以何种方式来和设备进行数据传输。可以传入下表列出的4个普遍使用的标志。某些类型的设备还支持额外的访问控制标志。例如,当打开一个文件的时候,我们可以指定诸如FILE_READ_ATTRIBUTES之类的访问标志。

9、参数dwShareMode用来指定设备共享特权(device-sharing privilege)。当我们仍然打开着一个设备的时候(也就是说,我们尚未调用CloseHandle来关闭设备),该参数可以控制其他的CreateFile调用,能够以何种方式来打开设备。下表列出了一些可以的值:

10、在打开一个文件的时候,传入的路径名最长不超过MAX_PATH(在winDef.h中被定义为260)个字符。但是,调用CreateFileW(Unicode版本)并给路径名加上“\\?\”前缀,可以超越这个限制。CreateFileW会把前缀去除,它允许我们传入的路径名长度超过32000个Unicode字符。但需要注意的是,在使用这个前缀的时候,必须使用完整的路径名,系统不会对诸如“.”和“..”之类的相对路径进行处理。此外,路径中的每个独立的组成部分仍然不能超过MAX_PATH个字符。
11、参数psa指向SECURITY_ATTRIBUTES结构,用来指定安全信息以及我们是否希望CreateFile返回的句柄能够被继承。只有当我们在具备安全性的文件系统(比如NTFS)中创建文件的时候,才会用到结构内部的安全描述符,在其他所有情况下,该安全描述符会被忽略。
12、参数dwCreationDesposition对文件的含义更重大。下表列出了可选值。

调用CreateFile来打开文件之外的其他设备时,必须将OPEN_EXISTING传给dwCreationDisposition参数。
13、dwFlagsAndAttributes参数有两个用途:其一,它允许我们设置一些标志来微调与设备之间的通信;其二,如果设备是一个文件,还能够设置文件的属性。这些通信标志中的大多数都是一个信号,用来告诉系统我们打算一何种方式来访问设备。这样系统就可以对缓存算法进行优化,来帮助我们提高应用程序的效率。
14、下面的CreateFile的高速缓存标志,主要关注文件系统对象。
a、FILE_FLAG_NO_BUFFERING,则合格标志表示在访问文件的时候不要使用任何数据缓存。一般情况下,文件数据的一部分会在内存中出现两次:高速缓存管理器有一个缓存,当我们在调用某些函数(比如ReadFile)的时候,我们自己会有一个缓存。系统高速缓存管理器的速度的提升是通过从文件中读取超出实际需要的数据量来达到的。如果我们不再从文件中读取数据,那么可能会浪费内存。通过指定FILE_FLAG_NO_BUFFERING标志,高速高速缓存管理器不要对任何数据进行缓存——我们会自己对数据进行缓存。这取决于我们正在做什么。则合格标志可以提高应用程序的性能和内存的使用效率。由于文件系统的设备驱动程序会讲文件数据直接写入到我们提供的缓存中,因此必
须遵循一定的规则:在访问文件的时候,使用的偏移量必须正好是磁盘卷的扇区大小的整数倍(用GetDiskFreeSpace函数来确定磁盘卷的扇区大小);读取/写入文件的字节数必须正好是扇区大小的整数倍;必须确保缓存在进程地址空间中的起始地址正好是扇区大小的整数倍。
b、FILE_FLAG_SEQUENTIAL_SCAN和FILE_FLAG_RANDOM_ACCESS,只有当我们允许系统对文件数据进行缓存的时候,这些标志才会有用。如果指定了FILE_FLAG_NO_BUFFERING标志,那么这两个标志都会被忽略。如果指定了FILE_FLAG_SEQUENTIAL_SCAN标志,那么系统会认为我们将顺序地访问文件。会先预读部分数据。但是如果我们要随机读取(会重新设置文件指针),那么还是指定FILE_FLAG_RANDOM_ACCESS标志。这标志是告诉系统不要提前读取文件数据。
c、为了对一个文件进行管理,高速缓存管理器必须为该文件保存一些内部数据结构——文件越大,所需的数据结构就越多。在出力非常大的文件时,高速缓存管理器可能无法分配它所需的内部数据结构,从而导致打开文件失败。为了访问非常大的文件,必须用FILE_FLAG_NO_BUFFERING标志来打开文件。
d、FILE_FLAG_WRITE_THROUGH,这是最后一个与高速缓存有关的标志。它禁止对文件写入操作进行缓存以减少数据丢失的可能性。当指定这个标志的时候,系统会将所有对文件的修改直接写入到磁盘中。但是,系统仍然会在内部的缓存中保存文件数据,这样文件读取操作会继续使用缓存中的数据(如果可供使用的话),而不必直接从磁盘中读取数据。如果用这个标志来打开网络服务器上的文件,那么只有在数据已经被写入服务器的磁盘之后,各个Windows文件写入函数才会返回到调用线程。
15、用来对高速缓存之外的各种行为进行定制。
a、FILE_FLAG_DELETE_ON_CLOSE,使用这个标志可以让文件系统在文件所有的句柄都被关闭后,删除该文件。这个标志通常和FILE_ATTRIBUTES_TEMPORARY属性一起使用。当这两个标志一起使用的时候,应用程序可以创建一个临时文件,想文件中写入数据,从文件中读取数据,最后关闭文件。当关闭文件的时候,系统胡i自动删除该文件。
b、FILE_FLAG_BACKUP_SEMANTICS,这个标志一般用于备份和恢复软件。在打开或创建人和文件之前,为了确保试图打开文件或创建文件的进程具有所需的访问特权,系统通常会执行安全性检查。但是,备份和恢复软件有一定的特殊性,它们会跳过某些文件安全性检查。当指定该标志的时候,系统会检查调用者的存取令牌(access token)是否具备对文件和目录进行备份/恢复的特权。如果调用者具备相应的特权,那么系统会允许它打开文件。也可以用该标志来打开一个目录的句柄。
c、FILE_FLAG_POSIX_SEMANTICS,区分文件大小写的方式来查找文件名。
d、FILE_FLAG_OPEN_REPARSE_POINT,该标志告诉系统忽略文件的重解析属性(即reparse attribute,如果有的话)。重解析属性允许一个文件系统过滤器对打开文件、读取文件、写入文件以及关闭文件这些行为进行修改。通常这样的修改行为是我们想要的,因此不推荐使用该标志。
e、FILE_FLAG_OPEN_NO_RECALL,该标志告诉系统不要将文件内容从脱机存储器(既是offline storage,比如磁带)回复到联机存储器(既是online storage,比如硬盘)。当文件很长时间没有被访问的时候,系统可以将文件内容转移到脱机存储器,从而腾出硬盘空间。(?)当系统执行这个操作的时候,并不会销毁硬盘上的文件,而只是销毁文件中的数据。当文件被打开的时候,系统会自动地从脱机存储器中恢复到文件数据。而该标志告诉系统不要恢复数据,这会导致系统对脱机存储媒介进行I/O操作。
f、FILE_FLAG_OVERLAPPED,这个标志告诉系统我们想要以异步方式来访问设备。打开设备的默认方式是同步I/O(既是没有指定该标志的)。
16、还有文件属性标志,见下表。除非我们正在创建一个新文件,且传给hFileTemplate参数的值为NULL,否则系统会完全忽略dwFlagsAndAttributes参数所指定的这些标志。


17、如果要创建临时文件,那么应该使用FILE_ATTRIBUTES_TEMPORARY标志。这样,CreteFile会尽量将文件数据保存在内存中࿰

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值