先来先服务算法(FCFS)
FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度
这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短,
做法是从后备队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后放入就绪队列
进程调度中使用此算法时,每次都从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行,该进程会一直运行到完成或者因发生某事件而阻塞后,进程调度程序才会把处理机分配给其他进程
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
短作业优先算法(SJF),
由于在实际情况中短作业(进程)所占比例很大,为了让它们比长作业优先执行,就有了此算法。
SJF顾名思义以作业长短来确定优先级,作业越短优先级越高,作业的长短用作业所需的运行时间来衡量,此算法一样也可以用做进程调度,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。
SJF调度算法也存在不容忽视的缺点:该算法对长作业不利,如作业C的周转时间由10增至16,其带权周转时间由2增至3.1。更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些(即使是后进来的)短作业(进程),将导致长作业(进程)长期不被调度。该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std
;
struct Node
{char name
;int Tarrive
;int Tservice
;int Tsurplus
;int Tstart
;int Taccomplish
;int prio
;int if_finish
;int num
;
}job
[10];
void Arrive_sort(int num
)
{int temp1
, temp2
, temp3
;for (int i
= 0; i
< num
; i
++){for (int j
= i
+ 1; j
< num
; j
++){if (job
[i
].Tarrive
> job
[j
].Tarrive
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;}}}
}
void Service_sort(int num
)
{int temp1
, temp2
, temp3
;for (int i
= 1; i
< num
; i
++){for (int j
= i
+ 1; j
< num
; j
++){if (job
[i
].Tservice
> job
[j
].Tservice
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;}}}
}
void Priority_sort(int num
)
{int temp1
, temp2
, temp3
, temp4
;for (int i
= 1; i
< num
; i
++){for (int j
= i
+ 1; j
< num
; j
++){if (job
[i
].prio
< job
[j
].prio
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;temp4
= job
[j
].prio
;job
[j
].prio
= job
[i
].prio
;job
[i
].prio
= temp3
;}}}
}
void Arrive_Short_sort(int num
)
{int temp1
, temp2
, temp3
;for (int i
= 0; i
< num
; i
++){for (int j
= i
+ 1; j
< num
; j
++){if (job
[i
].Tarrive
>= job
[j
].Tarrive
){if (job
[i
].Tarrive
> job
[j
].Tarrive
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;}else{if (job
[i
].Tservice
> job
[j
].Tservice
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;}}}}}
}
void fcfs(int num
)
{for (int i
= 0; i
< num
; i
++){job
[i
].Tstart
= job
[i
- 1].Taccomplish
;if (job
[i
].Tstart
< job
[i
].Tarrive
){job
[i
].Tstart
= job
[i
].Tarrive
;}else{job
[i
].Tstart
= job
[i
- 1].Taccomplish
;}job
[i
].Taccomplish
= job
[i
].Tstart
+ job
[i
].Tservice
;}
}
void sjf(int num
)
{Service_sort(num
);for (int i
= 0; i
< num
; i
++){job
[i
].Tstart
= job
[i
- 1].Taccomplish
;if (job
[i
].Tstart
< job
[i
].Tarrive
){job
[i
].Tstart
= job
[i
].Tarrive
;}else{job
[i
].Tstart
= job
[i
- 1].Taccomplish
;}job
[i
].Taccomplish
= job
[i
].Tstart
+ job
[i
].Tservice
;}
}
void RR(int num
)
{int q
;cout
<< "请输入时间片长度:" << endl
;cin
>> q
;int flag
= 1;int finish_pro
= 0;cout
<< "进程名称\t" << "开始时间\t" << "运行时间\t" << "剩余服务时间\t" << "结束时间\t" << endl
;int time
;int c
= 0;while (finish_pro
< num
){flag
= 0;for (int i
= c
; i
< num
; i
++){Arrive_sort(num
);job
[i
].Tsurplus
= job
[i
].Tservice
;job
[i
].Tstart
= job
[i
- 1].Taccomplish
;if (job
[i
].Tstart
< job
[i
].Tarrive
){job
[i
].Tstart
= job
[i
].Tarrive
;}else{job
[i
].Tstart
= job
[i
- 1].Taccomplish
;}time
= job
[i
].Tstart
;if (job
[i
].if_finish
== 1) continue;else{if (job
[i
].Tsurplus
<= q
&& time
>= job
[i
].Tarrive
){flag
= 1;time
= time
+ job
[i
].Tsurplus
;job
[i
].if_finish
= 1;job
[i
].Taccomplish
= time
;cout
<< job
[i
].name
<< "\t\t" << job
[i
].Taccomplish
- job
[i
].Tsurplus
<< "\t\t" << job
[i
].Tsurplus
<< "\t\t" << 0 << "\t\t" << job
[i
].Taccomplish
<< endl
;job
[i
].Tsurplus
= 0;}else if (job
[i
].Tsurplus
> q
&& time
>= job
[i
].Tarrive
){flag
= 1;time
= time
+ q
;job
[i
].Tsurplus
-= q
;job
[i
].Taccomplish
= time
;cout
<< job
[i
].name
<< "\t\t" << time
- q
<< "\t\t" << q
<< "\t\t" << job
[i
].Tsurplus
<< "\t\t" << job
[i
].Taccomplish
<< endl
;job
[num
].name
= job
[i
].name
;job
[num
].Tarrive
= time
;job
[num
].Tservice
= job
[i
].Tsurplus
;num
++;}if (job
[i
].if_finish
== 1) finish_pro
++;}c
++;}break;if (flag
== 0 && finish_pro
< num
){for (int i
= 0; i
< num
; i
++){if (job
[i
].if_finish
== 0){time
= job
[i
].Tarrive
;break;}}}}
}
void print(int num
)
{cout
<< "进程名" << "\t" << "到达时间" << "\t" << "服务时间" << "\t" << "完成时间" << endl
;for (int i
= 0; i
< num
; i
++){cout
<< job
[i
].name
<< "\t" << job
[i
].Tarrive
<< "\t\t" << job
[i
].Tservice
<< "\t\t" << job
[i
].Taccomplish
<< endl
;}
}
void display(int num
)
{int ch
= 0;cout
<< "—————————————————————————" << endl
;cout
<< "——————————1、FCFS算法 —————————" << endl
;cout
<< "——————————2、SJF算法——————————" << endl
;cout
<< "——————————3、RR算法 ——————————" << endl
;cout
<< "——————————4、优先级算法 ————————" << endl
;cout
<< "——————————5、退出 ———————————" << endl
;cout
<< "—————————————————————————" << endl
;do {cout
<< "请选择你想要的算法:" << endl
;cin
>> ch
;switch (ch
) {case 1:Arrive_sort(num
);fcfs(num
);print(num
);break;case 2:sjf(num
);print(num
);break;case 3:RR(num
);break;case 4:print(num
);break;case 5:exit
;default:cout
<< "输入错误,请重新输入!" << endl
;break;}} while (ch
!= 5);
}
int main()
{int num
;char jname
;int arrive
;int service
;int accomplish
;cout
<< "请输入进程个数:" << endl
;cin
>> num
;for (int i
= 0; i
< num
; i
++){cout
<< "请输入进程名、到达时间、服务时间" << endl
;cin
>> jname
;job
[i
].name
= jname
;cin
>> arrive
;job
[i
].Tarrive
= arrive
;cin
>> service
;job
[i
].Tservice
= service
;}display(num
);return 0;
}
总结
以上是生活随笔为你收集整理的操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。