操作系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
一、实验目的
1、处理机调度:在多道程序或多任务系统中,系统中同时处于就绪状态有
若干,也就是说能运行的进程数远远大于处理机个数。为了使系统中的
各进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占用
处理机。
2、银行家算法:模拟进程的资源分配算法,了解死锁的产生和避免。
3、页面替换:在分页虚拟存储系统中,当硬件发出缺页中断后转操作系统
处理缺页中断。如果主存中已无空闲块,采用合适算法进行缺页处理。
4、移臂调度:在启动之前按驱动调度策略对访问的请求优化其排序十分必
要。就应该考虑使移动臂的移动时间最短的调度策略。
将上述算法放在一个程序中进行调度,就是本次课程设计的主要内容。二、实验要求
书写实验报告,应该包括以下几项内容:
1、实验题目
2、程序中使用的数据结构及主要符号说明。
3、程序流程图和带有注释的源程序。
4、执行程序名,并打印程序运行时的初值和运行结果,其中包括:
I、各程序进程块的初始状态。
II、选中运行进程的名字、运行后各进程控制块状态以及每次调度时,就绪队列的进程排列顺序。
5、通过实验后的收获和体会及对实验的改进意见和见解。
三、实验内容
该程序中包括了处理机调度、页面置换算法、移臂调度算法;这三种算法中各包含了三种调度方式。最后还有银行家算法。
四、实验结果展示
1、初始界面如下
2、处理机调度过程
3、页面替换调度的界面
4、银行家算法界面
5、移臂调度界面
五、实验收获与体会
本次课程设计将平时做的实验综合在一起,通过界面的控制来调度不同的算法,实现不同的目的。当初单个实验执行没有错误,放在一起就出现了很多问题,比如重定义问题,整个实验中也只能出现一个main( )函数。
通过本次课程设计,收获颇多,当调出没错误时,一种前所未有的成就感油
然而生,同时也对各种算法有了更深层次的认识。
附录:
源程序:#include
#include
using namespace std;
struct PCB1
{char name[20]; //进程名
int arrivetime; //进程到达时间
int runtime; //估计运行时间
int grade; //进程的优先级(优先数越低,优先级越高)
PCB1 *next; //链表指针
};
class processes
{ PCB1 *head;//指向初始化的进程队列
PCB1 *run;//指向就绪进程队列,队首为正在运行的进程
PCB1 *run_tail;//指向就绪队列队尾
int num;//记录进程个数
int current;//记录系统当前时间的变量
public:
processes(int n);//构造函数
processes::~processes();//析构函数
void Set_Run();//run为空时初始化或构造run链表
void Move1();//run队列队首结点移至队尾
void Move2();//head队首元素移至run队首
void Move3();//进程运行后优先级改变且未运行完成有序插入就绪队列PCB1* Sort_Insert_arrivetime(PCB1 *head,PCB1 *n);//按到达时间排序
void inputprocess(int l);//建立进程的函数
void Delete_processes();//构造已完成的进程队列
void runprocess_FCFS();//先来先服务算法
void runprocess_RR();//时间片轮算法
void runprocess_Grade();//按优先级调度
};
processes::processes(int n)//构造函数
{ num=n;current=0;
run=head=NULL;
}
processes::~processes()//析构函数
{ delete head,run,run_tail;
}
void processes::Set_Run()
{ run=head;
run_tail=head;
head=head->next;
run->next=NULL;
}
void processes::Move1()
{ PCB1 *just_run=run;
run=run->next;
run_tail->next=just_run;
just_run->next=NULL;
run_tail=just_run;
}
void processes::Move2()
{ PCB1 *t=head;
head=head->next;
t->next=run;
run=t;
}
void processes::Move3()
{ PCB1 *just_run=run;
run=run->next;
PCB1 *r=run,*q=run->next;
while(q&&just_run->grade>=q->grade) r=q,q=q->next;
r->next=just_run;just_run->next=q;
if(!q) run_tail=just_run;
}
PCB1* processes::Sort_Insert_arrivetime(PCB1 *head,PCB1 *n)//按到达时间排序
{ PCB1 *p1,*p2;
if(head==NULL)
{head=n;n->next=NULL;