实验三 进程调度模拟程序
一、实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验内容及要求
要求:设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序。
进程调度算法:“时间片轮转法”调度算法对N个进程进行调度。
内容:完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。
1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。
2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。
3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。
5) 每进行一次调度,程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。
6) 重复以上过程,直到所要进程都完成为止。
三、实验方法、步骤及结果测试
1、源程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream.h> typedef struct node { char name[10]; int prio; int round; int cputime; int needtime; int count; char state; struct node *next; }PCB; PCB *finish,*ready,*tail,*run; //队列指针 int N; //进程数 void firstin() { run=ready; //就绪队列头指针赋值给运行头指针 run->state= 'R' ; //进程状态变为运行态] ready=ready->next; //就绪队列头指针后移到下一进程 } //输出标题函数 void prt1( char a) { if (toupper(a)== 'P' ) //优先级法 cout<< " " <<endl; cout<< "进程名 占用CPU时间 到完成还要的时间 轮转时间片 状态" <<endl; } //进程PCB输出 void prt2( char a,PCB *q) { if (toupper(a)== 'P' ) //优先级法的输出 cout<<q->name<< " " <<q->cputime<< " " <<q->needtime<< " " << q->round<< " " <<q->state<<endl; } //输出函数 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 insert(PCB *q) { PCB *p1,*s,*r; s=q; //待插入的PCB指针 p1=ready; //就绪队列头指针 r=p1; //*r做pl的前驱指针 while (p1!=NULL) if (p1->round<=s->round) { r=p1; p1=p1->next; } if (r!=p1) { r->next=s; s->next=p1; } else { s->next=p1; //否则插入在就绪队列的头 ready=s; } } //优先级创建初 void create( char alg) { PCB *p; int i,time; char na[10]; ready=NULL; finish=NULL; run=NULL; cout<< "输入进程名及其需要运行的时间:" <<endl; for (i=1;i<=N;i++) { p= new PCB; cin>>na; cin>>time; strcpy(p->name,na); p->cputime=0; p->needtime=time; p->state= 'W' ; p->round=0; if (ready!=NULL) insert(p); else { p->next=ready; ready=p; } cout<< "输入进程名及其需要运行的时间:" <<endl; } prt(alg); run=ready; ready=ready->next; run->state= 'R' ; } void timeslicecycle( char alg) { while (run!=NULL) { run->cputime=run->cputime+8; run->needtime=run->needtime-8; run->round=run->round+8; if (run->needtime<=0) { run->next=finish; finish=run; run->state= 'F' ; run=NULL; if (ready!=NULL) firstin(); } else { run->state= 'W' ; insert(run); firstin(); } prt(alg); } } //主函数 void main() { char algo= 'P' ; //算法标记 cout<< "输入进程的个数:" ; cin>>N; //输入进程数 create(algo); //创建进程 timeslicecycle(algo); //优先级法调度 } //main() |
2.运行结果
4.结果分析
这次的实验比上次困难很多。研究了很久,参考了网上很多资料,才勉强弄懂了时间片的程序。但是多级反馈的程序还是没能弄出来,在网上也找不到能够成功实现的程序。所以不足之处还是要等日后慢慢学习才能弥补。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞