NIO学习笔记(一)I/O缓冲区操作

本文详细介绍了数据从外部磁盘向进程内存区域移动的过程。通过read()系统调用,内核利用DMA技术从磁盘读取数据到内核缓冲区,然后复制到用户空间指定的缓冲区。文章还解释了用户空间与内核空间的区别及其在I/O操作中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



  上图简单描述了数据从外部磁盘向运行中的进程的内存区域移动的过程。进程使用read()系统调用,要求其缓冲区被填满。内核随即想磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过DMA完成,无需主CPU协助。一旦磁盘控制器把缓冲区填满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行read()调用时制定的缓冲区。

 

  用户空间是常规进程所在区域。JVM就是常规进程,驻守于用户空间。用户空间是非特权区域:比如,在该区域执行的代码就不能直接访问硬件设备。内核空间是操作系统所在的区域。内核代码有特别权力:它能与设备控制器通讯,控制着用户区域进程的运行状态,等等。最重要的是,所有I/O都直接或间接通过内核空间。

 

  当进程请求I/O操作的时候,它执行一个系统调用将控制权转交给内核。C/C++程序员所熟知的底层函数open()、read()、write()、close()要做的无非就是i建立和执行适当的系统调用。当内核以这种方式被调用,它随即采取任何必要步骤,找到进程所需数据,并把数据传送到用户空间内的制定缓冲区。内核试图对数据进行高速缓存或预读取,因此进程所需数据可能已经在内核空间里了。如果是这样,该数据只需要简单的拷贝出来即可。如果数据不在内核空间,则进程被挂起,内核着手把数据读进内存。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值