操作系统实验报告(clock算法)

时间:2019-05-14 05:49:39下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《操作系统实验报告(clock算法)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《操作系统实验报告(clock算法)》。

第一篇:操作系统实验报告(clock算法)

实验四 页面置换算法

一、实验目的

本实验主要对操作系统中请求分页式内存管理及其应用的一些关键算法进行模拟。学生通过设计与实现Clock算法,能够加强对相应理论的理解,并对了解操作系统内部的基本处理原理与过程也有很多益处。

二、实验要求

基本要求:描述Clock算法的基本原理、必要的数据结构、算法执行流程图、编码实现。

1)初始化:输入作业可占用的总页框数,初始化置空。

2)输入请求序列:输入一个作业页号访问请求序列,依次占用相应页框,直至全部占用; 3)Clock算法:当页框全部占用后,对于后续新的页号访问请求,执行Clock算法,淘汰1个页面后装入新的页号。

4)显示当前分配淘汰序列:显示淘汰的页号序列。

描述Clock算法的基本原理、必要的数据结构、算法执行流程图、编码实现。

三、实验内容

1)基本原理

时钟页面置换算法是把所有的页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面,如图所示。

当发生缺页中断时,算法首先检查表针指向的页面,如果它的R位是0就淘汰该页面,并把新的页面插入这个位置,然后把表针前移一个位置;如果R位是1就清除R位并把表针前移一个位置,重复这个过程直到找到了一个R位为0的页面为止。2)算法流程设计

主函数流程: STEP1:输入分配的页框数,页面访问次数和要访问的页面号序列 STEP2:内存页面初始化。内存中页面的数据结构为单循环链表,含有页号值yehao和访问位值a。开始时页号均为-1,访问位为0.STEP3:测试数据。具体算法是依要访问的页面号,调用find()函数查找是否已经存在于内存中。若存在,则修改其访问位为1.若不存在,触发缺页中断,调用tihuan()函数。最后,打印当前内存状态。如此循环直至测试串都访问完毕。3)主要函数实现

a)Makenode(double)函数:用于初始化一个节点。

b)Find(double)函数:依据输入的页号,查询内存中是否已存在此页面。若存在返回值1,不存在返回值0.c)Tihuan(double)函数:在发生缺页中断时,时钟指针查找访问位为0的页面进行替换,指针扫过的页面访问位置0,新加入的页面访问位置1。替换后指针下移。

d)Print_state()函数:打印当前内存中存在的页面的状态以及当前时钟指针所指向的页面位置。

4)测试数据

输入:

输入分配的页框数 3 输入页面访问次数 15 输入要访问的页面号序列 3 4 2 6 4 3 7 4 3 6 3 4 8 4 6 输出(仅最后一项):

5)结果分析

以下是clock算法对应输入页面号序列3 4 2 6 4 3 7 4 3 6 3 4 8 4 6的分析表

四、实验总结

1.加深对clock算法的理解。通过与其他算法的比较,我也了解了他们的异同之处。Clock算法其实是一种改进的第二次机会算法,它通过设置访问位,找到最早最不常访问的页面,即标号为0的页面。之所以叫clock算法,依我理解是将内存中的排列顺序附上时间的概念,clock指针扫过的页面要将他们1置0就是基于这个思想,因为他们都是没被访问的,且在时钟上的排列按照访问时间顺序。这样就保证了每次替换的都是最早进来的且不最常访问的页面。

2.在时钟内存结构的代码实现上,我使用了自建的单循环链表,对其进行顺序地遍历即可实现时钟指针的移动。另外通过全局变量node *r(时钟)node *start(开始页面项)node *r_prev(时钟指针的前驱)的设置,方便了有关算法的实现。

3.此算法较为简单,还有一种改进版的clock算法,增加了一个修改位,表示页框是否被修改过。这样的设计更加符合现在操作系统的调度原则。

参考文献

[1](美)Stanley B.Lippman 等 著 李师贤 等 译.C++ Primer中文版(第4版).人民邮电出版社, 2006-03-01 [2] 蒋爱军,李师贤,梅晓勇 著.C++ Primer习题解答(第4版).人民邮电出版社, 2007-02-01 [3] 塔嫩鲍姆(Tanenbaum.A.S),陈向群,马洪兵 著.现代操作系统(原书第3版).机械工业出版社, 2009-07-01 [4] 张尧学,史美林,张高.计算机操作系统教程.清华大学出版社, 2006-10-01 [5] 王晓东 著.数据结构(STL框架).清华大学出版社, 2009-09-01

第二篇:操作系统银行家算法实验报告

实验四

死锁

一、实验目的

当系统的总资源数m小于或等于所有进程对对资源的最大需求时,就可能产生 死锁。死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁的一个著名算法,该算法是在能确保系统处于安全状态时才把资源分配给申请者。通过本实验使学生能进一步理解死锁的概念,并能选择一个算法来避免死锁。

二、实验题目

系统中有m个同类资源被n个进程共享,每个进程对资源的最大需求数分别为S1, S2,…,Sn,且 Max(Si)<=m,(i=1,2,…n)。进程可以动态地申请资源和释放资源。编写一个程序,现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当的信息。

三、数据结构

主要数据结构:

Struct aa { void Print();//用于打印输出表格的函数 void Input();//用于输入的函数

void tryfenpei(int i);//试分配函数 void refenpei(int i);//恢复数据函数 void checksafe(int s);//安全检测函数 };

四、银行家算法的流程图 开始初始化资源类数c=3,进程数t=5初始化Available[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c]输入进程数iInt f=0f

五、源代码

#include #include “stdio.h” const unsigned short c = 3;//资源类数 const unsigned short t = 5;//进程数

void Print();//用于打印输出表格的函数 void Input();//用于输入的函数

void tryfenpei(int i);//试分配函数 void refenpei(int i);//恢复数据函数 void checksafe(int s);//安全检测函数

//定义初始化数组 int Available[c], Max[t][c], Allocation[t][c], Need[t][c], Request[c];

int in;//用户选择的进程号

int main(int argc, char *argv[]){ int i;char ch='Y';cout<<“初始化数据如下:”<>in){ if(in<0||in>4){ cout<<“不存在该进程,请重新输入”<>Request[i]){ if(Request[i]<0)cout<<“错误!输入的数字无效.”<Need[in][i])cout<<“错误!超出进程需求量”<Available[i])cout<<“错误!系统还没有足够的可用资源量满足进程需要”<

cout<<“试分配完成!”<

cout<<“需要继续实验吗?(y-继续 n终止)”;} else if(ch=='N'||ch=='n'){ cout<<“感谢您的使用,祝您愉快!”<>ch);return 0;}

void Print(){ int i,j;cout<<“ 进程个数 : ”<0){ cout<<“ |”;} cout<

void Input(){ for(int j=0;j>Available[j]){ if(Available[j]<0)cout<<“输入数字无效,请重新输入”<

{ for(int m=0;m>Max[l][m]){ if(Max[l][m]<0)cout<<“输入数字无效,请重新输入”<>Allocation[l][m])if(Allocation[l][m]<0)cout<<“输入数字无效,请重新输入”<

void tryfenpei(int i){ for(int f=0;f

//安全检测函数

void checksafe(int s){ int Work, flag, temp[t], i,j,l=0,k=0;bool Finish[t];for(i=0;i

} if(l==5)//一共有三类资源A B C,一条进程下面的安全性检测只检测了A类。如果A类通过了,那么还要判断B类,C类。否则不用 { for(i=0;i

} i=s;//s传递进来赋给i,s是用户输入的进程号(有主函数里的in传递进来)while(i

if(Finish[i]==false&&Need[i][j]<=Work){ Work=Work+Allocation[i][j];Finish[i]=true;temp[k]=i;//cout<<“temp=”<”;cout<

六、执行结果:

七、实验总结

通过本次实验了解到用银行家算法来预防死锁是可靠的,但也是非常保守的,因为它限制了进程对资源的存取,从而降低了进程的并发运行程度。死锁检测并不限制进程对资源的申请,只要有,就分配,但这也可能造成死锁。但由于死锁并不是经常发生的,故大大提高了系统运行的效率。

总之,通过本实验,使我进一步加深理解和掌握银行家算法。

第三篇:东南大学操作系统实验报告--银行家算法

操作系统实验三:银行家算法的实现

一、基本信息:

a)实验题目:银行家算法的实现 b)完成人姓名:韩璐璐 c)学号:71114115 d)报告日期:2016.5.27

二、实验目的

通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用Windows API进行共享数据互斥访问和多线程编程的方法。

三、实验内容

1.在Windows操作系统上,利用Win32 API编写多线程应用程序实现银行家算法。

2.创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。3.通过Win32 API提供的信号量机制,实现共享数据的并发访问。

四、程序运行时的初值和运行结果(系统截图)

五、源程序并附上注释 #include #include #include #include using namespace std;int r[3] = { 3, 3, 2 };//系统拥有的资源 int r0 = 0, r1 = 0, r2 = 0;//记录申请资源 class pcb { public: int id;bool state;int max[3];int alc[3];int need[3];

pcb(){ } void init(){

state = false;

cout << “请输入进程的id,各个资源总需求量和已占用资源” << endl;

cin >> id;

cout << “a,b,c三种资源的最大使用量” << endl;

cin >> max[0] >> max[1] >> max[2];

cout << “a,b,c三种资源的已占有量” << endl;

cin >> alc[0] >> alc[1] >> alc[2];} int rd(int n){

return rand()%(n + 1);

} int request(){

// Sleep(1000);

r0 = rd(max[0]alc[1]);

r2 = rd(max[2]alc[0]))&& r1 ==(max[1]alc[2]))

{

r[0] = r[0] + alc[0];

r[1] = r[1] + alc[1];

r[2] = r[2] + alc[2];

return 1;

}

return 2;

} };bool safe(vector

temp, int i){ int u = r[0]r1, l = r[2]1;j++)

temp[j] = temp[j + 1];temp.pop_back();int size = temp.size();//记录下容器内还有多少个进程

// int range[size];//记录下队列

int x = 0;//计数器

while(!temp.empty()){

static int j = 0;

if((temp[j].max[0]temp[j].alc[1])<= k &&

(temp[j].max[2]1;e++)

temp[e] = temp[e + 1];

temp.pop_back();

if(j >= temp.size())

j = 0;

}

else

{

j++;

if(j >= temp.size())

j = 0;

}

x++;

if(x ==(size*size))

{

cout << “没有安全队列,以上情况不成立” << endl;

cout << endl;

return false;

}

} return true;} int main(){ srand(time(0));pcb p[4];vector

vp;for(int i = 0;i<4;i++){

p[i].init();

vp.push_back(p[i]);} int x = 0;//计算器

int c;cout << “请选择分配资源方法:1.银行家算法 2.随机算法” << endl;cin >> c;switch(c){ case 1:

while(!vp.empty())

{

int a;

static int i = 0;

if((a = vp[i].request())!= 0)

{

if(a == 1)

endl;

r[1] << “ c

{

cout << ”进程“ << vp[i].id << ”已经结束“ <<

for(int j = i;j

r[1] = r[1]r2;

cout << ”a资源还剩“ << r[0] << ” b资源还剩“ << r[1] << ” c资源还剩“ << r[2] << endl;

cout << endl;

}

i++;

if(i >= vp.size())

i = 0;

}

}

else

i++;

if(i >= vp.size())

i = 0;

x++;

if(x >= 200)

{

cout << ”初始化的表不安全“ << endl;

return 0;

}

}

cout << ”进程已经全部结束“ << endl;

break;case 2:

while(!vp.empty())

{

int a2;

static int i2 = 0;

if((a2 = vp[i2].request())!= 0)

{

if(a2 == 1)

{

cout << ”进程“ << vp[i2].id << ”已经结束“ << endl;

for(int j = i2;j

r[1] = r[1]r2;

cout << ”a资源还剩“ << r[0] << ” b资源还剩“ << r[1] << ” c资源还剩“ << r[2] << endl;

cout << endl;

i2++;

if(i2 >= vp.size())

i2 = 0;

}

}

else

i2++;

if(i2 >= vp.size())

i2 = 0;

x++;

if(x >= 200)

{

cout << ”产生死锁“ << endl;

return 0;

}

}

cout << ”进程已经全部结束“ << endl;

break;default:

cout << ”选择错误“ << endl;

break;

} system(”pause");return 1;}

要求:实验报告以电子版的形式通过Email提交给助教,做到内容翔实、图表清晰,层次分明,标题突出。

一班 助教老师:丁文江 Email:dingwj@seu.edu.cn 二班 助教老师:张润环 Email:seu-zrh@seu.edu.cn 两位助教老师工作地点:九龙湖校区计算机楼333房间

第四篇:操作系统进程调度算法模拟实验报告

进程调度算法模拟

专业:XXXXX 学号:XXXXX 姓名:XXX 实验日期:20XX年XX月XX日

一、实验目的

通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解。

二、实验要求

编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算法分别进行模拟调度。

三、实验方法内容

1.算法设计思路

将每个进程抽象成一个控制块PCB,PCB用一个结构体描述。

构建一个进程调度类。将进程调度的各种算法分装在一个类中。类中存在三个容器,一个保存正在或未进入就绪队列的进程,一个保存就绪的进程,另一个保存已完成的进程。还有一个PCB实例。主要保存正在运行的进程。类中其他方法都是围绕这三个容器可以这个运行中的PCB展开。

主要用到的技术是STL中的vector以维护和保存进程容器、就绪容器、完成容器。

当程序启动时,用户可以选择不同的调度算法。然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。判断进程容器中是否有新的进程可以加入就绪队列。2.算法流程图 主程序的框架:

开始void FCFS();//先来先服务void SJF();//最短进程优先调度void RR();//简单时间片轮转void PD();//最高优先数优先void PCBInput();//输入进程信息选择调度算法输入进程信息将输入容器中以满足进入条件的进程调入就绪队列void ProcessQueueProcess();//查看当前时间下,有无进程加入。若有则把该进程调入就绪队列按照选择的算法开始选择就绪队列的进程开始执行void ProcessSelect();//若当前就绪队列不为空则根据选择的调度算法开始调度,否则,系统时间加一个时间片.以等待新的进程到判断就绪容器和输入容器是否为空!processScheduler.m_WaitQueue.empty()||!processScheduler.m_ProcessQueue.empt()Y打印各进程信息进行统计计算周转时间等结束void PCBDisplay();//打印当前状况下。就绪队列、完成队列、运行中的进程信息void SchedulerStatistics();//调度统计,计算周转时间等进程调度过程:

开始为空判断就绪队列是否为空if(m_WaitQueue.empty())非空让系统等待一个时间片TimePast()根据设定的调度算法从就绪队列中调入一个进程并执行(此时进程从就绪队列中删除,赋值到表示运行中的成员变量中)void FCFS();//先来先服务void SJF();//最短进程优先调度void RR();//简单时间片轮转void PD();//最高优先数优先进程运行一个时间片N是否达到该进程停止运行的条件Y选入的进程状态是否为“完成”如进程已完成,或者分得的时间片个数已到ProcessRun()Yvector

m_WaitQueue;//进程就绪队列进程未完成,将进程优先数减一,并放回到就绪队列中设置进程完成时间,将该进程放入完成队列vector

m_FinishQueue;//完成队列结束

3.算法中用到的数据结构

struct fcfs{

//先来先服务算法从这里开始

char name[10];

float arrivetime;

float servicetime;

float starttime;

float finishtime;

float zztime;

float dqzztime;

};

//定义一个结构体,里面包含的有一个进程相关的信息

4.主要的常量变量

vector

m_ProcessQueue;//进程输入队列

vector

m_WaitQueue;//进程就绪队列 vector

m_FinishQueue;//完成队列 vector

::iterator m_iter;//迭代器 PCB m_runProcess;//运行中的进程

int m_ProcessCount;//进程数 float m_RunTime;//运行时间

int m_tagIsRun;//是否在运行标志。表示正在运行,表示没有 float m_TimeSlice;//时间片大小

int m_TimeSliceCount;//指时间片轮转中一次分到的时间片个数 char m_SchedulerAlgorithm;//调度算法

5.主要模块

void PCBInput();//输入进程信息

void PCBSort();//对进程控制块按照优先级排序(采用冒泡排序)void ProcessSelect();//若当前就绪队列不为空则根据选择的调度算法开始调度。否则,系统时间void PCBDisplay();//打印当前状况下。就绪队列、完成队列、运行中的进程信息

void ProcessRun();//进程运行一次。运行时间加个时间片。并判断进程是否达到完成条件。若是则void ProcessQueueProcess();//查看当前时间下,有无进程加入。若有则把该进程调入就绪队列 void ProcessDispatch();//进程分派,进程执行完成后决定进程该进入哪个队列(就绪、完成)void TimePast(){ m_RunTime +=m_TimeSlice;ProcessQueueProcess();}//当前系统时间加个时间void SchedulerStatistics();//调度统计,计算周转时间等 void FCFS();//先来先服务 void SJF();//最短进程优先调度 void RR();//简单时间片轮转 void PD();//最高优先数优先 加.以等待新的进程到来

ProcessStatus='f'.否则为'w';片,并检查是否有新的进程加入

四、实验代码

#include #include #include

using namespace std;

struct fcfs{

//先来先服务算法从这里开始

char name[10];

float arrivetime;

float servicetime;

float starttime;

float finishtime;

float zztime;

float dqzztime;

};

//定义一个结构体,里面包含的有一个进程相关的信息

fcfs a[100];

void input(fcfs *p,int N)

{

int i;

cout<

printf(“

请您输入进程的名字

到达时间

服务时间:(例如: a 0 100)nn”);

for(i=0;i<=N-1;i++)

{

printf(“

请您输入进程%d的信息:t”,i+1);

scanf(“ttt%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);

}

}

void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N)

{ int k;

printf(“nn调用先来先服务算法以后进程运行的顺序是: ”);

printf(“%s”,p[0].name);

for(k=1;k

{

printf(“-->%s”,p[k].name);

}

cout<

printf(“n

具体进程调度信息:n”);

printf(“t进程名

到达时间

服务时间

开始时间

结束时间

周转时间

带权周转时间n”);

for(k=0;k<=N-1;k++)

{

printf(“t%st%-.2ft %-.2ft

%-.2ft

%-.2ft %-.2ft %-.2fn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);

}

getchar();

//此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框剪

}

void sort(fcfs *p,int N)//排序

{

for(int i=0;i<=N-1;i++)

for(int j=0;j<=i;j++)

if(p[i].arrivetime

{

fcfs temp;

temp=p[i];

p[i]=p[j];

p[j]=temp;

}

}

void deal(fcfs *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N)

//运行阶段

{ int k;

for(k=0;k<=N-1;k++)

{

if(k==0)

{

p[k].starttime=p[k].arrivetime;

p[k].finishtime=p[k].arrivetime+p[k].servicetime;}

else

{

p[k].starttime=p[k-1].finishtime;

p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}

}

for(k=0;k<=N-1;k++)

{

p[k].zztime=p[k].finishtime-p[k].arrivetime;

p[k].dqzztime=p[k].zztime/p[k].servicetime;

}

}

void FCFS(fcfs *p,int N)

{

float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;

sort(p,N);

deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

getchar();

} //先来先服务算法到此结束 struct sjf{//最短进程优先调度算法从这里开始

char name[10];float arrivetime;//到达时间

float servicetime;//运行时间

float starttime;

//开始时间

float finishtime;

//完成时间

};sjf a1[100];

void input(sjf *p,int N1)//进程信息输入 {

int i;cout<

printf(“

请您输入进程的名字

到达时间

服务时间:(例如: a 0 100)n”);

for(i=0;i<=N1-1;i++){

printf(“

请您输入进程%d的信息:t”,i+1);

scanf(“ttt%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);} }

void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,int N1)//最终结果输出

{

int k;

printf(“nt调用最短进程优先调度算法以后进程的调度顺序为:”);

printf(“%s”,p[0].name);

for(k=1;k

{printf(“-->%s”,p[k].name);}

cout<

printf(“n给个进程具体调度信息如下:n”);

printf(“nt进程名t到达时间t运行时间t开始时间t完成时间n”);

for(k=0;k<=N1-1;k++)

{

printf(“ t%st %-.2ftt %-.2ftt %-.2ftt %-.2ftn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime);

}

getchar();

} void sort(sjf *p,int N1)//排序 {

for(int i=0;i<=N1-1;i++)

for(int j=0;j<=i;j++)

if(p[i].arrivetime

{

sjf temp;

temp=p[i];

p[i]=p[j];

p[j]=temp;

} } void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,int N1)//运行阶段

{ int k;

for(k=0;k<=N1-1;k++)

{

if(k==0)

{

p[k].starttime=p[k].arrivetime;

p[k].finishtime=p[k].arrivetime+float(p[k].servicetime)/60;}

else

{

p[k].starttime=p[k-1].finishtime;

p[k].finishtime=p[k-1].finishtime+float(p[k].servicetime)/60;}

}

}

void sjff(sjf *p,int N1){

float arrivetime=0,servicetime=0,starttime=0,finishtime=0;

sort(p,N1);

for(int m=0;m

{if(m==0)

p[m].finishtime=p[m].arrivetime+float(p[m].servicetime)/60;

else

p[m].finishtime=p[m-1].finishtime+float(p[m].servicetime)/60;

int i=0;

for(int n=m+1;n<=N1-1;n++)

{

if(p[n].arrivetime<=p[m].finishtime)

i++;

}

float min=p[m+1].servicetime;

int next=m+1;

for(int k=m+1;k

{

if(p[k+1].servicetime

{min=p[k+1].servicetime;

next=k+1;}

}

sjf temp;

temp=p[m+1];

p[m+1]=p[next];

p[next]=temp;

}

deal(p,arrivetime,servicetime,starttime,finishtime,N1);

Print(p,arrivetime,servicetime,starttime,finishtime,N1);

getchar();}//最短进程优先调度算法到这里结束

char menu()//用来输出相关信息的函数

{

char cse1;

while(1)

{

system(“cls”);

fflush(stdin);

cout<

cout<

cout<<“t”<<“|| <<<<<<<<<<<<欢<<<<<<<<<<< >>>>>>>>>>>>迎>>>>>>>>>>> ||”<

cout<<“t”<<“||

||”<

cout<<“t”<<“||”<<“t 进程调度算法模拟”<<“tt”<<“||”<

cout<<“t”<<“||

||”<

cout<<“t”<<“||”<<“tt 1.先来先服务调度算法 ”<<“tt”<<“||”<

cout<<“t”<<“||

||”<

cout<<“t”<<“||”<<“tt 2.最短进程优先调度算法”<<“tt”<<“||”<

cout<<“t”<<“||

||”<

cout<<“t”<<“|| <<<<<<<<<<<<<<<<<<<<<<<<<您>>>>>>>>>>>>>>>>>>>>>>>>> ||”<

cout<

cout<

cout<<“tt

请输入您的选择(1/2):”;

cse1=getchar();

if(cse1<'1'||cse1>'2')

cout<<“你的输入有错!”<

else

break;

}

return cse1;} int main(int argc, char *argv[]){

while(1)

{

switch(menu())

{

case '1':

int N;

cout<

cout<

printf(“tt<<---!!@@@先来先服务调度算法@@@!!--->>n”);

cout<

printf(“输入进程数目:”);

scanf(“%d”,&N);

input(a,N);

FCFS(a,N);

case '2':

int N1;

cout<

cout<

printf(“tt<<---!!@@@最短进程优先调度算法@@@!!--->>n”);

cout<

printf(“输入进程数目: ”);

scanf(“%d”,&N1);

input(a1,N1);

sjf *b=a1;

sjf *c=a1;

sjff(b,N1);

getchar();

}

}

system(“PAUSE”);

return EXIT_SUCCESS;}

五、实验结果

1.执行结果

2.结果分析

先来先服务调度算法就是根据进程达到的时间为依据,哪一个进程先来那么该进程就会先执行;最短进程优先调度算法则是以每个进程执行所需时间长短为依据,某一个进程执行所需花的时间要短些那么该进程就先执行。以上就是本次进程调度实验的依据。

六、实验总结

通过本次实验了解到算法很重要,又更加明白算法本身可以节约时间,而且不同的函数之间在调用的时候要注意很多的问题。

第五篇:操作系统银行家算法(避免死锁)实验报告

操作系统实验:银行家算法

姓名:李天玮

班级:软工1101 实验内容:

在windows系统中实现银行家算法程序。

学号:201126630117 实现银行家算法所用的数据结构:

假设有5个进程3类资源,则有如下数据结构: 1.MAX[5,3] 5个进程对3类资源的最大需求量。2.AVAILABLE[3]系统可用资源数。

3.ALLOCATION[5,3]5个进程已经得到3类资源的资源量。4.NEED[5,3]5个进程还需要3类资源的资源量。

银行家算法:

设进程1提出请求Request[N],则银行家算法按如下规则进行判断。(1)如果Request[N]<=NEED[1,N],则转(2);否则,出错。(2)如果Request[N]<=AVALIABLE,则转(3);否则,出错。(3)系统试探非配资源,修改相关数据。

AVALIABLE=AVALIABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

安全性检查:

(1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE.(2)从晋城集合中找到一个满足下述条件的进程,FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4)。

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

WORK=WORK+ALLOCATION FINISH[i]=TRUE GOTO(2)

(4)如所有进程FINISH[M]=TRUE,则表示安全;否则系统不安全。

1.用init()函数对于数据的初始化

关键代码:

#define M 5 #define N 3

void init(){

cout<<“请输入5个进程对3类资源最大资源需求量:”<

} cout<<“请输入系统可用的资哩源数:”<

{ } cin>>AVAILABLE[j];for(int j=0;j>MAX[i][j];} //cout<

cout<<“请输入5个进程已经-的到的3类资源的资源量:”<

for(int i=0;i

} cout<<“请?输?入?5个?进?程ì还1需è要癮3类え?资哩?源′的?资哩?源′量?:”<

} for(int j=0;j>NEED[i][j];} //cout<>ALLOCATION[i][j];} //cout<

}// Stack around the variable 'AVAILABLE' was corrupted.显示数据详细信息

进行测试 输入一号进程号,并给需要申请资源设定为{1,0,2}

检验错误输入时候的报错信息

检验当再次申请0号资源并申请资源数目为{0,2,0}时,系统提示系统不安全申请不成功。

每当验证申请成功后会进行的修改操作:

if(flag=='Y'||flag=='y')//进?行D数簓据Y修T改?

{ changdata(i);

}

} if(chkerr(0)){

} else showdata();rstordata(i);showdata();else showdata();cout<>flag;退?出?演Y示?”;

下载操作系统实验报告(clock算法)word格式文档
下载操作系统实验报告(clock算法).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    操作系统实验报告

    许昌学院 《操作系统》实验报告书 学号:姓名:闫金科班级:成绩: 5006140057 14物联网工程 2016年02月实验一 Linux的安装与配置 一、实验目的 1. 熟悉Linux系统的基本概念,比......

    操作系统实验报告

    实验二 进程调度 1.目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握......

    操作系统 七次实验报告 常用页面置换算法模拟实验

    操作系统课程第七次实验报告姓名学号系计算机任课教师指导教师评阅教师实验地点综合楼B102实验时间2012-9-26实验课表现出勤和个人表现Q1(15+15(组长评分)=30分)得分:实验总分(......

    操作系统课程设计实验报告-用C++实现银行家算法

    操 作 系 统 实 验 报 告 (2) 学院:计算机科学与技术学院 班级:计091 学号:姓名: 时间:2011/12/30 目 录 1. 实验名称……………………………………………………3 2. 实验目的…......

    算法实验报告

    《算法设计与分析》 实验报告 班级姓名学号年 月日 目录 实验一二分查找程序实现…………………………………………………………………03页 实验二棋盘覆盖问题(分治法).…......

    操作系统实验报告-利用银行家算法避免死锁(推荐五篇)

    计算机操作系统实验报告 题 目 利用银行家算法避免死锁一、 实验目的: 1、加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2、要求编写和......

    《操作系统原理》算法总结

    《操作系统原理》算法总结 一、进程(作业)调度算法  先来先服务调度算法(FCFS):每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。该......

    操作系统课程设计六种算法

    《计算机操作系统》 学号:班级:软技姓名:张靖伟 课 程 设 计 报 告 4班 1367003270 目录 1 实验:进程调度算法——时间片轮转算法 2 实验:银行家算法3 实验:分区分配算法——4......