南昌大学计算机操作系统实验报告.docx

上传人:b****4 文档编号:6992125 上传时间:2023-05-10 格式:DOCX 页数:36 大小:668.82KB
下载 相关 举报
南昌大学计算机操作系统实验报告.docx_第1页
第1页 / 共36页
南昌大学计算机操作系统实验报告.docx_第2页
第2页 / 共36页
南昌大学计算机操作系统实验报告.docx_第3页
第3页 / 共36页
南昌大学计算机操作系统实验报告.docx_第4页
第4页 / 共36页
南昌大学计算机操作系统实验报告.docx_第5页
第5页 / 共36页
南昌大学计算机操作系统实验报告.docx_第6页
第6页 / 共36页
南昌大学计算机操作系统实验报告.docx_第7页
第7页 / 共36页
南昌大学计算机操作系统实验报告.docx_第8页
第8页 / 共36页
南昌大学计算机操作系统实验报告.docx_第9页
第9页 / 共36页
南昌大学计算机操作系统实验报告.docx_第10页
第10页 / 共36页
南昌大学计算机操作系统实验报告.docx_第11页
第11页 / 共36页
南昌大学计算机操作系统实验报告.docx_第12页
第12页 / 共36页
南昌大学计算机操作系统实验报告.docx_第13页
第13页 / 共36页
南昌大学计算机操作系统实验报告.docx_第14页
第14页 / 共36页
南昌大学计算机操作系统实验报告.docx_第15页
第15页 / 共36页
南昌大学计算机操作系统实验报告.docx_第16页
第16页 / 共36页
南昌大学计算机操作系统实验报告.docx_第17页
第17页 / 共36页
南昌大学计算机操作系统实验报告.docx_第18页
第18页 / 共36页
南昌大学计算机操作系统实验报告.docx_第19页
第19页 / 共36页
南昌大学计算机操作系统实验报告.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

南昌大学计算机操作系统实验报告.docx

《南昌大学计算机操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《南昌大学计算机操作系统实验报告.docx(36页珍藏版)》请在冰点文库上搜索。

南昌大学计算机操作系统实验报告.docx

南昌大学计算机操作系统实验报告

 

实验报告

 

实验课程:

计算机操作系统

学生姓名:

学号:

专业班级:

2012年12月19日

 

 

实验一编程实现银行家安全算法

实验二进程调度算法的实现

实验三存储管理的模拟实现

 

一、实验目的

通过实验加强对银行家安全算法的理解和掌握。

二、实验内容

熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。

三、实验要求

1、需写出设计说明;

2、设计实现代码及说明

3、运行结果;

四、主要实验步骤

设计说明:

假定系统中有五个进程{P0,P1,P2,P3,P4}和三类资源的数量分别为10、5、7,在T0时刻的资源分配情况如下图示:

资源情况

进程

Max

ABC

Allocation

ABC

Need

ABC

Available

ABC

P0

753

010

743

332

P1

322

200

122

P2

902

302

600

P3

222

211

011

P4

433

002

431

假设在此后任一时刻有一个进程P发出请求向量request,通过发出的向量判断是否可以满足需要,如果可以,则假设将该资源予以分配,并通过安全性算法进行检测,如果安全,则找出安全序列,否则系统不安全,将分配的资源回收。

代码设计:

将5个进程的所有信息放在一个对应的结构体structpro【i】中,系统资源数和进程请求资源分别存放在available和request数组中,同时通过建立一个finishi布尔数组来控制和标识5个进程的完成情况,如果最后finish值都为真,则说明分配资源后系统是安全的,否则,不安全并将资源回收。

银行家算法实现代码:

#include

#include

intmain(void)

{

structprocess

{intmax[3];

intallocation[3];

intneed[3];

}pro[5]={{7,5,3,0,1,0,7,4,3},{3,2,2,2,0,0,1,2,2},

{9,0,2,3,0,2,6,0,0},{2,2,2,2,1,1,0,1,1},

{4,3,3,0,0,2,4,3,1}};

intavailable[3]={3,3,2},request[3];

intwork[3],finish[5]={0};

intm,i,j,k,count=0,number=0;

intr=0,rank[5]={0};

printf("\t\2*****************银行家算法*******************\2\n");

printf("Theinformationofprocessesandsystem:

\n");

printf("\tname\tmax\tallocation\tneed\tavailable\n");

for(i=0;i<5;i++){

printf("\t");

printf("P[%d]",i);

printf("\t");

for(j=0;j<3;j++)

printf("%2d",pro[i].max[j]);

printf("\t");

for(j=0;j<3;j++)

printf("%2d",pro[i].allocation[j]);

printf("\t\t");

for(j=0;j<3;j++)

printf("%2d",pro[i].need[j]);

printf("\t");

if(i==0){

for(j=0;j<3;j++)

printf("%2d",available[j]);

}

printf("\n");

}

printf("pleasechoosetheprocessnumber:

");

scanf("%d",&m);

printf("pleaseinputtherequest:

");

for(i=0;i<3;i++){

scanf("%d",&request[i]);

}

for(j=0;j<3;j++)

if(request[j]<=pro[m].need[j])

count++;

if(count==3){

for(i=0;i<3;i++)

if(request[i]<=available[i])

number++;

if(number==3){

for(k=0;k<3;k++){

available[k]=available[k]-request[k];

pro[m].allocation[k]=pro[m].allocation[k]+request[k];

pro[m].need[k]=pro[m].need[k]-request[k];

}

}

else

{

printf("请求资源不能满足!

");

exit(0);

}

}

else

{

printf("请求资源超过所需!

");

exit(0);

}

for(j=0;j<3;j++)

work[j]=available[j];

L:

count=0;

for(i=0;i<5;i++){

if(!

finish[i]){

for(j=0;j<3;j++)

if(pro[i].need[j]<=work[j])

count++;

if(count==3){

finish[i]=1;

rank[r++]=i;

for(k=0;k<3;k++)

work[k]=work[k]+pro[i].allocation[k];

gotoL;

}

else

count=0;

}

}

number=0;

for(k=0;k<5;k++)

if(finish[k]==1)

number++;

if(number==5){

printf("系统处于安全状态!

\n");

printf("安全序列为:

\n");

for(i=0;i<5;i++)

printf("\tP[%d]",rank[i]);}

else

printf("系统处于不安全状态!

");

return0;

}运行结果:

 

六、实验体会或对改进实验的建议

程序比较长,用到了上学期的c语言编程,感觉主要是count比较难把握,程序算法还是比较清晰,就是自己编一个程序有一定难度,必须多加练习了。

做完后对银行家算法有更深的理解。

南昌大学实验报告

---进程调度算法的实现

一、实验目的

通过实验加强对进程调度算法的理解和掌握。

二、实验内容

编写程序实现进程调度算法,具体可以编写程序实现先来先服务算法或优先度高者调度算法。

三、实验要求

1、需写出设计说明;

2、设计实现代码及说明;

3、运行结果

四.实验主要过程和步骤

前三个算法主要是解决进程调度的顺序问题,最后一个时间片轮转调度主要是解决每个进程的完成时间,所以以下算法主要对此进行说明。

FCFS进程调度算法设计:

建立一个结构体数组pro[100],每个结构体中都存有各进程相关信息,然后输入进程数N确定进程数,并输入各进程的相关信息。

通过fcfs算法对按照所输入进程的arrivetime的大小进行排序,排好的序即为进程调度的执行顺序。

最后再通过对个进程的其他数据进行简单处理即可。

SJF进程调度算法设计:

SJF的算法设计基本同上。

只是在排序过程中稍有不同,它是按照进程的服务时间servetime来安排进程的调度顺序的。

HRF进程调度算法设计:

通过建立add值,对进程执行完后时间的累计,用来计算下一个进程的等待时间,add初始值为第一个进程执行后的完成时间。

从第二个进程开始进行优先级priority的比较,然后记录下优先级最大的进程的标号k,并与第二进程进行调换,下一次再通过同样的方法找到最大优先级的进程同第三个进程进行调换,依次类推直到执行完所有的进程。

其中通过count值控制每次执行的循环次数,l值标明下次所要调换的程序的标号。

时间片轮转调度算法:

首先,用过一个N次的循环计算每个进程的开始时间starttime,对每个进程首先判断pro[i-1].servetime是否小于时间片大小size,如果小于size就让pro[i].starttime等于pro[i-1].starttime加上pro[i-1].servetime,否则的话,就让其加上时间片大小size。

下来接着处理完成时间,首先为每个进程建立resttime的数组,用来存放每个进程执行一次的剩余时间,并将每个进程的servetime值对应的赋给它,然后通过用一个while(count!

=N)的循环控制所有的进程是否完成,最后在这个循环里面对每个进程检测,看它的resttime是否为0,如果为0说明它已经完成,否则判断他的resttime是否小于等于size,如果小于说明本次就能完成本进程,并将time的值赋给finishtime,否则的话就将resttime值减size,并将time值加size,这样不断地循环执行,知道N个进程全部执行完毕。

FCFS进程调度算法实现代码:

#include

intmain(void)

{

structprocess

{

charpro_name[10];

floatarrivetime;

floatservetime;

floatstarttime;

floatfinishtime;

floatcircle_time;

floatd_circle_time;

}a[100];//用结构体存放各进程的相关信息

inti,j,k,N;

processtemp;

printf("请输入进程数:

");

scanf("%d",&N);//进程数

printf("请输入进程信息(包括进程名、进程到达时间、进程服务时间):

\n");

for(i=0;i

printf("请输入第%d个进程的信息:

",i+1);

scanf("%s%f%f",&a[i].pro_name,&a[i].arrivetime,&a[i].servetime);

}

for(i=0;i

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

if(a[i].arrivetime

temp=a[i];

a[i]=a[j];

a[j]=temp;

}}

}//按照FCFS算法对进程进行排序

printf("\nFCFS进程调度顺序为:

\n");

for(k=0;k

printf("%5s",a[k].pro_name);

printf("\n");

a[0].starttime=a[0].arrivetime;

a[0].finishtime=a[0].servetime+a[0].starttime;

a[0].circle_time=a[0].finishtime-a[0].arrivetime;

a[0].d_circle_time=a[0].circle_time/a[0].servetime;//计算第一个进程的相关信息

for(i=1;i

a[i].starttime=a[i-1].servetime+a[i-1].starttime;

a[i].finishtime=a[i].servetime+a[i].starttime;

a[i].circle_time=a[i].finishtime-a[i].arrivetime;

a[i].d_circle_time=a[i].circle_time/a[i].servetime;

}//计算其他进程的相关信息

printf("\n进程调度列表:

\n");

printf("name\tarrive\tserve\tstart\tfinish\tcircle\td_circle\n");

for(i=0;i

printf("%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",a[i].pro_name,

a[i].arrivetime,a[i].servetime,a[i].starttime,a[i].finishtime,

a[i].circle_time,a[i].d_circle_time);

return0;

}运行结果;fcfs进程调度运行结果

SJF进程调度算法实现代码:

#include

intmain(void)

{

structprocess

{

charpro_name[10];

floatarrivetime;

floatservetime;

floatstarttime;

floatfinishtime;

floatcircle_time;

floatd_circle_time;

}a[100];

inti,j,k=0,N;

processtemp;

processt;

printf("请输入进程数:

");

scanf("%d",&N);

printf("请输入进程信息(包括进程名、进程到达时间、进程服务时间:

\n");

for(i=0;i

printf("请输入第%d个进程的信息",i+1);

scanf("%s%f%f",&a[i].pro_name,&a[i].arrivetime,&a[i].servetime);

}

floatmin=a[0].arrivetime;

for(i=0;i

if(a[i].arrivetime

min=a[i].arrivetime;

k=i;

}

printf("\n");

temp=a[0];

a[0]=a[k];

a[k]=temp;

for(i=1;i

for(j=1;j<=i;j++){

if(a[i].servetime

t=a[i];

a[i]=a[j];

a[j]=t;

}

}

}

printf("\n进程调度顺序为:

\n");

for(i=0;i

printf("%5s",a[i].pro_name);

printf("\n");

a[0].starttime=a[0].arrivetime;

a[0].finishtime=a[0].servetime+a[0].starttime;

a[0].circle_time=a[0].finishtime-a[0].arrivetime;

a[0].d_circle_time=a[0].circle_time/a[0].servetime;

for(j=1;j

a[j].starttime=a[j-1].servetime+a[j-1].starttime;

a[j].finishtime=a[j].servetime+a[j].starttime;

a[j].circle_time=a[j].finishtime-a[j].arrivetime;

a[j].d_circle_time=a[j].circle_time/a[j].servetime;

}

printf("\n进程调度列表:

\n");

printf("name\tarrive\tserve\tstart\tfinish\tcircle\td_circle\n");

for(i=0;i

printf("%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",a[i].pro_name,

a[i].arrivetime,a[i].servetime,a[i].starttime,a[i].finishtime,

a[i].circle_time,a[i].d_circle_time);

return0;

}Sjf进程调度运行结果:

HRF算法实现:

#include

intmain(void)

{

structprocess

{

charname[10];

floatarrivetime;

floatservetime;

floatstarttime;

floatfinishtime;

floatcycle_time;

floatd_cycle_time;

}pro[100];

inti,j,N,t,k,l=1;

intcount=1;

floatadd,min_arrive,priority,max=0;

processtemp;

printf("请输入进程数:

");

scanf("%d",&N);

printf("请输入进程信息(包括进程名、进程到达时间、进程服务时间)\n");

for(i=0;i

printf("请输入第%d个进程的信息",i+1);

scanf("%s%f%f",&pro[i].name,&pro[i].arrivetime,&pro[i].servetime);

}

min_arrive=pro[0].arrivetime;

for(i=0;i

if(pro[i].arrivetime

min_arrive=pro[i].arrivetime;

t=i;

}

}

temp=pro[t];

pro[t]=pro[0];

pro[0]=temp;

add=pro[0].arrivetime+pro[0].servetime;

pro[0].starttime=add;

while(count

for(i=count;i

if(pro[i].arrivetime<=add){

priority=(add-pro[i].arrivetime)/pro[i].servetime;

if(priority>max){

max=priority;

k=i;

}

}

}

count++;

add=add+pro[k].servetime;

temp=pro[k];

pro[k]=pro[l];

pro[l]=temp;

pro[l].starttime=add;

l=l+1;

}

printf("\n进程调度顺序为:

\n");

for(i=0;i

printf("\t%s",pro[i].name);

printf("\n\n");

for(i=0;i

pro[i].finishtime=pro[i].starttime+pro[i].servetime;

pro[i].cycle_time=pro[i].finishtime-pro[i].arrivetime;

pro[i].d_cycle_time=pro[i].cycle_time/pro[i].servetime;

}

printf("进程调度列表如下:

\2\n");

printf("\tname\tarrive\tserve\tstart\tfinish\tcycle\td_cycle\n");

for(i=0;i

printf("\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t\n",pro[i].name,

pro[i].arrivetime,pro[i].servetime,pro[i].starttime,pro[i].finishtime,

pro[i].cycle_time,pro[i].d_cycle_time);

return0;

}

HRF进程调度运行结果:

时间片轮转调度算法:

#include

intmain(void)

{

structprocess

{

charname[10];

floatarrivetime;

floatservetime;

floatstarttime;

floatfinishtime;

floatcycletime;

floatd_cycletime;

}pro[100];

floatsize;

inti,j,N,count=0;

floatresttime[100],time;\

printf("\t***************时间片轮转调度算法***************\n\n");

printf("pleaseinputtheprocessnumber:

");

scanf("%d",&N);

printf("pleaseinputtheprocesses'information(nameandservetime):

\n");

for(i=0;i

printf("pleaseinputthe%thprocessinformation:

",i+1);

scanf("%s%f",&pro[i].name,&pro[i].servetime);

printf("\n");

}

printf("pleaseinputthesizeoftime:

");

scanf("%f",&size);

for(i=0;i

pro[i].arrivetime=0;

pro[0].starttime=0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2