哈工大-操作系统L28

生磁盘的使用

一.磁盘的I/O过程

读一个字节:移动到指定的磁道上,开始旋转,转到相应的扇区之后再转换磁生电磁信号转换成电电信号读回去,读到内存缓冲区中

写(修改)一个字节:将内存缓冲区的一个字节修改(或写),移动磁头,然后到扇区里面将电信号变成磁信号,写道扇区里面

二. 使用磁盘

port=HD_DATA,将你要写的放在端口上

必须拼成相应的结果所以需要左右右移之类的

1.第一层抽象

用户根据盘块号读取磁盘,是从一维地址到三维地址的一个过程,访问盘块通常是连续的,在一段时间内访问连续的盘块号应该快一些,寻道磁臂从起点出发移动到相应的柱面上,直线移动是机械运动比较慢,旋转运动也是机械运动但要更快一些,节省时间相邻的盘块号尽力放在一个磁道上

传输时间很快可以忽略不记,无论读取多少都时间是10ms,所以每次读写的大小增大读写速度上升且明显,但是读写单位大了空间浪费就多了,一个单位是一个整体自己没有用完也不能分配给别人

这是空间和时间的折中,现在空间越做越大可以用空间换一些时间,操作系统用你的磁盘空间故意把读写的单位变大

用户处理的不再是扇区而是盘块,一个盘块可以是几个连续的扇区磁盘空间浪费了但读写速度快了

上层程序发出一个盘块号操作系统解释这个磁盘号是由多少个连续扇区组成的,得到这个连续扇区根据公式就可以算出CHS以及几个扇区,然后通过out发给磁盘控制器,应用程序就可以根据盘块号访问磁盘了,隐藏的很多细节

req->sector=bh->b_blocknr<<1获得磁盘号

do_hd_request算出CHS,req->sector的sector和CURRENT->sector的sector是一个

nsect每个盘块是多少个扇区

用hd_out指令输出

Linux0.11是一个盘块两个扇区

2. 第二层抽象

多个进程需要一个队列,磁盘中断的时候由磁盘驱动取出block,再换算成CHS,再直接使用磁盘的out,这样就需要调度,让寻道时间越短越好

三. 磁盘调度算法

1.FCFS先进先出

这个算法最直观也最简单但是磁盘会长途奔袭磁头移动磁道太多

2.SSTF短寻道优先

磁盘请求不断,磁盘访问通常在中间,中间柱面访问的多两边少,总是会在中间晃荡,尤其读写频繁的程序,离当前局部较远的磁头无法划到造成饥饿

3.SCAN电梯算法(扫描算法)

还是中间的访问的多

既公平磁头移动又比较小

四.多进程共同使用磁盘

req->sector=bh->b_blocknr<<1盘块号翻译成扇区

add_request(major+blk_dev,req)放到请求队列中

因为这个队列是多个经常共享所以放入之前需要用cli() sti()临界区保护起来

放入条件形成一个电梯队列

for(;temp->next;tmp=temp->next)从前往后扫描

s1<s2=c1<c2(c1,c2是柱面号),根据柱面号排序

停止条件:满足1和3或者满足2和3

temp<req<temp->next将req插入到中间

req<temp->next<temp将req插到这一段的头部

如图下

make req选择哪个内存缓冲,请求内存申请和内存管理的代码,得到这个缓冲区用电梯算法,将他放入到请求队列中,放入之后磁盘就可以睡眠了sleep_on,进程这个执行序列就结束了,接下来就是中断这个执行序列了,磁盘中断,就会处理这个请求,磁盘驱动就是do_hd_request,处理完之后又进行处理end_request结束这个请求唤醒发出这个请求,发出这个请求进程就会发现在内存缓冲区中,以及有要读写的内容了,进程就可以继续执行了

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值