进程调度.docx
- 文档编号:7499883
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:13
- 大小:135.07KB
进程调度.docx
《进程调度.docx》由会员分享,可在线阅读,更多相关《进程调度.docx(13页珍藏版)》请在冰豆网上搜索。
进程调度
湖南科技学院计算机与信息科学系
实验报告
实验名称
进程调度
课程名称
计算机操作系统
所属系部班级
计科0902班
时间
2011年12月1日第3,4节
地点
E305
姓名
姜泽政
学号
200908001217
成绩
本组成员
(一人一组)
一、实验要求
1、复习进程的状态及其转换;
2、深入理解同步与互斥的概念及p、v操作;
3、上机前仔细阅读参考程序,并在参考程序的基础上,对程序作相应的修改;给出实验数据与结果
二、实验目的
进程调度时进程管理的主要内容之一,通过设计,编制,调试一个简单的进程调度模拟系统,对进程调度,进程运行状态变换及PV操作加深理解和掌握。
三、实验环境
每人一台电脑,在下实现。
四、实验内容
1、模拟批处理多道操作系统的进程调度;采用剥夺式优先算法,对三个进程进行模拟调度
2、模拟实现同步机构避免并发进程执行时可能与时间相关的错误;模拟PV操作同步机构,用PV操作解决进程进入临界区的问题。
五、实验程序数据结构
1,进程控制块PCB
Struct{
Intid;
Charstatus;
Intpriorrty;
Intwaiter1;
}
2,信号量
Struct
{
Intvalue;
Intwater2;
}sem[2]
3,现场保护栈
Charstack[11][4]
每个进程都有一个为10个字的现场保护栈,用来保护被中断时的断点地址等。
以及全局变量
Inti;charaddr;intm1,m2;
六、实验输入数据
输入进程:
输入PCB参数
3,4,,5进程以此类推。
七、实验输出数据与分析总结
按任意键开始一次时间片调度:
进行了一次进程调度轮回,每一个进程公平的获得了一定时间的CPU使用。
进程全部运行完毕,正常退出。
实验结果的分析及说明
实验结果很明显的看出时间片轮转片算法的实质,即每一个进程按顺序公平的获得一定的CPU使用时间,如果没有运行结束,那么它将排到队尾等待下一次调度。
等待队列中的进程也会有次序的排队等待调度。
八、教师评语
教师签字:
年月日
程序中源程序和可执行程序:
voidmain();/*主函数,用来进行调度操作*/
voidnewPCB();/*建立PCB块并将他们组成一个队列*/
voidpushPCB();/*将新的PCB块放到链表末尾*/
voidshowPCB();/*调度一次时间轮转算法并显示*/
voidpinrtSort();/*排序输出各个进程的PCB*/
代码清单:
/*
本程序实现模拟进程的时间片轮转调度算法,即每一个进程按照在队列中的顺序平均获得cpu执行时间,
如未能在时间片中完成,则该进程回到队尾等待调度,直到运行完毕
Authorjuju
*/
#include
#include
#include
#include
staticintid=0;
intprocess_num;
intcurrent_process;
structpcb
{
charname[20];
intid;
charstate;
intneed_time;
intrun_time;
structpcb*next;
}*p,*q,*first_pcb=NULL;
typedefstructpcbPCB;
/*排序输出各个进程PCB*/
voidprintSort()
{
inti;
q=first_pcb;
for(i=0;i if(i==q->id){ printf("|%s\t\t|%d\t\t|%c\t\t|%d\t\t|%d\n",q->name,q->id,q->state,q->need_time,q->run_time); i++; q=first_pcb; }else{ q=q->next; if(q==NULL){ q=first_pcb; i++; } } } } /*调度一次PCB并显示*/ voidshowPCB() { inti; first_pcb->run_time++; first_pcb->state='r'; /*进程执行完毕,将其清除出链表*/ if((first_pcb->run_time)==(first_pcb->need_time)){ current_process--; printf("进程%s已经运行完毕",first_pcb->name); system("pause"); first_pcb=first_pcb->next; if(first_pcb==NULL){ printf("所有进程都已经运行完毕"); system("pause"); return; } first_pcb->state='r'; } system("cls"); /*显示运行的进程和就绪的进程*/ q=first_pcb->next; printf("-------当前运行的进程是: 进程%s\n\n",first_pcb->name); printf("-------在等待队列的进程是: "); while(q! =NULL){ printf("进程%s",q->name); q=q->next; } /*显示相应的PCB块*/ printf("\n\n------------------------------进程详细PCB------------------------------------"); printf("\n\n|进程名\t\t|进程ID\t\t|进程状态\t|进程所需时间\t|进程运行时间\n"); printSort(); /*进行一次时间片轮换调度算法,将队首的进程放到队尾,之前第二位进程获得cpu时间片*/ q=first_pcb; while(q->next! =NULL){ q=q->next; } first_pcb->state='w'; q->next=first_pcb; first_pcb=first_pcb->next; q->next->next=NULL; printf("\n"); printf("运行调度"); system("pause"); } /*将新的PCB块放到链表末尾*/ voidpushPCB(inti) { q->next=p; q=p; if(i==process_num-1)q->next=NULL; } /*建立PCB块并将他们组成一个队列*/ voidnewPCB() { inti; printf("请输入进程数: "); scanf("%d",&process_num); q=(PCB*)malloc(sizeof(PCB)); first_pcb=(PCB*)malloc(sizeof(PCB)); for(i=0;i system("cls"); p=(PCB*)malloc(sizeof(PCB)); printf("请输入第%d个进程名: ",id+1); scanf("%s",p->name); printf("请输入进程需要的运行时间: "); scanf("%d",&p->need_time); p->id=id++; p->run_time=0; p->state='w'; if(i==0){ first_pcb=q=p; p->next=NULL; } elsepushPCB(i); } } voidmain() { newPCB(); current_process=process_num; printf("按任意键开始进程调度\n"); system("pause"); while(current_process){ showPCB(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度