《进程调度_wll》由会员分享,可在线阅读,更多相关《进程调度_wll(10页珍藏版)》请在金锄头文库上搜索。
1、计算机操作系统实验报告 0915257 吴龙龙 1 / 10 进程调度实验进程调度实验 1. 实验目的实验目的 a) 熟悉进程调度的具体过程。 b) 理解在不同的进程调度算法下,如何实现进程调度。 c) 代码实现某一种进程调度算法下的进程调度的程序模拟。 2. 实验原理实验原理 2.1 进程调度进程调度: 进程调度又称低级调度,它属于处理机调度的范畴,决定内存就绪队列 中哪个进程将获得处理机,使其获得实实在在的执行。 2.2 进程调度算法进程调度算法 1)非剥夺式优先权调度算法)非剥夺式优先权调度算法 在这种方式下, 系统一旦把处理机分配给就绪队列中优先权最高的进 程后,该进程便一直执行下去,
2、直至完成; 或因发生某事件使该进程放 弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。 这 种调度算法主要用于批处理系统中; 也可用于某些对实时性要求不严的实 时系统中。 2)基于时间片的多级反馈队列调度算法)基于时间片的多级反馈队列调度算法 各就绪进程轮流运行一小段时间,这一小段时间称为时间片。在时 间片内,如进程运行任务完成或因 I/O 等原因进入阻塞状态,该进程就 提前让出 CPU。当一个进程耗费完一个时间片而尚未执行完毕,调度程 序就强迫它放弃处理机,使其重新插入到就绪队列末尾 具体描述如图 2-1 所示 图 2-1 3. 实验要求实验要求 1)可随机输入若干进程,并按优
3、先级排序 ; 2)从就绪队列选择进程运行:优先权-1;要求运行时间-1;需要运行时间 为 0,撤销该进程; 3)重新排序,进行下轮调度; 计算机操作系统实验报告 0915257 吴龙龙 2 / 10 4)最好采用图形界面 5)可随时增加进程 6)每次调度后,显示各进程状态 4. 实验分析实验分析 我们选择基于时间片得多及反馈队列调度算法作为进程调度的实现算法。 级数设为 3.具体如图 2-2 5. 数据结构数据结构 5.1PCB 节点结构节点结构 struct PCB int PID; char Name10;/进程名 char stat;/进程状态 int pri;/优先级,初始置 1 in
4、t time;/完成进程所需时间 ; 5.2PCB 链结构链结构 struct PCB_list PCB data;/数据域 PCB_list *next;/指针域 *R_listN,*E_list,*Pcb; 6. 函数设计函数设计 6.1 用户选择菜单用户选择菜单: void menu(); 6.2 显示进程状态显示进程状态 计算机操作系统实验报告 0915257 吴龙龙 3 / 10 void display(PCB_list *R_list,PCB_list *E_list,PCB_list *Pcb) 6.3 创建进程创建进程 int* allocation(int a,data p
5、art); 6.4 进程调度 void scheduling(PCB_list *R_list,PCB_list *E_list,PCB_list *Pcb,int ID) 7. 数据测试数据测试 案例: 进程进程 创 建创 建 时刻时刻 执 行 时 间执 行 时 间 (ms) 优先数优先数 P1 0 3 3 P2 2 6 5 P3 4 4 1 P4 6 5 2 P5 8 2 4 输出: 计算机操作系统实验报告 0915257 吴龙龙 4 / 10 计算机操作系统实验报告 0915257 吴龙龙 5 / 10 8. 结果分析结果分析 数据测试通过基本实现功能,符合实验要求。 9. 代码附录代码
6、附录 #include #include #define MAX 100 /PCB 块的最大数量 #define N 3 int n_max=1; struct PCB int PID; char Name10;/进程名 char stat;/进程状态 int pri;/优先级 int time;/完成进程所需时间 ; struct PCB_list PCB data; PCB_list *next; *R_listN,*E_list,*Pcb; void Creat(PCB_list *R_list,PCB_list *Pcb,int ID) /创建进程 int i; PCB_list *s
7、,*p,*q; if(IDMAX=MAX) printf(“当前进程已满,无法再继续创建n“); else p=(PCB_list*)malloc(sizeof(PCB_list); p- next=NULL; for(i=1;idata.PID=i; break; printf(“请输入进程名(字符串型):“); scanf(“%s“,p- data.Name); printf(“请输入进程所需时间(整数型):“); 计算机操作系统实验报告 0915257 吴龙龙 6 / 10 scanf(“%d“, p- data.stat=R; p- data.pri=1; if(Pcb- data.P
8、ID=0) Pcb- data=p- data; Pcb- data.stat=G; else if(Pcb- data.pri!=1) q=(PCB_list*)malloc(sizeof(PCB_list); q- next=NULL; q- data=Pcb- data; Pcb- data=p- data; p- data=q- data; p- data.stat=R; Pcb- data.stat=G; free(q); s=R_listp- data.pri- 1; while(s- next!=NULL) s=s- next; p- next=s- next; s- next=
9、p; else s=R_list0; while(s- next!=NULL) s=s- next; p- next=s- next; s- next=p; void display(PCB_list *R_list,PCB_list *E_list,PCB_list *Pcb)/显示各 队列进程 int i,flag=0; PCB_list *s=E_list- next,*q; if(Pcb- data.PID=0) printf(“当前无执行进程n“); 计算机操作系统实验报告 0915257 吴龙龙 7 / 10 else printf(“当前执行进程:PID 进程名 进程状态 优先级
10、 所需 时间n“); printf(“ %3d%10s%10c%10d%10dn“,Pcb- data.PID,Pcb- data.Name,Pcb- data. stat,Pcb- data.pri,Pcb- data.time); for(i=0,flag=0;inext; if(q!=NULL) flag=1; printf(“第%d 级就绪队列进程:PID 进程名 进程状态 优先级 所需时间n“,i+1); while(q!=NULL) printf(“ %3d%10s%10c%10d%10dn“,q- data.PID,q- data.Name,q- data.stat,q- dat
11、a.pri,q- data.time); q=q- next; if(flag=0) printf(“当前无就绪进程n“); if(s=NULL) printf(“当前无完成进程n“); else printf(“当前完成进程: 进程名 进程状态n“); while(s!=NULL) printf(“ %10s%10cn“,s- data.Name,s- data.stat); s=s- next; void scheduling(PCB_list *R_list,PCB_list *E_list,PCB_list *Pcb,int ID)/调度函数 PCB_list *p,*q,*r,*s=
12、E_list; 计算机操作系统实验报告 0915257 吴龙龙 8 / 10 int i,flag;/标志就绪队列中是否存在进程 p=(PCB_list*)malloc(sizeof(PCB_list); if(Pcb- data.PID=0)/当前无执行进程 printf(“无法执行本操作n“); else Pcb- data.time=Pcb- data.time- Pcb- data.pri;/执行进程所需时间 依据所在就绪队列级数变化 p- data=Pcb- data; p- next=NULL; if(Pcb- data.timenext!=NULL) s=s- next; s-
13、next=p; p- data.stat=F; IDp- data.PID=0; p- data.pri=0; for(i=0,flag=0;inext; if(r!=NULL) Pcb- data=r- data; Pcb- data.stat=G; q- next=r- next; free(r); flag=1; break; if(flag=0) Pcb- data.PID=0; else/进程未完成 if(p- data.pri!=N) q=R_listp- data.pri; else q=R_listp- data.pri- 1; 计算机操作系统实验报告 0915257 吴龙龙
14、9 / 10 while(q- next!=NULL) q=q- next; p- data.stat=R; p- data.pri=q- data.pri; p- next=q- next; q- next=p;/将该进程按优先级大小插入就绪队列 if(n_maxdata.pri) n_max=p- data.pri; for(i=0,flag=0;inext; if(r!=NULL) Pcb- data=r- data; Pcb- data.stat=G; q- next=r- next; free(r); break; /将优先级最高的就绪队列第一个进程转入执行进程 void show()/ printf(“1:创建进程 2:显示进程n“); printf(“3:进程调度 4:结束操作n“); printf(“请输入指令:“); int main() int flag,ID101=0,i; for(i=0;inext=NULL; R_listi- data.pri=i+1; E_list=(PCB_list*)malloc(sizeof(PCB_list); E_list- next=NULL;