• 操作系统第三次作业


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

    商软1班   黄敏鹏  201406114116

    一、        实验目的

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

    二、        实验内容和要求

        1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序。

    进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。

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

    (2).  进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。

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

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

    (5).  如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。

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

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

    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)增加阻塞队列。进程的是否阻塞和阻塞的时间由产生的“随机数”确定(阻塞的频率和时间长度要较为合理)。注意进程只有处于运行状态才可能转换成阻塞状态,进程只有处于就绪状态才可以转换成运行状态。

    2.    实验内容

    根据指定的实验课题:A(1),A(2),B(1)和B(2)完成设计、编码和调试工作,完成实验报告。

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

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

    1.      原理分析及流程图

      

    源码:

      1 #include<stdio.h>
      2 #include<windows.h>
      3 
      4 struct pcb{
      5     char name[10];  //进程名称
      6     char status;    //状态
      7 
      8     int arrtime;    //到达时间
      9     int reqtime;    //要求服务时间
     10     int startime;   //调度时间
     11     int finitime;   //完成时间
     12 
     13     float TAtime;   //周转时间
     14     float TTAWtime;   //带权周转时间
     15     float prio;     //优先级
     16 }proarr[24],profin[24],pro[24];
     17 
     18 int systime=0;    //系统时间
     19 int intarr=0;     //记录proarr[]的元素个数
     20 int intfin;       //记录profin[]的元素个数
     21 int intpro;       //记录pro[]的元素个数
     22 
     23 void intputJobarr();
     24 void putoutJobarr(int n);
     25 void putoutAllJobarr();
     26 void sort();
     27 void simulateCohort();
     28 
     29 /*
     30     向proarr输入一个进程
     31 */
     32 void intputJobarr(){
     33     printf("
    第 %d 个进程:
    ",intarr+1);
     34     printf("	输入进程名:");
     35     scanf("%s",&proarr[intarr].name);
     36     printf("	到达时间:");
     37     scanf("%d",&proarr[intarr].arrtime);
     38     printf("	要求服务时间:");
     39     scanf("%d",&proarr[intarr].reqtime);
     40     intarr++;
     41 }
     42 
     43 /*
     44     输出第n个进程信息    
     45 */
     46 void putoutJobarr(int n){
     47     n=n-1;
     48     if(n<0){
     49         printf("n<0
    ");
     50     }else{
     51         printf("            	name	artime	reqtime
    ");
     52         printf("第 %d 个进程:	%s	%d	%d
    ",n+1,proarr[n].name,proarr[n].arrtime,proarr[n].reqtime);
     53     }
     54 }
     55 
     56 /*
     57     输出所有进程信息    
     58 */
     59 void putoutAllJobarr(){
     60     printf("    进程名    到达时间    要求服务时间    调度时间    完成时间    周转时间    带权周转时间    
    ");
     61     for(int i=0;i<intarr;i++){
     62         printf("    %6s    %8d    %12d    %8d    %8d    %8f    %12f    
    ",proarr[i].name,proarr[i].arrtime,proarr[i].reqtime,proarr[i].startime,proarr[i].finitime,proarr[i].TAtime,proarr[i].TTAWtime);
     63     }    
     64 }
     65 
     66 /*
     67     对Jobarr进行排序,按照arrtime升序排序
     68 */
     69 void sort(){
     70     pcb k;
     71     for(int i=0;i<intarr;i++){
     72         for(int j=0;j<intarr-1;j++){
     73             if(proarr[j].arrtime>proarr[j+1].arrtime){
     74                 k=proarr[j];
     75                 proarr[j]=proarr[j+1];
     76                 proarr[j+1]=k;
     77             }
     78         }
     79     }
     80 }
     81 
     82 /*
     83     模拟队列
     84 */
     85 void simulateCohort(){
     86         proarr[0].startime=0;
     87         proarr[0].finitime=proarr[0].startime+proarr[0].reqtime;
     88         proarr[0].TAtime=proarr[0].finitime-proarr[0].arrtime;
     89         proarr[0].TTAWtime=float(proarr[0].TAtime)/proarr[0].reqtime;
     90     for(int i=1;i<intarr;i++){
     91         proarr[i].startime=proarr[i-1].finitime;
     92         proarr[i].finitime=proarr[i].startime+proarr[i].reqtime;
     93         proarr[i].TAtime=proarr[i].finitime-proarr[i].arrtime;
     94     }
     95     
     96 }
     97 
     98 /*
     99 *    主函数
    100 */
    101 void main()
    102 {
    103     system("mode con cols=100 lines=30");//窗口宽度高度
    104     int flag=1;
    105     int n;
    106     printf("
    	进程的个数 : ");
    107     scanf("%d",&n);
    108     while(intarr<n){
    109         intputJobarr();
    110     }
    111     system("cls");
    112     printf("
    	这是您输入的数据:
    
    ");
    113     putoutAllJobarr();
    114 
    115     sort();
    116     simulateCohort();
    117 
    118     printf("
        ____________________________________________________________________________________________
    ");
    119 
    120     printf("
    
    	这是模拟队列后的结果:
    
    ");
    121     putoutAllJobarr();
    122 
    123     printf("
    ");
    124 }
  • 相关阅读:
    Eclipse插件
    Android res文件夹下新建layout文件夹出错:invalid resource directory name
    Java笔记一:斐波那契数列
    Android应用的启动界面
    android短信系列之实现发送短信,并获得发送报告与接收报告
    转:android 使用html5作布局文件
    ubuntu10.10 全自动安装微软雅黑字体
    gcswf32.dll已停用
    Android连接真机之中兴
    在Servlet中连接Access
  • 原文地址:https://www.cnblogs.com/huangmp1024/p/5487891.html
Copyright © 2020-2023  润新知