1、I/O 概念

首先明确概念:I/O 的意思是:输入 输出,任何流程也都是输入输出。任何流也是输入输出,如内存,文件,网络
注意在linux里面大部分设备都可以称为文件,所以这里叫做文件I/O.

1.1 分散 聚集 I/O

允许一次调用同时从多个缓冲区读取数据或者写入多个缓冲区。
**适用场景:**聚集多个不同的数据结构变量,完成每次的I/O事务。
和我们普通的读写文件程序不一样,分散聚集I/O称为向量 读写, 一次可以写入多个缓冲区,这个对于存入不同内存区域的缓冲区写入文件来说非常方便
函数:

writev
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/uio.h>int main()
{struct iovec iov[3];ssize_t nr;int fd,i;char *buf[] ={"钱波测试\n","ab测试\n","test\n"};fd =open("/test.yml",O_WRONLY|O_CREAT|O_TRUNC);if(fd==-1){perror("open");return 1;}for(int i =0;i<3;i++){iov[i].iov_base = buf[i];iov[i].iov_len = strlen(buf[i])+1;}nr = writev(fd,iov,3);if(nr == -1){return -1;}printf("write over\n");if(close(fd)){perror("close");return 1;}return 0;
}

使用windows的wsl 进入ubuntu系统,

gcc test.c -o out
生成out程序,执行时因为写文件需要切换到root下

1.2 Epoll

poll() 和 select() 的改进,
适用场景: 一个线程需要处理数百个文件描述符的场景
Epoll 在2.6 内核引进

#include <sys/epoll.h>
int epoll_create1(int flags);
int epoll_create(int size);

触发为两种模式:
边缘触发和条件触发

1.3 内存映射 I/O

将文件映射到内存,支持通过简单的内存管理方式来处理文件I/O,
适用场景: 大文件映射分段读取,也可以用聚集I/O 读取

#include <sys/mmap.h>
void * mmap(
void *addr,size_t len,
int prot,
int flags,
int fd,
off_t offset);

取消映射,使用mummap()

使用mmap的好处是:避免多余的数据拷贝操作
不足之处:需要的映射区域的大小总是页的整数倍,可能浪费内存。
windows linux 内存文件映射

1.4 文件提示

进程将文件I/O期望适用方式的提示信息提供给内核,提升I/O性能
函数:
posix_fadvise()
readahead()

1.5 异步I/O

允许进程发起多个I/O 请求而不必等待请求完成,适用场景:不使用线程来处理比较高的I/O 负载
需要内核在最底层的支持,aio库提供了一些函数来实现异步I/O 并在完成时收到通知。

#include <aio.h>
struct aiocb{int aio_fildes;omt aop_lio_opcode;int aio_reqprio;volatile void *aio_buf;size_t aio_nbytes;struct sigevent aio_sigevent;
}
int aio_read(struct aiocb *aiocbp);
int aio_write(struct aiocb *aiocbp);
int aio_error(const struct aiocb *aiocbp);
int aio_return(struct aiocb *aiocb *aiocbp);
int aio_cancel(int fd,struct aiocb *aiocb *aiocbp);
int aio_fsync(int op,struct aiocb *aiocb *aiocbp);
int aio_suspend(const struct aiocb * const cblist[], int n, const struct timespec * timeout);

1.6 Linux 5.1合入了一个新的异步IO框架和实现:io_uring

io_uring 由Jens Axboe开发。
围绕高效进行设计。为了避免在提交和完成事件中存在内存拷贝,io_uring设计了一对共享的ring buffer用于应用和内核之间的通信。其中,针对提交队列(SQ),应用是IO提交的生产者(producer),内核是消费者(consumer);反过来,针对完成队列(CQ),内核是完成事件的生产者,应用是消费者。


2 、io 调度器和性能

I/O 调度器实现的两个基本操作就是合并和排序,为什么需要合并? 多个I/O请求合并为一个,可以更节省资源,可以说吞吐量没有变化,但是I/O的次数可以减少很多。

2.1 调度器

2.1.1 deadline I/O调度器

解决的问题: 写恶死读,解决了传统的电梯算法调度的问题,改进的地方为:增加了读FIFO队列和写FIFO队列。

2.1.2 Anticipatory I/O 调度器

比起deadline I/O 调度器,多了一个预测机制,有人会问这怎么预测?又不是算卦的,在I/O世界里,预测意味着等待,所有算法和逻辑都是空间和时间的交互而已,世界也是如此,需要预测就是在极小的时间状态下等待一个时隔,但是又感觉不到,这就叫预测。
    在磁头不断交互,寻找,读取中任务的尽头,给它一定的时间,如6毫秒等待,如果还是需要往下读就不会发生移动,也就是在6毫秒的时间内如果是对硬盘的同一部分发起同样的读请求,那么就是预测成功了!

2.1.3 CFQ I/O 调度器

每个进程都有自己的队列,叫做完全公平队列(Complete Fair Queeing) ,每个队列分配一个时间片,应对于进程而言,因为进程都有自己的时间片,调度器默认的空转时间为10毫秒,如果预测成功,则避免查找操作。

2.1.4 Noop I/O 调度器

简单合并,不排序的调度器,有很多人会有疑惑,为什么有这种调度器呢,因为现在固态硬盘使用的是闪存,不存在磁头旋转的问题,因为合并功能更重要而不是排序,如果期望的是优化交互操作,则用采用CFQ I/O调度器。

2.2 选择调度器

可以使用以下命令:
#echo cfq > /sys/block/hda/queue/scheduler
解释: 选择cfq 调度器 -->为hda设备,当然这个一定需要root权限


3、优化I/O性能

优化I/O 性能:
1、 选择合适的调度器
2 、在应用程序的写法中,尽量自己合并写和读操作
3 、减少内存的拷贝 减少,memset memcpy操作
4 、网络流的队列尽量减少,甚至可以去除
5 、尽量理解操作系统,理解机制,周密思考
6、研究合适的I/O 选择,合并线程,合并交互
7、磁盘的I/O是最慢的,一定是先决绝瓶颈问题

linux 高级文件IO相关推荐

  1. Linux什么是文件IO,linux中文件IO

    一. linux常用文件IO接口 1.1. 文件描述符 1.1.1. 文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指 ...

  2. Linux学习之嵌入式Linux编程文件IO(C语言版)

    Linux学习之嵌入式Linux编程文件IO(C语言版) 一.文件IO常用函数 1.open 2.write 3.read 示例代码: #include <sys/types.h> #in ...

  3. linux的文件io操作(转)

    linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作 ...

  4. Linux高级篇——IO系统编程

    1.文件IO 2.标准IO 3.动静态库的制作 4.目录IO 1.文件IO 文件IO简介 涉及哪些接口? Input ,Output 是从用户空间角度考虑的输入与输出: 从内核读取数据或从文件中读取数 ...

  5. 【linux】文件IO

    标准IO和文件IO的区别: 区别1:是否有缓冲机制.标准IO有缓冲(全缓冲.行缓冲.不缓冲),文件IO无缓冲. 区别2:函数的来源不同.标准IO来自于标准C库,文件IO来自于linux内核,系统调用. ...

  6. 11. Linux高级文件系统管理(1)

    目录 11.1 磁盘配额是什么 磁盘配额中的常见概念 11.2 磁盘配额启动前的准备工作 11.3 Linux扫描文件系统并建立磁盘配额记录文件(quotacheck命令) 11.4 Linux开启磁 ...

  7. linux的文件 IO

    文件 io 和标准 io 区别: 1.缓冲区不同:标准 IO 有缓冲,文件 IO 无缓冲: 2.操作对象不同:       标准 IO 操作流 FILE *fp stdin stdout stderr ...

  8. linux高级文件系统管理——RAID

    作为大型企业,很多时候数据量相当庞大,由此以来对磁盘空间的要求比较高,更重要是的对数据的完整性的追求.所以单独的磁盘不仅空间使用满足不了,数据的完整性更是无从谈起,所以也就出现了专业的数据存储技术,而 ...

  9. 【Linux】文件IO --- sync、fsync、fdatesync

    在使用write函数向文件中写入数据的时候,并不是在调用了函数以后就直接把数据写入磁盘:操作系统在内核中设置了一块专门的缓冲区,数据会先被写入到内核的缓冲区中,等到缓冲区满了或者系统需要重新利用缓冲区 ...

最新文章

  1. 2022-2028年中国废旧塑料回收产业研究及前瞻分析报告
  2. iOS多线程之7.NSOperation的初识
  3. Spring-属性文件自身的引用03
  4. Python编程语言学习:python中与数字相关的函数(取整等)、案例应用之详细攻略
  5. LUA表与函数的深入理解
  6. 深入react技术栈(12):组件内通信
  7. iOS开发之oc(二十)--Foundation(5)NSDictionary
  8. pwd 打印当前所在目录
  9. Unity Excel转json且自动生成C#脚本
  10. android 2d 漫画界面,开源漫画项目,部分界面仿有妖气
  11. 海贝思蓝牙接收器Linux,Hagibis海备思 蓝牙音频接收 耳机怎么样,评测
  12. Ingenuous Cubrency UVA - 11137 立方数之和 递推
  13. bresenham算法画圆c语言,bresenham画圆算法
  14. 乘云远航|共赢新征程,打造数字化供应链竞争力!
  15. 用PowerPoint巧做特效字幕(转)
  16. DX7游戏引擎(梦想之翼) for VB6
  17. 递归实现二叉树的前序遍历
  18. java毕业设计 springboo疫情温度打卡健康评测系统 (3)系统后台管理功能
  19. 大班科学计算机的发明应用教案,大班科学:四大发明
  20. 虚拟机vn登陆服务器系统,虚拟机搭建windows服务器

热门文章

  1. 机器学习工程师岗位面试经历之游戏行业
  2. [linux 命令笔记] kill
  3. about Microsoft Office SharePoint Portal Server 2003
  4. pythonbool类型数组生成_对numpy中布尔型数组的处理方法详解
  5. 你能抱我一下,好吗?
  6. 商汤科技大涨逾15% 市值突破2000亿港元
  7. 小米四曲面瀑布屏概念手机亮相:按键、开孔、边框全部消失
  8. SK海力士推出首款DDR5 DRAM 适用于大数据、人工智能等领域
  9. 五一假期期间 全国快递包裹揽投量同比增长约四成
  10. “携号转网”正式试运行,这两个原因或致无法转网