计算机操作系统实验-进程调度模拟算法

这篇具有很好参考价值的文章主要介绍了计算机操作系统实验-进程调度模拟算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验目的

进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以 便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法 的具体实施办法。

二、实验要求

1.设计进程控制块 PCB 的结构,通常应包括如下信息:

进程名、进程优先数(或轮转时间片数)、进程已占用的 CPU 时间、进程到完成还需要的时间、进程的状态、当前队列指针等。

2.编写两种调度算法程序:

优先数调度算法程序

循环轮转调度算法程序

3.按要求输出结果。

三、实验过程

分别用两种调度算法对伍个进程进行调度。每个进程可有三种状态;执行状态(RUN)、

就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。

 (一)进程控制块结构如下:

 NAME——进程标示符

 PRIO/ROUND——进程优先数/进程每次轮转的时间片数(设为常数 2)

 CPUTIME——进程累计占用 CPU 的时间片数

 NEEDTIME——进程到完成还需要的时间片数

 STATE——进程状态

 NEXT——链指针

 注:

 1.为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;

 2.各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行时给定。

(二)进程的就绪态和等待态均为链表结构,共有四个指针如下:

 RUN——当前运行进程指针

 READY——就需队列头指针

 TAIL—— 就需队列尾指针

 FINISH—— 完成队列头指针

(三)程序说明

 1. 在优先数算法中,进程优先数的初值设为:

 50-NEEDTIME

每执行一次,优先数减 1,CPU 时间片数加 1,进程还需要的时间片数减 1。在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加 2,进程还需要的时间片数减 2,并退出 CPU,排到就绪队列尾,等待下一次调度。

 2. 程序的模块结构如下:

 整个程序可由主程序和如下 7 个过程组成:

 2

 (1)INSERT1——在优先数算法中,将尚未完成的 PCB 按优先数顺序插入到就绪队列中;

 (2)INSERT2——在轮转法中,将执行了一个时间片单位(为 2),但尚未完成的进程

的 PCB,插到就绪队列的队尾;

 (3)FIRSTIN——调度就绪队列的第一个进程投入运行;

 (4)PRINT——显示每执行一次后所有进程的状态及有关信息。

 (5)CREATE——创建新进程,并将它的 PCB 插入就绪队列;

 (6)PRISCH——按优先数算法调度进程;

 (7)ROUNDSCH——按时间片轮转法调度进程。

 主程序定义 PCB 结构和其他有关变量。

代码:文章来源地址https://www.toymoban.com/news/detail-744848.html

Main.cpp
#include<iostream>
#include<string>
using namespace std;
typedef struct node
{
	char name[20];           //进程名
	int prio;                      //进程优先级
	int round;                   //分配CPU的时间片
	int cputime;                //CPU执行时间
	int needtime;              //进程执行所需时间
	char state;                   //进程状态
	int count;                    //记录执行次数
	struct node *next;       //链表指针
}PCB;
int num;
//定义三个队列,就绪队列,执行队列,完成队列
PCB *ready = NULL;         //就绪队列
PCB *run = NULL;             //执行队列
PCB *finish = NULL;          //完成队列
//取得第一个就绪节点
void GetFirst()
{
	run = ready;
	if (ready != NULL)
	{
		run->state = 'R';
		ready = ready->next;
		run->next = NULL;
	}
}
//优先级输出队列
void Output1()
{
	PCB *p;
	p = ready;
	while (p != NULL)
	{
		cout << p->name << "\t" << p->prio << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "  \t  " << p->count << endl;
		p = p->next;
	}
	p = finish;
	while (p != NULL)
	{
		cout << p->name << "\t" << p->prio << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "  \t  " << p->count << endl;
		p = p->next;
	}
	p = run;
	while (p != NULL)
	{
		cout << p->name << "\t" << p->prio << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "  \t  " << p->count << endl;
		p = p->next;
	}
}
//轮转法输出队列
void Output2()
{
	PCB *p;
	p = ready;
	while (p != NULL)
	{
		cout << p->name << "\t" << p->round << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "\t  " << p->count << endl;
		p = p->next;
	}
	p = finish;
	while (p != NULL)
	{
		cout << p->name << "\t" << p->round << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "\t  " << p->count << endl;
		p = p->next;
	}
	p = run;
	while (p != NULL)
	{
		cout << p->name << "\t" << p->round << "\t" << p->cputime << "\t" << p->needtime << "\t " << p->state << "\t  " << p->count << endl;
		p = p->next;
	}
}
//创建优先级队列
//创建优先级队列,规定优先数越小,优先级越低 
void InsertPrio(PCB *in)
{
	PCB *fst, *nxt;
	fst = nxt = ready;
	if (ready == NULL)  //如果队列为空,则为第一个元素 
	{
		in->next = ready;
		ready = in;
	}
	else     //查到合适的位置进行插入 
	{
		if (in->prio >= fst->prio)  //比第一个还要大,则插入到队头
		{
			in->next = ready;
			ready = in;
		}
		else
		{
			while (fst->next != NULL)  //移动指针查找第一个比它小的元素的位置进行插入 
			{
				nxt = fst;
				fst = fst->next;
			}
			if (fst->next == NULL) //已经搜索到队尾,则其优先级数最小,将其插入到队尾即可 
			{
				in->next = fst->next;
				fst->next = in;
			}
			else     //插入到队列中
			{
				nxt = in;
				in->next = fst;
			}
		}
	}
}
//将进程插入到就绪队列尾部
void InsertTime(PCB *in)
{
	PCB *fst;
	fst = ready;
	if (ready == NULL)
	{
		in->next = ready;
		ready = in;
	}
	else
	{
		while (fst->next != NULL)
		{
			fst = fst->next;
		}
		in->next = fst->next;
		fst->next = in;
	}
}
//将进程插入到完成队列尾部
void InsertFinish(PCB *in)
{
	PCB *fst;
	fst = finish;
	if (finish == NULL)
	{
		in->next = finish;
		finish = in;
	}
	else
	{
		while (fst->next != NULL)
		{
			fst = fst->next;
		}
		in->next = fst->next;
		fst->next = in;
	}
}
//优先级调度输入函数 
void PrioCreate()
{
	PCB *tmp;
	int i;
	cout << "Enter the name and needtime:" << endl;
	for (i = 0; i < num; i++)
	{
		if ((tmp = (PCB *)malloc(sizeof(PCB))) == NULL)
		{
			cerr << "malloc" << endl;
			exit(1);
		}
		cin >> tmp->name;
		getchar();
		cin >> tmp->needtime;
		tmp->cputime = 0;
		tmp->state = 'W';
		tmp->prio = 50 - tmp->needtime;  //设置其优先级,需要的时间越多,优先级越低
		tmp->round = 0;
		tmp->count = 0;
		InsertPrio(tmp);      //按照优先级从高到低,插入到就绪队列 
	}
	cout << "进程名\t优先级\tcpu时间\t需要时间 进程状态 计数器" << endl;
}
//时间片输入函数 
void TimeCreate()
{
	PCB *tmp;
	int i;
	cout << "输入进程名字和进程时间片所需时间:" << endl;
	for (i = 0; i < num; i++)
	{
		if ((tmp = (PCB *)malloc(sizeof(PCB))) == NULL)
		{
			cerr << "malloc" << endl;
			exit(1);
		}
		cin >> tmp->name;
		getchar();
		cin >> tmp->needtime;
		tmp->cputime = 0;
		tmp->state = 'W';
		tmp->prio = 0;
		tmp->round = 2;
		tmp->count = 0;
		InsertTime(tmp);
	}
	cout << "进程名\t轮数\tCPU时间\t需要时间 进程状态 计数器" << endl;
}
//按照优先级调度,每次执行一个时间片
void Priority()
{
	int flag = 1;
	GetFirst();
	while (run != NULL)
	{
		Output1();
		while (flag)
		{
			run->prio -= 3; //优先级减去三 
			run->cputime++; //CPU时间片加一 
			run->needtime--;//进程执行完成的剩余时间减一 
			if (run->needtime == 0)//如果进程执行完毕,将进程状态置为F,将其插入到完成队列 
			{
				run->state = 'F';
				run->count++;
				InsertFinish(run);
				flag = 0;
			}
			else   //将进程状态置为W,入就绪队列
			{
				run->state = 'W';
				run->count++; //进程执行的次数加一
				InsertTime(run);
				flag = 0;
			}
		}
		flag = 1;
		GetFirst();    //继续取就绪队列队头进程进入执行队列 
	}
}
void RoundRun()    //时间片轮转调度算法
{
	int flag = 1;
	GetFirst();
	while (run != NULL)
	{
		Output2();
		while (flag)
		{
			run->count++;
			run->cputime++;
			run->needtime--;
			if (run->needtime == 0) //进程执行完毕 
			{
				run->state = 'F';
				InsertFinish(run);
				flag = 0;
			}
			else if (run->count == run->round)//时间片用完 
			{
				run->state = 'W';
				run->count = 0;   //计数器清零,为下次做准备 
				InsertTime(run);
				flag = 0;
			}
		}
		flag = 1;
		GetFirst();
	}
}
int main(void)
{
	int n;
	cout << "输入进程个数:" << endl;
	cin >> num;
	getchar();
	cout << "-----------------进程调度算法模拟----------------------" << endl;
	cout << "                   1、优先级调度算法" << endl;
	cout << "                   2、循环轮转调度算法  " << endl;
	cout << "-------------------------------------------------------" << endl;
	cout << "输入选择序号:" << endl;
	cin >> n;
	switch (n)
	{
	case 1:
		cout << "优先级调度:" << endl;
		PrioCreate();
		Priority();
		Output1();
		break;
	case 2:
		cout << "循环轮转算法:" << endl;
		TimeCreate();
		RoundRun();
		Output2();
		break;
	case 0:
		exit(1);
		break;
	default:
		cout << "Enter error!" << endl;
		break;
	}
	cout << endl;
	return 0;
}

到了这里,关于计算机操作系统实验-进程调度模拟算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机操作系统实验:页面置换算法的实现

    本实验的目的是通过编程模拟不同的页面置换算法,比较它们的缺页率和命中率,加深对操作系统内存管理的理解。本实验采用C语言编写,实现了最佳置换算法(OPT)、先进先出置换算法(FIFO)和最近最久未使用算法(LRU)。实验中,页面号引用串从文本文件中读取,输出

    2024年02月02日
    浏览(36)
  • 计算机操作系统【慕课版】习题答案(第2章进程的描述与控制)

    一:简答题 (1).什么是前趋图?试画出下面四条语句的前趋图. S1:a=x+y; S2:b=z+1; S3:c=a-b; S4:w=c+1; 答:前趋图(Precedence Graph)是一个有向无循环图,记为DAG(DirectedAcyclicGraph),用于描述进程之间执行的前后关系。 (2)什么是进程? OS中为什么要引入进程?它会产生什么样的

    2024年04月13日
    浏览(33)
  • 计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】

    计算机操作系统复习系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 给大家整理了一下计算机操作系统中的重点概念,以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算

    2024年02月08日
    浏览(54)
  • 计算机操作系统重点概念整理-第三章 进程同步【期末复习|考研复习】

    计算机操作系统复习系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 给大家整理了一下计算机操作系统中的重点概念,以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算

    2024年02月08日
    浏览(50)
  • 操作系统 --- 计算机系统引论

            操作系统 ( Operating System , OS )是指控制和 管理 整个计算机系统的 硬件和软件 资源,并合理地组织调度计算机的工作和资源的分配;以 提供给用户和其他软件方便的接口和环境 ;它是计算机系统中最基本的 系统软件。              ———— 王道       

    2024年02月09日
    浏览(53)
  • 《操作系统》——计算机系统概述

    前言: 在之前的【Linux】学习中,我们已经对常见指令已经开发工具等进行了详细的了解。紧接着,我们将要学习的便是关于【Linux进程】的基本知识。但是为了帮助大家更好的理解相关的知识概念,我先带领大家来学习关于《操作系统》这门课的基本知识!!! 目录 (一)

    2024年02月03日
    浏览(87)
  • 【操作系统】 1、计算机系统概述

    从操作系统的角度上来划分计算机体系结构: 这里注意一点: 编译器属于应用程序。 操作系统 :是指 控制 和 管理 计算机系统的 硬件 和 软件 资源 ,合理的组织、调度计算机的工作与资源分配,进而为用户和其他软件提供 方便接口与环境的程序集合。 操作系统是计算机

    2024年02月08日
    浏览(61)
  • 计算机基础——操作系统

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录  前言 一.操作系统 1.操作系统简介  2.操作系统的主要功能 (1)资源管理 (2)人机交互  (3)程序控制 (4)进程管理

    2024年01月23日
    浏览(55)
  • 计算机操作系统安全

    操作系统安全是计算机系统安全的重要组成部分,目的是保护操作系统的机密性、完整性和可用性。在当前的网络环境下,操作系统面临着许多威胁,如病毒、木马、蠕虫、黑客攻击等等。为了保护操作系统的安全,需要采取各种措施来防范这些威胁。本文将介绍一些常见的

    2024年02月02日
    浏览(46)
  • 计算机操作系统-笔记

    第一章 引论 1. 操作系统定义 操作系统是运行在内核态的软件,它执行两个基本上独立的任务。 隐藏计算机底层硬件的实现,为用户及应用程序提供一个资源集的清晰抽象。 管理计算机硬件资源。 任何操作系统的核心是它可处理的系统调用集。这些系统调用集真实地说明了

    2024年02月20日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包