进程调度程序设计报告(源代码)剖析(3)

2020-02-22 12:45

FCFS算法输出

遇到的问题:

在设计程序时,在算法上面出现了一些错误,优先数不是由大到小排序,而是应该这样理解,当进程执行一个时间片时,优先数减一(使用CPU的时间变少,反而优先级高),因此,优先级高的优先数应该是比较小的,而不是优先数大的优先级大。在程序调试时,链表发生了错误,该内存不可写或者就是程序直接结束,但最终结果不是我想要的,经过一番折腾,最后发现,头指针和头结点混淆,有些地方没有给指针分配内存,语句的先后顺序不正确,以及没有考虑到链表最后没有设置结束标志。

六、结论与体会

做这个程序我断断续续的算下来应该总共用了2天,主要是花时间在观察别人的算法读别人的程序,然后才开始写自己的程序,期间参考了前人的程序并进行了改善和加工,这让我对进程调度的理解再次加深了,这是在平常学习的基础上,与程序相结合的过程,让我再次感受到编程给我们带来的无穷魅力,只要自己有兴趣,其实编程也是一件有趣的事,为了达到一定的要求,我们必须多次尝试用不同的方法去实现它,比如,进程调度有先来先服务算法,对于这个算法,可以用数组实现,也可以用链表实现,但是到底哪个更好哪个更灵活呢,相信学

11

过C语言的人都知道肯定是用链表实现最好了。这次设计还是有一些不足之处的,比如在算法和运行效率上还是有些欠缺的,需要进一步去改善程序代码,提高效率,减少冗余和错误,让使用者更清晰的观察和理解进程调度。

七、参考文献

[1]任爱华、罗晓峰. 操作系统实用教程(第三版)[M].北京:清华大学出版社,2009 [2]谌卫军、王浩娟. 操作系统[M]. 北京:清华大学出版社,2012.5

[3](日)前桥和弥(Maebasi Kazuya). 征服C指针[M]. 吴雅明译. 北京:人民邮电出版社,2013.2

附录:源程序

#include #include #include #include #include typedef struct node { char name[10]; //进程名 int prio; //进程优先数 int cputime; //进程占用CPU时间 int needtime; //进程到完成还要的时间 int arrivetime; //进程到达时间 int starttime; //进程开始时间 int finishtime; //进程完成时间 int servicetime; //进程服务时间 char state; //进程的状态 struct node *next; }PCB;

PCB *finish,*ready,*run; //队列指针 int N; //进程量 void firstin() { run=ready; //就绪队列头指针赋值给运行头指针 run->state='R'; //进程状态变为运行态 ready=ready->next; //就绪对列头指针后移到下一进程 }

void prt1(char a) { switch(a)

12

{ case 1: /*优先数法*/ printf(\名字\\t进程占用CPU时间\\t需要的时间\\t优先级数\\t状态\\n\ case 2: /*先来先服务算法*/ printf(\名字\\t到达时间\\t开始时间\\t服务时间\\t完成时间\\t状态\\n\ default:break; } }

void prt2(char a,PCB *q) { switch(a) { case 1: printf(\ break; case 2: printf(\e,q->finishtime,q->state); break; default:break; } }

void prt(char algo) { PCB *p; prt1(algo); //输出文字格式 if(run!=NULL) //如果运行指针不空 prt2(algo,run); //输出当前正在运行的PCB p=ready; //输出就绪队列PCB while(p!=NULL) { prt2(algo,p); p=p->next; } p=finish; //输出完成队列的PCB while(p!=NULL) { prt2(algo,p); p=p->next; } getchar(); //压任意键继续 }

void insert1(PCB *q) {

13

PCB *p1,*s,*r; int b; s=q; //待插入的PCB指针 p1=ready; //就绪队列头指针 r=p1; //做p1的前驱指针 b=1;

while((p1!=NULL)&&b) //根据优先数确定插入位置 if(p1->prio>=s->prio) { r=p1; p1=p1->next; } else b=0; if(r!=p1) //如果条件成立说明插入在r与p1之间 { r->next=s; s->next=p1; } else { s->next=p1; //否则插入在就绪队列的头 ready=s; } }

void insert2(PCB *q) { PCB *p1,*s,*r; int b; s=q; //指针s指向新要插入的进程 p1=ready; //指针p1指向原来的进程的对首 r=p1; //使用指针r指向p1前面的进程 b=1; while((p1!=NULL)&&b) { if(p1->arrivetimearrivetime) { r=p1; p1=p1->next; } else b=0; } if(r!=p1)

14

{ r->next=s; s->next=p1; } else { s->next=p1; ready=s; } }

void create1(char alg) { PCB *p; int i,time; char na[10]; ready=NULL; //就绪队列头指针 finish=NULL; //完成队列头指针 run=NULL; //运行队列头指针 //输入N个进程名和所需时间创建PCB for(i=1;i<=N;i++) { printf(\请输入第%d个进程的名字和运行时间\\n进程名:\ p=(PCB *)malloc(sizeof(PCB)); scanf(\ printf(\所需时间:\ scanf(\ strcpy(p->name,na); p->cputime=0; p->needtime=time; p->state='W'; p->prio=rand()+1; //随机分配优先数[1,15] if(ready!=NULL) //就绪队列不空则调用插入函数插入 insert1(p); //对新进程插入就绪队列 else { p->next=ready; //创建就绪队列的第一个PCB ready=p; } } system(\ printf(\ 优先数算法结果输出\\n\ printf(\ prt(alg); //输出进程PCB信息 run=ready; //将就绪队列的第一个进程投入运行

15


进程调度程序设计报告(源代码)剖析(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:matlab简单实例作业

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: