zoukankan      html  css  js  c++  java
  • 进程调度

     

    实验一、作业调度实验

    专业:商业软件工程   姓名:杨晓霞  学号:201406114107

    一、        实验目的

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

    二、        实验内容和要求

    1.2.2实验题A:编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对N(N不小于5)个进程进行调度。

    “最高优先级优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。

    (1). 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。

    (2). 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定规则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1,并且进程等待的时间超过某一时限(2个时间片时间)时增加其优先数等。

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

    (4). (**)在进行模拟调度过程可以创建(增加)进程,其到达时间为进程输入的时间。

    1.2.3实验题B:编写并调试一个模拟的进程调度程序,采用“基于时间片轮转法”调度算法对N(N不小于5)个进程进行调度。 “轮转法”有简单轮转法、多级反馈队列调度算法。

    (1). 简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片长度相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。(此调度算法是否有优先级?)

     (2). 多级反馈队列调度算法的基本思想是:

    将就绪队列分为N级(N=3~5),每个就绪队列优先数不同并且分配给不同的时间片:队列级别越高,优先数越低,时间片越长;级别越小,优先数越高,时间片越短。

    系统从第一级调度,当第一级为空时,系统转向第二级队列,.....当处于运行态的进程用完一个时间片,若未完成则放弃CPU,进入下一级队列。

    当进程第一次就绪时,进入第一级队列。

    (3). (**)考虑进程的阻塞状态B(Blocked)增加阻塞队列。进程的是否阻塞和阻塞的时间由产生的“随机数”确定(阻塞的频率和时间长度要较为合理)。注意进程只有处于运行状态才可能转换成阻塞状态,进程只有处于就绪状态才可以转换成运行状态。

    1.    实验内容

    根据指定的实验课题:A(1),A(2),B(1)和B(2)

    完成设计、编码和调试工作,完成实验报告。

    注:带**号的条目表示选做内容。

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

    1.源程序名:作业调度_3.cpp

    2.      原理分析及流程图

    (1)、存储结构

    typedef struct process
    {
    char name[10]; //进程名
    int priority; //优先数
    Time ReachTime; //到达时间
    Time NeedTime; //需要运行时间
    Time UseTime; //已用时间
    char state; //进程状态
    }PCB; //进程控制块

     

    (2)、主要程序

    void AddProcess();
    void print();
    void attemper();

    3.主要程序段及其解释:

      1 int AddProcess(int n)
      2 {
      3     char ch; 
      4     do{
      5         n=1;
      6         printf("
    请输入进程名");
      7         scanf("%s",pcb[n].name);
      8         printf("请输入进程的优先级");
      9         scanf("%d",&pcb[n].priority);
     10         printf("请输入需要的时间");
     11         scanf("%d",&pcb[n].NeedTime);
     12         pcb[n].ReachTime=n;
     13         pcb[n].UseTime=0;
     14         pcb[n].state='W';
     15         n++;
     16         printf("还要继续加进程吗,是(Y),否(N)");
     17         do{
     18             
     19             ch=getchar();
     20         }while(ch!='Y'&&ch!='N'&&ch!='y'&&ch!='n');
     21     }while(ch=='Y'||ch=='y');
     22     return n;
     23 }
     24 
     25 int HighPriority(int n)
     26 {
     27     for(int i=0;i<n;i++)
     28     {
     29         printf("
    请输入进程名");
     30         scanf("%s",pcb[i].name);
     31         printf("请输入进程的优先级");
     32         scanf("%d",&pcb[i].priority);
     33         printf("请输入需要的时间");
     34         scanf("%d",&pcb[i].NeedTime);
     35         pcb[i].ReachTime=i;
     36         pcb[i].UseTime=0;
     37         pcb[i].state='W';
     38     }
     39     return n;    
     40 }
     41     
     42     
     43 void sort(int n)
     44 {
     45     
     46     int i,j;
     47     for(i=0;i<n-1;i++)
     48     {
     49         for(j=n-2;j>=i;j--)
     50         {
     51             if(pcb[j+1].ReachTime<pcb[j].ReachTime)
     52             {
     53                 temp[j]=pcb[j];
     54                 pcb[j]=pcb[j+1];
     55                 pcb[j+1]=temp[j];
     56             }
     57         }
     58     }
     59     for(i=0;i<n-1;i++)//再按优先级进行排序
     60     {
     61         for(j=n-2;j>=i;j--)
     62         {
     63             if(pcb[j+1].priority>pcb[j].priority)
     64             {
     65                 temp[j]=pcb[j];
     66                 pcb[j]=pcb[j+1];
     67                 pcb[j+1]=temp[j];
     68             }
     69         }
     70     }
     71 }
     72 void print(int n)
     73 {
     74     
     75     sort(n);
     76     int i;
     77     printf("
     进程名  优先级  到达时间   需要时间  已用时间  进程状态  
    ");
     78     for(i=0;i<n;i++)
     79     {
     80         printf("%8s%8d%8d%10d%10d%10c
    ",pcb[i].name,pcb[i].priority,pcb[i].ReachTime,pcb[i].NeedTime,pcb[i].UseTime,pcb[i].state);
     81     }
     82 }
     83 void attemper(int n)
     84 {
     85     do{
     86         if((pcb[0].NeedTime-pcb[0].UseTime)>pTime)
     87         {
     88             pcb[0].UseTime+=pTime;//已用时间加时间片
     89             pcb[0].priority--;//优先级减一
     90             pcb[0].state='W';
     91         }
     92         else
     93         {
     94             pcb[0].UseTime=pcb[0].NeedTime;//已用时间等于需要时间
     95             pcb[0].priority=0;//优先级为零
     96             pcb[0].state='F';//完成进程,将状态置为完成
     97         }
     98         print(n);
     99     }while(pcb[0].state!='F');
    100 }

    4. 运行结果及分析

     

    四、实验总结

    在本次实验中,调度算法主要是优先级调度和轮转调度,写完算法后,再添加一个功能,插入进程,本次的实验还未完善

  • 相关阅读:
    [转]C# 常用字符串加密解密方法
    ADO.net商机题目
    ADO.net属性拓展
    实体类,数据访问类应用
    实体类,数据访问类.字符串攻击.防攻击
    ADO.net增删改的应用
    ADO.net增删改查
    css——层叠样式表
    标题栏小图标、锚点、滚动效果、视频插入、音乐插入
    HTML——超文本标记语言(表单及12个表单元素)
  • 原文地址:https://www.cnblogs.com/xiaochenxi/p/5470560.html
Copyright © 2011-2022 走看看