进程调度时间片轮转例题_进程调度算法java

进程调度时间片轮转例题_进程调度算法java一、实验目的(1)加深对进程的理解(2)理解进程控制块的结构(3)理解进程运行的并发性(4)掌握时间片轮转法进程调度算法二、实验原理(1)建立进程控制块(2)设计两个链队列,分别表示就绪队列和完成队列(3)用户输入进程标识符,进程到达时间,进程所需的时间,申请空间存放进程,PCB信息。(

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定



一、实验目的

1) 加深对进程的理解

2) 理解进程控制块的结构

3) 理解进程运行的并发性

4) 掌握时间片轮转法进程调度算法

二、实验原理

1)建立进程控制块

2)设计两个链队列,分别表示就绪队列和完成队列

3)用户输入进程标识符,进程到达时间,进程所需的时间,申请空间存放进程,PCB信息。

4)每一个时间片结束输出各进程的进程标识符,CPU运行时间

,进程所需时间,达到时间,周转时间,以及状态(运行完成或者就绪)


三、实验步骤、数据记录及处理


1.算法流程


本程序中用到抽象数据类型的定义


struct _PCBNode{	char name[20];       //进程名称	int arrive_time;     //到达时间	int need_time;      //服务时间	int cputime;         //CPU已经执行的时间	int accomplish_Time; //完成时间	int turn_over_time;  //周转时间	bool tag;            //是否完成};  class _PCB{	private:	queue<struct _PCBNode> _PNode;	queue<struct _PCBNode> _CNode;	int TIME;}

Jetbrains全家桶1年46,售后保障稳定

 

主程序的流程以及各程序模块之间的层次(调用)关系。

进程调度时间片轮转例题_进程调度算法java

实现概要设计中定义的主要函数,主要函数写出核心算法(要求注释);并尽可能画程

序流程图)

本程序写着的就绪队列中放着客户外界输入未到达的进程,所以在进行时间片轮转时要判断当前时间和到达时间,到达时间大于当前时间时才能CPU的调度
进程调度时间片轮转例题_进程调度算法java
void Pop()//模仿时间轮转调度
	{
		struct _PCBNode node;
		unsigned int n = _PNode.size();
		unsigned int  i = 0;
		for(; i< n; ++i)// for循环找队列中到达时间大于当前时间时的进程
		{
			node = _PNode.front();_PNode.pop();
			if(node.arrive_time <= TIME)
			{
				break;
			}
			_PNode.push(node);

		}

		TIME = TIME+Time_Pice;//模拟进程运行中
		
		if(i == n)//没找到到达时间大于当前时间时的进程		{
			Display_PCB();
			return ;
		}

		node.cputime +=Time_Pice; //进程占有CPU运行的时间

		if(node.cputime >= node.need_time)//完成运行,进入完成队列
		{
			node.accomplish_Time = TIME;
			node.tag = true;
			node.turn_over_time  = node.accomplish_Time -node.arrive_time ;
			_CNode.push(node);  
			cout<<node.name<<"   run over"<<endl;
		}
		else
		{
			_PNode.push(node);
		}
		Display_PCB(); 
	}

2.运行结果分析

时间片被设置为 2,打印TIME时间时就绪队列和运行完成队列的进程状态


进程调度时间片轮转例题_进程调度算法java

四、总结与体会

  通过做本次实验,我模拟了CPU进程调度中的时间片轮转调度算法。时间片轮状调度算法可以实现进程共享CPU。在试验中,我发现时间片不能太大,否则会导致大部分的进程在一个时间片中就能运行完成,不能实现进程对CPU资源的共享。


附录:源程序

#include<iostream> #include<queue> #include<string> using namespace std; #define Time_Pice 2 struct _PCBNode { char name[20]; //进程名称 int arrive_time; //到达时间 int need_time; //服务时间 int cputime; //CPU已经执行的时间 int accomplish_Time; //完成时间 int turn_over_time; //周转时间 bool tag; //是否完成 }; class _PCB { public: void Push(struct _PCBNode& node) { _PNode.push(node); } void init_time() { TIME = 0; } bool empty() { return _PNode.empty(); } void Pop() { struct _PCBNode node; unsigned int n = _PNode.size(); unsigned int i = 0; for(; i< n; ++i) { node = _PNode.front();_PNode.pop(); if(node.arrive_time <= TIME) { break; } _PNode.push(node); } TIME = TIME+Time_Pice; if(i == n) { Display_PCB(); return ; } node.cputime +=Time_Pice; if(node.cputime >= node.need_time) { node.accomplish_Time = TIME; node.tag = true; node.turn_over_time = node.accomplish_Time -node.arrive_time ; _CNode.push(node); cout<<node.name<<" run over"<<endl; } else { _PNode.push(node); } Display_PCB(); } void Display_PCB() { cout<<" TIME "<<TIME<<endl; int n = _PNode.size(); if(n != 0) { cout<<"ready......."<<endl; cout<<"name arrive_time need_time cputime tag"<<endl; for(int i = 0;i<n; ++i) { struct _PCBNode node = _PNode.front();_PNode.pop(); if(node.arrive_time <= TIME) { cout<<node.name<<" "<<node.arrive_time<<" " <<node.need_time<<" "<<node.cputime <<" "<<node.tag <<endl; } _PNode.push(node); } cout<<endl; } n = _CNode.size(); if(n != 0) { cout<<"run over"<<endl; cout<<"name arrive_time need_time accomplish_Time turn_over_time tag"<<endl; for(int i = 0;i<n; ++i) { struct _PCBNode node = _CNode.front();_CNode.pop(); cout<<node.name<<" "<<node.arrive_time<<" " <<node.need_time<<" "<<node.accomplish_Time<<" "<< node.turn_over_time<<" "<<node.tag <<endl; _CNode.push(node); } cout<<endl; } cout<<"**************************************************"<<endl; } private: queue<struct _PCBNode> _PNode; queue<struct _PCBNode> _CNode; int TIME; }; void main() { _PCB pcb; pcb.init_time(); int PCB_Numble; char PCBname[20]; int arrive_time; int need_time; cout<<"input PCB_Numble : "; cin>>PCB_Numble; cout<<"input PCBname arrive_time need_time example A 0 5\n"; for(int i = 0; i<PCB_Numble; ++i) { cin>>PCBname>>arrive_time>>need_time; struct _PCBNode node; strcpy(node.name ,PCBname); node.arrive_time = arrive_time; node.need_time = need_time; node.accomplish_Time = 0; node.cputime = 0; node.tag = 0; pcb.Push(node); } pcb.Display_PCB(); while(!pcb.empty()) { pcb.Pop(); } }  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218958.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 现在的SEO最须要会点啥

    现在的SEO最须要会点啥

    2021年11月16日
    37
  • 输出数组的全排列java_java用sort对一个数组排序

    输出数组的全排列java_java用sort对一个数组排序packagetest;importjava.util.ArrayList;importjava.util.List;publicclass Test{staticList<int[]>allSorts=newArrayList<int[]>();publicstaticvoidpermutation(int[]nums,i…

    2022年10月11日
    2
  • VS2008安装失败原因!「建议收藏」

    VS2008安装失败原因!「建议收藏」从RTM到现在,我已安装十多回VS2008,发现总会安装OfficeTools的时候,会失败。百思不知其解。后在网上看到,是因为我们使用UltraISO制作激活成功教程的VS2008的时候带出来的问题,主要是Unicode的问题。于是我这个怎么解决呢?我尝试先用deamon打开原版的vs2008,再用untraISO将虚拟盘的所以文件加入新的ISO中,再将激活成功教程的setup.那个文件,加入。重新生成iso

    2025年9月25日
    5
  • C语言 system函数[通俗易懂]

    C语言 system函数[通俗易懂]Windows函数windows操作系统下system()函数详解(主要是在C语言中的应用) 函数名:system功能:发出一个DOS命令用法:intsystem(char*command);system函数已经被收录在标准c库中,可以直接调用程序例:#includestdlib.h>#includestdio.h>intmain(void){printf(“Aboutt

    2022年9月18日
    2
  • VB6.0数据库开发五个实例——罗列的总结

    VB6.0数据库开发五个实例——罗列的总结

    2021年12月15日
    36
  • 新手入门树莓派必做的四件事

    新手入门树莓派必做的四件事随着树莓派在国内的热度越来越高,现在已经有很多人开始接触树莓派了。对于新手,有四件必须完成的事:1、为树莓派更换国内源。2、让Raspbian系统显示中文。3、安装中文输入法。4、调整树莓派的时区时间。不过安装一个合适的系统才是这四件事的前提,众多系统中,Raspbian算比较适合新手的。安装系统如果安装Raspbian系统,可以通过这个链接下载镜像

    2022年5月9日
    68

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号