加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱故事小小网_铜陵站长网 (http://www.0562zz.com/)- 视频终端、云渲染、应用安全、数据安全、安全管理!
当前位置: 首页 > 教程 > 正文

C语言达成时间片轮转法的cpu调度模拟

发布时间:2021-11-19 18:28:22 所属栏目:教程 来源:互联网
导读:/*这是实验课题目,上课时写的,不是很完整,仅当留着做个纪念,有问题大家一起学习讨论。*/ /*废话不多说,直接上代码!*/ /*****时间片轮转法进行CPU调度算法********/ #includestdio.h #includemalloc.h #includestring.h #define N 10 //定义最大进程数

/*这是实验课题目,上课时写的,不是很完整,仅当留着做个纪念,有问题大家一起学习讨论。*/
/*废话不多说,直接上代码!*/
 
/*****时间片轮转法进行CPU调度算法********/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define N 10  //定义最大进程数
#define TIME 2//定义时间片大小
typedef struct pcb{
    char id[10];//进程标识数
    int arrivetime;//到达时间
    int runtime;//进程已经占用的cpu时间
    int needtime;//进程还需要的时间
    char state[12];//进程运行状态:wait or runing
    struct pcb *next;
}pcb,*PCB;
PCB head;//设置全局变量用来修改就绪队列
PCB tail;
int count=0;//记录就绪队列中进程数
void CreatProcess(){
    //创建进程
    PCB p,q;//进程的头尾指针都有
    int num;//记录要创建的进程数
    int i,j;
    int arrive[N];
    head=tail=(PCB)malloc(sizeof(pcb));
    head->next=NULL;
    p=head;
    printf("输入你要创建的进程数:");
    scanf("%d",&num);
    count=num;
    printf("********按照进程到达时间从小到大创建就绪队列******n");
    //初始对其排序来创建就绪队列
    for(i=1;i<=num;i++){
        p->next=(PCB)malloc(sizeof(pcb));
        p=p->next;
        tail=p;
        printf("输入进程%d的标示符:",i);
        scanf("%s",p->id);
        printf("输入进程%d的到达时间:",i);
        scanf("%d",&p->arrivetime);
        printf("输入进程%d已占用的cpu时间:",i);
        scanf("%d",&p->runtime);
        printf("输入进程%d还需要的cpu时间:",i);
        scanf("%d",&p->needtime);
        printf("输入进程%d当前状态:(run 或者wait):",i);
        scanf("%s",p->state);
    }
    tail->next=p->next=NULL;
}
void RR_RunProcess(){
    //运行进程,简单轮转法Round Robin
    PCB p,q,temp;
    p=head->next;
    while(1){
    if(head->next==NULL)
    {
        printf("此时就绪队列中已无进程!n");
            return ;
    }
    else
    {
        while(p){
            if((p->needtime>0)&&!(strcmp(p->state,"wait"))){
                printf("进程%s开始,n",p->id );
                strcpy(p->state,"run");
                p->runtime+=TIME;
                p->needtime-=TIME;
                if(p->needtime<0)
                    p->needtime=0;
            }
            temp=p;//把该时间片内运行完的进程存到临时temp中
            //把temp接到链表尾部,销毁P;
            if(temp->needtime>0){//把该时间片内运行完的进程接到就绪队列的尾部
                if(count>1){
                head->next=temp->next;
                tail->next=temp;
                tail=tail->next;
                strcpy(tail->state,"wait");
                tail->next=NULL;
                }
                else if(count==1){//当只有一个进程等待时,分开讨论
                    head->next=temp;
                    tail=temp;
                    strcpy(tail->state,"wait");
                    tail->next=NULL;
 
                }
                 
            }
            if(temp->needtime==0){//销毁就绪队列中已经结束的进程
                count--;//此时就绪队列中进程数减1
                printf("进程%s结束.n",p->id);
                head->next=temp->next;
                free(temp);//撤销就绪队列中已经结束的进程
 
            }
 
            p=head->next;
 
        }
 
    }
    }
}
void main(){
    printf("**************进程的初始状态!**************n");
    CreatProcess();
    printf("*******************************************ntt程序运行结果如下:nn");
    printf("*******************************************n");
    RR_RunProcess();//简单轮转法Round Robin
 
}

(编辑:我爱故事小小网_铜陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读