本文重点说明下面内容:

  • 什么是标准IO,什么是文件IO?
  • 什么是Direct IO? O_SYNC标识有什么意义?
  • 各个层面的缓存如何同步?
  • 还在page cache中的脏页可以读写吗?

IO路径上的各层buff

Application buff
|
clib buff
|
page cache
|
disk cache

标准IO

  • 标准IO操作的是流(File对象)
  • 标准IO可以设置缓存,这个缓存是用户态buffer,一般称为clib buff
    api
#include <stdio.h>//打开流
FILE *fopen(const char *pathname, const char *type);//关闭流
int fclose(File *fp);// 刷新流
int fflush(FILE *fp);// 一次读写一个字符
int fgetc(FILE *fp);
int fputc(FILE *fp);// 一次读写一行
char* fgets(char* buf, int n, FILE* fp);
int fputs(const char *str, FILE* fp);// 二进制读写
size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);// 格式化输入输出
int fprintf(FILE *fp, const char* format, ...);
int fscanf(FILE *fp, const char *format, ...);// 示例
#include <stdio.h>
#include <stdlib.h>
int main(void){char buf[1024];while (fgets(buf, 1024, stdin) != NULL)if (fputs(buf, stdout) == EOF)printf("output error");if (ferror(stdin))printf("input error");exit(0);
}

说明

  • 调用fwrite, fputc, fputs系列函数后,数据被保存到clib buf中,依然处于用户态,如果此时应用进程crash掉,这些数据将丢失。
  • 在调用fflush可将clib buf中的数据写入内核的page cache中。
  • 调用fclose也会将clib buff中的数据刷新到内核,并且把clib buff中的输入数据丢弃。
    从这些标准IO的API可看出,标准IO比文件IO要简洁很多,没有各种标识,没有sync, nonblock等。
    上列API具体使用细节可参考《unix环境高级编程》第5章。

文件IO

文件IO是直接操作linux系统调用,大部分的问题都是使用文件IO带来的。

api


int open(const char *pathname, int oflag);int close(int filedes);ssize_t read(int filedes, void* buff, size_t nbytes);ssize_t write(int filedes, const void* buff, size_t nbytes);int fsync(int filedes);int fcntl(int filedes, int cmd);int ioctl(int filedes, int request);

说明

  • O_SYNC标识打开的文件,会在write系统调用时,会等待IO从底层返回;O_SYNC仅对写有意义。
  • O_DIRECT标识打开的文件不经过page cache; O_DIRECT对读写都是有意义的。
  • O_NONBLOCK标识打开的文件(一般是网络IO,终端设备IO) ,在不可读写时立即返回EAGAIN等错误码。
  • O_SYNC, O_DIRECT有区别如下,
size_t wirte_file()
{if(o_DIRECT)direct_io();elsebuffered_io();if( O_SYNC )wait_data_synced();
}
上述API细节可参考《unix环境高级编程》第3章。

mmap

api

#include <sys/mman.h>
void *mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
mmap在calling process的虚拟地址空间中创建一个映射,主要有以下两种常用方式:
  • 对文件创建一个mapping,读写文件可以用读写内存替代。

  • 匿名映射,传入的fd为-1

    创建mapping后,省掉了数据从在用户态buff和内核page cache的拷贝


后续整理下linux系统文件IO流程

linux系统IO操作相关推荐

  1. linux系统io错误,linux系统IO操作

    本文重点说明下面内容: 什么是标准IO,什么是文件IO? 什么是Direct IO? O_SYNC标识有什么意义? 各个层面的缓存如何同步? 还在page cache中的脏页可以读写吗? IO路径上的 ...

  2. 【Linux系统IO函数】lseek函数

    Linux系统IO函数-lseek函数 1.1 lseek函数与标准C库的fseek函数 lseek函数对应标准C库中的fseek函数 查看标准C库中的fseek函数使用说明: (shell输入) m ...

  3. Linux 系统 IO之 lseek 函数

    Linux 系统 IO之 lseek 函数 文章目录 Linux 系统 IO之 lseek 函数 1. lseek 函数 1.1 头文件包含 1.2 函数原型 1.3 函数功能 1.4 函数返回值 1 ...

  4. Linux系统IO分析工具之iotop常用参数介绍

      Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...

  5. putty怎么远程控制linux应用,如何使用linux系统远程操作软件putty!

    原标题:如何使用linux系统远程操作软件putty! linux小白到大神的成长之路:如何使用linux系统远程操作软件putty! 本经验由宗龙龙原创,全文共500多字,阅读需要14分钟,如果文中 ...

  6. putty 32位_了解linux系统远程操作软件,putty的安装过程!

    linux小白到大神的成长之路:了解linux系统远程操作软件,putty的安装过程! 本经验由宗龙龙原创,全文共600多字,阅读需要14分钟,如果文中存在错误,还请大家多多指点,我会积极改进的! 前 ...

  7. Linux系统下操作的常用快捷键

    Linux系统下操作的常用快捷键     Ubuntu基本快捷键(可能有重复.不全)欢迎指正 * 打开主菜单 = Alt + F1 类似Windows下的Win键,在GNOME中打开"应用程 ...

  8. 系统级程序设计第一课内容——Linux系统与操作 2022.5.2

    系统级程序设计第一课内容--Linux系统与操作 文章目录 系统级程序设计第一课内容--Linux系统与操作 一.Linux文件系统与操作 二.文件操作 1.主要函数 2.open() 3.read( ...

  9. Linux系统下操作Oracle数据库

    Linux系统下操作Oracle数据库 Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品. ...

最新文章

  1. 面向对象分析和设计(OOA/D)
  2. sql 只取一条记录_后端程序员必备:书写高质量SQL的30条建议
  3. centos7 mysql安装
  4. 如何更改 Mac 上的光标颜色
  5. InfluxDB学习之InfluxDB数据保留策略(Retention Policies)
  6. 一个请求多个响应_一个TCP连接到底可以发多少个HTTP请求?
  7. 先滑窗后时空联合处理MATLAB,时空联合优化重建方法及系统与流程
  8. Java集合框架之三:HashMap源码解析
  9. linux在电子信息工程行业中的应用,电子信息工程概述论文
  10. 百度定位---适配8.0限制后台定位
  11. Contki 相关链接备忘
  12. P2044 [NOI2012]随机数生成器
  13. 【学习笔记】白盒及黑盒测试方法简介
  14. 速锐得驾培驾考免接线OBD数据价值及发展思路
  15. 广义相对论和量子力学的根本矛盾
  16. qcap 教程_高通平台抓取ramdump及使用qcap解析,ramdumpqcap
  17. python 导入本地模块包失败的解决方案
  18. css属性之width
  19. 计算机审计体会论文,审计论文格式_计算机审计实验报告_审计论文范文3000字
  20. Disk Manager — 可视化的硬盘分区对象

热门文章

  1. C++的继承知识点重温
  2. Python中的字符串与字符编码:编码和转换问题
  3. nginx优缺点 优化
  4. 【三维深度学习】基于片元的渐进式三维点云上采样模型
  5. 【今日CV 视觉论文速览】27 Nov 2018
  6. linux 分卷解压
  7. OPENWRT传感器实验
  8. for循环的使用步骤 1104
  9. 字体样式 font-family 0911
  10. eclipse的安装与基本配置