zoukankan      html  css  js  c++  java
  • 操作系统 FCFS先到先服务调度算法

    //cpp文件
    
    
    #include "stdafx.h"
    
    void FCFS();//先到先服务调度算法
    void  SJF();//短进程优先算法
    void printProc();//输出进程的计算结果
    
    struct process_type //进程结构
    {
    	int pid;
    	int ArrivalTime;//到达时间
    	int ServiceTime;//服务时间
    	int StartTime;//开始时间
    	int FinishTime;//完成时间
    	int RoundTime;//周转时间
    	double WeightRoundTime;//带权周转时间   
    };
    
    struct process_type proc[20];//申请20个进程控制块,内存中进程数最大值为20
    int PNum, NowTime;//PNum表示进程数,NowTime表示当前的时刻
    
    int SumRT = 0; //总周转时间
    double SumWRT = 0; //总带权周转时间
    int AverageRT = 0; //平均周转时间   
    double AverageWRT = 0;//平均带权周转时间
    
    void   main()
    {
    	int i, n;
    	char a;
    	n = 1;
    
    	cout << "请输入进程个数:";
    	cin >> PNum;
    	for (i = 0;i<PNum;i++)
    	{
    		cout << "请输入第" << i + 1 << "个进程的pid,到达时间和服务时间:" << endl;
    		cin >> proc[i].pid;
    		cin >> proc[i].ArrivalTime;
    		cin >> proc[i].ServiceTime;
    	}
    
    	while (n == 1)
    	{
    		cout << "
    ********************************************";
    		cout << "
    *               CPU调度演示系统            *";
    		cout << "
    ********************************************";
    		cout << "
               1.FCFS        2.SJF        3.退出";
    		cout << "
    ********************************************";
    		cout << "
    请选择(~)";
    		cin >> a;
    
    		//		a=getchar();
    		switch (a)
    		{
    		case'1':
    			FCFS();
    			printProc();
    			break;
    		case'2':
    			SJF();
    			printProc();
    			break;
    		case'3':
    			exit(0);
    		default:
    			n = 0;
    		}
    	}
    }
    
    void printProc()//输出进程的计算结果
    {
    	cout << endl << "进程pid	到达时间	服务时间	周转时间	带权周转时间
    ";//逐个输出每一个进程的相关数据
    
    	for (int i = 0;i<PNum;i++)
    	{
    		cout << endl << proc[i].pid << "	" << proc[i].ArrivalTime << "		" << proc[i].ServiceTime << "		" << proc[i].RoundTime << "		" << proc[i].WeightRoundTime;
    		SumRT += proc[i].RoundTime;
    		SumWRT += proc[i].WeightRoundTime;
    	}
    	/*计算平均周转时间*/
    	AverageRT = SumRT / PNum;
    	/*计算平均带权周转时间*/
    	AverageWRT = SumWRT / PNum;
    	cout << "
    平均周转时间:" << AverageRT << "	" << "	平均带权周转时间:" << AverageWRT << endl;//输出平均周转时间和平均带权周转时间
    }
    
    void FCFS()
    {
    	int i, j;
    	for (i = 0;i<PNum;i++)//按进程到达时间的先后排序
    	{                                  
    		for (j = 0;j<PNum - i - 1;j++)
    		{
    			if (proc[j].ArrivalTime>proc[j + 1].ArrivalTime)
    			{
    				/*	  填写代码   */
    				int a = proc[j + 1].ArrivalTime;
    				int b = proc[j + 1].RoundTime;
    				int c = proc[j + 1].pid;
    
    				proc[j + 1].ArrivalTime =  proc[j].ArrivalTime;
    				proc[j + 1].RoundTime   =  proc[j].RoundTime;
    				proc[j + 1].pid         =  proc[j].pid;
    
    				proc[j].ArrivalTime =  a;
    				proc[j].RoundTime =  b;
    				proc[j].pid =  c;
    
    
    			}
    		}
    	}
    	
    
    
    
    	for (i = 0;i<PNum;i++)
    	{
    		if (i == 0)
    		{
    			/*计算开始时间*/
    			proc[i].StartTime = 0;
    
    			/*计算结束时间*/
    			proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;
    		}
    		else
    		{
    			if (proc[i].ArrivalTime<proc[i - 1].FinishTime)
    			{
    				/*计算结束时间*/
    				proc[i].StartTime = proc[i - 1].FinishTime;//开始时间等于上一个进程的结束时间
    				proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;//结束时间等于开始时间加上服务时间
    
    			}
    			else
    			{
    				/*计算结束时间*/
    				proc[i].StartTime = proc[i].ArrivalTime;//如果在前一个进程结束之后到达,则开始时间等于到到达时间
    				proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;//结束时间等于开始时间加上服务时间
    			}
    		}
    
    
    
    	
    
    		printf("进程%d从%d开始,在%d时刻结束
    ", proc[i].pid, proc[i].StartTime, proc[i].FinishTime);
    
    		proc[i].RoundTime = proc[i].FinishTime - proc[i].ArrivalTime;//周转时间
    		proc[i].WeightRoundTime = proc[i].RoundTime / proc[i].ServiceTime;//带权周转时间
    
    		proc[i + 1].StartTime = proc[i].FinishTime;
    	}
    	//	printProc();
    }
    
    void SJF()
    {
    
    }
    
    
    //头文件
    // stdafx.h : 标准系统包含文件的包含文件,
    // 或是经常使用但不常更改的
    // 特定于项目的包含文件
    //
    
    #pragma once
    
    #include "targetver.h"
    
    #include <stdio.h>
    #include <tchar.h>
    
    
    
    // TODO:  在此处引用程序需要的其他头文件
    
    #include "stdafx.h"
    #include <iostream>
    #include "conio.h"
    #include "stdio.h"
    #include "stdlib.h"
    
    using namespace std;
    
    
    
    


    鲜花会生锈,盐巴会腐烂
  • 相关阅读:
    5 Things Every Manager Should Know about Microsoft SharePoint 关于微软SharePoint每个经理应该知道的五件事
    Microsoft SharePoint 2010, is it a true Document Management System? 微软SharePoint 2010,它是真正的文档管理系统吗?
    You think you use SharePoint but you really don't 你认为你使用了SharePoint,但是实际上不是
    Introducing Document Management in SharePoint 2010 介绍SharePoint 2010中的文档管理
    Creating Your Own Document Management System With SharePoint 使用SharePoint创建你自己的文档管理系统
    MVP模式介绍
    权重初始化的选择
    机器学习中线性模型和非线性的区别
    神经网络激励函数的作用是什么
    深度学习中,交叉熵损失函数为什么优于均方差损失函数
  • 原文地址:https://www.cnblogs.com/hunterxing/p/9709302.html
Copyright © 2011-2022 走看看