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;
    
    
    
    


    鲜花会生锈,盐巴会腐烂
  • 相关阅读:
    Spring——Spring整合Mybatis及事务
    Spring——配置,依赖注入,Bean的自动装配
    Mybatis—多对一和一对多
    Mybatis—动态SQL
    Elasticserch学习之查询字符串
    Elasticserch学习之分页
    Elasticserch学习之多索引和多类别
    Elasticserch学习之搜索(二)
    Elasticserch学习之数据
    Elasticserch学习之添加索引
  • 原文地址:https://www.cnblogs.com/hunterxing/p/9709302.html
Copyright © 2011-2022 走看看