一、实验题目
模拟操作系统的进程调度
二、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三、实验要求
设计实现一个按优先数调度算法进行进程调度的模拟程序
四、解决方案
与实验一相似的是,我仍然需要一个实体对象用于描述进程的状态信息:
class Process {
public:
//构造函数与析构函数不在此赘述
char name;//进程的标识(主键)
int time;//剩余运行市场
int priority;//优先级,越大越好
bool status;//能否继续运行的标记
} p[10];
同时我写了一个模拟进程运行的方法:
void run(Process &process) {
process.priority >>= 1;//优先级/=2向下取整
process.time--;//时间减一
if (process.time <= 0) {
process.status = 0;
ending--;//时间用完,ending信号量回收。
}
}
还有一个用于交换进程位置的方法:
void swap(Process &p1, Process &p2) {
Process tmp = p1;
p1 = p2;
p2 = tmp;
}
以及一个提供给cmp()函数的方法。
bool cmp(Process p1, Process p2) {
return p1.priority >= p2.priority;//按照优先级降序排列
}
以下为我给模拟程序设计的流程图:
五、源程序
#include <bits/stdc++.h>
using namespace std;
int ending = 5;
class Process {
public:
Process(char name, int time, int priority, bool status) {
this->name = name;
this->time = time;
this->priority = priority;
this->status = status;
}
Process() {
}
~Process() {
}
char name;
int time;
int priority;//bigger is better
bool status;
} p[10];
void run(Process &process) {
process.priority >>= 1;
process.time--;
if (process.time <= 0) {
process.status = 0;
ending--;
}
}
void swap(Process &p1, Process &p2) {
Process tmp = p1;
p1 = p2;
p2 = tmp;
}
bool cmp(Process p1, Process p2) {
return p1.priority >= p2.priority;
}
//
//bool cmp(Process p1, Process p2) {
// return p1.priority >= p2.priority;
//}
int main() {
p[1] = Process('1', 2, 1, 1);
p[2] = Process('2', 3, 10, 1);
p[3] = Process('3', 1, 6, 1);
p[4] = Process('4', 2, 9, 1);
p[5] = Process('5', 4, 4, 1);
for (int t = 0; ending >= 0 && p[1].status; t++) {
printf("——————————————————第%d秒——————————————————\n", t);
sort(p + 1, p + 1 + ending, cmp);
for (int i = 1; i <= ending; i++) {
printf("位次%d:p%c,优先:%d,残时:%d\n", i, p[i].name, p[i].priority, p[i].time);
}
printf("进程p%c运行一次\n", p[1].name);
run(p[1]);
if (!p[1].status) {
swap(p[1], p[ending + 1]);
printf("进程p%c执行完毕\n", p[ending + 1].name);
} else {
printf("进程p%c还剩:%d秒\n", p[1].name, p[1].time);
}
}
return 0;
}
六、运行结果与分析
——————————————————第0秒——————————————————
位次1:p2,优先:10,残时:3
位次2:p4,优先:9,残时:2
位次3:p3,优先:6,残时:1
位次4:p5,优先:4,残时:4
位次5:p1,优先:1,残时:2
进程p2运行一次
进程p2还剩:2秒
——————————————————第1秒——————————————————
位次1:p4,优先:9,残时:2
位次2:p3,优先:6,残时:1
位次3:p2,优先:5,残时:2
位次4:p5,优先:4,残时:4
位次5:p1,优先:1,残时:2
进程p4运行一次
进程p4还剩:1秒
——————————————————第2秒——————————————————
位次1:p3,优先:6,残时:1
位次2:p2,优先:5,残时:2
位次3:p5,优先:4,残时:4
位次4:p4,优先:4,残时:1
位次5:p1,优先:1,残时:2
进程p3运行一次
进程p3执行完毕
——————————————————第3秒——————————————————
位次1:p2,优先:5,残时:2
位次2:p4,优先:4,残时:1
位次3:p5,优先:4,残时:4
位次4:p1,优先:1,残时:2
进程p2运行一次
进程p2还剩:1秒
——————————————————第4秒——————————————————
位次1:p5,优先:4,残时:4
位次2:p4,优先:4,残时:1
位次3:p2,优先:2,残时:1
位次4:p1,优先:1,残时:2
进程p5运行一次
进程p5还剩:3秒
——————————————————第5秒——————————————————
位次1:p4,优先:4,残时:1
位次2:p2,优先:2,残时:1
位次3:p5,优先:2,残时:3
位次4:p1,优先:1,残时:2
进程p4运行一次
进程p4执行完毕
——————————————————第6秒——————————————————
位次1:p5,优先:2,残时:3
位次2:p2,优先:2,残时:1
位次3:p1,优先:1,残时:2
进程p5运行一次
进程p5还剩:2秒
——————————————————第7秒——————————————————
位次1:p2,优先:2,残时:1
位次2:p1,优先:1,残时:2
位次3:p5,优先:1,残时:2
进程p2运行一次
进程p2执行完毕
——————————————————第8秒——————————————————
位次1:p1,优先:1,残时:2
位次2:p5,优先:1,残时:2
进程p1运行一次
进程p1还剩:1秒
——————————————————第9秒——————————————————
位次1:p5,优先:1,残时:2
位次2:p1,优先:0,残时:1
进程p5运行一次
进程p5还剩:1秒
——————————————————第10秒——————————————————
位次1:p1,优先:0,残时:1
位次2:p5,优先:0,残时:1
进程p1运行一次
进程p1执行完毕
——————————————————第11秒——————————————————
位次1:p5,优先:0,残时:1
进程p5运行一次
进程p5执行完毕
进程们都被塞进了一个数组里。ending表示的含义实际上是当前等待的进程个数。当某次run()函数执行完毕
七、实验小结
对进程调度有了更加深刻的认知