九、什么是I/O:
9.1、在Windows程序中,基础的运行单位为线程,为每一个线程分配一个处理器,可以让系统执行多个操作,
9.2、当线程进行一个I/O操作时,会被挂起,从而影响性能,为了解决这类问题,Windows使用了一套非常好的机制I/O完成端口。
9.3、用于进行输入输出的操作都可以叫I/O,如:文件、USB、设备操作都统称为I/O操作、网络通信也是I/O。
9.4、和外部通信的都统称为I/O。
十、端口机制:
10.1、Windows是一个多任务(可以执行多个进程)多线程(在一个进程中可以执行多个线程)的操作系统。
10.2、进程指的是当前程序的单位,线程是执行工作的工人。
10.3、多核:每一个内核可以对应一个线程,每一个核心执行一个线程(并行处理)。
10.4、线程挂起:等待I/O操作完成。
10.5、为了解决线程挂起这个问题,Windows做了一套机制:I/O完成端口。
10.6、I/O完成端口:线程不再等待I/O操作完成,而直接返回又来执行线程,直到这个I/O完成了再来处理(这里整个是一个并行)。
10.7、总的来说I/O完成端口机制是为了在执行I/O操作的时候能够来进行其他的一些操作。
十一、文件内核对象:
11.1、I/O其实都是相对于设备而言的,除了内存之外的都可以称之为设备(因为内存是我们运行所有程序的载体)。
11.2、文件是一个设备,目录也是一个设备。
11.3、逻辑磁盘驱动器:可以将Windows上的原始磁盘空间配置为逻辑驱动器,逻辑驱动器在编程中常被用于格式化驱动器。
11.4、物理磁盘驱动器:常被用于获取分区表。
11.5、Windows中可以将物理磁盘分成多块的逻辑磁盘。
11.6、不管是逻辑磁盘也好,目录也好都是为了让用户好的来整理。
1.7、文件是二进制数据的集合。文件格式列表必须要了解、熟悉。
11.8、文件内核对象:类(实际是一个结构体),代表了文件的内存区域。
11.9、内核对象就是用来指代一个个的单位。
十二、设备类型:
12.1、串口(单通道)、并口(8通道):属于两种不同的通信方式。
12.2、邮件槽:一对多,通过网络传输。
12.3、命名管道:一对一,通过网络传输。
12.4、匿名管道:一对一,本机传输。
12.5、套接字:报文或数据流传输,通过网络传输。
十三、R3和R0文件对象的交互:
13.1、R3(用户层)和R0(核心层)两个层是断开的。
13.2、以文件为列:打开一个文件:
13.3、首先调用对应的API,然后R3层发送请求,通过各种的检测到R0层中,然后R0层去取数据
13.4、R0取到数据后,会在R0中产生一个标识(文件对象,一个文件对象就代表了硬盘中的某一块内存空间)。
13.5、这个标识存在内存中,因为操作系统是存在内存当中。
13.6、然后R0层返回给R3层,然后API返回,而返回回来的这个东西,就是一个文件内核对象。
13.7、而R0和R3又是隔开的,两者不可能直接进行通讯的。
13.8、所以R0到R3之后只能得到一个文件内核对象的一个编号,这个编号反应在R3层中,而这个编号就是句柄。
13.9、这个句柄就对应了一个文件对象。
13.10、有了这些句柄之后,我们就可以通过句柄进行文件内核对象(一个内核对象代表的是某一个设备,某一个具体的事物)的操作。
13.11、所以句柄就是某一类事物的抽象。
13.12、内核对象并不希望被暴露出来,这是风险很大的事情。所以R3到R0层会经过各种的检测,这样保证安全。
13.13、就类似于银行的柜台一样,银行并不希望客户来直接自己操作取钱,而是通过身份,还用卡上余额等等的一些检测才能进行取钱。