当前位置:网站首页 > 后端开发 > 正文

摸拟实现进程调度算法

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

姓名:                                         

      

班级:                                       

    

学号:                                    

       

日期:                                   

实验目的:

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 = ;

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 ()

运行结果:

先进先出算法:

优先级调度算法:

时间片轮转算法:

短进程优先算法:

运行结果分析:

实验总结:

到此这篇摸拟实现进程调度算法的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • AV解决方法2024-11-24 18:36:06
  • 银行卡交易主要类型2024-11-24 18:36:06
  • 破解视频会员(你我都懂)2024-11-24 18:36:06
  • 工业超声波检测与医用超声波检查:深入探讨两者的异同2024-11-24 18:36:06
  • 《最终幻想3》像素复刻版风灵月影修改器新手入门篇——初学者也能轻松掌握的修改器使用技巧2024-11-24 18:36:06
  • 天干地支五行对照表|十天干十二地支五行对应表2024-11-24 18:36:06
  • 哈哈哈!段子手们在家被迫营业,每一个都能笑到窒息!2024-11-24 18:36:06
  • (轉貼) 人人有功練!! 有功夫,沒懦夫 (News)2024-11-24 18:36:06
  • 2024 Q3 NAND闪存价格|企业级依然猛涨,消费级放缓2024-11-24 18:36:06
  • 如何在 Photoshop 中制作半色调图案2024-11-24 18:36:06
  • 全屏图片