文件IO、标准IO的区别及其效率

article/2025/4/26 20:38:13

系统IO:Unix/Linux下的系统文件IO,即文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程序地址空间进行传输。

标准IO:带缓存的IO,又称为标准IO(C标准库中提供了标准IO库,即stdio),它实现了跨平台的用户缓存解决方案。
 

文件IO 和 标准IO的概念

【文件I/O】

        文件I/O是操作系统封装了一系列open、close、write、read等API函数构成的一套用来读、写文件的接口供应用程序使用,通过这些接口可以实现对文件的读写操作,但是效率并不是最高的。

        文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立刻触发系统调用过程,即向系统内核发出请求之后,系统内核会收到执行相关代码处理的请求,决定是否将操作硬件资源或返回结果给应用程序。

【标准I/O】

        标准IO:应用层C语言库函数提供了一些用来做文件读写的函数列表,叫标准IO。标准IO有一系列的C库函数构成(fopen,fclose,fwrite,fread),这些标准IO函数其实是由文件IO封装而来的(fopen内部还是调用了open);,我们通过fwrite写入的内容不是直接进入内核中的buf,而是先进入应用层标准IO库自己维护的buf中,然后标准IO库自己根据操作系统单次write的最佳count来选择好的时机来完成write到内核中的buf中。因此,标准I/O封装了底层系统调用更多的调用函数接口。

文件I/O和标准I/O的本质区别:

        1)缓冲区:标准I/O函数接口在对文件进行操作时,首先操作缓存区,等待缓存区满足一定的条件时,然后再去执行系统调用,真正实现对文件的操作。        而文件I/O不操作任何缓存区,直接执行系统调用。

        2)系统开销:使用标准I/O可以减少系统调用的次数,提高系统效率。例如,将数据写入文件中,每次写入一个字符。采用文件I/O的函数接口,每调用一次函数写入字符就会产生一次系统调用。        而执行系统调用时,Linux必须从用户态切换到内核态,处理相应的请求,然后再返回到用户态,如果频繁地执行系统调用会增加系统的开销。

        3)执行效率:采用标准I/O的函数接口,每调用一次函数写入字符,并不着急将字符写入文件,而是放到缓存区保存,之后每一次写入字符都放到缓存区保存。直到缓存区满足刷新的条件(如写满)时,再一并将缓存区中的数据写入文件,执行一次系统调用完成此过程,这样便很大程度地减少了系统的调用次数,提高了执行效率。

 

可以使用 time 命令测试 系统IO 和 标准IO程序执行效率,比如写 100 0000个数到某文件中。

time命令:程序执行时加上time能够粗略统计程序执行过程中的耗时。通常会有三个值real time, user time和sys time.

1. real time
概念:程序从开始到结束所经历的时间,也就是用户所感受到的时间。包括当前程序CPU的用时和所有延迟程序执行的因素的耗时总和(比如其他程序耗时,等待I/O完成耗时等)。

来源:real time是由gettimeofday()中结束时间与开始时间相减得来。

2. user time
概念:程序执行过程中在用户空间(user space)中所花费的所有时间,即程序用户模式下的CPU耗时。

仅指当前进程。
其他进程的时间和当前进程I/O阻塞的时间均不计在内。
来源:user time是由wait()或times()系统调用得来。
3. sys time
概念:程序执行过程中内核空间(kernel space)中所花费的时间,即程序在内核调用中的CPU耗时。

仅指当前进程。
程序的库代码调用仍然是在用户空间下。
来源:sys time是由wait()或times()系统调用得来。

time 命令应用详解: Linux系统-real/user/sys time - kakaisgood - 博客园

        Real 是时钟时间-程序从开始至结束的总时间。他包括期间其他进程所占用的时间片和进程被阻塞的时间(如IO等待的时间)

        User 被测试程序在用户模式下所花的CPU时间。他是进程执行的正真的CPU时间。其他进程调度的时间片以及阻塞(如IO)的时间不包含在内。

        Sys 是进程在内核中所花费的CPU时间。他表示进程在内核调用中所花的CPU时间,而程序的库调用仍然运行在用户空间下。

User+Sys表示程序所执行的CPU时间(不包括IO以及其他进程的CPU时间).

系统IO速度快还是标准IO速度快呢

—— 标准IO比系统IO快了好多,原因是:
标准IO比系统IO多了一个缓存区。当我们将数据输入时,他不会马上将数据写入文件,而是会将数据先写入缓存区,之后一次性写入很多数据。而系统IO没有缓存区,所以他每次都要在数据和文件之间来回搬运所以增加了很大的工作量。

解决方法
手动的为系统IO加上一个缓存区,即使用dup2() 函数制定一个带缓冲区的文件描述符即可。

系统IO和标准IO的速度对比_抹布吸的博客-CSDN博客


#include <unistd.h>

int dup2(int oldfd, int newfd);

dup2可以用参数newfd指定新文件描述符的数值。若参数newfd已经被程序使用,则系统就会将newfd所指的文件关闭,若newfd等于oldfd,则返回newfd,而不关闭newfd所指的文件。dup2所复制的文件描述符与原来的文件描述符共享各种文件状态。共享所有的锁定,读写位置和各项权限或flags等

dup()、dup2() 函数详解如下:

linux c——dup( )和dup2( )函数详解_tiandc的博客-CSDN博客_dup2

这里也有一篇很好的总结,记录下:系统调用IO和标准IO - 原野追逐 - 博客园

https://www.cnblogs.com/songhe364826110/p/11546076.html


http://chatgpt.dhexx.cn/article/SU0uK4KS.shtml

相关文章

如何理解 iowait

Linux中&#xff0c;%iowait 过高可能是个问题&#xff0c;严重的时候&#xff0c;它能使服务停止&#xff0c; 但问题是&#xff0c;多高才算高&#xff1f; 什么时候应该担心呢&#xff1f; 本文将讨论 iowait 的含义、相关的统计数据、原理以及 iowait的瓶颈问题 什么是 i…

Mysql的IO介绍及原因详解

有输入输出类型的交互系统都可以认为是I/O系统。 目录 一、IO操作 二、IO成本 三、IO分类 四、Mysql网络层IO&#xff08;网络IO&#xff09; 五、Mysql存储IO&#xff08;磁盘IO&#xff09; 一、IO操作 在计算机系统中I/O就是输入&#xff08;Input&#xff09;和输出(Outp…

IO概念

IO概念和五种IO模型 一、什么是IO&#xff1f; 我们都知道unix世界里、一切皆文件、而文件是什么呢&#xff1f;文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操…

顺序IO和随机IO

顺序IO和随机IO 什么是顺序IO和随机IO如何解决随机IO造成的性能损失&#xff1f;问题什么是IOPS?机械硬盘和固态硬盘在随机IO上性能的影响因素&#xff1f;SSD作为随机存储设备&#xff0c;其访问任意一块的时间应该是相等的&#xff0c;为什么顺序IO还是快于随机IO? 什么是顺…

绘图工具-draw.io

draw.io是一个可配置的图表/白板可视化应用程序。draw.io 由英国软件公司JGraph Ltd拥有和开发。这是一个开源项目&#xff08;但对贡献是封闭的&#xff09;&#xff0c;github链接&#xff1a;https://github.com/jgraph&#xff0c;可以绘制流程图、UML、类图、组织结构图、…

什么是IO Pad?

1.什么是IO pad&#xff1f; IO pad是一个芯片管脚处理模块&#xff0c;即可以将芯片管脚的信号经过处理送给芯片内部&#xff0c;又可以将芯片内部输出的信号经过处理送到芯片管脚。输入信号处理包含时钟信号&#xff0c;复位信号等&#xff0c;输出信号包含观察时钟、中断等…

Drawio使用简介(慢慢更新中)

drawio是一款强大、免费的绘图工具&#xff08;基本可以替代收费的visio等&#xff09;&#xff0c;使用起来非常方便。支持网页版使用&#xff08;网页版可以自己部署一套&#xff09;以及客户端使用&#xff08;支持windows&#xff0c;MacOS以及Linux&#xff09;。 该项目…

计算机io接口主要功能,io接口的功能是什么

IO接口又称为输入输出接口,是信息处理系统与外部世界之间的通信。输入是系统接收的信号或数据,输出是从其发送的信号或数据。该术语也可以用作行动的一部分; 到“执行I / O”是执行输入或输出操作。 IO 接口,又称为输入输出接口,是信息处理系统(例如计算机)与外部世界(可能是人…

到底什么是IO

IO 作为操作系统的核心知识之一, 无论是在本机、传统的单体应用、还是分布式系统中,都有非常重要的地位. 今天就和大家系统地聊一聊 IO 相关的东西. IO IO&#xff0c;Input/Output 简写&#xff0c;是指内存和外设之间的数据复制的过程. 输入是指数据从外设复制到内存中, 输…

一文掌握 IO 基础知识与概念

&#x1f49e;哈喽&#xff01;大家好&#xff0c;我是HappyGirl快乐女孩&#x1f49e; &#x1f61c;是一位爱好技术的【技术Fans】&#xff01;&#x1f61c; &#x1f49e;&#x1f49e;&#x1f49e; 如果有对技术感兴趣的宅友&#xff0c;欢迎关注&#x1f49e;&#x1f4…

韦东山freeRTOS系列教程之【第三章】任务管理

文章目录 系列教程总目录概述3.1 基本概念3.2 任务创建与删除3.2.1 什么是任务3.2.2 创建任务3.2.3 示例1: 创建任务3.2.4 示例2: 使用任务参数3.2.5 任务的删除3.2.6 示例3: 删除任务 3.3 任务优先级和Tick3.3.1 任务优先级3.3.2 Tick3.3.3 示例4: 优先级实验3.3.4 示例5: 修改…

FreeRTOS教程——定时器(二)

Free RTOS定时器 一、概念 一、概论 软件定时器允许设置一段时间&#xff0c;当设置的时间到达之后就执行指定的功能函数&#xff0c;被定时器 调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期&#xff0c; 简而言之&#xff0c;当定时…

韦东山freeRTOS系列教程之【第二章】内存管理

文章目录 教程目录2.1 为什么要自己实现内存管理2.2 FreeRTOS的5种内存管理方法2.2.1 Heap_12.2.2 Heap_22.2.3 Heap_32.2.4 Heap_42.2.5 Heap_5 2.3 Heap相关的函数2.3.1 pvPortMalloc/vPortFree2.3.2 xPortGetFreeHeapSize2.3.3 xPortGetMinimumEverFreeHeapSize2.3.4 malloc…

FreeRTOS学习记录(安富莱FreeRTOS教程摘录)

FreeRTOS学习资料&#xff1a; 安富莱论坛FreeRTOS教程 FreeRTOS源码下载链接 第1章 为什么选用FreeRTOS 1.1 FreeRTOS优势 FreeRTOS优势 最大的优势就是开源免费&#xff0c;商业使用的话不需要用户公开源代码&#xff0c;也不存在任何版权问题&#xff0c;是当前小型嵌入…

STM32 FreeRTOS系列教程(一)FreeRTOS简介

参考资料&#xff1a;《正点原子STM32F4 FreeRTOS开发手册_V1.1》《野火FreeRTOS 内核实现与应用开发实战—基于STM32》 学习RTOS的意义 当我们进入嵌入式这个领域的时候&#xff0c;往往首先接触的都是单片机编程&#xff0c;单片机编程又 首选51 单片机来入门。这里面说的单…

FreeRTOS使用教程(配合CubeMX)

FreeRTOS使用教程&#xff08;配合CubeMX&#xff09; 一、CubeMX配置 在选择后单片机芯片后&#xff0c;在Middleware中选择FREERTOS的CMSIS_V1版本即可在工程开启FreeRTOS。 关于FreeRTOS的具体配置一般集中在Kernel Setting中。具体参数一般可以默认&#xff0c;有特殊需求…

【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习

【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习 前言 本教程将对应外设原理&#xff0c;HAL库、STM32CubeMX和FreeRTOS结合在一起讲解&#xff0c;分析学习过程中遇到的问题和一些注意事项。 知识概括&#xff1a; SMT32定时器原理 STM32CubeMX创建定时器例程 HAL库…

[FreeRTOS系列教程]学习FreeRTOS前的准备工作-----初学者必看

转自&#xff1a;http://bbs.armfly.com/read.php?tid1552 转载说明&#xff1a;本文仅为转载&#xff0c;下面有几位同学询问对应的教程&#xff0c;教程请参考下面的链接&#xff0c;是以帖子的形式分章节说明。 http://bbs.armfly.com/thread.php?fid14&type29&…

FreeRTOS基本教程零:STM32 FReeRTOS 移植流程

一、资料准备 FreeRTOS源码下载地址&#xff1a; https://github.com/FreeRTOS/FreeRTOShttps://github.com/FreeRTOS/FreeRTOS我移植的是FreeRTOSv9.0.0 stm32裸机程序&#xff1a; 二、FreeRTOS目录 一共有三个文件夹 其中Demo文件夹中是FreeRTOS的例程&#xff0c;Licen…

基于STM32的实时操作系统FreeRTOS移植教程(手动移植)

前言&#xff1a;此文为笔者FreeRTOS专栏下的第一篇基础性教学文章&#xff0c;其主要目的为&#xff1a;帮助读者朋友快速搭建出属于自己的公版FreeRTOS系统&#xff0c;实现后续在实时操作系统FreeRTOS上的开发与运用。操作系统的学习与运用可以说是每位嵌入式开发工程师必须…