内容简介:当你看完这篇文章若是不能理解什么是带缓冲的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就没有其中的缓冲了,也就是进程通过DMA直接与I/O设备交换数据了,但是执行无缓冲的I/0被锁定在内存,不能被换出,那么这部分内存不能用了,信息交流的就少了不少,导致整个系统的性能有所下降, 但是这是进程执行I/O最快的方法了!!!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 缓冲区实例讲解之protostar stack3挑战篇
- Golang中的channel代码示例----无缓冲、有缓冲、range、close
- 缓冲区溢出实战教程系列(一):第一个缓冲区溢出小程序
- 小议缓冲区溢出
- 缓冲区溢出(栈溢出)
- 一种极致性能的缓冲队列
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。