Linux的缓存I/O和无缓存IO
一、I/O缓存的背景
I/O缓存是指在内存里开辟一块区域,存放用来接收用户输入和用于计算机输出的数据,以减小系统开销和提高外设效率。linux对IO文件的操作分为不带缓存的IO操作和带缓存的IO操作(标准IO操作)。为什么存在C标准I/O库函数与Unbuffered I/O函数?它们有什么区别?
二、带缓存的I/O操作
带缓存IO(标准IO),不依赖系统内核,所以移植性强,使用标准IO操作为了减少对read()和write()的系统调用次数,带缓存IO其实就是在用户层再建立一个缓存区,这个缓存区的分配和优化长度等其他细节都是标准IO库代你处理好了。系统调用如图所示

比如要写数据到文件上,内核缓存区长度是100字节,我们调用不带缓存的IO函数write()就要调用10次,这样系统效率低。
现在我们在用户层建立另一个缓存区(用户层缓存区或者叫流缓存),假设流缓存的长度是50字节,我们用标准C库函数的fwrite()将数据写入到这个流缓存区里面,流缓存区满50字节后在进入内核缓存区,此时再调用系统函数write()将数据写入到文件(实质是磁盘)上标准IO操作fwrite()最后还是要掉用无缓存IO操作write,这里进行了两次调用fwrite()写100字节也就是进行两次系统调用write()函数。
无缓存IO操作数据流向路径:数据——内核缓存区——磁盘
标准IO操作数据流向路径:数据——流缓存区——内核缓存区——磁盘
标准I/O对每个I/O流自动进行缓存管理(标准I/O函数通常调用malloc来分配缓存)。它提供了三种类型的缓存:
1) 全缓存:缓存满时I/O操作。磁盘上的文件通常是全缓存的。
2)行缓存。当输入输出遇到新行符或缓存满时.stdin、stdout通常是行缓存的。
3)无缓存。相当于read、write了。stderr通常是无缓存的
三、无缓存I/O(Unbuffered )I/O函数
刚看到这个"unbuffered",读者就觉得奇怪,操作系统不是对所有的输入输出都会做缓存吗(delayed write),为什么还会存在unbuffered?
其实,这里的ubuffered,是指的是针对与read和write本身来说,它们是没有缓存机制,比如read(fd,temp,100),在读够100个字节后或者遇到文件EOF后就返回,非常单纯。而C标准库函数中的fread和fwrite,就是利用缓存技术来调用read和write,可以说是buffered I/O。
但是,叫做无缓存IO是因为在用户层没有缓存,但对于Linux内核来说,还是进行了缓存,只是用户层看不到罢了。
这些不带缓存的I/O函数不是标准 C的组成部分,但是,它们是POSIX.1和Single UNIX Specification的组成 部分。C标准库函数是C标准的一部分,而Unbuffered I/O函数是UNIX标准的一部分。只有在UNXI平台上才能用Unbuffered I/O函数,windows上不行。所以C标准I/O库函数在头文件stdio.h中声明,而read、 write等函数在头文件unistd.h中声明。
四、两种I/O函数使用场景
open、read、write、close等系统函数称为无缓冲I/O(Unbuffered I/O)函数,用户程序在读写文件时既可以调用C标准I/O库函数,也可以直接调用底层的Unbuffered I/O函数,那个各自使用场景是什么呢?
- 用Unbuffered I/O函数每次读写都要进内核,调一个系统调用比调一个用户空间的函数要慢很多,所以在用户程序开辟I/O缓冲区还是必要的,用C标准I/O库函数比较方便,省去自己开辟内存空间。
- 用C标准I/O库函数要时刻注意I/O缓冲区和实际文件有可能不一致,在必要时调用fflush(3)。
- UNIX的传统是Everything is a file,I/O函数不仅可以读写文件还可以读写设备。在读写设备时通常是不希望有缓冲的。比如网络设置的读写就希望是实时读写,而不希望只写到缓冲区里,所以网络编程通常直接调用Unbuffered I/O函数。
五、磁盘交互的读写文件流程
当应用程序尝试读取磁盘上的某块数据的时候,如果这块数据已经存放在页缓存(内核高速缓存)中,那么这块数据就可以立即返回给应用程序,而不需要经过实际的物理读盘操作。当然,如果数据在应用程序读取之前并未被存放在页缓存中),那么就需要先将数据从磁盘读到页缓存中去。
对于写操作来说,应用程序也会将数据先写到页缓存中去(这里所说的写到页缓存中,如果是调用标准库I/O进行写,那么首先是写到标准库的缓冲区内,如果标准库的缓冲区写满以后,在写到页缓冲内;如果是系统调用,那么直接写到页缓冲内)。
数据是否被立即写到磁盘上去取决于应用程序所采用的写操作机制:如果用户采用的是同步写机制,那么数据会立即被写回到磁盘上,应用程序会一直等到数据被写完为止;如果用户采用的是延迟写机制,那么应用程序就完全不需要等到数据全部被 写回到磁盘,数据只要被写到页缓存中去就可以了。
在延迟写机制的情况下,操作系统会定期地将放在页缓存中的数据刷到磁盘上。与异步写机制不同的是,延迟写机制在数据完全写到磁盘上得时候不会通知应用程序,而异步写机制在数据完全写到磁盘上得时候是会返回给应用程序的。所以延迟写机制本省是存在数据丢失的风险的,而异步写机制则不会有这方面的担心。
参考:
带缓冲I/O 和不带缓冲I/O的区别与联系-CSDN博客
理解标准I/O库的缓冲机制及应用-CSDN博客
unix系统编程小结(一)------文件I/O-neilhappy-ChinaUnix博客
相关文章:
Linux的缓存I/O和无缓存IO
一、I/O缓存的背景 I/O缓存是指在内存里开辟一块区域,存放用来接收用户输入和用于计算机输出的数据,以减小系统开销和提高外设效率。linux对IO文件的操作分为不带缓存的IO操作和带缓存的IO操作(标准IO操作)。为什么存在C标准I/O库…...
【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术
弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术 1.弹性裸金属技术背景1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失1.2 传统 KVM 虚拟化系统导致资源争抢不可避免1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈 2.弹性裸金属技术实现2.1 VPC…...
【MySQL】(2) 库的操作
SQL 关键字,大小写不敏感。 一、查询数据库 show databases; 注意加分号,才算一句结束。 二、创建数据库 {} 表示必选项,[] 表示可选项,| 表示任选其一。 示例:建议加上 if not exists 选项。 三、字符集编码和排序…...
Hyper-V -docker-vmware 三者的关系
1. Docker 正常运行,需要启动Hyper-V ,打开 hypervisorlaunchtype 2.VMware 正常时,需要关闭Hyper-V ,关闭 hypervisorlaunchtype 2.1资源管理器->CPU 里要开启虚拟化 2.2 服务-停掉HV服务 2.3 控制面板 不勾选 2.4 …...
IP-----双重发布
目录 6.双重发布 1.重发布的作用 2.部署条件 1.必须存在ASBR 2.种子度量值 3.重发布的规则 4.重发布的数量 5.重发布的场景 1.场景和规则 2.直连和静态 3.动态RIP 4.动态OSPF 5.更改开销值 6.重发布的问题1 7.重发布的问题2 1.流量 2.前缀列表 3.偏移列表 4…...
【新立电子】探索AI眼镜背后的黑科技,FPC如何赋能实时翻译与语音识别,点击了解未来沟通的新方式!
在全球化的今天,语言障碍成为人们沟通与交流的一大难题。AI眼镜作为一种新兴的智能设备,正在通过实时翻译与语音识别功能,打破语言壁垒,为人们提供无缝沟通的解决方案。FPC在AI眼镜中的应用,为实时翻译与语音识别功能的…...
LeetCode 热题 100_寻找两个正序数组的中位数(68_4_困难_C++)(二分查找)(先合并再挑选中位数;划分数组(二分查找))
LeetCode 热题 100_寻找两个正序数组的中位数(68_4) 题目描述:输入输出样例:题解:解题思路:思路一(先合并再挑选中位数):思路二(划分数组(二分查找…...
Java多线程与高并发专题——深入ReentrantReadWriteLock
深入ReentrantReadWriteLock 读写锁出现原因 synchronized和ReentrantLock都是互斥锁。如果说有一个操作是读多写少的,还要保证线程安全的话。如果采用上述的两种互斥锁,效率方面很定是很低的。在这种情况下,咱们就可以使用ReentrantReadWr…...
【Python 语法】算法合集
查找二分查找代码大 O 表示法 广度优先搜索代码 狄克斯特拉算法 递归递归调用栈 分而治之(divide and conquer,D&C)贪心教室调度问题背包问题集合覆盖问题 动态规划背包问题旅游行程最优化 遇到问题时, 如果不确定该如何 高效…...
[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解
一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…...
C++ ++++++++++
初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存 整型 sizeof关键字 浮点型(实型) 有效位数保留七位,带小数点。 这个是保…...
C# 牵手DeepSeek:打造本地AI超能力
一、引言 在人工智能飞速发展的当下,大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮,为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升,以及对模型部署灵活性的追求,本地部署 DeepSeek 成为众多开发者和…...
phpstudy安装教程dvwa靶场搭建教程
GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA) Dvwa下载地址 Windows版phpstudy下载 - 小皮面板(phpstudy) 小皮下载地址 1选择windows 版本,点击立即下载 下载完成,进行解压,注意不要有中文路径 点击.exe文件进行安装…...
最新版本SpringAI接入DeepSeek大模型,并集成Mybatis
当时集成这个环境依赖冲突,搞了好久,分享一下依赖配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...
FastAPI 学习笔记
简介: FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 并基于标准的 Python 类型提示。 关键特性: 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic&…...
Elasticsearch:过滤 HNSW 搜索,快速模式
作者:来自 Elastic Benjamin Trent 通过我们的 ACORN-1 算法实现,探索我们对 Apache Lucene 中的 HNSW 向量搜索所做的改进。 多年来,Apache Lucene 和 Elasticsearch 一直支持使用 kNN 查询的过滤搜索,允许用户检索符合指定元数据…...
华为hcia——Datacom实验指南——STP工作基本原理及STP/RSTP基本功能配置
什么时候需要用到STP 在二层交换网络中,为了避免环路产生。 什么是STP STP生成树协议,是用来在冗余链路上消除二层环路。在众多交换机中,需要设置出一个根桥,其余的交换机称为非根桥,根桥是整个交换网络的核心&…...
Vue核心知识:动态路由实现完整方案
在Vue中实现动态路由,并结合后端接口和数据库表设计,是一个复杂的项目,需要多个技术栈和步骤的配合。以下将详细描述整个实现过程,包括数据库设计、后端接口设计、前端路由配置以及如何实现动态路由的功能。 目录 一、需求分析二…...
【Maui】系统找不到指定的文件Xamarin.Android.Aapt2.targets
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI,可从单个共享代码库开发可在 And…...
通过返回的key值匹配字典中的value值
需求 页面中上面搜索项有获取字典枚举接口,table表格中也有根据key匹配字典中的value 方案一 需要做到的要求 这里上面下拉列表是一个组件获取的字典,下面也是通过字典匹配,所以尽量统一封装一个函数,每个组件保证最少变动tabl…...
告别漫长ps软件下载等待,用快马ai即刻生成你的高效修图工作台
作为一个经常需要处理图片的创作者,我深知传统PS软件下载安装的痛点:动辄几个G的安装包、漫长的等待时间、复杂的配置过程。直到发现了InsCode(快马)平台,才真正体会到什么叫"即开即用"的高效修图体验。 批量处理革命 以前要给几十…...
零侵入、极简适配!飞桨CINN实现类CUDA硬件“即插即用”
简介继飞桨框架3.1版本推出“插件式 CUDA兼容类硬件接入方案”(飞桨实现插件式硬件图接入方案,模型推理加速2.2倍),实现运行时(Runtime)与算子(Kernel)的高效复用后,飞桨…...
SiameseUIE模型Git使用进阶:团队协作开发指南
SiameseUIE模型Git使用进阶:团队协作开发指南 1. 开篇:为什么团队开发需要Git规范 咱们做AI项目开发时,经常遇到这样的场景:几个人同时修改代码,结果合并时冲突不断;或者某位同事的代码把整个项目搞崩了&…...
终极指南:10个Browser Compatibility Data在Node.js中的高级应用技巧
终极指南:10个Browser Compatibility Data在Node.js中的高级应用技巧 【免费下载链接】browser-compat-data Browser compatibility data for Web technologies as displayed on MDN 项目地址: https://gitcode.com/gh_mirrors/br/browser-compat-data Brows…...
(87页PPT)6大领域+50个战略框架模型(附下载方式)
篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92796370/92683878 资料解读:6 大领域 50 个战略框架模型 详细资料请看本解读文章的最后内容 在商业竞争日趋激烈的当下,系统…...
3步实现窗口置顶:AlwaysOnTop让重要内容不再“失踪“
3步实现窗口置顶:AlwaysOnTop让重要内容不再"失踪" 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在多任务处理时,你是否经常需要在多个窗口间…...
EcomGPT-7B电商大模型网络安全应用:智能识别钓鱼商品与欺诈文案
EcomGPT-7B电商大模型网络安全应用:智能识别钓鱼商品与欺诈文案 最近和几个做电商平台的朋友聊天,他们都在头疼同一个问题:平台上的商品和文案越来越“花”,有些商家为了引流,标题和描述写得天花乱坠,甚至…...
RexUniNLU GPU推理优化教程:batch_size与max_length调优实测
RexUniNLU GPU推理优化教程:batch_size与max_length调优实测 1. 引言 如果你正在使用RexUniNLU处理大量文本数据,可能会遇到这样的问题:单条推理速度还行,但批量处理时总觉得不够快,GPU利用率也上不去。或者…...
节出来的 00 后,没做聊天壳子,先盯上了你的 Enter 键
字节出来的 00 后,没做聊天壳子,先盯上了你的 Enter 键你以为桌面 AI 助手还停留在「我问一句,它答一句」的阶段,这帮 00 后已经想把事做得更狠一点了。AirJelly 最近放出内测版,路子很野。它不是单纯陪你聊天…...
自媒体好帮手:OpenClaw+千问3.5-27B批量生成视频脚本
自媒体好帮手:OpenClaw千问3.5-27B批量生成视频脚本 1. 为什么需要自动化视频脚本生成 作为一个自媒体创作者,我每天最头疼的就是选题和脚本创作。传统流程需要手动搜索热点、分析数据、撰写大纲、拆解分镜,整个过程耗时耗力。直到我发现Op…...
