C语言缓冲区基础知识

  • Post author:
  • Post category:其他



1.什么是缓冲区?


缓冲区就是一块内存区,这块内存区用来缓存待处理的数据。


2.缓冲区有什么作用?


假设我们在家中休息看电视吃零食,每产生一个垃圾我们就下楼丢到楼下的垃圾桶中再上楼回家。这样连续丢多个垃圾,我们就需要连续多次下楼丢垃圾再上楼回家,这样显然效率低下,如果我们把垃圾丢到家中的垃圾桶,当垃圾桶满了,我们在一次性丢到楼下的垃圾桶中,这样效率明显就提高很多,此时,家中的垃圾桶就相当于一个缓冲区,用于提高我们丢垃圾的效率。

因此计算机缓冲区的作用其实就是提升计算机的性能,提高效率,主要体现在以下几个方面:


(1)缓冲区可以减少系统调用的次数:

操作系统提供给程序员的接口就是系统调用。

进程在系统上的运行分为2个级别:

用户态(user mode):用户态运行的进程可以直接读取用户程序的数据;

系统态(kernel mode):系统态运行的程序可以访问计算机的任何资源,不受限制

平常我们的进程几乎都是用户态,读取用户数据,当涉及到系统级别资源的操作(例如文件管理、进程控制、内存管理等)的时候,就要用到系统调用了,这时候需要从用户态切换到系统态。

以printf函数为例:调用printf函数是系统级别的操作,属于系统调用,而每进行一次系统调用,就要从用户态切换到内核态再将结果回到用户态,那如果我们连续输出多个字符,就需要连续多次进行系统调用,就需要在用户态和内核态之间不断地来回切换,这样造成系统的开销非常大,这时候缓冲区的作用就体现出来了,输出的字符在输出缓冲区中先缓存起来,当达到输出的条件时,再进行系统调用一次性将输出缓冲区中的数据输出到标准输出,由于只进行了一次系统调用,比连续多次进行系统调用在性能上提高不少。


(2)缓冲区可以减少对磁盘的读取次数:

比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中读取数据,等缓冲区的数据读取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。


(3)缓冲区可以解放CPU:

我们使用打印机打印文档,由于打印机的打印速度(输出)相对较慢,我们先把文档输入到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。


3.缓冲区的分类:


全缓冲:在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。一般是

行缓冲:在这种情况下,当缓冲区中遇到换行符时,执行真正的I/O操作,典型代表是输入缓冲区和输出缓冲区。

不带缓冲:也就是不进行缓冲,目的是使出错信息可以直接尽快地显示出来。标准出错情况stderr是典型代表。


4.缓冲区的刷新:


以下四种情况会引发缓冲区刷新:

缓冲区满时;

执行 fflush 语句;

执行 endl 语句;

关闭文件。

对于输出缓冲区,刷新缓冲区实际上就是把缓冲区中的数据输出到外部设备上。


5.输入缓冲区:


输入缓冲区通常是一种行缓冲区,程序并不会⽴即获取键盘输⼊的数据,键盘输入的数据都会存储在输入缓冲区中,按下回车键后,输入缓冲区遇到回车符,程序才从输⼊缓冲区读取数据(回车符也会存储在输入缓冲区中)。


6.输出缓冲区:


输出缓冲区通常也是一种行缓冲区,当有多个连续输出时,为了减少系统调用,程序不会立即把数据输出到屏幕上,而是先存储在输出缓冲区中,当遇到换行符,或者对缓冲区进行刷新时,会输出缓冲区中的数据 。