• 1209实验3报告


    实验三 进程调度模拟程序

     

     实验三 进程调度模拟程序

                                   13物联网   201306104116  谢敏

    1. 目的和要求

    实验目的

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

    实验要求

    设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序。

    进程调度算法:“时间片轮转法”调度算法对N个进程进行调度。 

    2.内容

    完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。

     

    1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 

    2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。

    3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

    4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。

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

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

    3.代码

    #pragma comment(linker, "/subsystem:console")
     #include<stdio.h>
     #include<stdlib.h>
     #include<conio.h>
     #include<dos.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;
     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;
     }
     
     }
     input() /* 建立进程控制块函数*/
     {
    int i,num;
     
     printf("
     请输入进程号:");
    scanf("%d",&num);
        num=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);
     }
     disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
     {
    printf("
     qname 	 state 	 super 	 ndtime 	 runtime 
    ");
     printf("|%s	",pr->name);
     printf("|%c	",pr->state);
     printf("|%d	",pr->super);
     printf("|%d	",pr->ntime);
     printf("|%d	",pr->rtime);
     printf("
    ");
     }
     check() /* 建立进程查看函数 */
     {
    PCB* pr;
     printf("
     **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
    disp(p);
     pr=ready;
     printf("
     ****当前就绪队列状态为:
    "); /*显示就绪队列状态*/
    while(pr!=NULL)
     {
     disp(pr);
     pr=pr->link;
     }
     }
     destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
     {
    printf("
     进程 [%s] 已完成.
    ",p->name);
     free(p);
     }
     running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
     {
     (p->rtime)++;
     if(p->rtime==p->ntime)
     destroy(); /* 调用destroy函数*/
    else
     {
     (p->super)--;
    p->state='w';
     sort(); /*调用sort函数*/
     }
     }
    main() /*主函数*/
     {
    int len,h=0;
     char ch;
     input();
     len=space();
     while((len!=0)&&(ready!=NULL))
     {
     ch=getchar();
     h++;
     printf("
     The execute number:%d 
    ",h);
     p=ready;
     ready=p->link;
     p->link=NULL;
     p->state='R';
     check();
     running();
     printf("
     按任一键继续......");
    ch=getchar();
     }
     printf("
    
     进程已经完成.
    ");
     ch=getchar();
     }
    

     4.总结

         这是参考别人的程序做出来的,我自己并没有什么想法.

  • 相关阅读:
    第07节-开源蓝牙协议BTStack框架代码阅读(上)
    第06节-开源蓝牙协议BTStack框架分析
    第05节-BLE协议物理层(PHY)
    第04节-BLE协议抓包演示
    第03节-BLE协议各层数据格式概述
    【重点声明】此系列仅用于工作和学习,禁止用于非法攻击。一切遵守《网络安全法》
    海外信息安全资源
    从浏览器攻击思考入门的问题。
    攻击载荷免杀技术
    聊聊NTLM认证协议
  • 原文地址:https://www.cnblogs.com/aa88/p/5032844.html
Copyright © 2020-2023  润新知