首页
学习
活动
专区
圈层
工具
发布

数据一致性和 io 类型

对linux内核来说,读写要经过层层路径,才能真正读写硬盘。从io路径来说,io要经过page cache,io调度队列,dispatch队列,ncq队列和硬盘cache,才能真正到达硬盘。...Page cache:page cache是linux内核提供的缓存接口,page cache的名字就说明内核是通过page单元(通常4K大小)来管理cache。...O_SYNC:打开文件的时候,可以设置O_SYNC标志,在page cache的写完成后,如果文件有O_SYNC标志,立即开始将io下发,进入调度队列。...和回写机制比较,O_SYNC没有等脏页生存30秒,就尝试立即下发到硬盘。 O_SYNC本质就是io下发,然后执行unplug操作。...而不是像O_SYNC那样,循环执行unplug操作。 为了避免O_SYNC每个写io都要阻塞等待的问题,系统提供了fsync和fdatasync系统调用,可以让应用层自己控制同步的时机。

4.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux环境下的open函数分析(二)

    There is one exception: on Linux 2.6 and later, O_EXCL can be used without O_CREAT...这里大概是讲了:在linux内核2.6版本以及后面的版本可以单独使用O_EXCL对块设备来说的话,一般的话O_EXCL和O_CREAT是要结合一起来用的(这样做的目的是当我们去创建一个新的文件,如果我们不小心在写代码输入还是之前已经存在的文件...这里我创建一个已经存在的b.txt本文文件,然后另外一个代码是创建一个不存在的c.txt文本文件: #include #include #include...}; 55 char writebuf[20] = "hhhhohohohoh"; 56 int ret = -1; 57 // 第一步:打开文件 58 fd = open("c.txt...2)还是先看O_SYNC的原注释: O_SYNC Write operations on the file will complete according to the

    1.5K10

    C语言文件读取那些事(open,fopen等函数深层理解)

    C语言文件读取操作特别是在linux内核,嵌入式开发中使用的较为频繁。...文件读取示例文件读取操作char buf[100] = {0};fd = open("xxx.c");// fd接受返回值,-1为错误char writebuf[20] = "I love";// 读取文件到...buf数组中,长度为10个ret = read(fd, buf, 10);// 写入数据ret = write(fd, writebuf, strlen(writebuf));close(fd); C语言中...0666目的是使文件可读可写)其中:O_NONBLOCK//非阻塞模式,打开文件如果不能立马执行,则立刻退回(默认是阻塞模式,文件一定被打开但时间没保证)// 应用于硬件打开(设备文件),不用于普通文件O_SYNC...//没有O_SYNC时,write写入的内容只是在底层的缓冲区(之后一起存放在硬件中),有些时候文件非常重要需要直接写入硬件中lseek函数,确定当前所属文件位置#include #include

    1.4K31

    【Linux笔记】Linux下编译C语言程序

    在上一篇笔记中有分享Linux下的vi/vim编辑器的使用方法(【Linux笔记】Vi/Vim编辑器),现在我们就可以使用vi/vim编辑器编写C代码了。那么写完代码该怎么进行编译呢?...首先,使用命令gcc -v查看当前的Linux发行版是否有安装gcc编译器(PS:本文使用的Linux发行版是红帽6): ? 使用vi/vim编辑器写代码并保存为hello.c: ?...以上就是在Linux下编译C程序的基本方法,适用于源文件不多的情况。后续的笔记中还会分享其他编译方法,欢迎持续关注!如果你觉得对你有用的话,麻烦帮忙点个赞。...在Linux下进行C语言编程的学习可能会增加学习的成本,但是从长远来看仍然是有必要的。...若不想安装Linux系统,也想适应一下Linux环境,则可参考往期笔记:【C语言笔记】Windows下体验Linux环境。

    14.9K10

    Linux GNU C 和 ANSI C 的区别

    Linux 上可用的 C 编译器是 GNU C 编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C对标准C进行一系列扩展,以增强标准C的功能。...open: generic_file_open, release: ext2_release_file, fsync: ext2_sync_file, }; 但是,Linux...C99已经支持__func__宏,因此建议在Linux编程中不再使用__FUNCTION__,而转而使用__func__: void example(void) { printf("This...Linux内核编程时常用的likely()和unlikely()底层调用的likely_notrace()、unlikely_notrace()就是基于 __builtin_expect(EXP,C)实现的...: gcc -c test.c 如果使用“-ansi–pedantic”编译选项,编译会报警: gcc -ansi -pedantic -c test.c test.c:3: warning: ISO

    6.4K40

    Linux C编程之一:Linux下c语言的开发环境

    ---恢复内容开始--- 今天开始根据Linux C编程相关视频的学习所做的笔记,希望能一直坚持下去。。。...3、IDE(集成开发环境:集编辑、编译、调试等功能于一身的工具)   Kylix:号称Linux下的dephi;   Kdevelop   RHIDE:类似与Turbo C++ 4、编译器:gcc...假如用户在安装过程中少装了这些包,就无法编译c源程序,这时候可以通过rpm包来迅速安装Linux的C开发语言环境的。...7、Linux下C程序开发过程:   (1)使用vi工具编辑写源程序;   (2)保存为*.c;   (3)使用gcc编译成二进制可执行文件;   (4)....**argv) { printf("Hello Linux\n"); return 0; } 9、c程序组成   对于一个c程序,安装完成后可以分成三个部分

    12.4K01

    Linux C编程之一:Linux下c语言的开发环境

    今天开始根据Linux C编程相关视频的学习所做的笔记,希望能一直坚持下去。。。...1、开发环境的构成 编辑器:VI; 编译器:选择GNU C/C++编译器gcc; 调试器:应用广泛的gdb; 函数库:glibc ; 系统头文件:glibc_header; 2、在安装Linux时需要注意事项...假如用户在安装过程中少装了这些包,就无法编译c源程序,这时候可以通过rpm包来迅速安装Linux的C开发语言环境的。...7、Linux下C程序开发过程: (1)使用vi工具编辑写源程序; (2)保存为*.c; (3)使用gcc编译成二进制可执行文件; (4)....{ printf(“Hello Linux\n”); return 0; } 9、c程序组成 对于一个c程序,安装完成后可以分成三个部分: 可执行文件;包含文件;库文件 比如用rpm安装的MySQL

    9.4K40

    【Linux】从open到write:系统文件IO 的奥秘与实战指南

    1.经典回顾C文件接口 在使用C语言时,我们需要访问文件通常会用到fopen、 fwrite、和fread还有fclose等函数。...在 Linux 和其他类 Unix 系统中,系统文件 I/O 通常通过系统调用(system call)完成。...相比 C 标准库的 fopen 函数,open 提供了更底层的控制,更适合系统级编程。...O_SYNC:同步写入模式,确保数据立即写入磁盘。每次 write 操作都不会缓存到内存,而是直接刷新到存储设备,适合数据持久性要求高的场景。...O_DSYNC:数据同步,类似 O_SYNC,但只同步数据而不包括文件元数据(如最后修改时间)。 O_RSYNC:同步读模式,和 O_SYNC 类似,但影响的是 read 操作。

    54010

    innodb与ext4缓存交互分析

    需要通过O_SYNC或者fsync()来刷新。 Write-Back buffer。(可设置存储控制器参数绕过) Disk on-borad buffer。...O_SYNC和fsync()的区别同理。 page cache和buffer cache的主要区别在于一个是面向实际文件数据,一个是面向块设备。...在VFS上层使用open()方式打开那些使用mkfs做成文件系统的文件,你就会用到page cache和buffer cache,而如果你在Linux操作系统上使用dd这种方式来操作Linux的块设备,...可见O_SYNC较之O_DSYNC要多做一些操作。...write barriers:目前raid卡的cache是否有电池或者电容保护对Linux来说是不可见的,所以Linux为了保证日志文件系统的一致性,默认会打开write barriers,也就是说,它会不断的刷新

    1.5K40

    C语言中open函数「建议收藏」

    pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp);oflag 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。   ...O_RSYNC read 等待所有写入同一区域的写操作完成后再进行   O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O   open 返回的文件描述符一定是最小的未被使用的描述符...编辑本段Linux C语言中open函数 相关函数   open(打开文件) 相关函数   read,write,fcntl,close,link,stat,umask,unlink,fopen...O_SYNC 以同步的方式打开文件。   O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。   ...参数mode 组合   此为Linux2.2以后特有的旗标,以避免一些系统安全问题。

    7K20

    c语言用命令行打开文件_c语言无法打开文件

    0 代表标准输入 stdin 1 代表标准输出 stdout 2 代表错误输出 stderr 在linux c中 get printf通常指操作文件描述符 0 1 。...在linux中对文件的访问通常有两种形式: 一 通过文件名作为参数操作文件; 二 通过文件描述符操作文件; 关闭文件 在linux c中 #include int close(int...fd); int fclose(int fd); 如果采用文件名打开的文件,可采用close关闭文件 如果采用文件描述符打开的文件,可采用fclose关闭文件 在linux c中关闭文件,常见的关闭文件错误产生的原因...: 1 远程文件保存系统,远程主机关闭,导致文件保存失败; 2 当有程序正在对文件进行写,此时关闭文件; 打开文件 linux c 提供两种打开文件的方式: 1 int open(char *pathname...如果被打开的文件存在,那么文件的原内容则会被忽略,被文件的文件视为空文件; O_APPEND:所有的写操作都在文件的末端进行,但是可以对文件进行无序访问; O_NONBLOCk:文件以非阻塞的方式打开; O_SYNC

    4.6K20
    领券