




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统原理实 验 报 告 院 (部): 管理工程学院专 业:信息管理与信息系统实验项目:实验一 二 三 五班 级:信管102姓 名:张凤丹学 号:目 录引 言4实验一、模拟进程创建、终止、阻塞、唤醒原语6实验目的:6实验内容:6实验步骤:7实验代码:7程序运行结果及分析12实验感想:13实验二、模拟进程调度功能14实验目的:14实验内容:14实验步骤:14实验代码:15程序运行结果及分析19实验感想:20实验三:模拟动态分区首次适应分配和回收算法20实验目的:20实验内容:20实验步骤:20实验代码:21程序运行结果及分析27实验感想:28实验五:模拟使用银行家算法判断系统的状态28实验目的
2、:28实验步骤:28实验代码:28程序运行结果及分析33实验感想:34引 言 操作系统是信息管理与信息系统专业一门重要的专业理论课程,了解和掌握操作系统的基本概念、功能和实现原理,对认识整个计算机系统的工作原理十分重要。操作系统实验是操作系统课程的一个重要组成部分,通过试验环节的锻炼使同学们不仅能够对以前的所学过的基础知识加以巩固,同时能够通过上机实验,对操作系统的抽象理论知识加以理解,最终达到融会贯通的目的,因此,实验环节是同学们理解、掌握操作系统基本理论的一个重要环节。本实验指导书,根据教材中的重点内容设定了相应的实验题目,由于实验课程的学时有限,我们规定了必做题目和选做题目,其中必做题目
3、必须在规定的上机学时中完成,必须有相应的预习报告和实验报告。选做题目是针对有能力或感兴趣的同学利用课余时间或上机学时的剩余时间完成。 实验一、模拟进程创建、终止、阻塞、唤醒原语实验目的: 通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。实验内容:1、设计创建、终止、阻塞、唤醒原语功能函数。2、设计主函数,采用菜单结构(参见后面给出的流程图)。3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。实验步骤:其中:进程名用P1,P2标识。优先级及运行时间:为实验题目二做
4、准备。状态为:就绪、运行、阻塞,三种基本状态。指针:指向下一个PCB。1、进程PCB中应包含以下内容:进程名优先级运行时间状态指针2、系统总体结构:开始系统主菜单1创建2阻塞3唤醒4终止5显示0退出请输入您需要的功能(05):输入选择=?543210退出创建阻塞唤醒终止显示结束实验代码:#include <stdio.h>#include<string.h>struct PCB char name4; int priority; int runtime; ;void main()int x,t;int a=0;int k=0,r=1,i=0,j=0;/k为就绪队列总数,
5、r堵塞队列总数char name4;struct PCB pcb10;struct PCB pcb110; struct PCB pcb210;printf("-菜单-nnn"); printf("0-退出系统n"); printf("1-创建进程n"); printf("2-堵塞进程n");printf("3-唤醒进程n"); printf("4-终止进程n");printf("5-显示进程n"); printf("-n"); str
6、cpy(,"s");/堵塞队列pcb10.priority = 2;pcb10.runtime = 3;/printf("%s %d %d",,pcb10.priority,pcb10.runtime); while(1)printf("请输入你的选择:"); scanf("%d",&x); if(x=0) break; if(x=1) printf("-创建进程-n"); printf("进程名:"); scanf("
7、;%s",&); printf("优先级:"); scanf("%d",&pcbk.priority); printf("运行时间:"); scanf("%d",&pcbk.runtime);k=k+1; if(x=2)printf("-堵塞进程-n"); printf("请输入要查找的进程:");scanf("%s",name);for(j=0;j<=k;j+)if(strcmp(pcbj.nam
8、e,name)=0)t=j;strcpy(,); pcb2a.priority = pcbt.priority; pcb2a.runtime = pcbt.runtime; strcpy(,); pcb1r.priority = pcb2a.priority; pcb1r.runtime = pcb2a.runtime; r=r+1;a=a+1;for(i=t;i<=k;i+)strcpy(,pcbi+1.name); pcbi.priority = pcbi+1.priority; pcbi
9、.runtime = pcbi+1.runtime; k=k-1;printf("将就绪序列调度为运行:");for(i=0;i<a;i+)printf("%s %d %dn",,pcb2i.priority,pcb2i.runtime);printf("堵塞进程:n"); for(j=0;j<r;j+) printf("%s %d %dn",,pcb1j.priority,pcb1j.runtime);break;elseprintf("该进程已是堵塞
10、进程!n");break; if(x=3)printf("-唤醒进程-n");printf("请输入要唤醒的进程:");scanf("%s",name);for(i=0;i<r;i+)if(strcmp(,name)=0) t=i;strcpy(,); pcbk.priority = pcb1t.priority; pcbk.runtime = pcb1t.runtime; k=k+1;for(j=t;j<r;j+)strcpy(,pc
11、b1j+1.name); pcb1j.priority = pcb1j+1.priority; pcb1j.runtime = pcb1j+1.runtime; r=r-1;printf("就绪进程:n");for(j=0;j<k;j+)printf("%s %d %dn",,pcbj.priority,pcbj.runtime);printf("堵塞进程:n");for(j=0;j<r;j+)printf("%s %d %dn",,pcb1j.priority,p
12、cb1j.runtime); break;elseprintf("该堵塞进程为空,不能唤醒进程!n");break;/for(j=0;j<k;j+)/printf("%s %d %dn",,pcbj.priority,pcbj.runtime);if(x=4)printf("-终止进程-n"); printf("请输入你要终止的进程:");scanf("%s",name);for(i=0;i<k;i+)if(strcmp(,name)=0)t=i;
13、for(j=t;j<k;j+)strcpy(,pcbj+1.name); pcbj.priority = pcbj+1.priority; pcbj.runtime = pcbj+1.runtime; k=k-1;if(strcmp(,name)=0) t=i;for(j=t;j<r;j+)strcpy(,pcb1j+1.name); pcb1j.priority = pcb1j+1.priority; pcb1j.runtime = pcb1j+1.runtime;r=r-1;printf("就绪进程:n&quo
14、t;);for(j=0;j<k;j+)printf("%s %d %dn",,pcbj.priority,pcbj.runtime);printf("堵塞进程:n");for(j=0;j<r;j+)printf("%s %d %dn",,pcb1j.priority,pcb1j.runtime);if(x=5)printf("-显示进程-n");printf("就绪进程:n");for(j=0;j<k;j+)printf("%s
15、%d %dn",,pcbj.priority,pcbj.runtime);printf("堵塞进程:n");for(j=0;j<r;j+)printf("%s %d %dn",,pcb1j.priority,pcb1j.runtime); 程序运行结果及分析 1) 运行结果实验感想: 通过设计并调试创建、终止、阻塞、唤醒原语功能,加深了对操作系统中进程控制功能的理解,并且掌握操作系统模块的设计方法和工作原理。更重要的是理解了操作系统的调度方法是就绪-运行-堵塞-唤醒-结束的过程。 实验二、模拟进程调度
16、功能实验目的: 通过本实验,进一步掌握进程调度的功能和实现原理。实验内容:1、 设计进程调度功能,至少模拟两种以上调度算法。如:优先级调度算法、时间片调度算法等。2、 进程调度功能作为一个函数scheduler,加入到实验题目一中。3、 进程调度程序从就绪队列中挑选进程,若队列为空,应显示“无就绪进程无法调度”的提示信息。4、 若选上一个进程,以显示:进程名、状态、时间片、优先级等信息表示一个进程被执行。若运行完,应删除相应PCB。实验步骤:1、 在实验题目一中的主菜单中加入一个菜单项:6 调度,选择该菜单项后,系统进入进程调度。2、 进程调度的结构:进程调度子菜单0-返回主菜单1-优先级调度
17、2-时间片调度请选择您需要的功能选项:读入选择=x=xX=? = 0 = 2转时间片调度算法转优先级调度算法返回上级菜单= 1 实验代码:#include <stdio.h>#include<string.h>void priority();void time();struct PCB char name4; int priority; int runtime; ;struct PCB pcb5;int q=5;void main() int p,i;strcpy(,"p1");/序列队列,优先级由高到低为1,2,3.pcb0.pr
18、iority = 2;pcb0.runtime = 3;strcpy(,"p2");/序列队列pcb1.priority = 3;pcb1.runtime = 2;strcpy(,"p3");/序列队列pcb2.priority = 1;pcb2.runtime = 4;strcpy(,"p4");/序列队列pcb3.priority = 5;pcb3.runtime = 6;strcpy(,"p5");/序列队列pcb4.priority =
19、 4;pcb4.runtime = 5;printf("-进程调度子菜单-n");printf(" 0-退出系统n");printf(" 1-优先级调度n");printf(" 2-时间片调度n"); printf("nn显示所有进程n");for(i=0;i<5;i+)printf("%s %d %dn",,pcbi.priority,pcbi.runtime);printf("请选择您需要的功能选项:");scanf("
20、;%d",&p);printf("*n");while(1)if(p=0)break;switch(p)/case 0:/break;case 1:printf("优先级调度算法n");priority();break;case 2:printf("时间片调度算法n");time();break;printf("请选择您需要的功能选项:");scanf("%d",&p);printf("*n");void priority()int i,j;int
21、t=0,r=0;/int q=5; char name2=" "for(i=0;i<q-1;i+)for(j=i;j<q;j+)if(pcbi.priority>pcbj.priority) strcpy(name,); strcpy(,); strcpy(,name); t=pcbi.priority; pcbi.priority=pcbj.priority; pcbj.priority=t; r=pcbi.runtime; pcbi.runtime=pcbj.runtime; pc
22、bj.runtime=r;printf("按优先级高低进行排序n");for(i=0;i<q;i+)printf("%s %d %dn",,pcbi.priority,pcbi.runtime);printf("*n");printf("显示优先级最高的进程n"); printf("%s %d %dn",,pcb0.priority,pcb0.runtime);for(i=0;i<q;i+)strcpy(,pcbi+1.name)
23、; pcbi.priority = pcbi+1.priority;pcbi.runtime = pcbi+1.runtime;printf("*n");printf("使最高优先级进程处于执行状态(撤销该进程)n");for(i=0;i<q-1;i+)/撤销进程printf("%s %d %dn",,pcbi.priority,pcbi.runtime);q=q-1;void time() int i,j,t; /int q=5;for(i=0;i<q;i+)printf("%s %d %dn
24、",,pcbi.priority,pcbi.runtime);for(i=0;i<q;i+)pcbi.runtime = pcbi.runtime-1; printf("*n");printf("将每个执行进程的执行时间减去一个时间片。n");for(i=0;i<q;i+)printf("%s %d %dn",,pcbi.priority,pcbi.runtime);for(i=0;i<q;i+)if(pcbi.runtime<=0)t=i;for(j=t;j<
25、;q;j+)strcpy(,pcbj+1.name); pcbj.priority = pcbj+1.priority; pcbj.runtime = pcbj+1.runtime; q=q-1;printf("*n");printf("将进行结束的进程撤销。n");for(i=0;i<q;i+)printf("%s %d %dn",,pcbi.priority,pcbi.runtime);程序运行结果及分析 实验感想:通过本实验,我进一步掌握进了程调度的功能和实现原理。熟练掌握了两种进程调度
26、算法的应用,相信这对以后进一步学习操作系统、信息系统的开发都有很大的好处。实验三:模拟动态分区首次适应分配和回收算法实验目的:通过本实验,可加深理解动态分区分配、回收程序的功能和具体实现,特别是对回收分区的合并的理解。实验内容:1、 设计动态分区首次适应分配、回收算法。2、 设计“未分配区说明表”,格式为:序号始址长度状态160k200103、 设计“已分配区说明表”,格式为:作业名始址长度状态004、 设计显示程序,将“未分配区说明表”和“已分配区说明表”的内容,显示在屏幕上。初始分配从一个空闲区分配起,回收时要合并空区。实验步骤:1、 系统要求分配一个分区时,应输入:作业名、作业长度。2、
27、 回收一个分区时,应输入:回收的作业名。回收的分区请注意是否需要进行合并。实验代码:#include <STDIO.H>#include <STDLIB.H>int MAX_SEGMENT=10;/最大碎片值struct Partition/分区表目int Par_Size;/分区大小int Par_No;/分区序号或者名字int Addr;/分区地址int IsUse;/分区使用情况,0表示空闲,1表示使用Partition *pri;/前向指针Partition *next;/后向指针;Partition * Int()/函数,返回Partition类型指针/初始化
28、空闲分区表Partition *list,*H,*H1;list=(struct Partition *)malloc(sizeof(struct Partition);/malloc申请动态分配空间list->next=NULL;H=list;if(!list)printf("n错误,内存初始化分配失败!程序结束");exit(1);H1=(struct Partition *)malloc(sizeof(struct Partition);printf("请预先输入分区总大小(以KB为单位):");scanf("%d",&a
29、mp;H1->Par_Size);H1->Addr=0;H1->Par_No=0;H1->IsUse=0;H1->pri=H;H1->next=NULL;H->next=H1;/list->H1return list;Partition * InitFP()/初始化已分配分区表Partition *FP,*F,*H;int i;FP=(struct Partition *)malloc(sizeof(struct Partition);FP->next=NULL;H=FP;for(i=0;i<10;i+)/已分配区先暂定分配十个表目F
30、=(struct Partition *)malloc(sizeof(struct Partition);if(!F)printf("n错误,内存分配失败!程序结束");exit(1);F->Par_Size=0;F->Addr=0;F->Par_No=0;F->IsUse=0;F->next=NULL;H->next=F;F->pri=H;H=H->next;return FP;Partition * New_Process( Partition *list, Partition *FP)/为新的进程分配资源Partitio
31、n *H,*P,*H1;int Size,Name,L;H=list;H1=FP->next;H=H->next;printf("请输入新作业的名称和大小(整数)n");printf("作业名称:");scanf("%d",&Name);printf("作业大小(整数):");scanf("%d",&Size);while(H)if(!H)/表目已查完,无法分配printf("n已无空闲分区,本次无法分配!");return list;elseif
32、(H->IsUse=0)/空表目/if(H->Par_Size>=Size)/大小满足,空闲分区大小要分配的大小if(H->Par_Size>=Size)/大小满足,bool temp=false;if(H->Par_Size-Size)<=MAX_SEGMENT)/空闲分区大小-要分配的大小<碎片值,会产生碎片,将整块内存大小分配出去,Size=H->Par_Size;/分配的大小为整块内存temp=true;/会产生碎片/其他情况就分配大小为请求大小,不会产生碎片,L=H->Addr;/保存空闲分地址if(temp)printf(
33、"该次内存分配会产生碎片,将整块内存大小%d分配出去!",Size);elseprintf("该次内存分配不会产生碎片");break; H=H->next;/否则,继续往下查找if(H)if(H->Par_Size>Size)/大小满足,空闲分区大小要分配的大小P=(struct Partition *)malloc(sizeof(struct Partition);/分配新的表目,处理一条数据,分配一次内存P->IsUse=1;P->Addr=L;/指向空闲分区地址P->next=H;/修改指针H->pri-
34、>next=P;P->pri=H->pri;H->pri=P;P->Par_Size=Size;/分配大小为要请求分配的大小P->Par_No=Name;/名称H->Par_Size-=Size;/修改空闲分区,H所指区块大小减SizeH->Addr+=Size;/H所指区块地址加SizeelseH->IsUse=1;/大小相等的,把当前表项设置空表目while(H1)if(H1->IsUse=0)H1->Par_No=Name;H1->Par_Size=Size;H1->Addr=L;/保存已分配地址H1->
35、IsUse=1;/在已分配表中设置为已分配break;H1=H1->next;elseprintf("所申请资源已大过系统所拥有的,请重新输入!n");return list;Partition *Reclaim( Partition *list, Partition *FP)/结束作业,资源回收,No为作业名,回收内存 Partition * H1,*H2,*H3,*HF;/H1为释放区,H2为后分区,H3为前分区int No;/作业名H1=list;HF=FP;/可有可无?H1=H1->next;HF=FP->next;printf("请输入
36、您想结束的作业名:");scanf("%D",&No);while(HF)/对已分配表进行操作if(HF->Par_No=No)HF->IsUse=0;/标志为空表目break;/这时保存着HF所指分区的信息HF=HF->next;if(!HF)/如果找不到该作业,则提示出错printf("所输入的作业名称不正确,请重新输入!");elsewhile(H1)/对空闲表进行操作if(H1->Par_No=No)H1->IsUse=0;/标志为空表目printf("内存回收成功");brea
37、k;H1=H1->next;H2=H1->next;/后分区H3=H1->pri;/前分区if(H2&&H2->IsUse=0)/后接分区为空闲if(H2->next=NULL)/判断后接分区是否为尾结点H1->Par_Size+=H2->Par_Size;/把H2合并到H1H1->next=NULL;free(H2);printf("已回收%d大小内存",H1->Par_Size);else/后分区不为空闲,表示已经被使用H1->Par_Size+=H2->Par_Size;H1->n
38、ext=H2->next;H2->next->pri=H1;free(H2);printf("已回收%d大小内存",H1->Par_Size);if(H3&&H3->IsUse=0)/前分区为空闲分区,则合并去前分区H3->Par_Size+=H1->Par_Size;H3->next=H1->next;if(H1->next!=NULL)/若H1为尾结点H1->next->pri=H3;free(H1);printf("已回收%d大小内存",H1->Par_S
39、ize);return list;void Print( Partition *list, Partition *FP)/输出已分配分区和空闲分区 Partition *H1,*H2;H1=list->next;H2=FP;H2=H2->next;printf("*n");printf("*总分配分区表*n");printf("分区序号大小开始地址 状态n");while(H1)printf("%d%d%d",H1->Par_No,H1->Par_Size,H1->Addr);if(H
40、1->IsUse=1)printf("已分配n");elseprintf("空表目n");H1=H1->next;printf("*n");void Main_Print( Partition *list, Partition *FP)/主入口函数,进行菜单选择int op;while(1)printf("n-主菜单-n");printf("n");printf("1.申请新的作业,分配内存n");printf("2.结束作业,回收内存n");
41、printf("3.查看内存表n");printf("4.退出系统n");printf("n请选择<1-4>:");scanf("%d",&op);switch(op)/根据输入,选择分支方向case 1: New_Process(list,FP);break;case 2: Reclaim(list,FP);break;case 3:Print(list,FP);break;case 4:break;default:printf("n选择错误,请重新选择!");break;
42、if(op=4)break;/退出循环void main()/主函数入口struct Partition *list,*FP;list=Int();FP=InitFP();Main_Print(list,FP);程序运行结果及分析 实验感想: 通过本实验,加深了对动态分区分配、回收程序的功能和具体实现,特别是对回收分区的合并的理解。实验五:模拟使用银行家算法判断系统的状态实验目的:了解进程管理的实现方法,理解和掌握处理进程同步问题的方法。实验内容:实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算法。实验步骤:l 理解安全性算法和银行家算法的核心机制:l 理解进程的三状态调度过程,
43、及各状态间的转换关系;l 设计读者-写者问题的写者优先算法;实验代码:#include <stdio.h>#include <stdlib.h>#include <conio.h> # define m 50 int no1; /进程数int no2; /资源数int r;int allocationmm,needmm,availablem,maxmm; char name1m,name2m; /定义全局变量void main()void check();void print();int i,j,p=0,q=0;char c;int requestm,all
44、ocation1mm,need1mm,available1m;printf("-银行家算法-n"); printf("请输入进程总数:");scanf("%d",&no1);printf("请输入资源种类数:");scanf("%d",&no2); printf("请输入最大需求矩阵:n");for(i=0;i<no1;i+)for(j=0;j<no2;j+)scanf("%d",&maxij); /输入已知进程最大资源
45、需求量printf("请输入当前分配矩阵:n");for(i=0;i<no1;i+)for(j=0;j<no2;j+)scanf("%d",&allocationij); /输入已知的进程已分配的资源数 for(i=0;i<no1;i+)for(j=0;j<no2;j+)needij=maxij-allocationij; /根据输入的两个数组计算出need矩阵的值 printf("请输入可利用资源矩阵n");for(i=0;i<no2;i+)scanf("%d",&a
46、vailablei); /输入已知的可用资源数print(); /输出已知条件check(); /检测T0时刻已知条件的安全状态if(r=1) /如果安全则执行以下代码doq=0; p=0;printf("n请输入请求资源的进程号(04):n");for(j=0;j<=10;j+)scanf("%d",&i);if(i>=no1)printf("输入错误,请重新输入:n"); continue; else break;printf("n请输入该进程所请求的资源数requestj:n");for(j=0;j<no2;j+)scanf("%d",&requestj);for(j=0;j<no2;j+)if(requestj>needij) p=1; /判断请求是否超过该进程所需要的资源数if(p)printf("请求资源超过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 统编版三年级语文下册第八单元考点过关卷(含答案)
- 上海市虹口区2024-2025学年高一下学期期末化学试卷(含答案)
- 税务师备考课件下载
- 日常生活技能培训餐具使用篇
- 企业安全防范的新策略基于无人机的电机控制技术方案研究
- 学生隐私问题不仅仅是政策的问题-以科技助力其解决
- 应对学习压力与挑战的教育心理学策略
- 国际体育交流行业深度调研及发展项目商业计划书
- 亲子阅读与故事分享会企业制定与实施新质生产力项目商业计划书
- 古代乐器博物馆企业制定与实施新质生产力项目商业计划书
- 有限空间作业及应急物资清单
- DB13(J)∕T 8060-2019 城镇供热管道及设备安装工程施工质量验收标准
- 《国际商务》课程
- 压力容器设计管理制度
- 比亚迪员工手册54
- 国际经济学期末考试试题库含答案
- 应力波理论复习资料
- 基于PLC的音乐喷泉控制系统的设计-毕业设计
- 体育场地与设施
- 五年级部编版语文下学期修改病句专项强化练习题
- 民办非企业单位清算报告
评论
0/150
提交评论