基于Linux的进程调度模拟程序

本文介绍并展示了两种常见的进程调度算法:最高优先级算法和先来先服务(FCFS)算法。通过源代码详细解释了如何实现这两种算法,并讨论了进程控制块(PCB)的使用以及如何管理和调整进程的优先级。

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

1. 最高优先算法源码:
要求:对课程设计题目(以下简称课题)进行综述,明确提出本文的目的,写出关键内容和主要观点,
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define getpch(type) (type*)malloc(sizeof(type)) 
#define nll 0 //定义nll的值为0
struct pcb { /* 定义进程控制块PCB */ 
char name[10]; //进程的名字 
char state; //进程的状态
int super; //进程的优先级
int ntime; //进程需要运行时间 
int rtime; //进程已用CPU时间
struct pcb* link; 
}*ready=nll,*p; 
typedef struct pcb PCB; 
char sort() /* 建立对进程进行优先级排列函数*/ 

PCB *first, *second; 
int insert=0; 
if((ready==nll)||((p->super)>(ready->super)))
 /*优先级最大者,插入队首*/ 

p->link=ready; 
ready=p; 

else /* 进程比较优先级,插入适当的位置中*/ 

first=ready; 
second=first->link; 
while(second!=nll) 

if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/ 
{ /*插入到当前进程前面*/ 
p->link=second; 
first->link=p; 
second=nll; 
insert=1; 

else /* 插入进程优先数最低,则插入到队尾*/ 

first=first->link; 
second=second->link; 


if(insert==0) first->link=p; 


char input() /* 建立进程控制块函数*/ 

int i,num; 
//clrscr(); /*清屏*/ 
printf ("\n 请输入被调度的进程数目:"); //其中\n表示换行
scanf ("%d",&num); 
for(i=0;i<num;i++) 

printf ("\n 进程号No.%d:\n",i); 
p=getpch(PCB); 
printf ("\n 输入进程名:"); 
scanf ("%s",p->name); 
printf ("\n 输入进程优先数:"); 
scanf ("%d",&p->super); 
printf ("\n 输入进程运行时间:"); 
scanf ("%d",&p->ntime); 
printf ("\n"); 
p->rtime=0;
p->state='w'; 
p->link=nll; 
sort(); /* 调用sort函数*/ 


int space() 

int l=0; PCB* pr=ready; 
while(pr!=nll) 

l++; 
pr=pr->link; 

return(l); 

char disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ 

printf ("\n qname \t state \t super \t ndtime \t runtime \n"); 
printf ("|%s\t",pr-> name); 
printf ("|%c\t",pr-> state); 
printf ("|%d\t",pr-> super); 
printf ("|%d\t",pr-> ntime); 
printf ("|%d\t",pr-> rtime); 
printf ("\n"); 
}
char check() /* 建立进程查看函数 */ 

PCB* pr; 
printf ("\n **** 当前正在运行的进程是:%s",p->name);
 /*显示当前运行进程*/ 
disp(p); 
pr=ready; 
printf ("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/ 
while(pr!=nll) 

disp(pr); 
pr=pr->link; 


char destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ 

printf ("\n 进程 [%s] 已完成.\n",p->name); 
free(p); 

char running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ 

(p->rtime)++; 
if(p->rtime==p->ntime) 
destroy(); /* 调用destroy函数*/ 
else 

(p->super)--; 
p->state='w'; 
sort(); /*调用sort函数*/ 


main() /*主函数*/ 

int len,h=0; 
char ch; 
input(); 
len=space(); 
while((len!=0)&&(ready!=nll)) 

ch=getchar(); 
h++; 
printf ("\n The execute number:%d \n",h); 
p=ready; 
ready=p->link; 
p->link=nll; 
p->state='R'; 
check(); 
running(); 
printf ("\n 按任一键继续......"); 
ch=getchar(); 

printf ("\n\n 进程已经完成.\n"); 
ch=getchar(); 
}
2. 先来先服务算法源码
#include"stdio.h"
#include"stdlib.h"
float t,d; /*定义两个全局变量*/
struct /*定义一个结构体数组,包括进程的信息*/
{
int id;
float ArriveTime; /*定义进程到达时间*/
float RequestTime; /*定义进程请求时间*/
float StartTime; /*定义进程开始时间*/
float EndTime; /*定义进程结束时间*/
float RunTime; /*定义进程运行时间*/
float DQRunTime; /*定义进程在队列的时间*/
int Status;/*定义进程的状态*/
}arrayTask[4]; /*定义初始化的结构体数组*/
GetTask()/*给结构体数组赋值,输入到达,服务时间*/
{ int i;
float a;
for(i=0;i<4;i++)
{
printf ("请为第%d个进程",i+1);
printf ("输入进程到达队列的时间: arrayTask[%d]:",i); 
/*用户输入进程的时间,初始为零 */
scanf ("%f",&a);
arrayTask[i].ArriveTime=a;
printf ("请输入进程到的运行所需时间 arrayTask[%d]:",i);
scanf ("%f",&a);
arrayTask[i].id=i+1;
arrayTask[i].RequestTime=a;
arrayTask[i].StartTime=0;
arrayTask[i].EndTime=0;
arrayTask[i].RunTime=0;
arrayTask[i].Status=0; /*开始默认的标志位零*/
}
}
int fcfs() /*定义FCFS中寻找未执行的进程的最先到达时间*/

int i,j,w=0; /*在结构体数组中找到一个未执行的进程*/ 
for (i=0;i<4;i++) 

if (arrayTask[i].Status==0) 

t= arrayTask[i].ArriveTime; 
w=1; 

if(w==1) 
break; 

for (i=0;i<4;i++) /*查找数组中到达时间最小未执行的进程*/ 

if(arrayTask[i].ArriveTime < t&&arrayTask[i].Status==0) 
t=arrayTask[i].ArriveTime; 
} /*返回最小到达时间的数组的下标*/ 
for (i=0;i<4;i++) 

if (arrayTask[i].ArriveTime==t) 
return i; 


int sjf() /*定义FCFS中寻找未执行的进程的最先到达时间*/
{
int i,x=0,a=0,b=0; /*判断是不是第一个执行的进程*/
float g;
for (i=0;i<4;i++)
{
if (arrayTask[i].Status==1){
g=arrayTask[i].EndTime;
x=1;
}
}
if(x==0) /*第一个执行的进程按FCFS*/
{
t=arrayTask[0].ArriveTime;
for(i=0;i<4;i++)
{
if (arrayTask[i].ArriveTime<t)
{ t=arrayTask[i].ArriveTime;
a=i;
}
}
return a;}
else
{
for(i=0;i<4;i++)
{
if (arrayTask[i].EndTime>g)
g=arrayTask[i].EndTime;
}
for(i=0;i<4;i++)
{
if (arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g)
{
t=arrayTask[i].RequestTime;
a=i;
b=1;
} /*判断有没有进程在前个进程完成前到达*/
}
if (b!=0) /*有进程到达则按SJF*/
{
for (i=0;i<4;i++)
{
if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime<=g&&arrayTask[i].RequestTime<t)
{
t=arrayTask[i].RequestTime;
a=i;
}
}
return a;
}
else { /*否则按FCFS*/
for (i=0;i<4;i++)
{
if(arrayTask[i].Status==0)
t=arrayTask[i].ArriveTime;
}
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime<t)
{
t=arrayTask[i].ArriveTime;
a=i;
}
}
return a;
}
}
}
new(int s) /*定义执行进程后相关数据的修改*/

int i,g=0;
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==0)
continue;
else
{
g=1;
break;
}
}
if(g==0) /*当处理的是第一个未执行的进程时执行*/
{
arrayTask[s].StartTime=arrayTask[s].ArriveTime;
arrayTask[s].EndTime=arrayTask[s].RequestTime+arrayTask[s].ArriveTime;
arrayTask[s].RunTime=arrayTask[s].RequestTime;
arrayTask[s].Status=1;
g=2;
}
if(g==1) /*当处理的不是第一个未执行的进程时执行*/
{
arrayTask[s].Status=1;
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==1)
d=arrayTask[i].EndTime;
}
for(i=0;i<4;i++) /*查找最后执行的进程的完成时间*/
{
if(arrayTask[i].EndTime>d&&arrayTask[i].Status==1)
d=arrayTask[i].EndTime;
}
if (arrayTask[s].ArriveTime<d)
/*判断修改的进程的到达时间是否在前一个执行的进程的完成时间前面*/
arrayTask[s].StartTime=d;
else
arrayTask[s].StartTime=arrayTask[s].ArriveTime;
arrayTask[s].EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;
arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;
}
arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;
}
Printresult(int j) /*定义打印函数*/

printf ("%d\t\t",arrayTask[j].id); /*打印进程id*/
printf ("%5.2f\t\t",arrayTask[j].ArriveTime); /*打印进程id*/
printf ("%5.2f\t\t",arrayTask[j].RequestTime); /*打印进程所需时间*/
printf ("%5.2f\t\t",arrayTask[j].StartTime); /*打印进程到达时间*/
printf ("%5.2f\t",arrayTask[j].EndTime); /*打印进程运行结束时间*/
printf ("%5.2f\t",arrayTask[j].RunTime); /*打印进程周转时间*/
printf ("%5.2f\n",arrayTask[j].DQRunTime); 
/*打印进程带权平均周转时间*/
}
main()

int i,b,k,a,c=0;
int d[4];
//clrscr();
printf ("\t 1. 先来先服务算法 \n");
printf ("\t 2. 退出 \n");
for (i=0;;i++)
{
if(c)
break;
printf ("请输入你的选择:\n");
scanf ("%d",&a);
switch(a)
{
case 2:
c=1;
break;
case 1:
printf ("请为进程输入不同的到达队列的时间\n");
GetTask();
printf ("*****************************先来先服务的运行结果是*****************************\n");
printf ("进程编号\t到达时间\t所需要的时间)\t开始时间\t结束时间 周转时间  带权周转时间\n");
for (b=0;b<4;b++) /*调用两个函数改变结构体数的值*/
{
k=fcfs();
d[b]=k;
new(k);
}
for (b=0;b<4;b++)
Printresult (d[b]);/*调用打印函数打出结果*/
break;
default:printf ("输入的数字不正确,请输入正确的数字!!\n");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值