原理讲解有缓冲I/O与无缓冲I/O的区别

存储 存储软件
当你学习Unix高级编程时会遇到不带缓冲的I/O函数,比如open、read、write、lseek、close等等,那这与带缓冲的I/O有什么区别????

当你看完这篇文章若是不能理解什么是带缓冲的I/O与无缓冲的I/O的区别,随意喷!!!

当你学习Unix高级编程时会遇到不带缓冲的I/O函数,比如open、read、write、lseek、close等等,那这与带缓冲的I/O有什么区别????

我们得先说说什么是高速缓冲存储器,先别急慢慢看,看不懂算我输!!!这个东东对整个计算机性能的提升有很大的帮助,具体就涉及到两个器件的运行速度了,也就是cpu与内存的运行速度,想想也知道两个不同器件的运行速度肯定不一样,最基本的硬件架构都不一样。那这就有一个问题产生了,cpu的速度大于内存的,那要是cpu不挺的往内存的某一个地址写数据,由于内存的速度跟不上,那数据就会被覆盖了,所以解决方案就是在cpu与内存之间加一个高速缓冲存储器,高速缓冲存储器的速度介于cpu与内存之间,那就好办事了,cpu先把数据放在这个存储器上,然后内存向存储器取数据,然后发送到其他地方,在这段时间里,内存向存储器取的数据不会因为cpu速度过快直接被覆盖,而是放在了高速缓冲存储器上,带内存再次取数据时间就够了!!!

同样的道理用在磁盘上,比如你写了一个进程,这个进程不挺的向磁盘写数据,若是进程发送的数据过快,磁盘在写的过程中就极有可能会被新的数据所覆盖,所以就出现了所谓的磁盘高速缓存来做缓冲,它其实是内存的一部分,也就是我们所说的内存条的一部分,当做缓冲,这就是它的实际的物理意义:就是内存的一部分。那这有什么好处???想想也知道好处大得很,说说原理,有个概念叫局部性原理。局部性原理包含很多的局部性,比如时间的局部性,就是说进程A在t0时刻访问磁盘的某一地址,在t0+t1时刻又来访问,就叫时间的局部性。若是访问的次数特别多,访问的时间的间隔特别短,那么进程A就要不挺的访问磁盘,就好比出家门玩的时候,你忘记带某一东西,你回去拿,忽然发现又忘记带了,这个时候你肯定想要是有人帮我拿了,在送的路上就好了不必在回家,同样的道理在进程A与磁盘之间,若是频繁访问某一地址,通过磁盘高速缓存来把数据存起来后方便以后在访问,更何况现在是变成了进程A直接与磁盘高速缓存(或者说内存)之间的访问了,这不更快了吗!!!所以一般出现一个某一个特定扇区的I/O请求时,这个请求会先查看所要访问的数据在不在缓存里面,在就访问,不在就把这个扇区的数据先拷贝到缓存里面,然后在访问缓存里面的数据。

是不是感觉又理解了一点操作系统的小知识,我们继续说!!!那上面这些与I/0有无缓冲有什么联系???

对于带缓冲的I/O通过一个叫缓冲区高速缓存最为缓存,其实它就是磁盘高速缓存。若是用户进程要访问某一个设备,注意不一定是磁盘,任何一个设备,由于每个I/O设备都与一个特殊文件相关联,而文件由文件系统所管理,所以对文件的I/O操作,就相当于对设备的操作了;而文件放在磁盘上,而且磁盘高速缓存(内存的一部分)又是被用来作为磁盘的缓存,所以某一设备(文件)的缓存可以是磁盘高速缓存(内存的一部分)其中的一部分!!!如下图所示:

原理讲解有缓冲I/O与无缓冲I/O的区别

这里可以是任意的设备

这个缓冲区就是磁盘高速缓存(内存的一部分)其中的一部分的缓存。某一进程通过文件系统接口向设备对应的文件写数据,文件系统把数据先存在缓存器中,然后发送到设备驱动程序控制设备。设备由所对应的控制器(可以简单的理解为寄存器)所管理,学过单片机的都知道,简单往寄存器写数据就能控制设备了,比如串口,只要会了串口,蓝牙不在话下!!!若是把控制器里面的寄存器映射到内存(也就是所谓I/O映射),再加上磁盘高速缓存是内存的一部分,那不就是数据在内存之间变化了,速度就更快了!!!

而对于无缓冲的I/O就没有其中的缓冲了,也就是进程通过DMA直接与I/O设备交换数据了,但是执行无缓冲的I/0被锁定在内存,不能被换出,那么这部分内存不能用了,信息交流的就少了不少,导致整个系统的性能有所下降,但是这是进程执行I/O最快的方法了!!!

责任编辑:武晓燕 来源: 今日头条
相关推荐

2020-08-07 08:03:37

IONetty

2024-03-05 18:24:52

I/O聚合优化存储

2012-05-14 11:53:44

IO虚拟化

2010-05-11 13:36:50

Unix标准

2011-01-14 09:25:28

LinuxIO机制

2012-06-25 10:53:32

Google IO大会

2013-05-28 10:08:41

IO输出

2017-01-19 19:14:20

Linux重定向命令

2020-06-10 08:28:51

Kata容器I

2021-02-22 17:06:58

Linux改动代码

2011-03-29 16:14:04

Cacti硬盘监控

2023-06-26 07:39:10

2020-12-11 11:04:07

NettyIO

2020-06-03 17:30:42

LinuxIO

2011-05-24 10:27:18

GoogleAndroidChrome

2011-01-27 13:52:11

Android 3.0I\O大会

2017-03-25 21:33:33

Linux调度器

2015-08-10 14:39:46

Java 操作建议

2021-10-13 06:49:15

网络 IO

2013-09-16 16:07:38

Java基础IO
点赞
收藏

51CTO技术栈公众号