摸拟实现进程调度算法

本文介绍了在实验中如何模拟实现进程调度算法,包括FIFO、静态优先级、时间片轮转和短进程优先等,通过设计进程控制块PCB表结构,用户输入进程数据,展示了如何根据这些算法进行进程调度决策和性能分析。
摘要由CSDN通过智能技术生成

实验一  摸拟实现进程调度算法

姓名:                                         

      

班级:                                       

    

学号:                                    

       

日期:                                   

实验目的:

1.进程调度是处理机管理的核心内容。观察、体会操作系统的进程调度方法,并通过一个简单的进程调度模拟程序的实现,加深对进程控制块、进程队列、进程调度算法,进程切换的理解并体会和了解各种调度算法的具体实施办法。                                                                                    

2.提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。 

实验内容:

  1. 设计进程控制块PCB表结构,模拟实现进程调度算法:FIFO,静态优先级调度, 时间片轮转调度,短进程优先调度算法,多级反馈队列调度。(实现其中之一个以上)。                                             
  2. 编写一个进程调度程序模拟程序。模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。                                    

    3.由用户输入(可通过文件输入)进程名、进程状态、进程运行时间和进程优先级等数据。  

基本思想、原理和算法描述:

  1. 短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间。
  2. 优先级调度调度算法的原理 优先级调度调度算法是根据进程的优先级来确定调度顺序的。每个进程都会被赋予一个优先级值,数值越小表示优先级越高。当CPU空闲时,系统会选择优先级最高的进程来执行,如果多个进程的优先级相同,那么采用先到先服务算法(FIFO)来调度。

源程序: 

void Priority() //优先级调度算法

{

int i, j;

    int iSum; //总等待时间

    //输出优先级调度算法执行流

    cout << endl << "---------------------------------------------------------------" << endl;

    cout << " 优先级调度算法执行流:" << endl << endl;

    cout << " 序号 进程名 运行时间 等待时间" << endl;

    iSum = 0;

    // 使用冒泡排序根据优先级对进程进行排序

    for (i = 0; i < iPCBNum - 1; i++)

    {for (j = 0; j < iPCBNum - i - 1; j++)

        {

            if (pcbs[j].iPriority > pcbs[j + 1].iPriority)

            {

                swap(pcbs[j], pcbs[j + 1]);

            } }}

    // 输出排好序的进程的详细信息并模拟进程运行

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

    {

        cout << "  " << i + 1 << "  " << pcbs[i].sName << "  " << pcbs[i].iRunTime << "  " << pcbs[i].iWaitTime << endl;

        // 累加总等待时间

        iSum += pcbs[i].iWaitTime;

        // 更新后续进程的等待时间

        for (j = i + 1; j < iPCBNum; j++)

        { pcbs[j].iWaitTime += pcbs[i].iRunTime;

        }}

    // 输出总调度次数、总等待时间和平均等待时间

    cout << " 总调度次数:" << iPCBNum << endl;

    cout << " 总等待时间:" << iSum << endl;

    printf(" 平均等待时间  %.2f\n", (float)iSum / (float)iPCBNum);

    cout << endl << "---------------------------------------------------------------" << endl;

2.

void SPF() //短进程优先调度算法

{

int i, j;

int iCurMin;

int iPassedTime = 0;

int iSum;

int iCurRunTime;

int iQueue[MAXPCB];

for (i = 0; i < iPCBNum; i++) {

iCurRunTime = 1000000;

for (j = 0; j < iPCBNum; j++) {

if ((pcbs[j].iFinished == 0) && (pcbs[j].iRunTime < iCurRunTime)) {

iCurMin = j;

iCurRunTime = pcbs[j].iRunTime;

}

}//for(j=0;j<iPCBNum;j++)

iQueue[i] = iCurMin;

pcbs[iCurMin].iFinished = 1;

pcbs[iCurMin].iWaitTime += iPassedTime;

iPassedTime += pcbs[iCurMin].iRunTime;

}

//输出短进程优先调度执行流

cout << "--------------------";

cout << "短进程优先调度执行流:";

cout << "序号 进程名 运行时间 等待时间";

iSum = 0;

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

{

cout << "" << i + 1 << "" << pcbs[iQueue[i]].sName << "" << pcbs[iQueue[i]].iRunTime << "" << pcbs[iQueue[i]].iWaitTime;

iSum += pcbs[iQueue[i]].iWaitTime;

}

cout << "总调度次数:" << iPCBNum;

cout << "总等待时间:" << iSum;

printf("平均等待时间 %.2f\n", (float)iSum / (float)iPCBNum);

cout << "-----------------------------";

} //void SPF ()

运行结果:

先进先出算法:

优先级调度算法:

时间片轮转算法:

短进程优先算法:

运行结果分析:

实验总结:

  • 25
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值