操作系统——文件系统(3)生磁盘的使用

第二层抽象:多个进程产生的磁盘队列请求

    现在我们可以处理一个磁盘块的读写请求了,但在实际的操作系统中,总是有很多个进程,每个进程有它的磁盘块读写请求。因此我们需要一个队列来处理这些请求,这就是第二层抽象。
    建立第二层抽象之后,每个进程在提出磁盘块读写请求前,需要将盘块号等相关信息填写到一个磁盘请求数据结构中,把它放到请求队列中,后面就由操作系统来执行。
    经过这层抽象后,操作系统要处理磁盘读写完成以下工工作:
(1)取出一个磁盘请求;
(2)取出请求中的盘块号;
(3)根据盘块号计算得出C、H、S;
(4)操作系统将这些信息通过out指令给到磁盘控制器。

    其中(2)~(4)我们在上一篇文章中已经论述过,而第二层抽象的核心就是(1),即磁盘调度算法
    在磁盘读写过程中,寻道时间往往是最耗费时间的,也就是说柱面号是我们在调度时最需要考虑的。现在假设一个磁盘请求队列是98,183,37,122,14,124,65,67,而此时磁头的位置在53(这些数字都是柱面号)。
    首先来看先来先服务(FCFS)算法
在这里插入图片描述
    由上图可以发现,按照FCFS算法,磁臂按照请求队列中的顺序依次移动,磁臂在不断地长途奔袭,一共移动了640个柱面,这显然不是我们想要的。
    假如从磁头目前所在的位置开始,每次选择距离磁头最近的柱面进行请求处理,效率应当会有所提升,这就是最短寻道时间优先(shortest seek time first,SSTF)
在这里插入图片描述
    由上图发现,磁臂的总移动距离为236。虽然SSTF的效率有了提高,但其也有缺点,比如在刚开始时磁头向右去处理65、67是不合理的,因为在处理完左边的柱面后,一定会向右去处理122、124、183等柱面,一定会经过65和67。SSTF是一个贪心算法,只顾及眼前的利益而没有考虑更后面的请求。
    而磁盘调度扫描算法(SCAN)即是首先向一个方向进行扫描,处理所有的请求,直到这个方向不再有请求时,再开始向另一个方向扫描,处理经过的所有请求。
在这里插入图片描述
    SCAN算法下磁臂的移动距离是208,比SSTF更少。但它也有个缺点,处于中间位置的柱面还是比在两边的柱面能更快地被扫描到。因此又引出了循环扫描算法(CSCAN)。即先向一个方向扫描,当该方向所有请求都被处理后再直接转到另一方向柱面号最大的请求位置,反方向扫描。因为类似于电梯的工作原理,又称电梯算法。
在这里插入图片描述
    现在可以完成多进程对磁盘的访问了:
(1)进程提出磁盘读写请求,新建一个磁盘请求数据结构req,可以用make_request产生req,并在其中填写盘块号等信息。
(2)将req加入到操作系统的磁盘请求电梯队列中,并进行临界区保护;
(3)上一个磁盘请求处理完成后发出中断,从电梯队列中取出一个磁盘请求就行处理;
(4)取出请求数据结构中的盘块号,算出扇区号、CHS等信息。

//磁盘请求队列处理代码(队列插入)
static void make_request()
{
	req->sector = bh->b_blocknr<<1;
	add_request(major + blk_dev, req);
}
static void add_request(struct blk_dev_struct *dev, struct request *req)
//在电梯队列中插入磁盘请求req,插入后仍保持电梯形状
{
	struct request *tmp = dev->current_request;
	req->next = NULL;
	cli();//关中断(进入临界区)
	for(; tmp->next; tmp = tmp->next)
	if(IN_ORDER(tmp, req) || !IN_ORDER(tmp, tmp->next)) &&IN_ORDER(req, tmp->next)) break;
	//用来寻找req在电梯队列中的位置
	req->next = tmp->next;
	tmp->next = req;
	sli();//开中断(离开临界区)
}
#define IN_ORDER(s1, s2)((s1)->sector < (s2)->sector)

    在磁盘控制器处理好一个磁盘请求后,会产生磁盘中断。中断处理函数如下:

//磁盘中断处理代码
static void read(write) _intr(void)
{
	end_request(1);
	do_hd_request();
}
do_hd_request()
{
	扇区号 = CURRENT->sector;
	计算出C、H、S;
	hd_out(C,H,S......);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值