首页 > 基础设施 > 正文

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

2018-11-05 13:28:08  来源:今日头条

摘要:当你学习Unix高级编程时会遇到不带缓冲的I O函数,比如open、read、write、lseek、close等等,那这与带缓冲的I O有什么区别?
关键词: 缓冲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最快的方法了

第二十八届CIO班招生
法国布雷斯特商学院MBA班招生
法国布雷斯特商学院硕士班招生
责编:pingxiaoli