Windows IO操作
Windows程序中, 基础的运行单元为线程!
为每一个线程分配一个处理器, 可以让系统执行多个操作!
当线程进行一个IO操作是, 会被挂起, 从而影响性能!
为了解决这类问题, Windows使用了一套非常好的机制 I/O完成端口.
IO操作
在C语言中, 我们的
printf,scanf,fprintf,fscanf等都是IO操作- 输入输出缓冲区, 我们称之为一个
"特殊的文件"
- 输入输出缓冲区, 我们称之为一个
- 在语言的层面的IO操作, 大部分都是指从文件的操作.
- 读入, Input, 就是 I 操作.
- 写入, Output, 就是 O 操作.
- 在操作系统层面, 对于外部设备的操作, 也都是IO操作
- 对文件, USB, 串口, 网络通讯等都是IO操作.
IO完成端口机制
Windows是一个多任务多线程的操作系统
- 多任务是指在Windows系统下面可执行多个进程
- 多线程是指在一个进程中可以同时执行多个线程
- 进程是程序的一个独立空间, 线程则是来实际进行工作的.
程序运行时可以用到电脑的每一个内核
- 操作系统可以将线程和多个内核对应起来
- 可以让每一个核心来运行一个线程来做一件事情
- 这样就达到了多任务并行处理
实现多进程和多线程后, 计算机的瓶颈不在是计算速度, 而是硬盘等外部设备的操作
它会导致我们正在工作的线程挂起
- 什么是挂起?
- 比如我们需要读取外部设备中的一些数据
- 根据外部设备的存储速度, 读取数据可能需要进行2分钟
- 这两分钟内, 执行这个操作的线程会被挂起, 要等待读取完成后才会返回
- 它必须等待IO操作完成时候才能进行
Windows就使用了一套
IO完成端口机制来解决线程被挂起- 当有一个IO请求的时候, 会发送这个IO请求
- 这时, 线程立即返回, 不等待IO操作处理完成
- 线程继续运行, 处理后面其他的事
- 当IO操作完成后, 会发出一个通知
- 得到这个通知后, 线程在来进行数据的处理.
- 这种操作称为IO完成端口机制
- 它不会让线程挂起, 一直等待IO操作完成, 提高了效率
设备
Windows中的设备包括并不限于如下几个.
文件
在Windows编程中, 文件的定义为:
二进制数据的集合
广义的文件定义这是根据文件格式定义不同意义的文件.
扩展阅读:
广义上的文件, Windows中的文件格式列表, 详情见 维基百科
维基百科访问请"搭梯子"
目录
- 在计算机或相关设备中, 一个"目录"或"文件夹"就是一个装有数字文件系统的虚拟"容器"
- 在它里面保存着一组文件和其他的一些目录(文件夹)
- 一个典型的文件系统可能会包含成千杭婉个目录(文件夹)
- 多个文件通过存储在一个目录(文件夹)中, 可以达到现有组织的存储文件的目的.
- 在一个目录(文件夹)中的另一个目录(文件夹)被称为它的子目录(子文件夹)
- 这样, 这些目录(文件夹)就构成了层次, 我们一般称之为"树"结构.
逻辑磁盘驱动器
将Windows上的原始磁盘空间配置为逻辑驱动器或物理驱动器
逻辑驱动器在编程中常备用于格式化驱动器
比如 C, D, E, F 等等盘符.
物理磁盘驱动器
常备用于获取分区表
多个硬盘会有多个物理磁盘驱动器.
内核对象
- 逻辑磁盘, 目录, 文件等都是虚拟的
Windows会自己维护一个文件
- 这里的文件是指
磁盘上一段连续的空间所存放的数据
- 这里的文件是指
- 通过文件系统的内核对象来进行维护
- 一个文件内核对象就代表从文件开始到文件结束的内存区域
一个文件对象就是一个类或结构体
- 可以用面向对象的思想来进行理解
- 文件对象是为了来代表出便于我们理解和管理的"单位"
- 文件, 目录, 逻辑磁盘, 物理磁盘都有自己相应的内核对象
- 可以通过Win32的API来获取对应的文件的内核对象.
串口
通过电话线发送信号, 单通道.
数据一位一位地顺序传送
通信线路简单, 只要一对传输线就可以实现双向通信(可直接利用电话线作为传输线)
从而大大降低了成本
适用于远距离通信,但传送速度较慢
- 它是一个外接设备
- 它也有其内核对象的存在
USB
是英文Universal Serial Bus(通用串行总线)的缩写
是一个外部总线标准, 用于规范电脑与外部设备的连接和通讯
支持设备的即插即用和热插拔功能
并口
8通道
采用并行传输方式来传输数据的接口标准
种类有数十种
它的传输速度并不一定比串口快.
邮件槽
一对多, 通过网络进行传输.
命名管道
一对一, 通过网络进行传输.
- 单向传输
- 一头进, 一头出
匿名管道
一对一, 本机进行传输.
- 单向传输
- 一头进, 一头出
- 常用于进程间通信
套接字
报文或数据流传输, 通过网络进行传输.
控制台
是与操作系统交互的设备
R0和R3文件对象的交互
通过一张图来看: 
- 所以通过"文件内核对象"的一个句柄, 我们才能进行文件的操作.
文件打开方式
| 设备 | 打开方式 | 备注 |
|---|---|---|
| 文件 | CreateFile(路径名或者UNC路径(局域网路径)) | |
| 目录 | CreateFile(路径名或者UNC路径(局域网路径)) | 需要 FILE_FLAG_BACKUP_SEMENTICS 标志 |
| 逻辑磁盘 | CreateFile(.?(盘符, C, D...):) | |
| 物理磁盘 | CreateFile(.PHYSICALDRIVE?(编号, 一般1, 2,...)) | |
| 串口 | CreateFile(COM?(串口号, 1, 2, ...)) | |
| 并口 | CreateFile(LPT?(并口号, 1, 2, ...)) | |
| 邮件槽服务器 | CreateMailslot(.mailslot邮件槽名) | |
| 邮件槽客户端 | CreateFile(servername(一般是UNC名)mailslot邮件槽名) | |
| 命名管道服务器 | CreateNamedPipe(.pipe管道名) | |
| 命名管道客户端 | CreateFile(servername(一般是UNC名)pipe管道名) | |
| 匿名管道 | CreatePipe | |
| 套接字 | Socket; accept |
未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-05-10 at 09:36 am