FCFS算法输出
遇到的问题:
在设计程序时,在算法上面出现了一些错误,优先数不是由大到小排序,而是应该这样理解,当进程执行一个时间片时,优先数减一(使用CPU的时间变少,反而优先级高),因此,优先级高的优先数应该是比较小的,而不是优先数大的优先级大。在程序调试时,链表发生了错误,该内存不可写或者就是程序直接结束,但最终结果不是我想要的,经过一番折腾,最后发现,头指针和头结点混淆,有些地方没有给指针分配内存,语句的先后顺序不正确,以及没有考虑到链表最后没有设置结束标志。
六、结论与体会
做这个程序我断断续续的算下来应该总共用了2天,主要是花时间在观察别人的算法读别人的程序,然后才开始写自己的程序,期间参考了前人的程序并进行了改善和加工,这让我对进程调度的理解再次加深了,这是在平常学习的基础上,与程序相结合的过程,让我再次感受到编程给我们带来的无穷魅力,只要自己有兴趣,其实编程也是一件有趣的事,为了达到一定的要求,我们必须多次尝试用不同的方法去实现它,比如,进程调度有先来先服务算法,对于这个算法,可以用数组实现,也可以用链表实现,但是到底哪个更好哪个更灵活呢,相信学
11
过C语言的人都知道肯定是用链表实现最好了。这次设计还是有一些不足之处的,比如在算法和运行效率上还是有些欠缺的,需要进一步去改善程序代码,提高效率,减少冗余和错误,让使用者更清晰的观察和理解进程调度。
七、参考文献
[1]任爱华、罗晓峰. 操作系统实用教程(第三版)[M].北京:清华大学出版社,2009 [2]谌卫军、王浩娟. 操作系统[M]. 北京:清华大学出版社,2012.5
[3](日)前桥和弥(Maebasi Kazuya). 征服C指针[M]. 吴雅明译. 北京:人民邮电出版社,2013.2
附录:源程序
#include
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->arrivetime
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