实验一 摸拟实现进程调度算法
姓名:
班级:
学号:
日期:
实验目的:
1.进程调度是处理机管理的核心内容。观察、体会操作系统的进程调度方法,并通过一个简单的进程调度模拟程序的实现,加深对进程控制块、进程队列、进程调度算法,进程切换的理解,并体会和了解各种调度算法的具体实施办法。
2.提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。
实验内容:
- 设计进程控制块PCB表结构,模拟实现进程调度算法:FIFO,静态优先级调度, 时间片轮转调度,短进程优先调度算法,多级反馈队列调度。(实现其中之一个以上)。
- 编写一个进程调度程序模拟程序。模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。
3.由用户输入(可通过文件输入)进程名、进程状态、进程运行时间和进程优先级等数据。
基本思想、原理和算法描述:
- 短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间。
- 优先级调度调度算法的原理 优先级调度调度算法是根据进程的优先级来确定调度顺序的。每个进程都会被赋予一个优先级值,数值越小表示优先级越高。当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 ()
运行结果:
先进先出算法:
优先级调度算法:
时间片轮转算法:
短进程优先算法:
运行结果分析:
实验总结:
到此这篇摸拟实现进程调度算法的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hdkf/10430.html