进程调度

简单轮转法。

其基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。

#include <stdio.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;
    first=ready;//read是head结点
    if (ready==NULL)
        ready=p;
    else{
        while (first->link!=NULL)
            first=first->link;//将first设置为tail结点
        first->link=p;//新输入的结点挂在队尾
    }
    return;
}

void input() /* 建立进程控制块函数*/
{
    int i,num;
    //clrscr(); /*清屏*/
    printf("\n 请输入进程个数?");
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
        printf("\n 进程号No.%d:\n",i);
        p=getpch(PCB);
        printf("\n 输入进程名:");
        scanf("%s",p->name);
        printf("\n 输入进程优先数:");
        scanf("%d",&p->super);
        printf("\n 输入进程运行时间:");
        scanf("%d",&p->ntime);
        printf("\n");
        p->rtime=0;p->state='w';
        p->link=NULL;
        sort(); /* 调用sort函数*/
    }
    return;
}

void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
    printf("\n qname \t state \t super \t ndtime \t runtime \n");
    printf(" |%s\t",pr->name);
    printf(" |%c\t",pr->state);
    printf(" |%d\t",pr->super);
    printf(" |%d\t",pr->ntime);
    printf(" |%d\t",pr->rtime);
    printf("\n");
    return;
}

void check() /* 建立进程查看函数 */
{
    PCB* pr;
    printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
    disp(p);
    pr=ready;//pr为就绪队列的head进程
    printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
    while(pr!=NULL)//显示就绪队列中的全部进程
    {
        disp(pr);
        pr=pr->link;
    }
    return;
}

void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
    printf("\n 进程 [%s] 已完成.\n",p->name);
    free(p);
    return;
}

void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
    (p->rtime)++;//得到CPU分配的时间+1
    if(p->rtime==p->ntime)//分配的时间等于所需运行时间,表示运行结束
        destroy(); /* 调用destroy函数*/
    else
    {
        p->state='w';
        sort(); /*调用sort函数*/
    }
    return;
}

void main() /*主函数*/

{
    int h=0;
    char ch;
    input();
    ch=getchar();
    while(ready!=NULL)
    {
        h++;
        printf("\n The execute number:%d \n",h);
        p=ready;//每次取head结点的进程
        ready=p->link;//head置为队列中第二个结点
        p->link=NULL;//取下head结点
        p->state='R';//状态设置为就绪ready
        check();
        running();
        printf("\n 按任一键继续......");
        ch=getchar();
    }
    printf("\n\n 进程已经完成.\n");
    ch=getchar();
    return;
}

最高优先数优先

/* 编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对多个并发进程进行调度。 要求:采用动态优先数。 即进程的优先数在创建进程时可以给定一个初始值, 并且可以按一定原则修改优先数:在进程获得一次CPU后就将其优先数减少1。 */
#include <stdio.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,*s;

typedef struct pcb PCB;

void sort() /* 建立对进程进行优先级排列函数(插入排序)*/
{
    PCB *first,*m,*q;
    //head=ready;//read是head结点
    if (ready==NULL)
        ready=p;
    else{
        first=p;//要插入的结点为first
        for(q=ready;(q!=NULL)&&(q->super<first->super);m=q,q=q->link);//寻找插入位置
        if(q==ready)
        {
            first->link=ready;//先连
            ready=first;//后断
        }
        else//插在m之后,q之前
        {
            first->link=q;//先连
            m->link=first;//后断
        }
    }
    return;
}

void input() /* 建立进程控制块函数*/
{
    int i,num;
    //clrscr(); /*清屏*/
    printf("\n 请输入进程个数?");
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
        printf("\n 进程号No.%d:\n",i);
        p=getpch(PCB);
        printf("\n 输入进程名:");
        scanf("%s",p->name);
        printf("\n 输入进程优先数:");
        scanf("%d",&p->super);
        printf("\n 输入进程运行时间:");
        scanf("%d",&p->ntime);
        printf("\n");
        p->rtime=0;p->state='w';
        p->link=NULL;
        sort(); /* 调用sort函数*/
    }
    return;
}

void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
    printf("\n qname \t state \t super \t ndtime \t runtime \n");
    printf(" |%s\t",pr->name);
    printf(" |%c\t",pr->state);
    printf(" |%d\t",pr->super);
    printf(" |%d\t",pr->ntime);
    printf(" |%d\t",pr->rtime);
    printf("\n");
    return;
}

void check() /* 建立进程查看函数 */
{
    PCB* pr;
    printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
    disp(p);
    pr=ready;//pr为就绪队列的head进程
    printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
    while(pr!=NULL)//显示就绪队列中的全部进程
    {
        disp(pr);
        pr=pr->link;
    }
    return;
}

void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
    printf("\n 进程 [%s] 已完成.\n",p->name);
    free(p);
    return;
}

void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
    (p->rtime)++;//得到CPU分配的时间+1
    (p->super)++;//进程获得一次CPU之后优先级减1,优先数越小优先级越高
    if(p->rtime==p->ntime)//分配的时间等于所需运行时间,表示运行结束
        destroy(); /* 调用destroy函数*/
    else
    {
        p->state='w';
        sort(); /*调用sort函数*/
    }
    return;
}

void main() /*主函数*/

{
    int h=0;
    char ch;
    input();
    ch=getchar();
    while(ready!=NULL)
    {
        h++;
        printf("\n The execute number:%d \n",h);
        p=ready;//每次取head结点的进程
        ready=p->link;//head置为队列中第二个结点
        p->link=NULL;//取下head结点
        p->state='R';//状态设置为就绪ready
        check();
        running();
        printf("\n 按任一键继续......");
        ch=getchar();
    }
    printf("\n\n 进程已经完成.\n");
    ch=getchar();
    return;
}

代码测试

创建3个进程,a,b,c,初始优先数分别为2,1,3(优先数越小优先级越高),运行时间都为3。
3个进程的运行时间总和为9,CPU时间片为1,所以进行9次运行之后,3个进程全部运行结束;
进程被CPU调度一次,优先数加1(优先级减1),运行时间加1;

进程调度_第1张图片

进程调度_第2张图片

进程调度_第3张图片

进程调度_第4张图片

进程调度_第5张图片

3 总结

你可能感兴趣的:(cpu,操作系统,malloc,sizeof,进程调度)