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

    //优先级调度算法
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    
    #define getpch(type)(type*)malloc(sizeof(type))
    #define NULL 0
    
    struct pcb 
    {/*定义进程控制块PCB*/
    char name[10];
    char state;
    int super;
    int ntime;
    int rtime;
    struct pcb* link;
    }
    *ready=NULL,*p;
    
    typedef struct pcb PCB;
    
    void sort() /*建立对进程进行优先级排列函数*/
    {
     PCB *first, *second;
    int insert=0;
    if((ready==NULL)||((p->super)>(ready->super)))/*优先级最大者,插入队首*/
    {
    p->link=ready;
    ready=p;
    }
    else/*进程比较优先级,插入适当的位置中*/
    {
    first=ready;
    second=first->link;
    while(second!=NULL)
    {
    if((p->super)>(second->super))/*若插入进程比当前进程优先数大,*/
    {/*插入到当前进程前面*/
    p->link=second;
    first->link=p;
    second=NULL;
    insert=1;
    }
    else/*插入进程优先数最低,则插入到队尾*/
    {
    first=first->link;
    second=second->link;
    }
    }
    if(insert==0) first->link=p;
    }
    }
    
    void input()/*建立进程控制块函数*/
    {
    int i,num;
    system("cls");/*清屏*/
    printf("
     请输入进程数: ");
    scanf("%d",&num);
    for(i=1;i<=num;i++)
    {
    printf("
     进程号No.%d:
    ",i);
    p=getpch(PCB);
    printf("
     输入进程名:");
    scanf("%s",p->name);
    printf("
     输入进程优先数:");
    scanf("%d",&p->super);
    printf("
     输入进程运行时间:");
    scanf("%d",&p->ntime);
    printf("
    ");
    p->rtime=0;p->state='w';
    p->link=NULL;
    sort();/*调用sort函数*/
    }
    }
    int space()
    {
    int l=0;
    PCB* pr=ready;
    while(pr!=NULL)
    {
    l++;
    pr=pr->link;
    }
    return(l);
    }
    
    void disp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/
    {
    printf("
     进程名	 状态	 优先数	 需要运行时间	 已经运行时间
    ");
    printf("|%s	",pr->name);
    printf("|%c	",pr->state);
    printf("|%d	",pr->super);
    printf("|%d		",pr->ntime);
    printf("|%d	",pr->rtime);
    printf("
    ");
    }
    
    void check()/*建立进程查看函数*/
    {
    PCB* pr;
    printf("
     **** 当前正在运行的进程是:
    ");/*显示当前运行进程*/
    disp(p);
    pr=ready;
    printf("
     **** 当前就绪队列状态为:
    "); /*显示就绪队列状态*/
    while(pr!=NULL)
    {
    disp(pr);
    pr=pr->link;
    }
    }
    void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
    {
    printf("
     进程 [%s] 已完成.
    ",p->name);
    free(p);
    }
    void running() /*建立进程就绪函数(进程运行时间到,置就绪状态*/
    {
    (p->rtime)++;
    if(p->rtime==p->ntime)
    destroy();/*调用destroy函数*/
    else
    {
    (p->super)--;
    p->state='w';
    
    sort();/*调用sort函数*/
    }
    }
    
    void main()/*主函数*/
    {
    int len,h=0;
    char ch;
    input();
    len=space();
    while((len!=0)&&(ready!=NULL))
    {
    ch=getchar();
    h++;
    printf("-----------------------------------------------------");
    printf("
     现在是第%d次运行: 
    ",h);
    p=ready;
    ready=p->link;
    p->link=NULL;
    p->state='r';
    check();
    running();
    printf("
    按任意键继续......
    ");
    }
    printf("
    
    进程已经完成.
    ");
    }

  • 相关阅读:
    wpf 控件回车事件中调用tab实现方法
    C#中M的N次方显示
    新概念英语第三册单词
    新概念英语第二册单词
    手把手教你搭建一个vue项目
    Vuex里的module选项和移动端布局
    Vuex与axios的封装和调用
    Vue路由
    Vue脚手架的搭建和路由配置
    Vue全家桶之一Vue(基础知识篇)
  • 原文地址:https://www.cnblogs.com/badgood/p/4543651.html
Copyright © 2011-2022 走看看