资源库-操作系统原理 实验二:进程调度

一、实验题目

模拟操作系统的进程调度

二、实验目的

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。

三、实验要求

设计实现一个按优先数调度算法进行进程调度的模拟程序

四、解决方案

    与实验一相似的是,我仍然需要一个实体对象用于描述进程的状态信息:

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()函数执行完毕

七、实验小结

对进程调度有了更加深刻的认知

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值