Poedu_Windows_IO操作

来源:互联网 发布:云计算应用架构 编辑:程序博客网 时间:2024/06/05 11:54

什么是windows的IO

系统与外部设备进行交互的操作

对外部设备的操作都称为I/O操作

IO完成端口机制

提高效率

windows是一个多任务多线程的操作系统

多任务:执行多个进程
多线程:一个进程内执行多个线程

进程所代表的是当前程序的单位,线程所代表的是实际工作的工人

多核:多核操作系统下,可以让每一个核心运行来运行一个线程,真正达到多任务并行处理

单核:伪多任务

外部设备的瓶颈,会使线程挂起

例如从外部设备读取需要2分钟,那么线程会被挂起,直到设备读取完毕才能进行下面的工作:会影响效率,IO完成端口机制可以帮助解决这个问题

有IO处理请求的时候,会发送请求,不会等待,线程继续做事情,设备操作结束后,给线程一个通知,再回来做这件事情,相当于自己做了一个并行,不会导致程序卡死

能够让程序被挂起的时候来执行其它的一些操作

文件内核对象的理解

IO操作都是基于设备:除了内存之外的都可以认为是设备

内存是运行所有程序的载体

标准IO操作

文件

存储在硬盘中,属于文件设备

目录

windows下包含着很多目录,也属于一个设备

逻辑磁盘驱动器

系统中的分区,从操作系统的角度看,哪块空间到哪块空间是属于C盘的

物理磁盘驱动器

一般一台电脑只装了一个磁盘,那么就只有一个物理磁盘

  • windows可以将一块物理磁盘分成逻辑磁盘,逻辑磁盘和目录都是为了方便用户的使用,在目录下面,就是文件(有一个文件格式表,可百度查看),在系统层面下,每一个文件都是二进制数据的集合(二进制文件)

  • 广义上的文件的是由格式来区分:通过扩展名能够知道编码格式,才能正确的打开文件

    但是,文件的最终意义是二进制的集合

  • 物理磁盘 -> 逻辑磁盘(可以跨物理磁盘) -> 分成一级级的目录 -> 文件

    逻辑磁盘和目录都是由操作系统做出来的,真实存在的只是物理磁盘和文件(文件的概念也是虚拟出来的,其实就是二进制数据)

    文件是由文件系统维护的,文件只是一个内存区间,但是在逻辑上要组织成一个单位

  • 文件内核对象:代表从A到B这块区域

    就像一个类(其实内核对象是一个结构体),这个对象指代了A到B这块区域,都是一个个的对象,都保存在文件内核中,所以文件内核对象,都是为了做一件事情,只是为了指代出一些单位,或者指代类似于文件的一些事物

    每个设备都有自己的一个对象

    获取对应的对象:处在核心态,没办法new出来,所以需要用API

    使用内核对象,更多的是对文件以及目录设备进行操作,增删改查,对逻辑磁盘的操作只能做些格式化和大小更改,对物理磁盘的操作只能是获取分区等

所有的设备类型讲解

串口

并口

串口和并口是计算机和外部设备进行交互的一种方式

但是是两种不同的连接方式,相当于是一个接口,主要做信号交互,串口是单通道,并口是八通道,但并口并不一定比串口快,还要做排序什么的

邮件槽

通过网络传输

可以进行一对多的通信

局域网

命名管道

通过网络传输

一对一的通信

局域网

匿名管道

本机通信:进程与进程是隔离的。之间的通信可以使用匿名管道,也可以使用scoket

一对一

套接字

报文或者数据流的传输

R3和R0文件对象的交互

这里写图片描述
软件->R3层->一根分离线 ->R0层 ->作用到一个个单独的硬件中

软件使用R3层提供的一些API,打开文件、读取的操作

过程

软件向R3层提出请求:打开文件;R3判定请求是否符合要求,再到那条线(不会越过这条线),再通过R0层调用硬件中硬盘,取到这个文件,R0层会有一个标识(在内存中保存一个文件内核对象),然后向上返回,返回到软件层,返回的东西其实就是文件内核对象,但是没法越过那条线,所以没法把东西直接给软件层,所以需要两个进程之间进行通信,通信的内容不能太大,所以会返回一个编号,这个编号在R3层就是一个句柄(HANDLE),通过这个句柄就可以对文件进行操作,操作后的内容放到一个内存共享区域,软件再从这个共享区域中拿东西

R3层的参数校验,是为了保证请求能够通过那条线的检测

设备的打开方式

文件

CreateFile:不止是新建,也会打开

参数:路径名或UNC路径(\)等

返回文件内核对象:HANDLE

目录

CreateFile

需要使用标志位 FILE_FLAG_BACKUP_SEMENTICS

逻辑磁盘

CreateFile(\?:):下划线加一个盘符(比如C)

物理磁盘

CreateFile(//PHYSICALDRIVE?)

问号是数字

串口

CreateFile(COM?)

COM+串口编号

并口

CreateFile(LPT?)

LPT+并口编号

邮件槽服务器

CreateMailslot(.\mailslot\邮件槽名)

邮件槽客户端

CreateFile(\servername(一般是UNC名)\mailslot\邮件槽名)

命名管道服务器

CreateNamedPipe(.\pipe\管道名)

命名管道客户端

CreateFile(\servername(一般是UNC名)\pipe\管道名)

注意邮件和命名管道,使用的时候再看一遍

匿名管道

CreatePipe

套接字

Socket; accept

原创粉丝点击