czxt
实验三 进程调度模拟程序
1. 目的和要求
1.1. 实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
1.2. 实验要求
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). (**)在进行模拟调度过程可以创建(增加)进程,其到达时间为进程输入的时间。
0.
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)
完成设计、编码和调试工作,完成实验报告。
注:带**号的条目表示选做内容。
3. 实验环境
可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB等可视化环境,利用各种控件较为方便。自主选择实验环境。
4. 实验原理及核心算法参考程序段
动态优先数(优先数只减不加):

//优先级调度算法 
#include <stdio.h> 
#include <stdlib.h>  
#include <conio.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;
int num=0;
void 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; 
    }
}
int space()  
{   
    int l=0;   
    PCB* pr=ready;   
    while(pr!=NULL) 
    {   
        l++;   
        pr=pr->link; 
    }    
    return(l);
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/  
{   
    printf("\n\t进程名\t状态\t优先数\t需要运行时间\t已经运行时间\n");
    printf("\t%s",pr->name);  
    printf("\t%c",pr->state); 
    printf("\t%d",pr->super);  
    printf("\t%d",pr->ntime);
    printf("\t\t%d",pr->rtime);
    printf("\n"); 
}
void check() /* 建立进程查看函数 */  
{  
    PCB* pr;  
    printf("\n\t**** 当前正在运行的进程是:\n"); /*显示当前运行进程*/  
    disp(p); 
    pr=ready;  
    printf("\n\t**** 当前就绪队列状态为:\n"); /*显示就绪队列状态*/  
    while(pr!=NULL)   
    {   
        disp(pr);   
        pr=pr->link;  
    } 
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/  
{ 
    printf("\n\t进程 [%s] 已完成.\n",p->name);  
    free(p); 
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/  
{    
    (p->rtime)++;  
    if(p->rtime==p->ntime) 
        destroy(); /* 调用destroy函数*/ 
    else   
    {
        if(p->super>0)
            (p->super)--;   
        p->state='W';   
        sort(); /*调用sort函数*/  
    } 
}
//手动输入模拟函数
void manuallyEnter(){
int i;    
    system("cls"); /*清屏*/   
    printf("\n\t请输入进程数: "); 
    scanf("%d",&num);
    printf("\n");
    for(i=1;i<=num;i++) 
    {  
        printf("\t第%d个进程:\n",i);  
        p=getpch(PCB);
        printf("\t输入进程名:");   
        scanf("%s",p->name);   
        printf("\t输入进程优先数:");  
        scanf("%d",&p->super);  
        printf("\t输入进程运行时间:");   
        scanf("%d",&p->ntime);  
        printf("\n");
        p->rtime=0;
        p->state='W';  
        p->link=NULL;    
        sort(); /* 调用sort函数*/   
    }
}
//读取文件
void readFile()
{
    //读取文件
    FILE *fp = fopen("pcb.txt","r");
    if(fp == NULL)
    {
        printf("File open error!\n");
        exit(0);
    }
    while(!feof(fp)&&fgetc(fp)!=EOF)
    {
        fseek(fp,-1L,SEEK_CUR);
        fscanf(fp,"%s%d%d",&p->name,&p->super,&p->ntime);
        num++;
    }
    fclose(fp);
}
//选择数据的获取方式
void dataAccess()
{
    int k;
    printf("\n\n\t**************************************\n");
    printf("\t\t1.调用文本写入数据\n");
    printf("\t\t2.调用手动输入模拟数据\n");
    printf("\t**************************************\n\n\n");
    printf("\t请选择菜单项: ");
    scanf("%d",&k);
    switch(k){
    case 1:
        readFile();
        break;
    case 2:
        manuallyEnter();
        break;
    default:
        printf("\n\n\t**请输出1或者2进行选择");
        dataAccess();
        break;
    }
}
void output()
{
    int len,h=0;   
    char ch; 
    len=space();  
    while((len!=0)&&(ready!=NULL)) 
    {    
        ch=getchar(); 
        h++;   
        printf("\t-----------------------------------------------------\n");   
        printf("\t现在是第%d次运行:\n",h); 
        p=ready;  
        ready=p->link;   
        p->link=NULL;   
        p->state='R';   
        check();  
        running();   
        printf("\n\t按任意键继续......\n");  
    }  
}
int main() /*主函数*/ 
{
    dataAccess();
    output();
    printf("\n\n\t进程已经完成.\n"); 
}
czxt的更多相关文章
- ListFragment的使用
		ListFragment继承了Fragment,顾名思义,ListFragment是一种特殊的Fragment,它包含了一个ListView,在ListView里面显示数据. 1. MainActiv ... 
- debian C++ OTL库 用 unixodbc 连接 mysql 小记
		这个东东也是折腾了几天,网上很多文章可能已经过时,所以写下不同,以备后用. 参考网址: http://blog.csdn.net/genganpeng/article/details/7402229 ... 
- 正态QQ图的原理
		code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ... 
- I/O CPU
		http://www.educity.cn/zk/czxt/201306041038131789.htm http://blog.csdn.net/xiazdong/article/details/6 ... 
- webgl开发第一道坎——矩阵与坐标变换
		一.齐次坐标 在3D世界中表示一个点的方式是:(x, y, z);然而在3D世界中表示一个向量的方式也是:(x, y, z);如果我们只给一个三元组(x, y, z)鬼知道这是向量还是点,毕竟点与向量 ... 
- arp命令 清arp表
		平常删除arp都用arp-d.大量存在的时候 arp -n|awk '/^[1-9]/ {print arp -d $1}' | sh 清除所有arp表,以前用这个来清arp表貌会清空,没注意到存在i ... 
- nfs简述
		参考:http://www.51lun-wen.cn/shenghuo/dianniaowangluo/diannaowangluo/czxt/Linux/200810/354248.html 1.什 ... 
- Linux curl 详解
		Linux下载工具Curl也是Linux下不错的命令行下载工具,小巧.高速,唯一的缺点是不支持多线程下载.以下是他的安装和功能. 安装 $ tar zxvf curl-7.14.0.tar.gz $ ... 
- 笔记整理--LibCurl开发
		LibCurl开发_未了的雨_百度空间 - Google Chrome (2013/7/26 21:11:15) LibCurl开发 一:LibCurl 编程流程1.调用curl_global_ini ... 
随机推荐
- Linux驱动开发学习笔记(1):LINUX驱动版本的hello world
			1.关于目录 /lib/modules/2.6.9-42.ELsmp/build/ 这个是内核源码所在的目录 一般使用这样的命令进入这个目录:cd /lib/modules/$(una ... 
- H-Basis/SG/SH GI Relighting
			小试了一把预计算全局光照,作为PRT的上级应用.完全自行实现,使用SG/SH.H-Basis基波对GI光场进行频域压缩,存在3D纹理中,用于2跳间接光照实时显示.其中坑点不少,尤其是在HDR环境下使用 ... 
- @Html.DropDownList 设置选中值无效
			有时候在ASP.NET MVC中用@Html.DropDownList 设置选中值无效,如图: 具体原因说不清,反正只要改个名字就行了!!!,如图::: 
- struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
			前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ... 
- TSPL学习笔记(4):数组相关练习
			最近研究函数式编程,都是haskell和scheme交互着看的,所以笔记中两种语言的内容都有,练习一般也都用两种语言分别实现. 本篇练习一些数组有关的问题,之所以与数组相关是因为在命令式编程中以下问题 ... 
- C# MailMessage Attachment 中文名附件发邮件-Firefox中文显示正常,网页打开邮件附件中文名乱码
			一.故事 首先通过CDO.Message来获取邮件EML相关数据:邮件标题.邮件内容.邮件附件.发件人.收件人.CC主要就这么几个,其次通过MailMessage来组织邮件通过Python来发送邮件! ... 
- 从今天起,记录CEF使用开发心得经验
			已经使用CEF来呈现桌面程序界面大半年了,从来没有写过相关博文.发现网上的中文资料甚至英文已经无法满足我的开发需求,不少问题只得自己探索.在此先谢过网络上各位CEF使用开发博文的贡献者,没有你们我也难 ... 
- [under the hood]Reduce EXE and DLL Size with LIBCTINY.LIB
			Matt Pietrek Download the code for this article: Hood0101.exe (45KB) W ay back in my October 1996 co ... 
- 关于Python的web框架
			uliwebhttp://git.oschina.net/limodou/uliweb uliweb 吸取了其他框架的经验,集成了orm.总的来说一般.这个安装后有个exe文件,命令行工具.不绿色.个 ... 
- How to Debug Enterprise Portal Code in Dynamics AX 2009
			转载 To set up debugging for pages1. Log into the server that is running the AOS.2. Open the Microsoft ... 
