Linux-缓冲区(简单理解)

1. 缓冲区是什么

缓冲区就是一段内存空间。

2. 为什么要有缓冲区

IO写入有两种:

  • 写透模式(WT) 成本高,效率低
  • 写回模式(WB) 成本低,效率高

写透模式:每次的文件写入都要立即刷新到文件所在的磁盘上,一次不论写多少大小的内容。

写回模式:先把内容存下来,存到缓冲区中,等到到了一定条件,再统一刷新到磁盘上

因为磁盘是电脑上的一个外设,也是唯一的机械设备,对其的读写速度相当慢,而内存相比磁盘是相当快的,所以如果采用写透模式,就会拖慢计算机的整体效率

写回模式采取一定的刷新策略:1.立即刷新 2.行刷新(\n),3. 满刷新,

对应的特殊情况:1. 用户强制退出, 2. 进程退出

3. 缓冲区在哪里

那么缓冲区在哪里呢?

谁提供的函数接口,谁就要提供缓冲区的实现,缓冲区在哪里也就有根据了

比如c语言的fprintf(),就有对应的缓冲区,缓冲区由c标准库提供,他会在用户空间定义一块空间作为缓冲区。准确的说,就是在FILE结构体中

操作系统的接口write也有对应的缓冲区,在内核空间。

c语言层面的缓冲区,最后还是要给内核空间的缓冲区,c++缓冲区要给c语言的缓冲区,所以一般越底层的接口,速度越快。

cpp 复制代码
// 测试IO接口
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    close(1);
    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if (fd < 0)
    {
        perror("open");
        return 1;
    }

    printf("print\n");
    fprintf(stdout, "fprintf\n");
    fputs("fputs\n", stdout);
    write(fd, "write\n", sizeof "write\n");
    perror("perror");

    // fflush(stdout);
    // close(fd);
    fork();
}

没有fflush文件log.txt的内容

fflush后文件的内容

我们发现两次打印的内容不同,其中c语言的函数接口都打印了两次,而系统的打印接口只有一次

这是为什么呢?

fork创建子进程会在用户空间上刷新的时候会发生写时拷贝,缓冲区的内容也会拷贝一份,再刷新的时候就会有两份内容,而write属于内核级的内存空间,并没有影响。

相关推荐
A小辣椒10 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒14 小时前
TShark:基础知识
linux
AlfredZhao16 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式