首页 > 其他分享 >setvbuf缓冲的使用

setvbuf缓冲的使用

时间:2024-03-13 17:11:21浏览次数:35  
标签:缓冲 mode 使用 缓冲区 磁盘 setvbuf size

平时我们在写文件的时候,iofstream也好,fwrite也罢,写文件到磁盘,刷新、落盘,这样就完成了一次磁盘IO交互;

当出现高并发,多个线程都在写磁盘的时候,就可能出现磁盘IO瓶颈,如图,写等待的时间就会很长,这将一定程度阻塞程序的运行或者影响正常存储:

# iostat -x -d /dev/sda -m 1

针对这种问题,解决方法一方面是多加磁盘数量,来均衡单一磁盘的读写压力;另一方面也可以通过IO缓冲机制减少写磁盘的次数;

setvbuf

通过设置一个中间缓冲,接收写文件的数据,等到缓冲满了,再刷新到磁盘中;在一定程度上减少fwrite写文件次数;

int setvbuf( FILE *stream, char *buffer,  int mode,  size_t size); 如果成功,则返回 0

  stream
  指向 FILE 结构的指针。

  buffer
  用户分配的缓冲区。

  mode
  缓冲模式。

  size
  缓冲区大小(以字节为单位)。 允许的范围:2 <= size<= INT_MAX (2147483647)。 在内部将为 size 提供的值向下舍入为最接近的 2 的倍数。

 

setvbuf 函数允许程序控制 stream 的缓冲和缓冲区大小。 stream 必须引用自该文件打开后尚未进行 I/O 操作的打开文件。 将 buffer 所指向的数组用作缓冲区,除非 buffer 是 NULL,在这种情况下,
setvbuf 使用长度为 size/2 * 2 字节的自动分配的缓冲区。 此模式必须是 _IOFBF、_IOLBF 或 _IONBF。 如果 mode 是 _IOFBF 或 _IOLBF,则将 size 用作缓冲区的大小。 如果 mode 是 _IONBF,则该流取消缓冲并同时忽略 size 和 buffer。 mode 的值及其含义是:

  setvbuf(fp, filebuf.get(), _IOFBF, BufSize);使用这个缓冲,在fwrite的时候就会先写入缓冲,等到缓冲满再落盘;一定程度上依靠缓冲减少落盘次数;减少磁盘IO;缓解磁盘压力

标签:缓冲,mode,使用,缓冲区,磁盘,setvbuf,size
From: https://www.cnblogs.com/8335IT/p/18071068

相关文章

  • kubernetes中使用Service反向代理外部服务
    参考https://blog.csdn.net/weixin_43334786/article/details/128432325当我们的某个服务在外部集群的时候,但是又想k8s集群内的应用连接它,这是可以创建一个service,用service代理外部服务,然后集群内就能连接该service,从而间接的访问外部服务。创建一个service代理外部的服务创......
  • 不使用telnet进行端口测试的方法
    不使用telnet进行端口测试的方法 测试通过样例[root@ip203~]#curl-v10.0.0.210:8082*Abouttoconnect()to10.0.0.210port8082(#0)*Trying10.0.0.210...*Connectedto10.0.0.210(10.0.0.210)port8082(#0)>GET/HTTP/1.1>User-Agent:curl/7.29......
  • 痞子衡嵌入式:使用恩智浦GUI Guider快速创建全新LCD屏示例工程的步骤
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是使用恩智浦GUIGuider快速创建全新LCD屏示例工程的步骤。在痞子衡旧文《在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤》里,痞子衡介绍了在官方SDK裸机驱动elcdif示例工程基础上做修改以支持一款......
  • Maven的基本安装与使用
    前言Maven翻译为"专家"、"内行",是Apache下的一个纯Java开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven是一个项目管理工具,可以对Java项目进行构建、依赖管理。简单来说,Maven是一个框架,可以简化......
  • VMware workstation新建虚拟机网络使用NAT模式的各个问题
    使用Vmwareworkstation创建linux(centos7)虚拟机时,在网络方面可能会碰到各种问题:1.重启后网络就断了,没法开机自启动2.如何配置固定IP3.ping不通www.baidu.com...问题1:重启后网络就断了,没法开机自启动解决:修改配置文件,一般是:/etc/sysconfig/network-scripts/ifcfg-e......
  • 关于自动唤醒(AWU)的使用介绍
    1、关于AWU的介绍AWU模块可以实现无需外部中断的情况下自动唤醒。通过对时间基数进行编程,可周期性地从停止或待机模式下唤醒。AWU是一个6位的自加型计数器,关于其时钟源的选择如下:CH32X035可选择内部高速时钟HSI的47KHz分频时钟作为AWU模块时钟源,可以在低功耗模式下运行......
  • MYSQL- 使用SQL99 实现7种JOIN 操作
    DESCemployees; DESCdepartments;   ##中图就是内连接SELECTlast_name,department_nameFROMemployeeseJOINdepartmentsdONe.department_id=d.department_id##sql99内连接SELECTlast_name,department_name,cityFROMemployeeseINNERJOIN......
  • Git自动切换提交时使用的用户名
    根据远程地址自动切换commit时候使用的用户名。比如一般都是使用下面nickname提交,但如果待提交仓库包含ssh://[email protected]/**这样的远程地址,则自动使用MY_NAME进行commit先找到.gitconfig文件位置gitconfig--origin--list编辑.gitconfig,增加includeIf段的内容.gi......
  • C++ cout的使用总结
    cout是C++中ostream类型的对象cout是C++中ostream类型的对象,该类被封装在<iostream>库中,该库定义的名字都在命名空间std中,所以cout全称是std::cout。1、cout支持多种数据类型,如int、float、double、char、string等,它们都会被自动转换成字符串进行输出。#includ......
  • 服务器中间件的种类和日常使用
    服务器中间件是一种软件,它提供了在服务器上运行的应用程序之间的连接和通信的功能。不同的中间件提供了不同的功能和特性,以下是一些常见的服务器中间件的种类和日常使用。ApacheTomcat:Tomcat是一种开源的JavaServlet容器,用于运行JavaWeb应用程序。它支持JavaSe......