0%

IO操作底层实现

IO操作底层实现

进行执行IO操作就是向操作系统发起请求,写操作是让操作系统将缓冲区的数据写入磁盘,读操作是让操作系统将数据写入到缓冲区

WX20220529-151312@2x

可以看到上图中的操作是读取磁盘的内容进行的操作,从磁盘读取数据需要通过DMA把数据写入到内核内存缓冲区,一旦磁盘控制器把缓冲区填满,内核就会把数据从内核空间的临时缓冲区拷贝到进程执行read()调用指定的缓冲区中

可能大家会感到意外,为什么还要有一个内核缓冲区和一个用户空间缓冲区呢,这一步从内核空间拷贝到用户空间是不是多余,这个问题首先硬件不能直接访问用户空间;七次,磁盘是基于块存储的,操作的是固定大小的数据块,而用户进程请求的可能是任意大小的或非对齐的数据块,内核需要在中间进行数据分解、再组合工作

那么有没有办法可以解决呢?

虚拟内存

后来提出来一个虚拟内存的概念,使用虚拟的内存地址取代物理内存地址,这样可以做到内核空间地址和用户空间地址的虚拟地址映射到同一个物理地址,DMA就可以直接填充对内核与用户空间进程同时可见的缓冲区了

虚拟地址映射

但是前面还说到内核还做了一步数据分解、再组合工作,使得数据进行对齐,那这个怎么解决呢?

操作系统把内存地址空间划分为页,即固定大小的字节组,内存页大小总是磁盘块大小的倍数,通常为2次幂