Linux系统的I/O操作涉及的内核缓冲区

news/2023/6/9 20:18:46

一.  Linux系统中I/O操作

Linux系统中,常见的I/O操作,如 read() 函数或 write() 函数。

在调用 write() 函数时,我们认为该函数一旦返回,数据便已经写到了文件中,但是这种概念只是宏观上的。实际上,操作系统实现某些文件 I/O 时(如磁盘文件),为了保证I/O的效率,在内核通常会用到一片专门的区域(内存或独立的I/O地址空间)作为 I/O 数据缓冲区。它用在输入输出设备和CPU之间,用来缓存数据,使得低速的设备和高速的 CPU 能够协调工作,避免低速的输入输出设备长时间占用CPU,减少系统调用,提高了 CPU 的工作效率。

二.   Linux 系统中的内核缓冲区

1. 延迟写:

UNIX 或 Linux 系统在设计时使用了内核缓冲区。

Linux系统的延迟写原理:大多数磁盘 I/O 都通过缓存进行,当将数据写到文件上时,通常该数据先由内核复制到缓存中,如果该缓存尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要刷新缓冲时,再将该缓存写入输出队列,然后等待其到达队首时,才进行实际的 I/O 操作。这种输出方式被称为延迟写。

2.  Linux系统中同步接口函数

为了保证磁盘上实际文件系统与缓存中内容的一致性,系统提供了同步接口,包括 sync() 函数、fsync() 函数与 fdatasync() 函数。同步缓存函数如下:

sync() 函数:

#include <unistd.h>

void sync(void);

函数sync() 始终成功。但是 sync() 只是将所有修改过的块的缓存排入写队列,然后就返回,它并不等待实际I/O 操作结束。系统守候进程一般每隔一段时间调用一次 sync() 函数。这就保证了定期刷新内核的块缓存。

fsync() 函数 与 fdatasync() 函数:

int fsync(int fd);

int fdatasync(int fd);

fsync() 函数则等待 I/O 结束,然后返回。fsync() 多用于数据库相关的应用程序,它确保修改过的块立即写到磁盘中。

fdatasync() 只是更新内容,如果没有必要,并不更新元数据(即该文件的属性,例如上次修改内容的时间)。

如果执行成功时,fsync()函数/fdatasync()函数返回0;否则返回-1,同时设置 errno 以指明错误。

三. 总结

磁盘I/O操作中提供的这种延迟写机制,虽然减少了磁盘读写次数,可以有效的提供 CPU 工作效率。但是缺点是:降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。

所以,这种延迟读写机制,有利有弊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4566527.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

MusicLab RealEight for Mac破解教程

MusicLab RealEight for Mac&#xff08;八弦电吉他虚拟乐器&#xff09; MusicLab RealEight for Mac破解版基于易于使用的键盘布局以及先进的键&#xff0c;踏板&#xff0c;速度开关系统提供令人难以置信的实用性&#xff0c;并允许键盘手执行具有全新水平表达的吉他部件.Mu…

物联网 ESP826-NODEMCU(基础知识篇)

arduino 数字引脚电压5v nodemcu 电压3.3v 且只有一个模拟引脚 nodemcu 1.GPIO代表的是esp8266上的引脚 即digitalWrite(D2)与digitalWrite(4)是同样的功能 2.浅蓝底黑字是nodemcu通讯功能的引脚&#xff0c;nodemcu有两个硬件串口 除了RX,TX 还有 D4 &#xff08…

亿智SV826/SV823新一代高性能视觉AI SoC正式量产

产品概述 SV826/SV823是亿智电子面向视频编解码AI摄像头应用发布的新一代高性能端侧AI芯片。依托高算力NPU、高性能的图像处理ISP和编解码能力&#xff0c;实现4K超高清视频录制和视频级别的智能化&#xff0c;应用于人脸识别、人形跟踪、车牌识别、车辆检测等目标&#xff0c…

LeetCode826. 安排工作以达到最大收益

力扣 解题思路: 1.将工作难度和收益进行映射 &#xff0c; 按照工作难度升序排列。 2.将工人的完成难度按升序排列。 3.从第一个工人开始先找到自己的最大能获取的最大利润&#xff0c;因为工人经过了排序&#xff0c;那么后面的工人只需要在前面一个工人的基础上向后找&…

Leetcode 826. 安排工作以达到最大收益

Leetcode 826. 安排工作以达到最大收益 1. 问题描述 2. 思路 3. 代码 func maxProfitAssignment(difficulty []int, profit []int, worker []int) int {var res intprofitMap : make(map[int]int, 0)length : len(profit)for i : 0; i < length; i {_, ok : profitMap[di…

【ACwing】二、 数据结构:826. 单链表+ 827. 双链表

文章目录826. 单链表827. 双链表回顾以及计划&#xff1a;用了一个多月的时间看完了acwing的第一章基础算法&#xff0c;并完成了相关笔记&#xff0c;接下来的系列是对第二章数据结构的笔记以及相关习题。我觉得学习速度有点慢了&#xff0c;争取在这一学期能把所有的课程完成…

[AcWing]826. 单链表(C++实现)单链表模板题

[AcWing]826. 单链表&#xff08;C实现&#xff09;单链表模板题1. 题目2. 读题&#xff08;需要重点注意的东西&#xff09;3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结1. 题目 2. 读题&#xff08;需要重点注意的东西&#xff09; 初步思路&#x…

htc d826 android 6,【精】自己动手一:HTC826D用提取的MirrorLink协议APP安装包投影成功...

火腿肠被我拆坏&#xff0c;已经光荣牺牲下岗&#xff0c;发个百度网盘分享给需要朋友们。http://pan.baidu.com/s/1nuLXAJn四川全新英朗车友会欢迎大家加入。HTC826D用提取MirrorLink协议APP安装包投影成功有需要APP车友可以论坛回复并留下联系方式&#xff0c;我…