定义进程结构体:
struct Pro{ int num; //进程号 int time_in; //进程到达时间 int work_time; //进程服务时间
int btime;//用于抢占式进程优先记录该进程开始时间 int l_w_time;//用于抢占式进程优先记录剩余服务时间 int end_time; //记录该进程结束时间,(需要时时监测) int judge; //用于需要时的标记
}pro[10]; //进程结构体
1先到先服务
算法描述:把所有进程按到达先后排序,每次取最先到的进程执行后淘汰,再取下一个,直到所有进程调度完毕。
主要代码:
void FCFS() //先到先服务 { char s[] = {\先到先服务\ printmat(s); PT; int i, j; int min; int t = pro_num;
int begin_time = 0x7fff; for(i = 1; i <= pro_num; i++) { if(pro[i].time_in < begin_time) begin_time = pro[i].time_in; pro[i].judge = 0; //所有进程号查找标志置0,表示还未查找 }
while(t--) {
for(i = 1; i <= pro_num; i++) {
if(pro[i].judge==0) {
min = i; //设其为目前最早到达的时间 for(j = i+1; j <= pro_num; j++) {
if(pro[j].judge == 0 && pro[j].time_in <= pro[min].time_in)//该进程号若还未被查找且小于预设
min = j; }
pro[min].judge = 1; //该进程号被查找过
printf(Format2,pro[min].num,pro[min].time_in,pro[min].work_time,
begin_time,begin_time+pro[min].work_time,begin_time+pro[min].work_time-pro[min].time_in); begin_time += pro[min].work_time; puts(\ } } } printmat(s); puts(\}
程序截图:
2段进程优先非抢占
算法描述:每次选出最短的进程进行调度,调度完毕则淘汰,直到所有进程都调度完毕;
void SJF() //短进程优先(非抢占) {
char s[] = \非抢占短进程优先\ printmat(s); PT; struct Pro *p,*q,*head; int t_num,t_work_time,t_time_in; head = &pro[1]; /************************按所有进程到达时间排序*************/ p = head; while(p - head < pro_num) {
for(q = p+1; q-head < pro_num; q++) {
if(q->time_in < p->time_in || (q->work_time < p->work_time && q->time_in == p->time_in)) {
t_num = p->num,t_time_in = p->time_in,t_work_time = p->work_time; p->num = q->num,p->time_in = q->time_in,p->work_time = q->work_time;
q->num = t_num, q->time_in = t_time_in,q->work_time = t_work_time; } } p++; } /*************************************************************/ /**********找出第一个执行的进程,即最先到达的最短进程*********/ int time = 0; p = head; for(q = head; q < head + pro_num; q++) { q->judge = 0; if(q->time_in < p->time_in) p = q; if(q->time_in == p->time_in && q->work_time < p->work_time) p = q; } int cnt = pro_num; p = head; while(cnt--) { time = time < p->time_in ? p->time_in:time; p->judge = 1; p->begin_time = time; time += p->work_time; p->end_time = time; for(q = head; q < head + pro_num; q++) { if(p->judge == 1 && q->judge == 0) p = q; else if(p->judge == 0 &&(q->work_time < p->work_time)) { p = q; } } } for(p = head; p < head+pro_num; p++) { printf(Format2,p->num,p->time_in,p->work_time,p->begin_time,p->end_time,p->end_time-
p->time_in); puts(\ } printmat(s); puts(\}
3短进程优先(抢占)
算法描述:按时间叠加,当新进程到达时,判断如果比当前执行的进程短,则发生抢占,执行完的淘汰,直到所有进程都调度完毕。 int find(int pp,int time) { int i; for(i = 1; i <= pro_num; i++) { if(pro[pp].l_w_time == 0 ||( pro[i].l_w_time != 0 && pro[i].l_w_time < pro[pp].l_w_time && time >= pro[i].time_in)) pp = i; } return pp; }
void test() { int i; for(i = 1; i <= pro_num; i++) {