Linux IO调度
来源:互联网 发布:linux 没有service 编辑:程序博客网 时间:2024/06/03 21:57
前言
在计算机系统中IO请求分为两种,一种是读请求,一种是写请求,这两种请求对时间的敏感度有很大的差异。进程会因读请求儿进入休眠状态,如果是和用户交互的应用,休眠时间过长会引起明显的卡顿,用户体验便会下降;写请求则不同,它可被系统暂存在IO缓冲区中,等空闲时在将数据写入指定的IO中。
IO调度方式都需要完成请求合并工作,请求的排序工作会因IO器件的不同而有所不同。具体的IO调度方式有以下几种:
linus电梯IO调度方法
这个名字很熟悉,就不多说了。很直观的可以想象IO请求的过程很像乘坐电梯,所以最初Linux系统就使用的是此调度方法。
在此方法中系统只有一个队列用于存放IO请求,当一个新的IO请求准备加入时,会遍历整个队列,查找是否可能合并的请求。如果找到了可以合并的请求,就进行两个请求的合并,这样就可以将两个IO请求变成一个,缩短IO设备的寻址时间;如果没有找到可以合并的IO请求,那么就将此IO请求放在队列的尾部。IO请求插入完成后,会对队列中的请求按照扇区的方向进行排序。
这种调度方法的缺点是没有很好的解决请求的饥饿问题。在极端情况下,有些请求将得到不到执行。另外队列中没有区分读写请求,这样也会加剧读请求延时对系统的影响。
最终期限IO调度方法(deadline)
此调度方法的出现是为了解决电梯调度方法的饥饿问题。在最终期限IO调度方法中,每个请求都有一个超时时间,读请求默认为500ms,写请求默认为5s。方法中需要维护三个队列,分别是排序队列、写请求队列和读请求队列。排序队列同电梯调度方法中的队列操作方法类似,读写请求队列是FIFO队列。如果这两个队列中有超时的请求,那会马上得到执行,如果没有则从排序队列中取出一个执行,此请求会从两个队列中删除。
这种方法比较好的防止请求饥饿的发生,但不能严格保证请求的相应时间。
预测IO调度方法(as)
因为在很多的应用场景中,代码经常会发送一个读IO请求,在获取结果后再发出IO请求,这两个请求的存放地址会很接近,如果按照先前的两种方法,在这种情况下新的IO请求不会得到及时的执行。预测IO调度方法很好的解决了这个问题。
预测IO调度方法以最终期限IO调度方法为基础,只是在处理完一个请求后并不急于处理下一个请求,而是等待一定的时间(默认为6ms,此值可配置),在此等待时间内可能会有新的无需长时间寻址的IO请求,如果有,在等待完毕后便立即执行。
这样预测IO调度方法的吞吐量就会比最终期限IO调度方法略胜一筹,当然请求执行完后的等待也消耗了一定的时间。
完全公正IO调度方法(CFG)
完全公正IO调度方法是根据操作IO的进行格式来确定队列的格式,每个队列都会进行合并和排序工作,然后方法会让队列轮转起来,比如每个队列执行4个请求后换下一个队列执行,这样就确保每个进程都可以接收到公平的磁盘带宽。
空操作IO调度方法(noop)
这种调度方法是为哪些没有寻道负担的块设备准备的,如闪存卡、SSD等。空操作IO调度方法只完成合并请求的工作,不对队列进行扇区排序。请求的执行会遵循FIFO的模式。
- linux io调度
- Linux IO调度
- linux IO调度器
- linux io调度补充
- linux IO调度算法
- linux IO调度算法
- linux IO调度算法
- Linux IO调度器
- Linux的IO调度
- linux IO调度器
- Linux的IO调度
- Linux IO调度算法
- Linux调度IO模型
- Linux IO调度
- Linux deadline io 调度算法
- linux的IO调度算法
- Linux的IO调度算法
- 修改Linux IO调度器
- OrmLite框架 ——OrmLite 入门(android数据库操作框架)
- 每天一个 Linux 命令(29): chgrp命令
- Windows10 多个软件未响应(暴风影音,QQ,优酷,Edge等)
- HDU2730_Painter_贪心
- 深入javascript原型
- Linux IO调度
- 跨域访问-预请求及跨域常见问题
- http range
- poj 3087 shuffle's up bfs
- 1分钟实现“延迟消息”功能(58沈剑)
- Maven-关于在环境变量中配置两个maven的问题
- 单例模式汇总
- <a>超文本标签
- Vim高级用户3大技巧