zoukankan      html  css  js  c++  java
  • 实验三 、进程调度模拟程序

    实验三、进程调度模拟程序

    专业 网络工程   姓名 方俊晖 学号 201406114309

    一、        实验目的

    通过本实验可以加深对有关进程控制块、进程队列的概念的进一步理解。

    二、        实验内容和要求

         1.进程PCB的结构体定义

         2.定义结构体

         3.输入进程序列

         4.排序(按到位时间)

         5.输出进程运行的结果

    三、        实验方法、步骤及结果测试

    #include<stdio.h> 
    #include<stdlib.h> 
    #include<string.h> 
    #include<windows.h>
    #include<time.h>
    typedef struct node 

    char name[10]; //进程名 
    int prio; //进程优先数 
    int cputime; //进程占用CPU时间
    int needtime; //进程到完成还要的时间
    int arrivetime; //进程到达时间
    int starttime; //进程开始时间
    int finishtime; //进程完成时间
    int servicetime; //进程服务时间
    char state; //进程的状态 
    struct node *next; 
    }PCB; 
    PCB *finish,*ready,*run; //队列指针
    int N; //进程量
    void firstin() 

    run=ready; //就绪队列头指针赋值给运行头指针
    run->state='R'; //进程状态变为运行态
    ready=ready->next; //就绪对列头指针后移到下一进程 

    void prt1(char a) 
    {
    switch(a)
    {
    case 1: /*优先数法*/ 
    printf("名字 进程占用CPU时间 需要的时间 优先级数 状态 ");break; 
    case 2: /*先来先服务算法*/
    printf("名字 到达时间 开始时间 服务时间 完成时间 状态 ");break;
    default:break;
    }

    void prt2(char a,PCB *q) 

    switch(a)
    {
    case 1: printf("%s %d %d %d %c ",q->name,q->cputime,q->needtime,q->prio,q->state);
    break; 
    case 2: printf("%s %d %d %d %d %c ",q->name,q->arrivetime,q->starttime,q->servicetime,q->finishtime,q->state);
    break;
    default:break;
    }

    void prt(char algo) 

    PCB *p; 
    prt1(algo); //输出文字格式 
    if(run!=NULL) //如果运行指针不空 
    prt2(algo,run); //输出当前正在运行的PCB
    p=ready; //输出就绪队列PCB
    while(p!=NULL) 

    prt2(algo,p); 
    p=p->next; 

    p=finish; //输出完成队列的PCB 
    while(p!=NULL) 

    prt2(algo,p); 
    p=p->next; 

    getchar(); //压任意键继续 

    void insert1(PCB *q) 

    PCB *p1,*s,*r; 
    int b; 
    s=q; //待插入的PCB指针 
    p1=ready; //就绪队列头指针 
    r=p1; //做p1的前驱指针 
    b=1; 
    while((p1!=NULL)&&b) //根据优先数确定插入位置 
    if(p1->prio>=s->prio) 

    r=p1; 
    p1=p1->next; 

    else 
    b=0; 
    if(r!=p1) //如果条件成立说明插入在r与p1之间 

    r->next=s; 
    s->next=p1; 

    else 

    s->next=p1; //否则插入在就绪队列的头
    ready=s; 


    void insert2(PCB *q)
    {
    PCB *p1,*s,*r;
    int b;
    s=q; //指针s指向新要插入的进程
    p1=ready; //指针p1指向原来的进程的对首
    r=p1; //使用指针r指向p1前面的进程
    b=1;
    while((p1!=NULL)&&b)
    {
    if(p1->arrivetime<s->arrivetime)
    {
    r=p1;
    p1=p1->next;
    }
    else
    b=0;
    }
    if(r!=p1)
    {
    r->next=s;
    s->next=p1;
    }
    else
    {
    s->next=p1;
    ready=s;
    }

    void create1(char alg) 

    PCB *p; 
    int i,time; 
    char na[10]; 
    ready=NULL; //就绪队列头指针 
    finish=NULL; //完成队列头指针 
    run=NULL; //运行队列头指针 
    //输入N个进程名和所需时间创建PCB
    for(i=1;i<=N;i++) 

    printf("请输入第%d个进程的名字和运行时间 进程名:",i);
    p=(PCB *)malloc(sizeof(PCB)); 
    scanf("%s",na); 
    printf("所需时间:");
    scanf("%d",&time); 
    strcpy(p->name,na); 
    p->cputime=0; 
    p->needtime=time; 
    p->state='W'; 
    p->prio=rand()%15+1; //随机分配优先数[1,15]
    if(ready!=NULL) //就绪队列不空则调用插入函数插入 
    insert1(p); //对新进程插入就绪队列
    else 

    p->next=ready; //创建就绪队列的第一个PCB 
    ready=p; 


    system("cls");
    printf(" 优先数算法结果输出 "); 
    printf("--------------------------------------------------------------------------- ");
    prt(alg); //输出进程PCB信息 
    run=ready; //将就绪队列的第一个进程投入运行 
    ready=ready->next; 
    run->state='R'; 

    void create2(char alg)
    {
    PCB *p;
    int i;
    ready=NULL;
    run=NULL;
    finish=NULL;
    for(i=0;i<N;i++)
    {
    p=(PCB *)malloc(sizeof(PCB));
    printf("进程名:");
    scanf("%s",p->name);
    printf("到达时间:");
    scanf("%d",&p->arrivetime);
    printf("需要时间:");
    scanf("%d",&p->servicetime);
    p->starttime=0;
    p->finishtime=0;
    p->state='W';
    if(ready!=NULL)
    insert2(p);//将新进程插入就绪队列
    else
    {
    p->next=ready;//创建就绪队列的第一个
    ready=p;
    }
    }
    system("cls");
    printf(" 先来先服务算法结果输出 ");
    printf("--------------------------------------------------------------------------- ");
    prt(alg);
    }
    void priority(char alg) 

    while(run!=NULL) //当运行队列不空时,有进程正在运行 

    run->cputime=run->cputime+1; 
    run->needtime=run->needtime-1; 
    run->prio=run->prio-1; //每运行一次优先数-1 
    if(run->prio<0) //如果优先数减到小于0,则转换成0
    run->prio=0;
    if(run->needtime==0) //如果所需时间为0,即完成,将其插入完成队列 

    run->next=finish; 
    finish=run; 
    run->state='F'; //置状态为完成态 
    run=NULL; //运行队列头指针为空 
    if(ready!=NULL) //如果就绪队列不空 
    firstin(); //将就绪对列的第一个进程投入运行 

    else //没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列
    if((ready!=NULL)&&(run->prio<ready->prio)) 

    run->state='W'; //状态改为就绪
    insert1(run); //将进程按优先数大小插入
    firstin(); //将就绪队列的第一个进程投入运行 

    prt(alg); //输出进程PCB信息 


    void FCFS(char alg)
    { int time=0;//系统时间从0开始
    do{
    run=ready;//就绪序列的第一个进程放入run队列进行执行
    run->state='R';//进程开始执行
    ready=ready->next;//指向下一个
    time=run->arrivetime>time? run->arrivetime:time; 
    run->starttime=time;//进程开始 
    prt(alg);//显示正在执行的进程
    time=time+run->servicetime;//计算下个进程最小可开始时间
    run->finishtime=time;//进程结束时间
    run->state='F';//结束状态标识
    prt(alg);//进程结束再显示
    run->next=finish;
    finish=run;//进程结束放入结束队列
    run=NULL;
    }while(ready!=NULL);
    }
    /*菜单显示函数*/
    void Menu()
    {
    system("cls");
    printf(" +━━━━━━━━━━━━━━━━━━━━━━+ "); 
    printf(" | pcb进程调度 | ");
    printf(" |━━━━━━━━━━━━━━━━━━━━━━| ");
    printf(" | | ");
    printf(" | [1]优先数算法 | ");
    printf(" | | ");
    printf(" | [2]先来先服务算法 | ");
    printf(" | | ");
    printf(" | [3]退出系统 | ");
    printf(" | | ");
    printf(" |━━━━━━━━━━━━━━━━━━━━━━| ");
    printf(" | By:FJH | ");
    printf(" +━━━━━━━━━━━━━━━━━━━━━━+ ");
    printf(" 请输入编号:");

    int main() 

    char algo; //接收算法编号 
    char mainmenu;//判断是否继续
    srand((unsigned)time(NULL));
    system("cls");//清屏
    do{ 
    Menu();//显示菜单
    scanf("%d",&algo); //输入算法编号 
    switch(algo)
    {
    case 1:
    system("cls");
    printf("您选择的是优先数算法 ");
    printf("请输入进程数目:"); 
    scanf("%d",&N); //输入进程数
    create1(algo); //创建队列 
    priority(algo);//优先数
    break;
    case 2:
    system("cls");
    printf("您选择的是先来先服务算法 ");
    printf("请输入进程数目:"); 
    scanf("%d",&N); //输入进程个数
    create2(algo);//创建队列
    FCFS(algo);//先来先服务
    break;
    case 3:
    printf(" I want to see you again!886! ");
    exit(0);
    break;
    default:
    printf("输入有误 ");
    break;
    }
    printf(" 是否继续操作(Y/N) ");
    fflush(stdin);
    mainmenu=getchar();
    }
    while(mainmenu=='y'||mainmenu=='Y');
    return 0;
    }

     

    四、 实验总结

          本次实验需要应用以前所学的C语言的知识,定义结构体、指针等方法去完成本次实验,在这过程中需要对PCB进程管理反复试验,才能完成。

  • 相关阅读:
    基数排序
    希尔排序
    归并排序
    选择排序
    冒泡排序
    堆排序
    快速排序
    Python selenium 4种常用定位 id,class_name,text,xpath
    python selenium 用索引值定位
    python pycharm 建立新项目时使用上个项目所下载的第三方库方法
  • 原文地址:https://www.cnblogs.com/amzinghui/p/5389201.html
Copyright © 2011-2022 走看看