编程进程或作业先来先服务高优先权按时间片轮转调度算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编程进程或作业先来先服务高优先权按时间片轮转调度算法
学生实验报告姓名:年级专业班级 10 级计算机3 班日期 201 2 年 12 月 9 日成绩课程名称计算机操作系统实验名称 2 编程进程或作业先来先服务、权、按时间片轮转调度算法(4 课时)实验类型验证设计综合创新【实验目的、要求】(1)通过编写程序实现进程或作业先来先服务、权、按时间片轮转调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。

(2)了解Windows2000/XP 中进程(线程)的调度机制。

(3)学习使用Windows2000/XP 中进程(线程)调度算法,掌握相应的与调度有关的Win32 API 函数。

【实验内容】在Windows XP、Windows 2000 等操作系统下,使用的VC、VB、java 或C 等编程语言,利用相应的WIN32 API 函数,编写程序实现进程或作业先来先服务、权、按时间片轮转调度算法。

【实验环境】(含主要设计设备、器材、软件等)一台计算机及c++软件【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)1、进程调度算法:采用多级反馈队列调度算法。

其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS 原则排队等待高度。

当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS 原则等待调度执行,以此类推。

2、实验步骤: (1)按先来先服务算法将进程排成就绪队列。

(2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。

(3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。

(4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。

(5)重复步骤(2)、(3)、(4),直到就绪队列为空。

3、流程图:进程完成,撤消该进程就绪队列首进程投入运行时间片到,运行进程已占用CPU 时间+1 运行进程已占用 CPU 时间已达到所需的运行时间把运行进程插入到下一个队列的队尾插入新的进程开始初始化PCB,输入进程信息所有队列都为空各进程按FCFS 原则排队等待调度是是4、代码:#include#include#include#define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 #define TIME 2//时间片长度typedef struct pcb{//进程管理块 char name[10];//进程名字 char state; //进程状态 int queue; //进程所在的队列 int ntime; //进程需要运行的时间int rtime; //进程已经运行的时间 int etime; //进程在本队列可运行的时间片 struct pcb *link; }PCB; PCB *ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL; //就绪队列,进程插入位置的变量 int geti() //使用户仅能输入整数退出程序 { char ch; int i = 0; fflush(stdin); ch = getchar(); while(ch == '\n'){ printf("\tf 输入不能为空..请重新输入\n"); fflush(stdin); ch = getchar(); } while(ch != '\n'){ if(ch > '9' || ch < '0'){ printf("\t 输入有误!!输入只能为正整数,请重新输入...\n"); fflush(stdin); i = 0; ch = getchar(); }else{ i = i*10 + (ch - '0'); ch = getchar(); } } return i; } void findpos()//更新状态量 { PCB *ps = pfend; if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1) pinsert = ps; else{ while (ps->link && ps ->link->queue != (pfend ->queue +2)) ps = ps->link; pinsert = ps; } } void insert()//插入进程{ if(!ready ){ ready = p; pfend = p; pinsert = p; }else if(ready ->queue
== 1){//第一队列存在 p->link = pfend->link; pfend->link = p; pfend = p; findpos(); } else{ p->link = ready; ready = p; findpos(); } } void input()/*建立进程控制块函数*/ { int i,num; printf("\n 请输入进程的个数?"); num = geti(); for(i=0; i < num; i++) { printf("\n 进程号No.%d:\n",i+1); p=getpch(PCB); printf("\n 输入进程名:"); scanf("%s",p->name); printf("\n 输入进程运行时间:"); p ->ntime = geti(); printf("\n"); p->rtime=0; p->state='w'; p->queue =1; p->etime = TIME; p->link=NULL; insert();/*调用insert 函数*/ } } void disp(PCB *pr)/*建立进程现实函数,用于显示当前进程*/ { printf("\nname\t state\t queue\t ntime\t rtime\t 在队列可停留时间\t \n"); printf("|%s\t",pr->name); printf(" |%c\t",pr->state); printf(" |%d\t",pr->queue); printf(" |%d\t",pr->ntime); printf(" |%d\t",pr->rtime); printf(" |%d\t",pr->etime); printf("\n"); } void check()/*建立进程查看函数*/ { PCB *pr; printf("\n ****当前正在运行的进程是:%s",ready->name);/*显示当前运行的进程*/ disp(ready); pr= ready ->link; printf("\n****当前就绪队列状态为:\n");/*显示就绪队列状态*/ while(pr!=NULL) { disp(pr); pr=pr->link; } } void sort()//调整进程队列{ if(!ready->link ||ready->queue < ready->link->queue) return; p = ready ->link; ready ->link = pinsert ->link; pinsert ->link = ready; pinsert = ready; ready = p; if (ready && ready -> queue == pinsert ->queue){ findpos(); } } void addnew()//添加新的进程 { if(ready ->queue != 1){ (ready -> queue)++; ready->etime *= 2; ready -> state='w'; sort();/*调用sort 函数*/ input(); } else{ input(); } } void destroy()/*建立进程撤销函数(进程运行结束,撤销进程)*/ { printf("\n 进程[%s]已完成.\n",ready->name); p = ready; ready = ready->link; free(p); if (ready && ready -> queue == pinsert ->queue) findpos(); } void running()/*建立进程就绪函数(进程运行时间到,置就绪状态)*/ { (ready -> rtime)++; ready ->etime --; if(ready->rtime == ready->ntime){ destroy(); return; }else if(ready ->etime == 0){ int time = 2; (ready -> queue)++; for(int i = 2; i != ready->queue; ++i) time *= 2; ready->etime = time; ready -> state='w'; sort();/*调用sort 函数*/ } } void main() { char ch; input(); while(ready != NULL) { printf("\nThe execute name:%s\n",ready ->name); ready ->state = 'R'; check(); running(); printf("\n 按i 键添加新进程....按其他任意键继续运行..."); fflush(stdin); ch = getchar(); if (ch == 'i'|| ch=='I') addnew(); } printf("\n\n 进程已经完成\n"); getchar(); } 5、结果过程及截图初始化队列输入所有进程后的进程信息如下:按Y 键继续运行进程:按Y 键继续运行进程: P1 需要运行两个时间片,本进程才离开此队列进程所在的逻辑队列 P1 需要运行1 个时间片,本进程才离开此队列运行若干次后的状态:添加新的进程: P1 加入到了第二个逻辑队列 P3 运行完毕了队列数越大,进程在次队列可停留的时间就越大【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见) 6、总结在这个多级反馈的实验中,我采取了用一条实际上的链表队列来模拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每个进程运行完后应该插入的地方,还有一个标志位Fend 用来表明新插入的队列的位置。

虽然实验原理很简单,但是在编
写代码的过程中遇到了不少的问题,在两个小时之内已经完成的大体代码的编写,但是之中存在不少的问题,导致了用了差不多四个小时的时间去调试才把它弄好,这主要归咎于在开始设计代码的不太合理,在后期使得代码结构有些混乱,使得调试更加的麻烦,以及对编程的不熟悉。

通过这个实验不仅使我对进程的调度算法有了更深的认识,使得理论知识得到的实践,也使我的编程能力得到了进一步提高。

指导教师签名: 20 年月日【备注】。

相关文档
最新文档