p1->next=p2;
p2->state=\就绪中\ p2->name=p->name; p2->run=p->rest;
p2->queue=(p->queue)+1; p2->rest=p->rest; p2->fragement=2; p2->next=NULL; }
:5: 实验效果:
:6:实验总结:
如上图所示,进程在一个时间片执行完后进程,剩余时间为0,退出队列,进程2在执行完一个时间片后仍然未完成,进入就绪队列末尾,以此类推,直至三个进程都完成,这个时间片轮转算法比较简单,只需要处理好把未完成的进程插入就绪队列末尾即可,把已完成的从就绪队列中释放。调试过程中总是会出现bug,但需要我们耐心一个个解决。
第三个:多级队列反馈算法::
3:实验方法,步骤:
其思想是:当一个新进程进入内存后,首先将它放入第一个队列的末尾,按fcfs的原则排队等待,当轮到该进程执行,如能在该时间片内完成,则撤出系统,倘若在时间片内未完成,则放进第二个队列的末尾,按同样的fcfs原则等待执行。
首先用create()函数创建链表并对其初始化,然后把链表放进processing()函数中进行处理,若任然未完成,则把该进程放进insert()函数中插入下 一队列。
4:流程图
:4:重要的函数和数据结构:
struct PCB对进程结构体进行定义 Create()函数进行链表的初始化
Insert()函数把未完成的进程插入下一个就绪队列的末尾 Processing()函数对链表循环进行处理 Disp()函数对结果进行显示
Insert()函数把进程插入下一个就绪队列 void insert(struct PCB *p){ struct PCB *p1,*p2; p2=p1=p;
p2=(struct PCB *)malloc(sizeof(struct PCB)); while(p1->next)p1=p1->next; p1->next=p2;
p2->state=\就绪中\ p2->name=p->name;
p2->run=p->rest;
p2->queue=(p->queue)+1; p2->rest=p->rest;
p2->fragement=2*(p->fragement); p2->next=NULL; }
void processing(struct PCB *head){ //对占有cpu时间的进程进行系列的处理 struct PCB *p1,*p2,*p3; int n=0; p1=head; while(p1){
p1->rest=p1->rest-p1->fragement; if(p1->rest<0)p1->rest=0; p1->state=\运行中\ disp(p1);
if(p1->rest==0)
printf(\进程%d已完成\\n\ if(p1->rest>0)insert(p1); p1=p1->next; } }
5:实验效果:

