操作系统磁盘调度实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告

课程名称操作系统实验名称磁盘调度成绩

学生姓名作业君专业软件工程班级、学号

同组者姓名实验日期2020

一、实验目的

磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验来理解和掌握磁盘调度的职能。

二、实验内容与要求

实验内容:

分别模拟如下磁盘调度算法,对磁盘进行移臂操作:

●先来先服务算法

●最短寻道优先算法

实验要求:

1、假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。

2、磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有

进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。

当有多个进程提出输入输出请求而处于等待状态时,可用磁盘调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进程。

3、由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它

进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。

4、为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,参考程序

流程图。

5、“接受请求”进程建立一张“进程请求I/O”表,指出等待访问磁盘的进程要求访问的磁

道,表的格式如下:

6、磁盘调度的功能是查“请求I/O”表,当有等待访问的进程时,按磁盘调度算法从中选

择一个等待访问的进程,按其指定的要求访问磁道。流程图中的“初始化”工作包括:初始化“请求I/O”表,设置当前移臂方向;当前磁道号。并且假设程序运行前“请求I/O”

表中已有若干进程(4~8个)申请访问相应磁道。

三、算法描述(含数据结构定义)或流程图

四、实验过程

#include

using namespace std;

#include

#include

typedef struct node

{

int data;

struct node *next;

}Node;

int main()

{

void fcfs(Node *,int,int);//声明先来先服务函数FCFS

void sstf(Node *,int,int);//声明最短寻道时间优先函数SSTF

void print(Node *); //输出链表函数

Node *head,*p,*q; //建立一个链表

int it,c=0,f,s; //c为链表长度,f是开始的磁道号,s是选择哪个算法

head=(Node *)malloc(sizeof(Node));

head->next=NULL;

q=head;

cout<<" /**************磁盘调度算法***************/"<

cout<

cout<<"新建一个单链表,以0作为结束标志:";

cin>>it;

while(it!=0)

{

p=(Node *)malloc(sizeof(Node));

p->next=NULL;

p->data=it;

q->next=p;

q=p;

cin>>it;

c++;

}

cout<<"从几号磁道开始:";

cin>>f; //f为磁道号

print(head);

cout<<"链表长度为:"<

cout<<"1、先来先服务算法FCFS"<

cout<<"2、最短寻道时间优先算法SSTF"<

cout<<"3、电梯调度算法(扫描算法SCAN)"<

cout<<"0、退出"<

cout<<"请选择:";

cin>>s;

while(s!=0)

{

switch(s)

{

case 1:cout<<"你选择了:先来先服务算法FCFS"<

fcfs( head,c,f);

break;

case 2:cout<<"你选择了:最短寻道时间优先算法SSTF"<

sstf( head,c,f);

break;

}

cout<<"退出请选0,继续请选1,2:";

cin>>s;

}

}

/***********************************************************/

void fcfs(Node *head,int c,int f)//先来先服务算法

{

void print(Node *);

Node *l;//*m,*n;

float num=0; //num为平均寻道长度

l=head->next;

for(int i=0;i

{

num+=abs(l->data-f);

f=l->data;

l=l->next;

}

num=num/c;

cout<<"先来先服务的寻道顺序是:"<

print(head);

cout<<"平均寻道长度:"<

}

/*****************************************************************/ void sstf(Node *head,int c,int f)//最短寻道时间优先算法

{

void print(Node *);

Node *p,*q,*r,*s,*l,*m;

l=(Node *)malloc(sizeof(Node));

l->next=NULL;

m=l;

q=head;

p=head->next;

s=head;

r=head->next;

float num=0;

for(int i=0;i

{

int min=abs(f-r->data);

for(int j=0;j

{

p=p->next;

q=q->next;

if(abs(f-p->data))

{

min=abs(f-p->data);

r=p;

s=q;

}

}

num+=abs(f-r->data);

f=r->data;

s->next=r->next;

r->next=NULL;

相关文档
最新文档