操作系统实验报告-优先数调度算法_第1页
操作系统实验报告-优先数调度算法_第2页
操作系统实验报告-优先数调度算法_第3页
操作系统实验报告-优先数调度算法_第4页
操作系统实验报告-优先数调度算法_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、江西师范大学计算机信息工程学院学生实验报告 专业 网络工程一班 姓名 学号 日期 2015年4月12日 课程名称操作系统实验室名称X4313 实验名称 优先数调度算法指导教师 实验目的在多道程序或者多任务系统中,同时处于就绪态的进程有若干个。在单处理器系统中,处于运行态的进程最多只有一个,也就是说能运行的进程数远小于就绪态进程个数,所以必须进行进程调度,按照一定的调度算法,即依照某种原则或策略从就绪态队列中选中进程占用处理器。本实验要求学生设计一个优先数调度算法来模拟实现处理器调度过程。实验原理和内容 (1)假定进程控制块中包含内容为:进程名链接指针进程的优先数估计运行时间进程状态其中进程名即

2、进程标示符;链接指针是按照进程到达进程就绪队列的时间链接进程的优先数由用户自己指定,并且优先数值越小,优先级越高,调度时,总是选择优先级高的进程占用CPU;估计运行时间可由设计者任意指定一个时间值;进程状态:为简单起见,仅记录进程的就绪(用R表示)状态。 (2)根据需要,设计一个队首指针指向5个进程(进程名为A,B,C,D,E)组成的就绪队列中的第一个进程,再设一个当前指针指向当前正在运行的进程。 (3)进程调度时,采用静态优先调度。 (4)用非抢占式方式分配处理器。 (5)要求所设计的程序必须有输出语句,用于输出进程调度和运行一次后进程的变化。比如:每次被选中的进程名,就绪队列中进程的排队情

3、况,进程控制块的动态变化。实验步骤#include #include #include #include struct PCB /定义一个进程结点数据域char name3; /进程名int run_time; /运行时间 int level; /优先数char state; /运行状态struct PCB *next; /指向下一个结点的指针;struct PCB *creat() /创建一个函数,用于返回一个链表int i = 1; int time, slevel; /用来存储用户输入struct PCB *head, *tail, *temp, *previous; /申明指针char

4、 PCB_name53 = P1, P2, P3, P4, P5; /初始化进程名数组temp = (struct PCB *)malloc(sizeof(struct PCB); /给temp指针分配内存printf(请输入第1个结点的优先数: );scanf(%d, &slevel);printf(请输入第1个结点的运行时间: );scanf(%d, &time);temp-level = slevel; /将输入的优先数赋值给temp结点的优先数strcpy(temp-name, PCB_name0); /将PCB_name0复制给temp结点temp-next = NULL; /tem

5、p结点的下一个为空temp-run_time = time; /获取输入的运行时间 temp-state = R; /运行状态为就绪head = tail = temp; /指向当前第一个结点while (i != 5) /i的初值为1,这里不等于5,意思就是继续添加四个结点temp = (struct PCB *)malloc(sizeof(struct PCB); /分配一段新的内存给tempprintf(请输入第%d个结点的优先数: , i + 1);scanf(%d, &slevel);printf(请输入第%d个结点的运行时间: , i + 1);scanf(%d, &time);t

6、emp-level = slevel; /同上strcpy(temp-name, PCB_namei);temp-run_time = time;temp-state = R;if (temp-level head-level) /比较当前定义的结点的优先数与head的优先数,同时head指向的结点的优先数是最大的temp-next = head; /如果前定义的结点的优先数与head的优先数大,则head指向当前定义的结点head = temp;elseprevious = head;while (previous-next != NULL) /如果比优先数最大的结点小,则继续与后面的节点进

7、行比较,知道找到一个合适的位置,即为比前面结点的优先数大,比后面的小if (temp-level level) & (temp-level = (previous-next)-level)temp-next = previous-next; /交换两个结点的位置 previous-next = temp;break;elseprevious = previous-next; /实现往后移if (previous-next = NULL) /如果没有找到比当前结点小的,则将当前结点放在最后面tail-next = temp;temp-next = NULL;tail = temp; i+;ret

8、urn (head); /返回一个链表的头结点void display(struct PCB *p) /用于输出当前链表中各结点的状态 while (p != NULL)printf(t%s, p-name);printf(t%d, p-run_time);printf(t%d, p-level);printf(t%c, p-state);printf(t%sn, p-next-name);p = p-next; /实现往后移int main( void )struct PCB *head, *tail, *p;head = creat(); /调用函数creat,head指向头结点p = h

9、ead;tail = p;printf(初始进程的情况: n);display(p); /显示当前结点的情况while(head-next != NULL) /判断当前链表中的结点是否不止一个 struct PCB *q = head;struct PCB *previous;tail = head;while (tail-next != NULL) /将tail指针指向尾结点tail = tail-next;printf(最新进程调度的情况: n);printf(%s-,head-name); /输出最近调用的进程名display(q); /显示当前调用情况head-level-; /优先数

10、减1head-run_time-; /运行时间减1if(head-run_time state = E;head = head-next;elseprevious = head; /判断其他情况p = previous-next;if (previous-level p-level) /如果当前运行过的结点的优先数仍然是最大的,跳出本次循环continue;elsewhile (p-next != NULL) /否则,在链表中重新找到当前运行结点的位置/这个用于判断,运行过的结点与后面的比较情况是否为比前一个结点的优先数大比后一个结点的优先数小,如果是,将该节点插入其中,否则,往后移,直到找到

11、一个这样的位置,或者运行到链表结束if (previous-level level) & (previous-level = p-next-level)head = previous-next;previous-next = p-next;p-next = previous;break;elsep = p-next; /实现往后移if (p-next = NULL) /如果p-next为空的话,表示当前运行的结点的优先数最小,则将它放在链表的尾部head = previous-next;tail-next = previous;previous-next = NULL;if (head-next = NULL) /如果当前链表中只存在一个结点则进入判断内部 while (head-run_time !=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论