进程执行操作系统-CPU调度算法(FIFS,SJF,PRO,RR)

本文通过C++代码详细介绍了几种常见的进程调度算法,包括先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(PRO)及轮转(RR)等算法,并展示了如何通过这些算法来优化系统的平均等待时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在查找进程执行之类的问题,今天正好有机会和大家讨论一下.

    #include<iostream> #include<fstream> using namespace std; int h_start=0; int m_start=0; int mission; int time_piece; int wait_time; char w; class process { public: int index; int exe_time; int h; int m; int priority; char mark; process() { mark='0'; } }; void FCFS(process pro[]) { process temp; process pro1[5]; int i=0,j=0; int key; h_start=8; m_start=0; wait_time=0; for(; i<5; i++) pro1[i]=pro[i]; //按申请时间先后对5个进程停止排序 for(i=0; i<4; i++) { key=i; for(j=i+1; j<5; j++) if((pro1[j].h*60+pro1[j].m) < (pro1[key].h*60+pro1[key].m)) key=j; temp=pro1[key]; pro1[key]=pro1[i]; pro1[i]=temp; } cout<<"FCFS:"<<endl; for(i=0; i<5; i++) { wait_time+=h_start*60+m_start-pro1[i].h*60-pro1[i].m; cout<<pro1[i].index<<' '<<h_start<<':'<<m_start<<' '; m_start+=pro1[i].exe_time; if(m_start>=60) { h_start++; m_start-=60; } cout<<h_start<<':'<<m_start<<endl; } wait_time/=5; cout<<"Average waiting time:"<<wait_time<<endl; } void SJF(process pro []) { process pro1[5]; process pro2[5]; process temp; int n2=0; int i=0,j=0; int key=0; int out=0; h_start=8; m_start=0; wait_time=0; for(i=0; i<5; i++) pro1[i]=pro[i]; cout<<"SJF(非抢占):"<<endl; while(out<5) { //将pro1中满意条件的进程加入到等待序列pro2中 for(i=0; i<5; i++) { if(pro1[i].mark=='0' && (pro1[i].h*60+pro1[i].m)<=(h_start*60+m_start)) { pro2[n2++]=pro1[i]; pro1[i].mark='1'; } } //对等待序列pro2中的进程按照执行时间从小到大排序 for(i=0; i<n2-1; i++) { key=i; for(j=i+1; j<n2; j++) if(pro2[j].exe_time < pro2[key].exe_time) key=j; temp=pro2[key]; pro2[key]=pro2[i]; pro2[i]=temp; } //对排序后的序列停止执行 wait_time+=h_start*60+m_start-pro2[0].h*60-pro2[0].m; cout<<pro2[0].index<<' '<<h_start<<':'<<m_start<<' '; m_start+=pro2[0].exe_time; if(m_start>60) { h_start++; m_start-=60; } cout<<h_start<<':'<<m_start<<endl; n2--; out++; //清除执行实现的进程 for(i=0; i<n2; i++) pro2[i]=pro2[i+1]; } wait_time/=5; cout<<"Average waiting time:"<<wait_time<<endl; } void PRO(process pro[]) { process pro1[5]; process pro2[5]; process temp; int n2=0; int i=0,j=0; int key=0; int out=0; h_start=8; m_start=0; wait_time=0; for(i=0; i<5; i++) pro1[i]=pro[i]; cout<<"优先级调度(非抢占):"<<endl; while(out<5) { //将pro1中满意条件的进程加入到等待序列pro2中 for(i=0; i<5; i++) { if(pro1[i].mark=='0' && (pro1[i].h*60+pro1[i].m)<=(h_start*60+m_start)) { pro2[n2++]=pro1[i]; pro1[i].mark='1'; } } //对等待序列pro2中的进程按照优先级排序 for(i=0; i<n2-1; i++) { key=i; for(j=i+1; j<n2; j++) if(pro2[j].priority < pro2[key].priority) key=j; temp=pro2[key]; pro2[key]=pro2[i]; pro2[i]=temp; } //对排序后的序列停止执行 wait_time+=h_start*60+m_start-pro2[0].h*60-pro2[0].m; cout<<pro2[0].index<<' '<<h_start<<':'<<m_start<<' '; m_start+=pro2[0].exe_time; if(m_start>60) { h_start++; m_start-=60; } cout<<h_start<<':'<<m_start<<endl; n2--; out++; //清除执行实现的进程 for(i=0; i<n2; i++) pro2[i]=pro2[i+1]; } wait_time/=5; cout<<"Average waiting time:"<<wait_time<<endl; } void RR(process pro[]) { process temp; process pro1[5]; int i=0,j=0; int key=0,n1=5,n2=1; int exet[5]; h_start=8; m_start=0; wait_time=0; for(; i<5; i++) pro1[i]=pro[i]; for(i=0; i<5; i++) exet[i]=pro1[i].exe_time; //按申请时间先后对5个进程停止排序 for(i=0; i<4; i++) { key=i; for(j=i+1; j<5; j++) if((pro1[j].h*60+pro1[j].m) < (pro1[key].h*60+pro1[key].m)) key=j; temp=pro1[key]; pro1[key]=pro1[i]; pro1[i]=temp; } cout<<"RR:"<<endl; //开始执行,mark=0:未等待 mark=1:等待 mark=2:执行结束 while(n1>0) { for(i=0; i<5; i++) { if(pro1[i].mark=='2')continue; pro1[i].mark='1'; cout<<pro1[i].index<<' '<<h_start<<':'<<m_start<<' '; //时间片不够用 if(pro1[i].exe_time>time_piece) { pro1[i].exe_time-=time_piece; m_start+=time_piece; if(m_start>=60) { h_start++; m_start-=60; } cout<<h_start<<':'<<m_start<<endl; //判断下一个进程是不是处于等待状态 if(i+1==n1)i=-1; else { if((h_start*60+m_start)<(pro1[i+1].h*60+pro1[i+1].m)) i=-1; // else if(pro1[i+1].mark=='0')n2++; } } //时间片够用 else { m_start+=pro1[i].exe_time; if(m_start>=60) { h_start++; m_start-=60; } cout<<h_start<<':'<<m_start<<endl; n1--; //n2--; //清除执行结束的程序 //for(j=i;j<n1;j++) //pro1[j]=pro1[j+1]; pro1[i].mark='2'; wait_time+=h_start*60+m_start-exet[i]-pro1[i].h*60-pro1[i].m; //判断下一个进程是不是处于等待状态 if(i+1==n1)i=-1; else { if((h_start*60+m_start)<(pro1[i+1].h*60+pro1[i+1].m)) i=-1; //else if(pro1[i+1].mark=='0'){n2++;i--;} } } } } wait_time/=5; cout<<"Average waiting time:"<<wait_time<<endl; } int main() { process p[5]; ifstream inFile("job.txt"); inFile>>mission; inFile>>time_piece; for(int i=0; i<5; i++) { inFile>>p[i].index; inFile>>p[i].h; inFile>>w; inFile>>p[i].m; inFile>>p[i].exe_time; inFile>>p[i].priority; } FCFS(p); SJF(p); PRO(p); RR(p); inFile.close(); return 0; }

    每日一道理
风,渐渐吹起,吹乱了我的发丝,也让我的长裙有些飘动。绿叶仿佛在风中起舞,离开了树,投向了大地,却不知这样会枯萎,我弯下腰,轻轻拾起一片树叶,那非常有序的茎脉,是一种美的点缀。我有些哀叹:绿叶啊,绿叶,你这般美丽地从树上轻轻飘下,随风起舞,却不知已被人称之为落叶!

文章结束给大家分享下程序员的一些笑话语录: 爱情观
  爱情就是死循环,一旦执行就陷进去了。
  爱上一个人,就是内存泄露--你永远释放不了。
  真正爱上一个人的时候,那就是常量限定,永远不会改变。
  女朋友就是私有变量,只有我这个类才能调用。
  情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。

1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最短作业时间优先(抢占式和非抢占式)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参数 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格式显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间。 进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值