理解io

来源:互联网 发布:tizen系统安装软件 编辑:程序博客网 时间:2024/05/23 14:37

1, I/O:

 I/O:顾名思义,数据的读取和写入


上图简单描述了数据从外部磁盘向运行中进程的内存区域移动的过程。

进程使用read( )系统调用,要求其缓冲区被填满,内核随即向磁盘控制硬件发出指令,要求其从磁盘读取数据,磁盘控制器直接把数据写入内核空间的缓冲区,这一步是通过DMA完成,无需CPU协助,一旦内核缓冲区被装满,内核即把缓冲区里面的临时数据拷贝到用户进程所指定的缓冲区

JVM属于常规进程,无特权,不能直接访问硬件设备,内核代码有特权,能与设备控制器通讯,控制着用户区域进程的运行状态,所有I/O都直接或间接的通过内核空间

当用户执行I/O请求读取数据时,若所需要数据已经存在于内核空间,则简单拷贝出来即可,而不存在,则需要挂起用户进程,将数据装载到内存

Q1:为什么不直接将数据从磁盘控制器读取到用户空间呢?


a1:1,硬件通常无法直接访问用户空间

        2,磁盘这种基于块存储的硬件设备操作的是固定大小的数据块,而用户请求的可能是任意大小的或非对齐的数据块,在数据往来于用户空间和存储设备中,内核负责数据的分解再组合工作,充当二者之间的中间人


发散读取:


虚拟地址:使用虚假地址代替物理(RAM)内存地址

内存映射:


内存映射文件:

传统的文件I/O是通过用户进程发布read( ),write( )系统调用来传输数据的。为了在内核空间的文件系统页和用户空间的内存区之间移动数据,一次以上的拷贝操作几乎总是免不了的。这是因为,在文件系统页与用户缓冲区之间往往没有一一对应关系

用户内存到文件系统页的映射




文件锁定:

某个进程要读取文件,则需要获取该文件部分区域的《共享锁》,某个进程要写文件,则需要获取该文件部分区域的《独占锁》

一般而言,读取进程和写入进程会相互阻止 对文件的操作




0 0