《操作系统》实验报告.docx
- 文档编号:7024587
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:52
- 大小:339.55KB
《操作系统》实验报告.docx
《《操作系统》实验报告.docx》由会员分享,可在线阅读,更多相关《《操作系统》实验报告.docx(52页珍藏版)》请在冰豆网上搜索。
《操作系统》实验报告
《操作系统》实验报告
时间:
2013年11月19日——2013年12月11日
地点:
科技楼423室
班级:
计科1111班
学号:
20111
姓名:
电话:
上交时间:
2013年12月11日
注意:
所有程序都应有一定的注释说明,用VC实现,附上实验结果。
实验1:
进程管理
要求:
编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;撤销某个进程。
提示:
1、进程状态简单处理为:
0为不在内存,1为在内存,2为阻塞,3为挂起。
2、撤销进程指将进程的状态从运行变为阻塞。
3、程序的结构可以处理为在主函数中用switch语句调用各种表示进程管理功能的函数。
#include
#include
#include
#include
structjincheng_type{
intpid;
intyouxian;
intdaxiao;
intzhuangtai;
charinfo[10];
};
structjincheng_typeneicun[20];
intshumu=0,guaqi=0,pid,flag=0;
voidcreate()
{
if(shumu>=20)
cout<<"内存已满,请先换出或杀死进程"< else { for(inti=0;i<20;i++) if(neicun[i].zhuangtai==0) break; cout<<"请输入新进程id: "; cin>>neicun[i].pid; for(intj=0;j { if(neicun[i].pid==neicun[j].pid) { cout<<"进程已存在"< return; } } cout<<"请输入新进程的优先级: "; cin>>neicun[i].youxian; cout<<"请输入新进程大小: "; cin>>neicun[i].daxiao; cout<<"请输入新进程的内容: "; cin>>neicun[i].info; neicun[i].zhuangtai=1; shumu++; } } voidrun() { for(inti=0;i<20;i++) { if(neicun[i].zhuangtai==1) { cout<<"进程id: "< cout<<"优先级: "< cout<<"大小: "< cout<<"状态: "< cout<<"内容: "< flag=1; } } if(! flag) cout<<"当前没有运行的进程"< } voidhuanchu() { if(! shumu) { cout<<"当前没有运行的进程"< return; } cout<<"输入换出进程id: "; cin>>pid; for(inti=0;i<20;i++) { if(pid==neicun[i].pid) { if(neicun[i].zhuangtai==1) { neicun[i].zhuangtai=2; guaqi++; cout<<"已换出新进程"< } elseif(neicun[i].zhuangtai==0) cout<<"要换出的新进程不存在"< else cout<<"要换出的进程已经挂起"< flag=1; break; } } if(flag==0) cout<<"要换出的进程不存在"< } voidkill() { if(! shumu) { cout<<"当前没有运行的进程"< return; } cout<<"请输入要杀死的进程"< cin>>pid; for(inti=0;i<20;i++) { if(pid==neicun[i].pid) { if(neicun[i].zhuangtai==1) { neicun[i].zhuangtai=0; shumu--; cout<<"已杀死进程"< } elseif(neicun[i].zhuangtai==0) cout<<"要杀死的进程不存在"< else cout<<"要杀死的进程已挂起"< flag=1; break; } } if(flag==0) cout<<"要杀死的进程不存在"< } voidhuanxing() { if(! shumu) { cout<<"当前没有运行的进程"< return; } if(! guaqi) { cout<<"当前没有挂起的进程"< return; } cout<<"请输入要唤醒的进程: "; cin>>pid; for(inti=0;i<20;i++) { if(pid==neicun[i].pid) { flag=false; if(neicun[i].zhuangtai==2) { neicun[i].zhuangtai=1; guaqi--; cout<<"已唤醒进程"< } elseif(neicun[i].zhuangtai==0) cout<<"要唤醒的进程不存在"< else cout<<"要唤醒的进程已挂起"< break; } } if(flag) cout<<"要唤醒的进程不存在"< } voidmain() { intn=1; intnum; for(inti=0;i<20;i++) { neicun[i].zhuangtai=0; } while(n) { cout<<"*******************************************"< cout<<"*进程演示系统*"< cout<<"*******************************************"< cout<<"*1.创建进程2.查看进程*"< cout<<"*3.换出进程4.杀死进程*"< cout<<"*5.唤醒进程6.退出*"< cout<<"*******************************************"< cout<<"*请选择1-6*"< cout<<"*******************************************"< cin>>num; switch(num) { case1: create(); break; case2: run(); break; case3: huanchu(); break; case4: kill(); break; case5: huanxing(); break; case6: exit(0); default: n=0; } flag=0; } } 实验2: 进程调度 要求: 1、设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。 2、建立进程就绪队列。 3、编制两种进程调度算法: 优先权调度(实现动态优先级)和时间片轮转调度。 提示: 1、假设利用两种算法对五个进程进行调度,每个进程有运行、就绪、阻塞三种状态,初始状态为就绪态。 2、为了便于处理,程序中的某进程运行时间以时间片为单位计算。 各进程的优先数或轮转时间数以及进程需运行的时间片数的初值由用户给定。 3、在优先权调度算法中,优先数可以先取50,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。 在时间片轮转调度算法中,采用固定时间片,即每执行一次进程,该进程的执行时间片数为已执行了2个单位,这时CPU时间片数加2,进程还需要的时间片数减2,并将该进程排列到就绪队列的队尾。 4、对于优先数一致的情况,采用FIFO策略解决。 #include #include #include #include typedefstructnode { charname[10]; intprio; intround; intcputime; intneedtime; intcount; charstate; structnode*next; }PCB; PCB*finish,*ready,*tail,*run; intN; voidfirstin(void) { if(ready! =NULL) { run=ready; ready=ready->next; run->state='R'; run->next=NULL; } else { run=NULL; } } voidprt1(chara) { if(toupper(a)=='P') cout<<"namecputimeneedtimeprioritystate"< else cout<<"namecputimeneedtimecountroundstate"< } voidprt2(chara,PCB*q) { if(toupper(a)=='P') cout<<""< else cout<<""< } voidprt(charalgo) { PCB*p; prt1(algo); if(run! =NULL) prt2(algo,run); p=ready; while(p! =NULL) { prt2(algo,p); p=p->next; } p=finish; while(p! =NULL) { prt2(algo,p); p=p->next; } system("pause"); } voidinsert1(PCB*q) { PCB*p,*s,*r; intb; s=q; p=ready; r=p; b=1; if(s->prio==ready->prio) { s->next=ready; ready=s; } else { while(p! =NULL&&b) { if(p->prio=s->prio) { r=p; p=p->next; } else { b=0; } } s->next=p; r->next=s; } } voidinsert2(PCB*q) { tail->next=q; tail=q; q->next=NULL; } voidpcreate_task(charalgo,intn) { PCB*p; inti,time; charna[10]; ready=NULL; finish=NULL; run=NULL; for(i=0;i { p=(PCB*)malloc(sizeof(PCB)); cout<<"Enterthenameofprocess: "; cin>>na; //system("pause"); cout<<"Enterthetimeofprocess: "; cin>>time; //system("pause"); strcpy(p->name,na); p->cputime=0; p->needtime=time; p->state='W'; p->prio=time; if(ready==NULL) { ready=p; ready->next=NULL; } else { insert1(p); } } cout<<"Outputthewaitingprocessinformation"< prt(algo); firstin(); } voidrecreate_task(charalgo,intn) { PCB*p; inti,time; charna[10]; ready=NULL; finish=NULL; run=NULL; for(i=0;i { p=(PCB*)malloc(sizeof(PCB)); cout<<"Enterthenameofprocess: "; cin>>na; //system("pause"); cout<<"Enterthetimeofprocess: "; cin>>time; //system("pause"); strcpy(p->name,na); p->cputime=0; p->needtime=time; p->count=0; p->state='W'; p->round=2; if(ready! =NULL) { insert2(p); } else { p->next=ready; ready=p; tail=p; } } cout<<"Outputthewaitingprocessinformation"< prt(algo); run=ready; ready=ready->next; run->state='R'; } voidpriority(charalgo) { while(run! =NULL) { run->cputime+=1; run->needtime-=1; run->prio-=3; if(run->needtime==0) { run->next=finish; finish=run; run->state='F'; run=NULL; firstin(); } else { if((ready! =NULL)&&((run->prio)<(ready->prio))) { run->state='W'; insert1(run); run=NULL; firstin(); } } } prt(algo); } voidroundrun(charalgo) { while(run! =NULL) { run->cputime+=1; run->needtime-=1; run->count+=1; if(run->needtime==0) { run->next=finish; finish=run; run->state='F'; run=NULL; if(ready! =NULL) { firstin(); } } else { if(run->count==run->round) { run->count=0; if(ready! =NULL) { run->state='W'; insert2(run); firstin(); } } } prt(algo); } } intmain() { charalgo; intN; cout<<"ChoosethetypeofattemperP: priorityR: timeround: "; cin>>algo; //system("pause"); cout<<"PleaseenterthenumberofprocessN: "; cin>>N; //system("pause"); if((algo=='P')||(algo=='p')) { pcreate_task(algo,N); priority(algo); } elseif((algo=='r')||(algo=='R')) { recreate_task(algo,N); roundrun(algo); } return1; } . . 实验3: 银行家算法 要求: 编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。 某系统有A、B、C、D4类资源共5个进程(P0、P1、P2、P3、P4)共享,各进程对资源的需求和分配情况如下表所示: 进程 已占资源 最大需求数 A B C D A B C D P0 0 0 0 0 0 0 1 2 P1 1 0 0 0 1 7 5 0 P2 1 3 5 4 2 3 5 6 P3 0 6 3 2 0 6 5 2 P4 0 0 1 4 0 6 5 6 现在系统中A、B、C、D4类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题: 1)现在系统是否处于安全状态? 2)如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求? 提示: 1、假设进程P提出请求Request[i],则银行家算法按如下步骤进行判断。 Step1: 如果Request[i]<=Need[i],则转向Step2;否则,出错。 Step2: 如果Request[i]<=Available[i],则转向Step3;否则,出错。 Step3: 系统试探分配相关资源,修改相关数据: Available[i]=Available[i]-Request[i], Allocation[i]=Allocation[i]+Request[i], Need[i]=Need[i]-Request[i] Step4: 系统执行安全性检查,如安全,则分配成立;否则试探性分配资源作废,系统恢复原状,进程进入等待状态。 2、利用安全性检查算法检查根据银行家算法进行资源分配后系统状态是否处于安全状态。 具体算法如下: Step1: 设置两个工作向量work=Available,finish=false; Step2: 从进程集合中找到一个满足下述条件的进程; finish=false, Need<=work 若能找到该进程,则执行Step3,否则,执行Step4。 Step3: 假设上述找到的进程获得资源,可顺利执行,直至完成,从而释放资源,做如下修改。 work=work+Allocation, finish=true, gotoStep2; Step4: 如果所有进程的finish=true,则表示该系统安全;否则系统不安全。 #include #include #include usingnamespacestd; #defineMaxprocess50 #defineMaxresource100 intAvailable[Maxresource]; intMAX[Maxprocess][Maxresource]; intAllocation[Maxprocess][Maxresource]; intneed[Maxprocess][Maxresource]; intRequest[Maxprocess][Maxresource]; boolfinish[Maxprocess]; intp[Maxprocess]; intm,n; voidInit(); boolSafe(); voidBank(); intmain() { Init(); Safe(); Bank(); return1; } voidInit() { inti,j; cout<<"请输入进程的数目: "; cin>>m; cout<<"请输入资源的种类数: "; cin>>n; cout<<"请输入每个进程最多所需的各资源数,按照"< for(i=0;i for(j=0;j cin>>MAX[i][j]; cout<<"请输入每个进程已分配的各资源数,也按照"<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告