zoukankan      html  css  js  c++  java
  • 处理机调度实验

    一、 实验目的

    用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

    二、 实验要求: 

       C++语言实验对N个进程采用非抢占式的动态优先权优先算法的进程调度

    三、 实验内容:

    (1) 设计一个有N个进程并发的进程调度程序。进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)算法。

    (2) 每个进程有一个进程控制块(PCB)表示。PCB用结构来描述,包括以下字段:

    l 进程标识ID、

    l 优先数,为初始设定的模拟条件

    l 到达时间,为初始设定的模拟条件

    l 需要运行时间,为初始设定的模拟条件

    已用CPU时间,为初始设定的模拟条件

    进程阻塞时间startblock(表示进程在运行startblock个时间片后,进程将进入阻塞状态),为初始设定的模拟条件

    进程被阻塞的时间blocktime(表示进程等待blocktime个时间片后,将转换成就绪状态),为初始设定的模拟条件,模拟执行I/O操作需要的时间

    l 进程状态state,就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态

    队列指针next等等。

    (3) 优先数改变的规则

    进程在就绪队列中呆一个时间片,优先数增加1;

    进程每运行一个时间片,优先数减3;

    (4) 运行过程描述

    首先按照初始化输入,按照各进程优先级高低排列就绪队列中进程顺序,优先级最高的进程最先获得CPU控制权运行。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,此时应将进程的优先数减3(即降低一级),如果到了进程需被阻塞的时间点,阻塞进程,然后把它插入阻塞队列,等待经过blocktime后,再唤醒进程,把它按照优先级高低,插入就绪队列相应位置等待CPU。

    每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

    重复以上过程,直到所要进程都完成为止。

    备注:进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

    进程的到达时间为进程输入的时间或顺序。

    参考代码

    #include<stdio.h> 

    #include<stdlib.h> 

    #include<conio.h>  

    #define getpch(type) (type*)malloc(sizeof(type)) 

    #define NULL 0 

    #define TIME 2//时间片长度  

    typedef struct pcb{//进程管理块  

    char name[10];//进程名字  

    char state;  //进程状态

    int queue;  //进程所在的队列  

    int ntime;  //进程需要运行的时间  

    int rtime;  //进程已经运行的时间  

    int etime;  //进程在本队列可运行的时间片  

    struct pcb *link; 

    }PCB;  

    PCB *ready=NULL,*pinsert=NULL,*pfend=NULL,*p=NULL;//就绪队列,进程插入位置的变//    

    int geti() //使用户仅能输入整数 

    {  

    char ch;  

    int i = 0;  

    fflush(stdin);  

    ch = getchar();  

    while(ch == ' '){   

    printf(" f输入不能为空..请重新输入 ");   

    fflush(stdin);   

    ch = getchar();  

    }  

    while(ch != ' '){   

    if(ch > '9' || ch < '0'){    

    printf(" 输入有误!!输入只能为正整数,请重新输入... ");    

    fflush(stdin);    

    i = 0;    

    ch = getchar();   

    }else{    

    i =  i*10 + (ch - '0');    

    ch = getchar();   

    }  

    }  

    return i; 

    }  

    void findpos()//更新状态量 

    {  

    PCB *ps = pfend;  

    if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1)    pinsert = ps;  

    else{   

    while (ps->link && ps ->link->queue != (pfend ->queue +2))

    ps = ps->link;   pinsert = ps;       } }  

    void insert()//插入进程 

    {  

    if(!ready ){     

    ready = p;   

    pfend = p;   

    pinsert = p;  

    }else if(ready ->queue == 1){//第一队列存在   

    p->link = pfend->link;   

    pfend->link = p;   

    pfend = p;   

    findpos();   

    }else{   

    p->link = ready;   

    ready = p;   

    findpos();  

    }  

    }  

    void input()/*建立进程控制块函数*/ 

    {  

    int i,num;    

    printf(" 请输入进程的个数?");  

    num = geti();  

    for(i=0; i < num; i++)  

    {   

    printf(" 进程号No.%d: ",i+1);   

    p=getpch(PCB);   

    printf(" 输入进程名:");   

    scanf("%s",p->name);   

    printf(" 输入进程运行时间:");   

    p ->ntime = geti();   

    printf(" ");

    p->rtime=0;   

    p->state='w';   

    p->queue =1;   

    p->etime = TIME;   

    p->link=NULL;   

    insert();/*调用insert函数*/  

    }  

    void disp(PCB *pr)/*建立进程现实函数,用于显示当前进程*/ 

    {  

    printf(" name  state  queue  ntime  rtime 在队列可停留时间   ");  

    printf("|%s ",pr->name);  

    printf(" |%c ",pr->state);  

    printf(" |%d ",pr->queue);  

    printf(" |%d ",pr->ntime);  

    printf(" |%d ",pr->rtime);  

    printf(" |%d ",pr->etime);  

    printf(" "); 

    }  

    void check()/*建立进程查看函数*/ 

    {  

    PCB *pr;  

    printf("  ****当前正在运行的进程是:%s",ready->name);

    /*显示当前运行的进程*/  

    disp(ready);  

    pr= ready ->link;  

    printf(" ****当前就绪队列状态为: ");/*显示就绪队列状态*/  

    while(pr!=NULL)  

    {   

    disp(pr);   

    pr=pr->link;  

    }   

    void sort()//调整进程队列  

    {  

    if(!ready->link ||ready->queue < ready->link->queue) 

    return;    

    p = ready ->link;  

    ready ->link = pinsert ->link;  

    pinsert ->link = ready;

    pinsert = ready;  

    ready = p;  

    if (ready && ready -> queue  == pinsert ->queue)

    {   

    findpos();  

    }   

    }  

    void addnew()//添加新的进程 

    {  

    if(ready ->queue != 1)

    {  

    (ready -> queue)++;  

    ready->etime *= 2;  

    ready -> state='w';  

    sort();/*调用sort函数*/  

    input();  

    }  else{   

    input();     

    }   

    void destroy()/*建立进程撤销函数(进程运行结束,撤销进程)*/ 

    {  

    printf(" 进程[%s]已完成. ",ready->name);  

    p = ready;  

    ready = ready->link;  

    free(p);  

    if (ready &&  ready -> queue  == pinsert ->queue)

      findpos(); 

    }   

    void running()/*建立进程就绪函数(进程运行时间到,置就绪状态)*/ 

    {  

    (ready -> rtime)++;  

    ready ->etime --;  

    if(ready->rtime == ready->ntime){   

    destroy();   

    return;  

    }else if(ready ->etime == 0){   

    int time = 2;   

    (ready -> queue)++;

    for(int i = 2; i != ready->queue; ++i)    

    time *= 2;   

    ready->etime = time;   

    ready -> state='w';   

    sort();/*调用sort函数*/  

    }      

    void main() 

    {  

    char ch;  

    input();  

    while(ready != NULL)  {   

    printf(" The execute name:%s ",ready ->name);   

    ready ->state = 'R';   

    check();   

    running();   

    printf(" 按i键添加新进程....按其他任意键继续运行...");   

    fflush(stdin);   

    ch = getchar();   

    if (ch == 'i'|| ch=='I')    

    addnew();     

    }  

    printf("  进程已经完成 ");  

    getchar();    

    }

  • 相关阅读:
    oculus按键大全
    10 soundJs 初体验
    09 获取服务器时间
    08 基本数据类型转换
    07 如果再使用animateCC2018或者苹果系统使用animate时出现Uncaught ReferenceError: lib is not defined的错误
    AS3.0和php数据交互POST方式
    06 显示fps帧频
    05 js利用ajax向服务器发送请求并返回json值
    04 ajax执行php并传递参数
    03php拉取服务器信息并生成json
  • 原文地址:https://www.cnblogs.com/youyumengyu/p/5949679.html
Copyright © 2011-2022 走看看