广工操作系统实验报告.docx
- 文档编号:30022457
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:55
- 大小:407.34KB
广工操作系统实验报告.docx
《广工操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《广工操作系统实验报告.docx(55页珍藏版)》请在冰豆网上搜索。
广工操作系统实验报告
操作系统实验报告
学院_____计算机学院_______
专业______软件工程________
班级______________
学号____________
姓名________________
指导教师
(2010年10月)
学号:
姓名:
协作者:
________
实验__一__题目__进程调度___第周星期___
一、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验内容和要求
编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。
·每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行的时间、已用CPU时间、进程状态等。
·进程的优先数以及需要的运行时间事先由人为指定(也可以随机数产生)。
·如果运行一个时间片后进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果还未达到,则把它送回队尾。
三、实验主要仪器设备和材料
实验环境
硬件环境:
IBM-PC或兼容机
软件环境:
C语言编程环境
四、实验原理及设计方案
1、实验原理
将程序顺序的输入进程队列后,开始执行程序,当运行了一个时间片后,如果进程所占的CPU时间达到所需的运行时间时,该进程完成,并撤销该进程,否则则把进程送回队尾。
2、设计方案
用一个进程控制块(PCB)表示进程。
输入进程名称,优先级,运行时间后,通过模拟系统对进程采用“轮转法”调度,得到各个时间片进程的运行情况。
3、相关数据结构的说明
structpcb//定义进程控制块PCB
{
charname[10];//进程名称
charstate;//进程当前状态
intsuper;//进程优先级
intntime;//进程运行所需时间
intrtime;//进程已运行时间
structpcb*link;//连接到队列中下一个进程的指针
}
4、程序流程图(详细)
5、给出程序中源程序名和可执行程序名。
源程序名:
pcb.cpp
可执行程序名:
pcb.exe
输入数据:
in.txt
输出数据:
out.txt
6、程序清单(源程序中要附有详细的注释)
#include
#definegetpch(type)(type*)malloc(sizeof(type))
structpcb//定义进程控制块PCB
{
charname[10];//进程名称
charstate;//进程当前状态
intsuper;//进程优先级
intntime;//进程运行所需时间
intrtime;//进程已运行时间
structpcb*link;
}*ready,*p,*rear;
typedefstructpcbPCB;
voidpush()//建立将进程按FCFS排入队列的函数
{
rear->link=p;
rear=p;
p->link=NULL;
p->state='w';//插入队尾后把状态改成'w'
}
voidinput()//建立进程控制块函数
{
inti,num;
printf("请输入进程数量");
scanf("%d",&num);
p=getpch(PCB);//给p分配空间
for(i=0;i { printf("\n进程号No.%d",i); p=getpch(PCB); printf("输入进程名: "); scanf("%s",p->name); printf("输入进程优先等级: "); scanf("%d",&p->super); printf("输入进程所需运行时间: "); scanf("%d",&p->ntime); p->rtime=0;//为进程的已运行时间初始化为0 p->state='w';//为进程的状态初始化为'w' p->link=NULL; push(); } } voiddisp(PCB*pr)//建立进程显示函数 { printf("\nqname\tstate\tsuper\tndtime\truntime\n"); printf("|%s\t",pr->name); printf("|%c\t",pr->state); printf("|%d\t",pr->super); printf("|%d\t",pr->ntime); printf("|%d\t",pr->rtime); printf("\n"); } voidcheck()//建立进程查看函数 { system("cls"); PCB*pr; pr=ready->link; while(pr! =NULL)//队列从头到尾显示进程 { disp(pr); pr=pr->link; } } voiddestroy()//建立进程撤消函数 { disp(p); printf("\n进程[%s]已完成。 \n",p->name); free(p);//释放p } voidrunning()//建立进程就绪函数 { p->rtime++;//已运行时间增加 if(p->rtime==p->ntime)//当已运行时间等于所需运行时间时 { p->state='f';//状态更新为'f' ready->link=p->link; destroy();//调用destory()函数,释放p p=ready->link; system("pause");//暂停,可了解当前状态 } else//如果进程还没达到所需运行时间,则把进程送入队尾 { ready->link=p->link; push(); p=ready->link; } } intmain()//主函数 { intt=0;//定义t表示已用的时间片 rear=getpch(PCB);//为rear分配内存 ready=rear;//把ready指向rear input();//输入进程 p=ready->link; check(); while(ready->link)//当进程队列中还有进程时运行 { t++; p->state='r';//将进程状态设置为ready check(); printf("第%d个时间片: ",t); printf("正在运行\n"); system("pause");//显示正在运行的进程队列 running(); check(); printf("第%d个时间片: ",t); printf("运行完成\n"); system("pause");//显示运行完成后的进程队列 } printf("\n全部进程已运行完成! \n"); system("pause"); return0; } 五、实验结果及分析 1、运行结果(要求截图)(能动态说明执行结果)(要求截图尺寸大小适中) (1)输入数据 (2)开始运行,进程队列如图 (3)经过3个时间片,进程【333】完成 (4)经过9个时间片,进程【555】完成 (5)经过10个时间片,进程【111】完成 (6)经过12个时间片,进程【444】完成 (7)经过13个时间片,进程【222】完成 (8)全部进程运行完成 2、实验结果的分析及说明 程序输出与编写程序的目的一致,直观的反应了轮转法进程调度的运行规则,显示了完成各个进程运行所需要的时间,以及各个进程完成的顺序。 六、调试总结及心得体会 (调试过程中小结、所遇问题及解决方法、心得体会) 整个调试过程中并未遇到太大的问题,程序编写过程也很顺利,运行程序模拟进程调度之后,更直观的了解了轮转法进程调度的过程。 七、思考题 1、分析不同调度算法的调度策略,比较不同调度算法的优缺点,总结它们的适用范围。 答: 动态有限权算法: 动态优先权是指在创建进程时所创建的优先权,会随进程的推进或者等待时间的增加而改变,以便获得更好的调度性能。 处理机为每个进程分配一定的时间片,在就绪队列中,优先权高的进程将优先获得处理机,进程在进去运行完响应的时间片后,如没完成,优先权减1,从新回到就绪队列等待分配处理机。 时间片的轮转法: 系统将所有进程排成一个队列,按照先来先服务的原则,对队列首的进程进行处理,每个进程在用完自己的时间片后,从新回到队尾进行排队。 每运行一次,进程的需要时间减1,直到就绪队列为空! 学号: 姓名: 协作者: ________ 实验__二__题目__作业调度___第周星期___ 一、实验目的 本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。 二、实验内容和要求 作业调度算法: 采用基于先来先服务的调度算法。 可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个 作业的资源要求。 三、实验主要仪器设备和材料 硬件环境: IBM-PC或兼容机 软件环境: C语言编程环境 四、实验原理及设计方案 1、实验原理 采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效率。 作业调度从系统已接纳的暂存在输入井中的一批作业中挑选出若干个可运行的作业,并为这些被选中的作业分配所需的系统资源。 对被选中运行的作业必须按照它们各自的作业说明书规定的步骤进行控制。 2、设计方案 (1)作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。 作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。 但有时系统中现有的尚未分配的资源既可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出选择。 先来先服务算法是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。 (2)假定某系统可供用户使用的主存空间共100k,并有5台磁带机。 3、相关数据结构的说明 structtime//定义一个时间结构体 { inth; intm; }t; structjcb//定义一个作业结构已 { charname[10];//作业名称 structtimesubmittime;//提交时间 structtimestarttime;//开始时间 structtimeneedtime;//需要运行的时间 structtimefinishtime;//完成时间 charstate;//状态 structjcb*link;//连接到下一个作业的指针 }; 4、程序流程图(详细) 5、给出程序中源程序名和可执行程序名。 源程序名: jcb.cpp 可执行程序名: jcb.exe 输入数据: in.txt 输出数据: out.txt 6、程序清单(源程序中要附有详细的注释) #include #include #definegetpch(type)(type*)malloc(sizeof(type)) structtime//定义一个时间结构体 { inth; intm; }t; structjcb//定义一个作业结构已 { charname[10];//作业名称 structtimesubmittime;//提交时间 structtimestarttime;//开始时间 structtimeneedtime;//需要运行的时间 structtimefinishtime;//完成时间 charstate;//状态 structjcb*link;//连接到下一个作业的指针 }*ready,*p,*rear; typedefstructjcbJCB; intnum; voidpush()//建立将进程按FCFS排入队列的函数 { rear->link=p; rear=p; } voiddisp(JCB*pr)//建立作业显示函数 { printf("\nname\tstate\tsubmittime\tneedtime\tstarttime\tfinishtime\ttime\n"); printf("|%s\t",pr->name); printf("|%c\t",pr->state); printf("|%d: %d\t\t",pr->submittime.h,pr->submittime.m); printf("|%d: %d\t\t",pr->needtime.h,pr->needtime.m); printf("|%d: %d\t\t",pr->starttime.h,pr->starttime.m); printf("|%d: %d\t\t",pr->finishtime.h,pr->finishtime.m); printf("|%d: %d\t\t",pr->finishtime.h-pr->submittime.h,pr->finishtime.m-pr->submittime.m); printf("\n"); } voidinput()//建立作业控制块函数 { inti; printf("请输入作业数量"); scanf("%d",&num); p=getpch(JCB);//给p分配空间 for(i=0;i { p=getpch(JCB); printf("输入作业名: "); scanf("%s",p->name); printf("输入作业提交时间(h: m): "); scanf("%d: %d",&p->submittime.h,&p->submittime.m); printf("输入作业所需运行时间(h: m): "); scanf("%d: %d",&p->needtime.h,&p->needtime.m); printf("\n"); p->state='w';//为作业的状态初始化为'w' p->link=NULL; push(); p=NULL; } } voidrunning()//建立作业就绪函数 { if(p->submittime.h { p->starttime.h=t.h;//当提交时有程序在运行 p->starttime.m=t.m;//则开始时间等于上一程序运行完成时间 } else//否则开始时间等于提交时间 { t.h=p->submittime.h; t.m=p->submittime.m; p->starttime.h=t.h; p->starttime.m=t.m; } t.h=p->needtime.h+t.h; t.m=p->needtime.m+t.m; if(t.m>=60) { t.h++; t.m-=60; } p->finishtime.h=t.h; p->finishtime.m=t.m; p->state='f'; push(); } intmain()//主函数 { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); inti; rear=getpch(JCB); ready=getpch(JCB); rear=ready; input(); p=ready->link; t.h=p->submittime.h; t.m=p->submittime.m; printf("\n"); for(i=0;i { running(); disp(p); p=p->link; } p=ready->link; system("pause"); return0; } 五、实验结果及分析 1、运行结果(要求截图)(能动态说明执行结果)(要求截图尺寸大小适中) 输入数据: 输出结果: 2、实验结果的分析及说明 根据实验输入,输出了运行后各个作业的开始时间,完成时间以及周转时间。 六、调试总结及心得体会 (调试过程中小结、所遇问题及解决方法、心得体会) 有了第一个实验的基础,在这个实验中,除了在处理小时与分钟的转换上花费了点时间之外,其余的部分都完成的比较顺利。 七、思考题 1、写出每种算法的调度策略,最后比较各种算法的优缺点。 答: 先来先服务算法是根据作业的进入时间来排序,到达时间短的先运行,优点是实现简单,缺点是运行时间慢。 短作业优先算法是根椐作业的估计运行时间来排序,估计运行时间短的先运行,优点是运行时间快,缺点是实现起来比较复杂。 2、选择调度算法的依据是什么? 答: 如果作业要求的速度不高,而且作业比较小型,那就最好用先来先服务算法。 如果作业要求的速度高,作业流程复杂,那就最好用短作业优先算法。 学号: 姓名: 协作者: ________ 实验__四__题目主存空间的分配和回收_第周星期__ 一、实验目的 熟悉主存的分配与回收。 理解在不同的存储管理方式下,如何实现主存空间的分配与回收。 掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。 所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。 所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。 当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。 随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、循环首次适应算法、最佳适应算法三种算法来实现主存的分配与回收。 同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 硬件环境: IBM-PC或兼容机 软件环境: VC++6.0 四、实验原理及设计方案 1、实验原理 在该算法中,把主存中所有空闲区按其物理地址递增的次序排列。 在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足要求的空闲区,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区表或链中。 2、设计方案 (1)初始化空闲分区; (2)反复对现有的空闲分区进行进程创建和撤消,即内存分配和回收; (3)退出。 3、相关数据结构的说明 structzone { intsize;//区域的大小 intstate;//区域的状态 charname[10];//区域的名称 structzone*link;//连接到下一区域的指针 }; 4、程序流程图(详细) 5、给出程序中源程序名和可执行程序名。 源程序名: memory.cpp 可执行程序名: memory.exe 输入数据: in.txt 输出数据: out.txt 6、程序清单(源程序中要附有详细的注释) #include #include #defineMAX5 structpage//定义一个页表page { intnum;//页号 charimformation[100];//页表信息 page*next;//指向下一个页表的指针 }*address,*memory;//定义一个指令地址指针和主存指针 voidprint(page*pp)//输出页表 { printf("num: \t%d\n",pp->num); printf("imformation: \t%s\n\n",pp->imformation); } voidAddToAddress()//向指令地址添加页表 { inta; page*p,*pp; p=address; while (1) { printf("pleaseinputnum: "); scanf("%d",&a); if(a) { pp=(page*)malloc(sizeof(page));//分配内存空间 pp->num=a; printf("pleaseinputimformation: "); scanf("%s",pp->imformation); pp->next=NULL; p->next=pp;//把页表连接到address后 p=pp; print(p); pp=NULL; free(pp); } else { return; } } } voidinit()//初始化程序,为address和memory分配内存空间 { address=(page*)malloc(sizeof(page)); memory=(page*)malloc(sizeof(page)); Add
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告