python面试题十二(全缓冲、行缓冲和无缓冲)

这里的缓冲是指的是用户空间的I/O缓冲区,不是内核缓冲。

  • 无缓冲:用户层不提供缓冲,数据流直接到内核缓冲,再到磁盘等外设上。标准错误输出(2)通常是无缓存的,因为它必须尽快输出,且是输出到具有交互式的设备上,如屏幕,不是磁盘。

  • 行缓冲:在I/O缓冲区中遇到换行符或者缓冲区写满时,就自动把数据送到内核缓冲区标准输入(0)和标准输出(1)对应终端设备时通常是行缓冲的。另外,在程序结束时;main函数中return时(代表程序执行结束);main函数调用exit函数时(结束当前进程);C库函数fflush时或关闭文件时,也会将I/O缓冲的数据刷到内核中,然后送到外设上。

  • 全缓冲:如果缓冲区写满了就写回内核。常规文件的写入写出(磁盘)通常是全缓冲的。另外,在程序结束时;main函数中return时(代表程序执行结束);main函数调用exit函数时(结束当前进程);C库函数fflush时或关闭文件时,也会将I/O缓冲的数据刷到内核中,然后送到外设上。后两种都是:数据-------I/O缓冲---------内核缓冲-------外设。

上述都是I/O缓冲区,其作用是减少read和write的次数,即减少了系统调用,从而减少了系统开销,提高了I/O速度。

内核缓冲区。 从理论上讲,内核可以在任何时候写磁盘,但并不是所有的write操作都会导致内核的写动作。内核会把要写的数据暂时存在缓冲区中,积累到一定数量后再一次写入。有时会导致意外情况,比如断电,内核还来不及把内核缓冲区中的数据写道磁盘上,这些更新的数据就会丢失。

read把数据从内核缓冲区复制到I/O缓冲区,write把数据从I/O缓冲区复制到内核缓冲区,它们不等价于数据在内核缓冲区和磁盘之间的交换。注意:对于用户进程来说,把数据送到内核缓冲和送到外设上是等价的(一样的效果),即对用户进程是透明的。

标准输出(1)和错误输出(2)的区别。首先,前者是行缓冲,后者是无缓冲,可以立即将错误信息输出到屏幕上,而不会留在I/O缓冲中;两者都默认输出到屏幕上。

发布了44 篇原创文章 · 获赞 0 · 访问量 1226

猜你喜欢

转载自blog.csdn.net/weixin520520/article/details/105451556