操作系统实验程序1234.docx
- 文档编号:9411163
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:46
- 大小:216.73KB
操作系统实验程序1234.docx
《操作系统实验程序1234.docx》由会员分享,可在线阅读,更多相关《操作系统实验程序1234.docx(46页珍藏版)》请在冰点文库上搜索。
操作系统实验程序1234
操作系统实验
实验一进程调度
一、实验目的
多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。
因而引起进程调度。
本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。
二、实验要求
1.设计进程调度算法,进程数不定
2.包含几种调度算法,并加以实现
3.输出进程的调度过程——进程的状态、链表等。
三、参考例
1.题目——优先权法、轮转法
简化假设
1)进程为计算型的(无I/O)
2)进程状态:
ready、running、finish
3)进程需要的CPU时间以时间片为单位确定
2.算法描述
1)优先权法——动态优先权
当前运行进程用完时间片后,其优先权减去一个常数。
2)轮转法
四、
实验流程图
注意:
1.产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。
2.进程数n不要太大通常取4~8个
3.使用动态数据结构
4.独立编程
5.至少三种调度算法
6.若有可能请在图形方式下,将PCB的调度用图形成动画显示。
五.实验过程:
(1)输入:
进程流文件(1.txt),其中存储的是一系列要执行的进程,每个作业包括四个数据项:
进程名进程状态(1就绪2等待3运行)所需时间优先数(0级最高)
进程01502
进程12104
进程21150
进程33285
进程42191
进程5387
输出:
进程执行流等待时间,平均等待时间
本程序包括:
FIFO算法,优先数调度算法,时间片轮转调度算法
(2)程序代码
#include
#include
#include
constintblock_time=10;//定义时间片的长度为10秒
constintMAXPCB=100;//定义最大进程数
//定义进程结构体
typedefstructnode
{
charname[20];
intstatus;
inttime;
intprivilege;
intfinished;
intwait_time;}pcb;
pcbpcbs[MAXPCB];
intquantity;
//初始化函数
voidinitial()
{
inti;
for(i=0;i { strcpy(pcbs[i].name,""); pcbs[i].status=0; pcbs[i].time=0; pcbs[i].privilege=0; pcbs[i].finished=0; pcbs[i].wait_time=0; } quantity=0; } //读数据函数 intreadData() { FILE*fp; charfname[20]; inti; cout<<"请输入进程流文件名: "; cin>>fname; if((fp=fopen(fname,"r"))==NULL) { cout<<"错误,文件打不开,请检查文件名"< } else { while(! feof(fp)) { fscanf(fp,"%s%d%d%d",pcbs[quantity].name,&pcbs[quantity].status, &pcbs[quantity].time,&pcbs[quantity].privilege); quantity++; }//输出所读入的数据 cout<<"输出所读入的数据"< cout<<"进程名进程状态所需时间优先数"< for(i=0;i { cout<<""< } return (1); } return(0); } //重置数据,以供另一个算法使用 voidinit() { inti; for(i=0;i { pcbs[i].finished=0;pcbs[i].wait_time=0; } } //先进先出算法 voidFIFO() { inti,j;inttotal; //输出FIFO算法执行流 cout< cout<<"FIFO算法执行流: "< for(i=0;i { cout<<""< for(j=i+1;j {pcbs[j].wait_time+=pcbs[i].time;} } total=0; for(i=0;i {total+=pcbs[i].wait_time;} cout<<"总等待时间: "< "< } //优先数调度算法 voidprivilege() { inti,j,p; intpassed_time=0; inttotal; intqueue[MAXPCB]; intcurrent_privilege=1000; for(i=0;i { current_privilege=1000; for(j=0;j { if((pcbs[j].finished==0)&&(pcbs[j].privilege {p=j; current_privilege=pcbs[j].privilege; } } queue[i]=p; pcbs[p].finished=1; pcbs[p].wait_time+=passed_time; passed_time+=pcbs[p].time; } //输出优先数调度执行流 cout< cout<<"优先数调度执行流: "< cout<<"进程名等待时间"< for(i=0;i { cout<<""< } total=0; for(i=0;i {total+=pcbs[i].wait_time;} cout<<"总等待时间: "< "< } //时间片轮转调度算法 voidtimer() { inti,j,number,flag=1; intpassed_time=0; intmax_time=0; intround=0; intqueue[1000]; inttotal=0; while(flag==1) { flag=0; number=0; for(i=0;i { if(pcbs[i].finished==0) {number++;j=i;} } if(number==1) {queue[total]=j;total++;pcbs[j].finished=1;} if(number>1) { for(i=0;i { if(pcbs[i].finished==0) {flag=1; queue[total]=i; total++; if(pcbs[i].time<=block_time*(round+1)) { pcbs[i].finished=1; } } } } round++; } if(queue[total-1]==queue[total-2]) {total--;} cout< cout<<"时间片轮转调度执行流: "< for(i=0;i { cout< cout< } } //显示 voidversion() { cout<<" /*********************进程调度********************/ "; cout< //主函数 voidmain() { intflag; version(); initial(); flag=readData(); if(flag==1) {FIFO(); init(); privilege(); init(); timer(); } } (3)运行结果: 输入进程流文件名1.txt即可得出以下输出结果: 实验二银行家算法 一、实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止。 本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 二、实验要求 设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。 系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析; 三、数据结构 1.可利用资源向量Available,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。 其数值随该类资源的分配和回收而动态地改变。 如果Available(j)=k,标是系统中现有Rj类资源k个。 2.最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。 如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k。 3.分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。 如果Allocation(i,j)=k,表示进程i当前已经分到Rj类资源的数目为k。 Allocationi表示进程i的分配向量,有矩阵Allocation的第i行构成。 4.需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。 如果Need(i,j)=k,表示进程i还需要Rj类资源k个,才能完成其任务。 Needi表示进程i的需求向量,由矩阵Need的第i行构成。 上述三个矩阵间存在关系: Need(i,j)=Max(i,j)-Allocation(i,j); 四、银行家算法 Requesti是进程Pi的请求向量。 Requesti(j)=k表示进程Pi请求分配Rj类资源k个。 当Pi发出资源请求后,系统按下述步骤进行检查: 1.如果Requesti≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。 2.如果Requesti≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。 3.系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值: Available=Available-Requesti Allocationi=Allocationi+Requesti Needi=Needi-Requesti 4.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。 如果安全才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。 假定系统有5个进程(p0,p1,p2,p3,p4)和三类资源(A,B,C),各种资源的数量分别为10,5,7,在T0时刻的资源分配情况如下图: MaxAllocationNeedAvailable ABCABCABCABC P0753010743332 (230) P1322200122 (302)(020) P2902302600 P3222211011 P4433002431 五、安全性算法 1.设置两个向量。 Work: 它表示系统可提供给进程继续运行的各类资源数目,它包含m个元素,开始执行安全性算法时,Work=Available。 Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish(I)=false;当有足够资源分配给进程Pi时,令Finish(i)=true; 2.从进程集合中找到一个能满足下述条件的进程。 Finish(i)==false; Needi≤work; 如找到则执行步骤3;否则,执行步骤4; 3.当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行 Work=work+Allocationi Finish(i)=true;转向步骤2; 4.若所有进程的Finish(i)都为true,则表示系统处于安全状态;否则,系统处于不安全状态。 六、系统流程图 七.银行家算法程序代码 #include #include #include usingnamespacestd; typedefstructMax1//资源的最大需求量 { intm_a; intm_b; intm_c; }Max; typedefstructAllocation1//已分配的资源数 { inta_a; inta_b; inta_c; }Allocation; typedefstructNeed1//还需要的资源数 { intn_a; intn_b; intn_c; }Need; structAvailable1//可利用的资源量 { intav_a; intav_b; intav_c; }q; structpr//定义一个结构 { charname; Maxmax; Allocationallocation; Needneed; intfinishflag; }p[5]; charna[5]; //******************************************** voidinit()//读入文件"1.txt" { cout<<"各进程还需要的资源数NEED: "< FILE*fp; fp=fopen("1.txt","r+");//打开文件"1.txt" for(inti=0;i<5;i++) { fscanf(fp,"%c,%d,%d,%d,%d,%d,%d\n",&p[i].name,&p[i].max.m_a,&p[i].max.m_b, &p[i].max.m_c,&p[i].allocation.a_a,&p[i].allocation.a_b,&p[i].allocation.a_c); p[i].need.n_a=p[i].max.m_a-p[i].allocation.a_a; p[i].need.n_b=p[i].max.m_b-p[i].allocation.a_b; p[i].need.n_c=p[i].max.m_c-p[i].allocation.a_c; cout< "< } fclose(fp);//关闭文件 } //*********************************************** intfenpei()//分配资源 { cout<<"Available: "; cout< intfinishcnt=0,k=0,count=0; for(intj=0;j<5;j++) p[j].finishflag=0; while(finishcnt<5) { for(inti=0;i<5;i++) { if(p[i].finishflag==0&&q.av_a>=p[i].need.n_a&&q.av_b>=p[i].need.n_b&&q.av_c>=p[i].need.n_c) { q.av_a+=p[i].allocation.a_a; q.av_b+=p[i].allocation.a_b; q.av_c+=p[i].allocation.a_c; p[i].finishflag=1; finishcnt++; na[k++]=p[i].name; break; } } count++;//禁止循环过多 if(count>5)return0; } return1; } //**************************************************** intshq()//申请资源 { intm=0,i=0,j=0,k=0;//m为进程号;i,j,k为申请的三类资源数 cout<<"请输入进程号和请求资源的数目! "< cout<<"如: 进程号资源ABC"< cout<<"0202"< cin>>m>>i>>j>>k; if(i<=p[m].need.n_a&&j<=p[m].need.n_b&&k<=p[m].need.n_c) { if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c) { p[m].allocation.a_a+=i; p[m].allocation.a_b+=j; p[m].allocation.a_c+=k; p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a; p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b; p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c; cout<<"各进程还需要的资源数NEED: "<<'\n'; for(intw=0;w<5;w++) cout< "< <<""< return1; } else cout<<"Request>Available让进程"< } else cout<<"Request>Need,让进程"< return0; } //******************************************** voidmain() { intflag; charc; cout<<"/********银行家算法********/"< cout<<"确认已经在\"1.txt\"文档中正确输入各进程的有关信息后按回车键"< getch(); init(); q.av_a=10;//各种资源的数量 q.av_b=5; q.av_c=7; while(flag) { for(inti=0;i<5;i++) { q.av_a-=p[i].allocation.a_a; q.av_b-=p[i].allocation.a_b; q.av_c-=p[i].allocation.a_c; } if(fenpei()) { cout<<"这样配置资源是安全的! "< cout<<"其安全序列是: "; for(intk=0;k<5;k++) cout<<"-->"< cout< cout<<"有进程发出Request请求向量吗? (EnteryorY)"< cout< c=getch(); if(c=='y'||c=='Y') { if(shq())continue; elsebreak; } elseflag=0; } else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 程序 1234