时间片轮转算法(c++)

这篇具有很好参考价值的文章主要介绍了时间片轮转算法(c++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

操作系统进程调度的基本算法,时间片轮转。

假设cpu只有单核,但是进程很多,最简单就是先来先服务,但是会造成后来的进程等待很久,所以有另一种策略就是每个进程都服务一会,这样就不会出现一个进程长时间得不到服务的情况   (饿死现象),在轮流服务一会的方式中,由于cpu一般速度较快,所以我们可能会产生一种错觉就是有多个cpu在给我们服务,我们的多个进程好像都收到反馈了

输入即将到达的进程数还有进程的信息,时间片大小,初始化pcb, 设时间为0

创建3条队列(就绪,未到达,完成) ,各进程按到达时间排序, 入未到达队列

外循环(以是否有进程还没执行好为条件)

    { 内循环(当前时间未到达队列是否有进程到达了 为条件)

        {    送入就绪队列

        }

       if(就绪队列空)  

       { 时间加一,后面不用执行

        }

       else

       { 就绪队列取进程,状态改’run’

       时间片循环(时间片未用完 为条件)

      { 时间加一

        循环(当前时间未到达队列是有进程到达)

        {    送入就绪队列

         }

        if(剩余服务时间==0)

        { 进程状态’finish’

            完成时间就是当前时间

            插入完成队列

           跳出时间片循环

       }

    }

    if(进程状态’run’)

    { 进程状态’wait’

      插入就绪队列

    }

 }

}

打印结果

示例代码如下

#define time_slice  3       //时间片长度
#define N			5		//进程数
#include<iostream>
#include <queue>
using namespace std;

struct pcb
{
	char process_name[10];   //进程名字
	int arrive_time;   		//到达时间
	int service_time;   	//需要服务时间
	int remain_time;        //还差多少时间
	int complete_time;   	//完成时间
	char state; 			//进程状态

}PCB[N + 1];             //0号单元不存数据,直接用作交换

queue<pcb> Wait_queue;		//就绪队列
queue<pcb> Coming_queue;	//还未到达
queue<pcb> Finish_queue;	//已完成


void sort(int n)          //按到达时间升序
{
	int i, j;
	for (i = 1; i < n; i++)            
	{
		for (j = 1; j <= n - i; j++)
		{
			if (PCB[j].arrive_time > PCB[j + 1].arrive_time)
			{
				PCB[0] = PCB[j];
				PCB[j] = PCB[j + 1];
				PCB[j + 1] = PCB[0];
			}
		}
	}
}

int rr(int n)
{
	int i, time = 0, t;
	
	cout << "\n请输入各进程的信息\n" << endl;
	for (i = 1; i <= n; i++)      //输入各进程信息,插入未到达队列
	{
		PCB[i].state = 'w';
		cout << "------\n请输入第" << i << "进程名字: ";
		cin >> PCB[i].process_name;
		cout << "请输入到达时间: ";
		cin >> PCB[i].arrive_time;
		cout << "请输入服务时间: ";
		cin >> PCB[i].service_time;
		PCB[i].remain_time = PCB[i].service_time;
		
	}
	sort(n);
	for (i = 1; i <= n; i++)
	{
		Coming_queue.push(PCB[i]);
	}

	i = 1;

                           // 进程还有未执行完毕
	while (Coming_queue.empty() == false || Wait_queue.empty() == false)     
	{
			while (Coming_queue.empty() == false && time >= Coming_queue.front().arrive_time)        //有进程到达
			{
				Wait_queue.push(Coming_queue.front());   //从未到达队列 放到就绪队列
				Coming_queue.pop();
			}
		if(Wait_queue.empty() == true)     //就绪队列空,时间加1,本次不运行进程
		{
			time++;
			continue;
		}
		else     //就绪队列非空
		{
			cout << "\n第" << i << "次调度执行进程:" << Wait_queue.front().process_name 
				<< "\t 时间: " << time << endl;
			t = time_slice;   //t等于时间片

			PCB[0] = Wait_queue.front();    //取出就绪队列头
			Wait_queue.pop();
			PCB[0].state = 'r';				//状态正在运行
			while (t-- > 0)
			{
				time++;				
				while (Coming_queue.empty() == false && time >= Coming_queue.front().arrive_time)        //有进程到达
				{
					Wait_queue.push(Coming_queue.front());        //插入就绪队列
					Coming_queue.pop();
				}
				
				if (--PCB[0].remain_time == 0)					//剩余服务时间-1,结果已经为0
				{
					PCB[0].state = 'f';							//进程完成
					PCB[0].complete_time = time;				//完成时间就是当前时间
					Finish_queue.push(PCB[0]);					//插入完成队列
					break;
				}
			}
			if (PCB[0].state == 'r')    	//时间片结束还没执行完
			{
				PCB[0].state = 'w';			//回到就绪队列
				Wait_queue.push(PCB[0]);
			}
		}
		i++;
	}
	return 0;
}

void print()
{
	int i = 0;
	float round_time[N],		  //周转时间
		  force_round_time[N],    //带权周转时间
		  sum = 0;				  //存放各进程的带权周转时间和
	cout << "\n 进程   |" << "到达时间  |" << "  服务时间   |" << "  完成时间   |" << "  周转时间  |" << " 带权周转时间" << endl;
	while (Finish_queue.empty() == false)
	{
		round_time[i] = Finish_queue.front().complete_time - Finish_queue.front().arrive_time;
		force_round_time[i] = round_time[i] / Finish_queue.front().service_time;
		cout << Finish_queue.front().process_name
			<< "\t|  " << Finish_queue.front().arrive_time
			<< "\t   |  " << Finish_queue.front().service_time << " \t |  " << Finish_queue.front().complete_time
			<< "\t       |  " << round_time[i]
			<< "\t    |  " << force_round_time[i]
			<< endl;
		Finish_queue.pop();
		
		sum += force_round_time[i];
		i++;
	}
	cout << "\n\n系统平均带权周转时间: " << (sum / i) << endl;
}

int main()
{
	cout << "\t\t时间片轮转调度算法" << endl;
    rr(N);
	print();
	return 0;
}

时间片轮转调度c++代码,算法,c++

时间片轮转调度c++代码,算法,c++

 时间片轮转调度c++代码,算法,c++文章来源地址https://www.toymoban.com/news/detail-770602.html

到了这里,关于时间片轮转算法(c++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR

    实验内容: 实现时间片轮转算法(模拟),要求如下: 1、用到的数据结构 /* PCB / struct PCB { pid_t pid;//进程 PID int state; //状态信息,1 表示正在运行,0 表示暂停,-1 表示结束 unsigned long runned_time;//已运行时间 unsigned long need_running_time;//剩余运行时间 }; / PCB集合 */ struct PCB pcb[TOT

    2024年02月04日
    浏览(55)
  • 时间片轮转算法(c++)

    操作系统进程调度的基本算法,时间片轮转。 假设cpu只有单核,但是进程很多,最简单就是先来先服务,但是会造成后来的进程等待很久,所以有另一种策略就是每个进程都服务一会,这样就不会出现一个进程长时间得不到服务的情况   (饿死现象),在轮流服务一会的方式中

    2024年02月03日
    浏览(33)
  • 【linux 多线程并发】多任务调度器,调度策略时间片轮转,先进先出,多种实时任务的策略,内核级最高优先级调度策略

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年02月03日
    浏览(54)
  • 进程调度算法——C++实现 [ FCFS,SJF,HPR,HRN + 开源代码 + 详细解析 ]

    ✅ (原创,库存,第100篇博客,纪念一下) (1) 先来先服务算法FCFS (First Come First Service):即调度程序只靠率一个参数———作业到达系统的时间,谁先到就先给谁提供服务。 (2) 最短作业优先算法SJF (Shortest Job First):即我们也只考虑一个参数———进程的CPU的执行时间,计算量

    2023年04月13日
    浏览(38)
  • 五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

    说明: 1、假设有只两种状态,就绪状态和结束状态。进程的初始状态都为就绪状态。 2、每次运行所设计的处理器调度程序调度进程之前,为每个进程随机生成它的要求运行时间。 3、模拟处理器调度,被选中的进程并不实际启动运行,而是执行已运行时间+1来模拟进程的一

    2024年02月08日
    浏览(47)
  • 磁盘调度算法之先来先服务(FCFS),最短寻找时间优先(SSTF),扫描算法(SCAN,电梯算法),LOOK调度算法

    寻找时间(寻道时间) Ts:在读/写数据前,将磁头移动到指定磁道所花的时间。 ① 启动磁头臂 是需要时间的。假设耗时为s; ② 移动磁头 也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为m,总共需要跨越n条磁道。 则寻道时间 T s = s + m ∗ n Ts =s + m*n T s = s + m ∗

    2024年02月08日
    浏览(47)
  • 【华为OD机试真题】1260 - 响应报文时间(JAVA C++ Python JS) | 机试题+算法思路+考点+代码分析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Python语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述

    2024年02月07日
    浏览(44)
  • 基于MATLAB的多无人机多任务调度算法——CBBA带时间窗

    基于MATLAB的多无人机多任务调度算法——CBBA带时间窗 简介: 多无人机(Multi-UAV)的多任务调度是无人机应用领域的重要问题之一。CBBA(Consensus-based Bundle Algorithm)是一种用于多无人机多任务调度的经典算法之一。本文将介绍基于MATLAB的CBBA算法,并对其进行改进,加入时间窗

    2024年02月02日
    浏览(50)
  • 多级反馈队列调度算法(c++)

    如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是)  (骗一下数据,说不定以后面试就过了,拜谢) 操作系统基本调度算法,多级反馈队列调度算法。在划分时间片的调度算法中,多级反馈队列算法兼顾提高系统吞吐率和及减少进程饥饿。设置多个反馈队列,

    2024年02月09日
    浏览(38)
  • 操作系统磁盘调度算法(c++)

    先来先服务这个没什么好说了,按顺序来就是了。将需要访问的磁道序列直接作为算法的访问序列,然后将每次移动的磁道数量记录下来。 最短寻道时间优先,每次执行完,看一下离自己最近的哪条磁道有任务,就移动过去执行。每次寻找下一次访问的磁道号时,都遍历磁道

    2024年02月04日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包