一,磁盘结构
磁盘格式化:
低级格式化:基础装修,划分扇区,写入控制信息
高级格式化:装入操作系统对应的文件系统
二,磁盘性能
三,磁盘调度
任何一个程序需要从磁盘进行io操作时,都要进行一次系统调用,这个调用请求需要包含一下信息:
1.是输出操作还是输入操作
2.磁盘传输的地址(柱面,磁头,扇区)
3.对应的内存地址
4.要传输的扇区数量(传输以扇区为单位)
对于并发系统的进程,在同一时刻会发生大量的磁盘调度请求,操作系统是管理者,但是磁盘只能一个一个的处理,所以操作系统会安排一个队列来进行等待,一个请求完成后,操作系统安排下一个请求
饥饿扫描,循环扫描,look扫描(循环扫描改进版,类似电梯的算法)
CFCS:先来先服务,最简单
SSTF:最常用了,但是会出现饥饿现象,也就是磁臂粘连,
SCAN or C-SCAN:适用于负载比较大的系统,比如安装了数据库的,或者是kafka之类的
查看LInux的磁盘扫描算法:
noop表示当前正在使用的,一共支持三种,后面是将算法修改位cfq
三种i调度算法的差别:
noop:先来先服务算法,非常适合SSD(没有磁道)
deadline:会构建两个队列,一个放读的请求,一个放写的请求,每个IO请求都有一个时间戳,来表示过期时间,如果过期时间到了,将会推送到最高优先级来处理。读和写的请求的优先级不一样,所以需要两个队列。
--适合大量读操作的系统
cfq:完全公平的队列方法。为每个进程创建一个IO队列,cfq的目标是对每个进程提供一个公平的IO优先级。为每个进程创建一个时间片,在时间片里面进行请求,循环进行,跟CPU的时间片循环差不多,但这个算法很复杂,对于每一个进程队列中的请求进行了排序,达到优化目的,所有的请求的IO队列都是公平的,
--适合多应用的系统
经过测试 noop和deadline的效率是差不多的 cfq 虽然最复杂,但是效率不如noop和deadline
总结: