Direct IO

news2024/9/20 1:14:03

目录

一、基本介绍

二、使用方法与Demo

三、O_DIRECT 与 O_SYNC 


一、基本介绍

         如上图所示,普通的 IO 读写,会先将内容保存在缓冲区中,文件落盘需要调用 fflush 、fsync 等方法。

        而 DirectIO 是无缓冲 IO,,使用无缓冲 IO 对文件进行读写,不会经过 OS Cache,数据直接落盘。

        大多数使用场景中,使用缓冲区可以达到预读取、批量刷盘等目的,可以提高一部分性能。但对于一些应用场景,例如数据库,他们内部设计了一套自己的缓存机制,如果不使用 Direct IO 会存在双重缓存机制,影响性能。而且,数据库的缓存机制更适用于数据库本身。

二、使用方法与Demo

        下面介绍如何使用 Direct IO

/*
    打开文件并返回文件句柄。
    flags 必须包含 O_RDONLY(只读), O_WRONLY(只写), O_RDWR(读写) 中的一种。
    除此之外还有如下 flag:
    O_APPEND : 追加写入,但在 NFS 场景下如果多进程写入文件,会造成文件损毁(NFS不支持追加写入,内核必须模拟)。
    O_ASYNC、O_CLOEXEC、O_CREAT、O_DIRECTORY、O_EXCL、O_LARGEFILE、O_NOATIME、O_NOCTTY、O_NOFOLLOW、O_NONBLOCK、O_NDELAY、O_PATH、O_TRUNC
    O_DIRECT : 绕过系统缓冲区直接读写磁盘文件,大多数情况下会降低性能,但对于应用自身携带缓存机制的情况下很有用。但需要注意,O_DIRECT 不等同于 O_SYNC。
    O_SYNC  : 同步 IO,write 操作在物理落盘之前会一直阻塞。
               
*/
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

         在使用 Direct IO 编码过程中,读写的 buff 需要进行内存对齐,所以不能使用 malloc 进行内存随机分配,需要使用 memalign 、aligned_alloc、 valloc 等函数指定分配的内存起始地址。

#include <malloc.h>
#include <stdlib.h>
/*
    在内存中分配 size 长度的空间,该空间的起始位置为 alignment 的整数倍(必须是2的幂)
*/
void *memalign(size_t alignment, size_t size);

/*
    与 memalign 类似,唯一的不同在于 aligned_alloc 的 size 也必须是 alignment 的整数倍
*/
void *aligned_alloc(size_t alignment, size_t size);

/*
    与 memalign 类似,valloc 分配的内存起始默认为 页 的整数倍,等同于 memalign(sysconf(_SC_PAGESIZE),size)
*/
void * valloc (size_t size)

        在 NFS 场景下,一些特殊配置的内核可能不支持使用 Direct IO。NFS 场景下只有 Client 会越过系统缓存,Server端不会进行改变。客户端会要求服务器 I/O 同步,以保持 O_DIRECT 的同步语义。在这些情况下,某些服务器的性能会很差,尤其是在 I/O 很小的情况下。Linux NFS 客户端对 O_DIRECT I/O 没有对齐限制。

        下面是一个简单的使用 Demo,读取裸设备中的数据并写入指定的文件中。

#define _GNU_SOURCE
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define SECTOR_SIZE 512

int main(int argc, char *argv[]) {
    int offset = 0;
    int length = 5;
    int rc = -1;

    char *sector = aligned_alloc(SECTOR_SIZE, SECTOR_SIZE);
    memset(sector, 0, SECTOR_SIZE);
    int fd = open("/dev/sda1", O_RDWR | O_DIRECT);

    FILE *fp = fopen("/home/tp/test.txt","w");

    lseek(fd, offset, SEEK_SET);
    for (int i = 0; i < length; i++) {
        rc = read(fd, sector, SECTOR_SIZE);
        if (rc < 0)
            printf("sector read error at offset = %d + %d %s", offset, i, strerror(errno));
        printf("Sector: %d", i);
        fwrite(sector, 1, SECTOR_SIZE, fp);
    }
    free(sector);
    close(fd);
    fclose(fp);
}

三、O_DIRECT 与 O_SYNC 

        O_DIRECT 上一章节已经介绍完成,下面简单介绍 O_SYNC。

        O_SYNC 表示打开同步 IO,在进行 write 时,在数据刷入磁盘之前会一直阻塞O_SYNC的同步是通过 fsync 函数实现的。使用 O_SYNC 后会浪费系统资源,会搜索缓存池内的脏页,强制将所有的脏页最终通过 submit_bio 提交给调度器,并等待完成。由于搜索算法的原因,有可能还会导致多余的IO操作。

        而 Direct IO 绕过内存直接将数据写入磁盘,但其只保证所有的 IO 下发到磁盘设备并完成,至于磁盘设备本身是否具备缓存等机制是无法感知的,其实对于 O_SYNC 来说也同样如此。

        还有一点就是 Direct IO针对读写两个操作,SYNC 只针对写操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

>>数据管理:DAMA简介「考试和续期」

关于DAMA,这里就不再多做描述,可以参考以前写的一些简介或官方介绍。下面就考试再做一些详细介绍。 1 区别 CDGA:数据治理工程师(Certified Data Governance Associate),“DAMA中国”组织的数据治理方面的职业认证考试。 CDGP:数据治理专家(Certified Data Governa…

数学小课堂:无穷小(用动态和极限的眼光看世界)

文章目录 引言I 极限1.1 柯西对极限的认知1.2 极限准确的定义1.3 数列极限的定义1.4 函数极限的定义1.5 无穷小(特殊的极限)1.6 定量和逆向思维1.7 认知升级的过程引言 身处于渐变世界的人类,难以理解瞬间突变。 老师的作用,就是用大白话,把数学语言所写的知识,翻译成大…

基于ANN以使用有监督和无监督的学习将其分为不同的类别或识别模式(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 人工神经网络&#xff08;ANN&#xff09;在包括技术或统计在内的每一个分支中都变得越来越有用&#xff0c;以分析一些社会或非…

【C++容器】vector、map、hash_map、unordered_map四大容器的性能分析【2023.02.28】

摘要 vector是标准容器对数组的封装&#xff0c;是一段连续的线性的内存。map底层是二叉排序树。hash_map是C11之前的无序map&#xff0c;unordered_map底层是hash表&#xff0c;涉及桶算法。现对各个容器的查询与”插入“性能做对比分析&#xff0c;方便后期选择。 测试方案…

QT-自定义滑动式日期选择

QT-自定义滑动式日期选择前言一、效果演示二、注意说明二、关键程序1.SliderDateTime.cpp2.Slider.cpp四、程序链接前言 1、使用鼠标滑动的方式选择指定的日期时间&#xff0c;并且获取当前选中的时间&#xff0c;整体样式看来十分舒服&#xff0c;更加适用触摸屏的方式。 2、…

Python进阶-----面向对象1.0(对象和类的介绍、定义)

目录 前言&#xff1a; 面向过程和面向对象 类和对象 Python中类的定义 &#xff08;1&#xff09;类的定义形式 &#xff08;2&#xff09;深层剖析类对象 前言&#xff1a; 感谢各位的一路陪伴&#xff0c;我学习Python也有一个月了&#xff0c;在这一个月里我收获满满…

理解Spring中的依赖注入和控制反转

依赖注入&#xff08;Dependency Injection&#xff09;是一种面向对象编程的设计模式&#xff0c;用于解决对象之间的依赖关系。它的基本思想是将对象的创建和管理工作交给容器来完成&#xff0c;而不是在应用程序中手动创建和管理对象&#xff0c;从而达到松耦合、易维护、易…

华为OD机试题【最差产品奖】用 C++ 编码,速通 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明最差产…

【项目精选】 javaEE采购管理系统(论文+视频+源码)

点击下载源码 本系统是一个独立的系统&#xff0c;用来解决企业采购信息的管理问题。采用JSP技术构建了一个 有效而且实用的企业采购信息管理平台&#xff0c;目的是为高效地完成对企业采购信息的管理。经过 对课题的深入分析&#xff0c;采购系统需实现以下功能模块&#xff1…

中睿天下当选信通院网络安全卓越合作伙伴

2月23日&#xff0c;2023年中国网络和数据安全产业高峰论坛—网络安全技术创新赋能产业发展分论坛在四川成都成功召开&#xff0c;分论坛以“技术创新、场景赋能、实效验证”为主题&#xff0c;由工业和信息化部网络安全管理局指导&#xff0c;中国信息通信研究院主办&#xff…

kind kubernetes 集群内如何通过 helm 部署定制化 Prometheus-Operator?

文章目录1. Prometheus 简介2. Prometheus 优势3. Prometheus 架构图4. Prometheus-Operator 简介5. Prometheus-Operator 架构图6. 环境准备7. Kind 部署 Kubernetes7.1 安装 Ingress-nginx 组件7.2 安装 Metric Server 组件8. helm 快速安装 Prometheus-Operator9. 定制 Prom…

洗地机哪个品牌最好用?家用洗地机十大名牌

这几年清洁类的小家电非常热门&#xff0c;无线吸尘器、扫地机器人、扫拖一体机、洗地机和擦窗机器人层出不穷&#xff0c;各个品牌百花齐放。这些清洁电器&#xff0c;确实为家庭卫生清洁带来了很大的便捷。但要把这些产品一次性买齐是一笔不小的开销&#xff0c;而且需要收纳…

天猫淘宝企业服务为中小微企业打造供应链智能协同网络,让采购不再将就!丨爱分析报告

编者按&#xff1a;近日天猫淘宝企业服务&爱分析联合发布《2023中小微企业电商采购白皮书》&#xff0c;为中小微企业采购数字化带来红利。 某水泵企业&#xff1a;线上客户主要是中小微企业&#xff0c;线上业绩遇到瓶颈&#xff0c;如何突破呢&#xff1f;某焊割设备企业…

助力Koordinator云原生单机混部,龙蜥混部技术提升CPU利用率达60%|龙蜥技术

文/OpenAnolis Kernel SIG01什么是 CPU 混部CPU 混部是指将不同类型的业务部署到同一台机器上运行&#xff0c;让它们共享机器上的 CPU 资源以提升 CPU 利用率&#xff0c;从而降低机器的采购和运营成本。但是&#xff0c;对于有些类型的任务来说&#xff0c;它们对延时非常的敏…

光流分析 Optical Flow Lucas-Kanade 算法 DOF Dense Optical Flow

光流跟踪算法对车位进行跟踪 概念 光流是空间运动物体在观察成像平面上的像素运动的瞬时速度&#xff0c;是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xff0c;从而计算出相邻帧之间物体的运动信息的一种方法。 一…

王道计算机网络课代表 - 考研计算机 第二章 物理层 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 计算机网络 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “物理层” 章节知识点总结的十分全面&#xff0c;涵括了《计算机网络》课程里的全…

ARM LDREX/STREX指令以及独占监控器详解

一、目的Linux驱动开发中有一个特别重要的知识点必须掌握&#xff0c;即并发、竞态以及同步。什么是并发&#xff1f;多个执行单元&#xff08;进程、线程、中断&#xff09;同时对一个共享资源的进行访问&#xff1b;此处的共享资源可以是外设、内存或者软件层面的全局变量静态…

Linux服务器磁盘分区、挂载、卸载及报错处理

整体操作是&#xff1a;先对磁盘进行格式化&#xff0c;格式化后挂载到需要的挂载点&#xff0c;最后添加分区启动表&#xff0c;以便下次系统启动时自动挂载。一、linux分区1、Linux来说wulun有几个分区&#xff0c;分给哪一目录使用&#xff0c;他归根结底只有一个根目录&…

计算机操作系统第一章

操作系统引论1.1操作系统的目标和作用定义&#xff1a;操作系统是控制管理计算机系统的硬软件&#xff0c;分配调度资源的系统软件。目标&#xff1a;方便性&#xff0c;有效性&#xff08;提高系统资源的利用率、提高系统的吞吐量&#xff09;&#xff0c;可扩充性&#xff0c…

小红书达人怎么找?保姆级教程来了~

在小红书推广营销中&#xff0c;寻找优质的达人是最头疼的事&#xff0c;许多品牌往往会根据简单的小红书排名来直接进行判断认定&#xff0c;其实在挑选小红书达人时有许多要注意的点&#xff0c;接下来和小编一起根据小红书数据分析工具来筛选合适、优质的达人。 千瓜数据—…