zoukankan      html  css  js  c++  java
  • 实验三

    #include<stdafx.h>
    #include<stdio.h>
    #include <malloc.h>
    //#include <string>   //c里面没有string,因为string是一个类,而c没有类
    #include <string.h>
    #define _CRT_SECURE_NO_WARNINGS
    //using namespace std;
    
    struct PCB
    {
        int ProcessReachTime;//标志进程到达时间
        char PID[10];//进程ID
        //int priority;//进程优先数,在这里的FCFS没有用
        //int chip;//时间片
        int needTime;
        int cputime;//进程已经占用CPU的时间
        int alltime;//进程还需要运行的时间(当进程运行完毕时,其值为0)
        char state;//进程的状态STATE(为简化起见。设每个进程处于运行E(excecuting)、就绪R(ready)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态R。)
        struct PCB* next;//进程队列指针NEXT(用来将PCB排成队列)等
    };
    
    int time;//用于进程到达时间和需要时间
    char strPID[10];
    int num;
    struct PCB  *start,*startHead,*temp,*newNode;
    int totalTime=0;
    int main()
    {
        printf("请输入进程数:");
        scanf_s("%d",&num);
    
        start=(PCB*)malloc(sizeof(PCB));
        startHead=(PCB*)malloc(sizeof(PCB));
        start=NULL;
        startHead=start;
    
        temp=(PCB*)malloc(sizeof(PCB));
        temp=startHead;
    
        for (int i=0;i<num;i++)
        {
            startHead=start;
            temp=startHead;
            newNode=(PCB*)malloc(sizeof(PCB));
            //--------------------------
            printf("请输入进程ID:");
            scanf_s("%s",strPID);
            strcpy_s(newNode->PID,strPID);//不能用newNode->PID=strPID;因为PID是一个字符数组newNode->PID是一个常量,不能复制
            //--------------------------
            printf("请输入进程到达时间:");
            scanf_s("%d",&time);
            newNode->ProcessReachTime=time;
            //--------------------------
            printf("请输入进程需要时间:");
            scanf_s("%d",&time);
            newNode->needTime=time;
            //--------------------------
            newNode->state='R';
    
    
            newNode->next=NULL;
            if(i==0)
            {
                start=newNode;
                startHead=start;
            }
            else if (i==1)
            {
                if(start->ProcessReachTime<=newNode->ProcessReachTime)
                {
                    startHead->next=newNode;
                }
                else
                {
                    newNode->next=startHead;
                    start=newNode;
                }
            }
            else
            {
                for(startHead=start;startHead!=NULL;startHead=startHead->next)
                {
                    temp=startHead;
                    if(start->ProcessReachTime>newNode->ProcessReachTime)
                    {
                        newNode->next=startHead;
                        start=newNode;
                        break;
                    }
                    
                    else if(startHead->ProcessReachTime<=newNode->ProcessReachTime &&startHead->next!=NULL&& startHead->next->ProcessReachTime>newNode->ProcessReachTime)//注意后面两个的顺序,如果顺序调换会发生错误
                    {
                        newNode->next=startHead->next;
                        temp->next=newNode;
                        break;
                    }
    
                    else if(startHead->next==NULL)
                    {
                        temp->next=newNode;
                        break;
                    }
                }
            }
            
        }
    
        int startTime=0;//用于记录一个进程开始运行的时间
        startHead=start;
        for(int i=0;startHead!=NULL;i++)
        {
            if (startHead->ProcessReachTime<=i&&startHead->state=='R')
            {
                startTime=i;//记录开始时间i为astartTime
                startHead->state='E';//进程为执行状态
                printf("在%d时刻:",i);
                printf("进程%s开始运行
    ",startHead->PID);
            }
            else if (i-startTime<startHead->needTime&&i-startTime>0&&startHead->state=='E')
            {
                printf("在%d时刻:",i);
                printf("进程%s正在运行
    ",startHead->PID);
            }
            else if (i-startTime==startHead->needTime&&startHead->state=='E')
            {
                startHead->state='F';
                printf("在%d时刻:",i);
                printf("进程%s结束运行
    ",startHead->PID);
                startHead=startHead->next;
                i--;//这个很重要,主要在结束时刻是否有进程执行
            }
    
            if(startHead==NULL)
            {
                printf("进程调度结束");
            }
        }
    
    
        
        while(1);
    }

    心得体会:

         了解进程调度大概原理。

  • 相关阅读:
    [原创]什么是安全性测试
    [原创]如何有效的考核测试人员
    [原创]MySql官方压力测试工具Mysqlslap
    [原创软件测试工作技能
    [原创]如何有效构建测试环境
    [原创]常见系统测试类型总结
    [原创]Kjava手机顽童模拟器
    [原创]浅谈测试人员提交缺陷记录
    [原创]Windows/Unix 资源性能计数器
    [原创]戴明PDCA方法
  • 原文地址:https://www.cnblogs.com/zzen/p/4600245.html
Copyright © 2011-2022 走看看