数据缓冲策略 —— 无缓冲、行缓冲、全缓冲(缓冲区大小测试)

本文探讨了C语言中无缓冲write、行缓冲printf和全缓冲的原理与验证,通过实例解析了它们的工作方式,并揭示了行缓冲转为全缓冲的特殊情况。

printf打印数据时,一般会先把数据放入C缓冲区,然后再刷新到内核缓冲区,最后再写入硬件

这个过程中,数据从C缓冲区迁移到内核缓冲区的操作我们称为缓冲(也可以理解为刷新)

下面我们将介绍 缓冲策略的三种情况

1、无缓冲(不刷新),如write

2、行缓冲(行刷新),遇到换行符\n才会刷新

3、全缓冲(缓冲区满了才刷新),如写入数据到磁盘


目录

一、无缓冲(不刷新)

1、无缓冲验证

2、验证结果

二、行缓冲

1、不加 '\n' 验证

2、添加 '\n' 验证

三、全缓冲

1、打印少量的数据

2、打印大量的数据

3、缓冲区大小验证

四、缓冲案例:行缓冲 变成了 全缓冲

1、案例介绍

 2、案例分析


一、无缓冲(不刷新)

不缓冲的意思就是,不会向内核缓冲区存入内容,而是直接输出到文件中,比如系统调用函数 write函数

1、无缓冲验证

下面用一段简单的代码来验证这一现象,基本思路是:调用write函数向文件里写入内容,使用死循保证当前进程不会退出(退出的时候会刷新缓冲区)。新开一个终端查看文件内容,如果文件中包含了写入的内容,说明是无缓冲;如果不包含写入的内容,说明是其他缓冲。

测试代码如下:

int main(int argc, char** argv){
	int fd = open("./1.txt",O_WRONLY | O_APPEND);
	const char* buf = "hello, world";
	write(fd, buf, strlen(buf));        // 注意这里使用的是strlen,而不是sizeof
                                        // sizeof(buf) 就会变成计算buf指针的大小,那就是固定4个字节

	while(1)
	{
		sleep(1000);
	}
	close(fd);
	return 0;
}

2、验证结果

验证结果如下:

我们发现, 进程还没有退出的情况下,字符串就已经被写入到文件里了,说明write函数没有经过内核缓冲区,直接将数据写入到文件中。

二、行缓冲

行缓冲的意思是,遇到换行符的时候

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值