实验三使用动态优先权的进程调度算法的模拟.docx
- 文档编号:9033729
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:27
- 大小:18.95KB
实验三使用动态优先权的进程调度算法的模拟.docx
《实验三使用动态优先权的进程调度算法的模拟.docx》由会员分享,可在线阅读,更多相关《实验三使用动态优先权的进程调度算法的模拟.docx(27页珍藏版)》请在冰点文库上搜索。
实验三使用动态优先权的进程调度算法的模拟
实验三使用动态优先权的进程调度算法的模拟
http:
1、实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
2、实验内容
(1)用C语言来实现对N个进程采用动态优先算法的进程调度;
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
l进程标识符id
l进程优先数priority,并规定优先数越大的进程,其优先权越高;l进程已占用的CPU时间cputime;
l进程还需占用的CPU时间alltime,当进程运行完毕时,alltime变为0;l进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进程将进入阻塞状态;
l进程被阻塞的时间blocktime,表示已阻塞的进程再等待blocktime个时间片后,将转换成就绪态
l进程状态state;
l队列指针next,用来将PCB排成队列
(3)优先数改变的原则:
l进程在就绪队列中呆一个时间片,优先数增加1
l进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们的初始状态如下:
ID01234PRIORITYCPUTIME000ALLTIME33634STARTBLOCK2-1-1-1-1BLOCKTIME300STATEREADYREADYREADY
(5)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:
RUNNINGPROG:
iREADY_QUE:
->id1->id2
BLOCK_QUE:
->id3->id4
==================================
ID01234
PRIORITYP0P1P2P3P4
CPUTIMEC0C1C2C3C4
ALLTIMEA0A1A2A3A4
STARTBLOCKT0T1T2T3T4
BLOCKTIMEB0B1B2B3B4
STATES0S1S2S3S4
3、思考题
(1)在实际的调度中,除了按调度算法选择下一个执行的进程外,还应处理哪些工作?
队列实现:
#include
#include
//#defineNULL0
#defineM10
typedefstructnode
{intid;
intpr;
intct;
intat;
intbt;
intsb;
structnode*next;
}jd;
jd*max(jd*p){jd*maxnode=NULL,*p1,*p2,*p3=p;
intmaxnum;
p1=p;p2=p;
if(p->next==NULL)
returnNULL;
maxnum=p->next->pr;
while(p1->next!
=NULL)
{p2=p1->next;
if(maxnum<=p2->pr){maxnode=p2;
p3=p1;
maxnum=p2->pr;}p1=p1->next;}p3->next=maxnode->next;
maxnode->next=NULL;
returnmaxnode;}voidblocktoready(jd*pblock,jd*pready){jd*p1=pblock,*p3;
while(p1->next!
=NULL){p3=p1->next;
if(p3->bt==0){p1->next=p3->next;
p3->next=pready->next;
pready->next=p3;}p1=p1->next;
if(p1==NULL)
break;}}
voidready(jd*p){jd*p1=p->next;
while(p1!
=NULL){p1->pr++;
p1=p1->next;}}
voidrun(jd*p){jd*p1;
if(p->next!
=NULL){p1=p->next;
p1->pr=p1->pr-3;
p1->at--;
p1->ct++;}}
voidblock(jd*p){jd*p1=p->next;
while(p1!
=NULL){p1->bt--;
p1=p1->next;}}
voidruntoreadyorblock(jd*prun,jd*pready,jd*pblock){jd*p;
if(prun->next==NULL)
return;
p=prun->next;
if(p->at==0)
prun->next=NULL;
else{if(p->ct==p->sb)
{p->next=pblock->next;
pblock->next=p;
prun->next=NULL;}else{
p->next=pready->next;
pready->next=p;
prun->next=NULL;}}}jd*head(jdpcb[],intL){inti;
for(i=0;i printf("PRIORITY: "); scanf("%d",&pcb[i].pr); printf("ALLTIME: "); scanf("%d",&pcb[i].at); printf("STARTBLOCK: "); scanf("%d",&pcb[i].sb); printf("BLOCKTIME: "); scanf("%d",&pcb[i].bt); pcb[i].id=i; pcb[i].ct=0;}for(i=0;i return&pcb[0];}voidprint(jd*p){jd*p1; if(p->next==NULL) printf("\t\tthequeareempty\n"); while(p->next! =NULL){p1=p->next; printf("\t\t%d\t%d\t%d\t%d\t%d\t%d\n",p1->id,p1->pr,p1->ct,p1->at,p1->sb,p1->bt);p=p->next; if(p==NULL) break;}} intmain(){jdpcb[M]; jd*pready=(jd*)malloc(sizeof(jd)); jd*prun=(jd*)malloc(sizeof(jd)); jd*pblock=(jd*)malloc(sizeof(jd)); intL,i,n=1; pready->next=NULL; prun->next=NULL; pblock->next=NULL; printf("pleaseinputthenumberofpcb: \n"); scanf("%d",&L); pready->ne#include #include //#defineNULL0 #defineM10 typedefstructnode {intid; intpr; intct; intat; intbt; intsb; structnode*next; }jd; jd*max(jd*p){jd*maxnode=NULL,*p1,*p2,*p3=p; intmaxnum; p1=p;p2=p; if(p->next==NULL) returnNULL; maxnum=p->next->pr; while(p1->next! =NULL) {p2=p1->next; if(maxnum<=p2->pr){maxnode=p2; p3=p1; maxnum=p2->pr;}p1=p1->next;}p3->next=maxnode->next; maxnode->next=NULL; returnmaxnode;}voidblocktoready(jd*pblock,jd*pready){jd*p1=pblock,*p3; while(p1->next! =NULL){p3=p1->next; if(p3->bt==0){p1->next=p3->next; p3->next=pready->next; pready->next=p3;}p1=p1->next; if(p1==NULL) break;}} voidready(jd*p){jd*p1=p->next; while(p1! =NULL){p1->pr++; p1=p1->next;}} voidrun(jd*p){jd*p1; if(p->next! =NULL){p1=p->next; p1->pr=p1->pr-3; p1->at--; p1->ct++;}} voidblock(jd*p){jd*p1=p->next; while(p1! =NULL){p1->bt--; p1=p1->next;}} voidruntoreadyorblock(jd*prun,jd*pready,jd*pblock){jd*p; if(prun->next==NULL) return; p=prun->next; if(p->at==0) prun->next=NULL; else{if(p->ct==p->sb) {p->next=pblock->next; pblock->next=p; prun->next=NULL;}else{ p->next=pready->next; pready->next=p; prun->next=NULL;}}}jd*head(jdpcb[],intL){inti; for(i=0;i printf("PRIORITY: "); scanf("%d",&pcb[i].pr); printf("ALLTIME: "); scanf("%d",&pcb[i].at); printf("STARTBLOCK: "); scanf("%d",&pcb[i].sb); printf("BLOCKTIME: "); scanf("%d",&pcb[i].bt); pcb[i].id=i; pcb[i].ct=0;}for(i=0;i return&pcb[0];}voidprint(jd*p){jd*p1; if(p->next==NULL) printf("\t\tthequeareempty\n"); while(p->next! =NULL){p1=p->next; printf("\t\t%d\t%d\t%d\t%d\t%d\t%d\n",p1->id,p1->pr,p1->ct,p1->at,p1->sb,p1->bt);p=p->next; if(p==NULL) break;}} intmain(){jdpcb[M]; jd*pready=(jd*)malloc(sizeof(jd)); jd*prun=(jd*)malloc(sizeof(jd)); jd*pblock=(jd*)malloc(sizeof(jd)); intL,i,n=1; pready->next=NULL; prun->next=NULL; pblock->next=NULL; printf("pleaseinputthenumberofpcb: \n"); scanf("%d",&L); pready->ne#include #include //#defineNULL0 #defineM10 typedefstructnode {intid; intpr; intct; intat; intbt; intsb; structnode*next; }jd; jd*max(jd*p){jd*maxnode=NULL,*p1,*p2,*p3=p; intmaxnum; p1=p;p2=p; if(p->next==NULL) returnNULL; maxnum=p->next->pr; while(p1->next! =NULL) {p2=p1->next; if(maxnum<=p2->pr){maxnode=p2; p3=p1; maxnum=p2->pr;}p1=p1->next;}p3->next=maxnode->next; maxnode->next=NULL; returnmaxnode;}voidblocktoready(jd*pblock,jd*pready){jd*p1=pblock,*p3; while(p1->next! =NULL){p3=p1->next; if(p3->bt==0){p1->next=p3->next; p3->next=pready->next; pready->next=p3;}p1=p1->next; if(p1==NULL) break;}} voidready(jd*p){jd*p1=p->next; while(p1! =NULL){p1->pr++; p1=p1->next;}} voidrun(jd*p){jd*p1; if(p->next! =NULL){p1=p->next; p1->pr=p1->pr-3; p1->at--; p1->ct++;}} voidblock(jd*p){jd*p1=p->next; while(p1! =NULL){p1->bt--; p1=p1->next;}} voidruntoreadyorblock(jd*prun,jd*pready,jd*pblock){jd*p; if(prun->next==NULL) return; p=prun->next; if(p->at==0) prun->next=NULL; else{if(p->ct==p->sb) {p->next=pblock->next; pblock->next=p; prun->next=NULL;}else{ p->next=pready->next; pready->next=p; prun->next=NULL;}}}jd*head(jdpcb[],intL){inti; for(i=0;i printf("PRIORITY: "); scanf("%d",&pcb[i].pr); printf("ALLTIME: "); scanf("%d",&pcb[i].at); printf("STARTBLOCK: "); scanf("%d",&pcb[i].sb); printf("BLOCKTIME: "); scanf("%d",&pcb[i].bt); pcb[i].id=i; pcb[i].ct=0;}for(i=0;i return&pcb[0];}voidprint(jd*p){jd*p1; if(p->next==NULL) printf("\t\tthequeareempty\n"); while(p->next! =NULL){p1=p->next; printf("\t\t%d\t%d\t%d\t%d\t%d\t%d\n",p1->id,p1->pr,p1->ct,p1->at,p1->sb,p1->bt);p=p->next; if(p==NULL) break;}} intmain(){jdpcb[M]; jd*pready=(jd*)malloc(sizeof(jd)); jd*prun=(jd*)malloc(sizeof(jd)); jd*pblock=(jd*)malloc(sizeof(jd)); intL,i,n=1; pready->next=NULL; prun->next=NULL; pblock->next=NULL; printf("pleaseinputthenumberofpcb: \n"); scanf("%d",&L); pready->next=head(pcb,L); while (1){prun->next=max(pready); run(prun); ready(pready); block(pblock); printf("running%deverypcbinformation: \n",n); printf("\t\tid\tpr\tct\tat\tsb\tbt\n"); printf("thereadypcb: \n"); print(pready); printf("therunpcb: \n"); print(prun); printf("theblockpcb: \n"); print(pblock); printf("theallpcb: \n"); for(i=0;i ",pcb[i].id,pcb[i].pr,pcb[i].ct,pcb[i].at,pcb[i].sb,pcb[i].bt);}printf("\n"); blocktoready(pblock,pready); runtoreadyorblock(prun,pready,pblock); n++; if(pready->next==NULL&&pblock->next==NULL) break;}}xt=head(pcb,L); while (1){prun->next=max(pready); run(prun); ready(pready); block(pblock); printf("running%deverypcbinformation: \n",n); printf("\t\tid\tpr\tct\tat\tsb\tbt\n"); printf("thereadypcb: \n"); print(pready); printf("therunpcb: \n"); print(prun); printf("theblockpcb: \n"); print(pblock); printf("theallpcb: \n"); for(i=0;i ",pcb[i].id,pcb[i].pr,pcb[i].ct,pcb[i].at,pcb[i].sb,pcb[i].bt);}printf("\n"); blocktoready(pblock,pready); runtoreadyorblock(prun,pready,pblock); n++; if(pready->next==NULL&&pblock->next==NULL) break;}}xt=head(pcb,L); while (1){prun->next=max(pready); run(prun); ready(pready); block(pblock); printf("running%deverypcbinformation: \n",n); printf("\t\tid\tpr\tct\tat\tsb\tbt\n"); printf("thereadypcb: \n"); print(pready); printf("therunpcb: \n"); print(prun); printf("theblockpcb: \n"); print(pblock); printf("theallpcb: \n"); for(i=0;i ",pcb[i].id,pcb[i].pr,pcb[i].ct,pcb[i].at,pcb[i].sb,pcb[i].bt);}printf("\n"); blocktoready(pblock,pready); runtoreadyorblock(prun,pready,pblock); n++; if(pready->next==NULL&&pblock->next==NULL) break;}} 运行结果: [root@localhostroot]#gcc-oashiyan 4.c [root@localhostroot]#./a 数组实现: 实验目的 通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。 2、实验内容: (1)用C语言来实现对N个进程采用动态优先权优先算法的进程调度。 (2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段: 进程标识数ID 进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高 进程已占用的CPU时间CUPTIME 进程还需占用的CPU时间ALLTIME。 当进程运行完毕时,ALLTIME变为0 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。 进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STAT E. 队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: 进程在就绪队列中呆一个时间片,优先数增加1。 进程每运行一个时间片,优先数减3。 (4)假设在调度前,系统中有5个进程,它们的初始状态如下: ID01234 PRIORITY CPUTIME000 ALLTIME33634 STARTBLOCK2-1-1-1-1 BLOCKTIME300 STATEREADYREADYREADY (5)为了清楚地观察诸进程的调度过程,程序将每个时间片内的进程的情况显示出来,参照的具体格式如下: RUNINGPROG: iREADY_QUE: ->id1->id2 BLOCK_QUE: ->id3->id4 ID01234 PRIORITYP0P1P2P3P4 CPUTIMEC0C1C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 使用动态优先权的进程调度算法的模拟 实验 使用 动态 优先权 进程 调度 算法 模拟