模拟在单处理器多进程操作系统的CPU调度

本文介绍了模拟单处理器多进程操作系统中的CPU调度,包括先来先服务(FCFS)和短作业优先(SJF)算法。通过进程PCB结构描述进程状态,并展示在VC++环境下运行的结果,验证了算法的正确性。

 模拟在单处理器多进程操作系统的CPU调度。本实验为模拟实验,不要求实现真正的进程创建与进程调度。主要实现各种调度算法。

进程PCB结构:标识符、进程名称、到达时间、服务时间、剩余运行时间、已使用时间、进程状态。其中进程状态有三种:就绪R,运行E,结束F。

剩余运行时间和已使用时间两个属性用于时间片轮转算法和多级反馈队列算法。进程每使用完一个时间片,已使用时间就会增加一个时间片的长度,剩余运行时间=服务时间 – 已使用时间。


仅完成了先来先服务算法的调度和短作业优先算法:

在linux中因缺少conio包无法运行,可自行修改后 就能运行。我在VC++软件中运行如下代码:

#include "stdio.h"
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<string.h>
#include <iostream.h>
#define getpch(type) (type*)malloc(sizeof(type))
typedef struct pcb PCB;

//定义进程控制块的PDB
struct pcb{

	int id; 	//标识符

	char name[10];	//名称

	int time_start;	//到达时间

	int time_need;	//服务时间
	
	int time_left;//剩余运行时间

	int time_used;	//已使用的CPU时间

	char state;	//进程状态
};

//系统函数

//停顿几秒
void _sleep(int n){
	clock_t goal;
	goal = (clock_t)n * CLOCKS_PER_SEC + clock();
	while(goal>clock());
}

//按任意键继续
char _keygo(){
	char c;
	printf("按任意键继续.......\n");
	c = getch();
	return c;
}

///////////////////////////用户函数///////////////////////////

//数据设置区域



int time_unit = 2;//时间片长度

const maxnum = 10;//最大进程数量

int num = 5;//实际进程数量
PCB pcbdata[maxnum] = {
	{1000,"A",0,4,4,0,'R'},
	{1001,"B",2,5,3,0,'R'},
	{1002,"C",5,3,5,0,'R'},
	{1003,"D",4,2,2,0,'R'},
	{1004,"E",1,1,4,0,'R'},

};

//就绪队列,存放进程的pcb
int ready[maxnum];
//记录排序使用哪个数值作为排序对象
int order[maxnum];

//手工输入数据
void input(){
	int i;
	printf("进程总数为:");
	scanf("%d",&num);
	for(i = 0; i< num; i++){
		//系统自动分配标识符
		pcbdata[i].id = 1000 + i;
		printf("输入第%d个进程名:",i+1);
		scanf("%s",&pcbdata[i].name);
		printf("输入第%d个进程达到时间:",i+1);
		
编写一个单处理机下的进程调度程序,模拟操作系统进程调度。 要求: 1.能够建指定数量的进程,每个进程由一个进程控制块表示。 2.实现先来先服务调度算法进程到达时间可由进程建时间表示。 3.实现短作业优先调度算法:可指定进程要求的运行时间。(说明:对可剥夺的短作业优先算法,当作业运行时间相等时,优先调度进程号小的进程执行;对可剥夺式的短作业优先算法,即选最短剩余时间的进程进行运行,在剩余时间相同的情况下,选择到达时间早的进程进行运行) 4. 实现时间片轮转调度算法:可指定生成时间片大小。(说明:新进程到来时插入到就绪队列的队尾,当进程P运行完一个时间片时,若同时有进程Q到达,则先在就绪队列队尾插入新到达的进程Q,之后再插入进程P) 5.实现动态优先级调度算法:可指定进程的初始优先级(优先级与优先数成反比,优先级最高为0),优先级改变遵循下列原则:进程在就绪队列中每停留一个时间片,优先级加1,进程每运行一个时间片,优先级减3。(说明:本算法在优先级相同的情况下,选择到达时间早的进程进行运行) 测试用例格式如下: 输入:调度算法    进程号/到达时间/运行时间/优先级/时间片 输出:调度顺序/进程号/开始运行时间/结束运行时间/优先级 其中调度算法选项为:1----先来先服务,2----短作业优先,3----最短剩余时间优先,4----时间片轮转,5----动态优先级
实现了如下四种调度算法模拟: (1)时间片轮转调度 (2)优先数调度 (3)最短进程优先 (4)最短剩余时间优先 模拟过程使用了JProgressBar作为进程状态条,更为直观地观察到每个进程的执行状态。 程序用户说明: 1、在上图标号1处输入要建随机进程的个数,仅可输入正数,非正数会有相关提示。然后点击标号2处的“进程”按钮,随进建的进程显示在程序界面的中央窗口,如标号3所示。 2、建好随机进程后,在标号4的单选框选择将要模拟执行的调度算法,然后点击标号5处的“开始模拟”,程序开始执行。标号3的列表会显示相应的调度变化。 3、模拟过程中,可以继续添加新的进程,操作同上。 4、 一个算法模拟执行完毕之后,可以点击标号6的“复位”按钮,可以重置列表的内容为程序模拟运行前的内容。复位成功后,可以继续选择其他调度算法进行模拟。 5、标号7显示为程序模拟过程中的时间,从1秒开始累计。 6、点击标号8的“清空”按钮,可以清空类别的进程,以便程序的下次执行。 题目要求: 题目四 单处理器系统的进程调度 一 、 课 程 设 计 目 的 1. 加深对进程概念的理解, 明确进程和程序的区别。 2. 深入了解系统如何组织进程进程。 3. 进一步认识如何实现处理器调度。 二 、 课 程 设 计 内 容 编写程序完成单处理器系统中的进程调度, 要求实现时间片轮转、 优先数、 最短进程优 先和最短剩余时间优先四种调度算法。 实验具体包括: 首先确定进程控制块的内容, 进程控 制块的组成方式; 然后完成进程建原语和进程调度原语; 最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“ 虚拟 PCB” 进行相应的调度模拟操作, 即每发生“ 调度” 时, 显示出当前运行进程的“ 进程标识符”、“ 优先数”、“ 剩余运行时间” 等, 而需要对系 统中真正的 PCB 等数据进行修改。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值