任务调度 实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大作业三任务调度
姓名:
学号:
班级:
日期:2015年7月
1 需求说明
本次实验的目标是在Linux环境下实现任务调度仿真,利用多线程实现任务池中的多个任务,支持先来先服务、轮转和反馈三种调度策略,提高对Linux环境下多进程、多线程和单处理器调度等知识的理解。
2 设计说明
设有任务A、B、C、D、E,分别具有不同的优先级和处理时间,通过一个调度线程对这5个任务进行调度。
2.1 结构设计
将先来先服务与优先级队列用结构体数组进行设计,对到达时间、运行时间结束时间进行相关的调度与修改
将时间片轮转用循环队列来表示,使五种不同任务不断的论寻,直至运行结束。
2.2 功能设计
●正确输出三种调度算法下,任务的执行顺序、每个任务占用CPU的时间以及优先
级队列(反馈调度)
●通过一个调度进程实现任务调度
●有输出界面,在每个时间点输出任务状态、每个任务已经占用CPU
时间和还需CPU时间,已经执行的任务顺序和时间。
3 测试和使用说明
3.1 使用说明
无
3.2 测试说明
4 程序清单
[cpp] view plaincopy
OBJS=main.o fcfs_sjf.o cl.o
a.out:$(OBJS) common.h
gcc $(OBJS) -o a.out main.o:main.c common.h
gcc -c main.c
fcfs_sjf.o:fcfs_sjf.c common.h
gcc -c fcfs_sjf.c
cl.o:cl.c common.h
gcc -c cl.c
common.h
#include
#include"stdio.h"
#include"string.h"
#define NULL0
/*定义结构*/
typedef struct quen
{
char pname[8];
int time1;
int time2;
char state;
struct quen*next; }QUEN;
float t,d;
struct{
int id;
float ArriveTime;
float RequestTime;
float StartTime;
float EndTime;
float RunTime;
float DQRunTime;
int status;
}arrayTask[4];
void GetTask();
nt fcfs();
int sjf();
void new_n(int s);
void Printresult(int j);
void cl();
fcfs_sjf.c
void GetTask()
{
int i;
float a;
for(i=0;i<=4;i++)
{
arrayTask[i].id=i+1;
printf("input the number");
printf("input the ArriveTime of arrayTask[%d]:",i);
scanf("%f",&a);
arrayTask[i].ArriveTime=a;
printf("input the RequestTime of arrayTask[%d]:",i);
scanf("%f",&a);
arrayTask[i].RequestTime=a;
arrayTask[i].StartTime=0;
arrayTask[i].EndTime=0;
arrayTask[i].RunTime=0;
arrayTask[i].status=0;
}
}
/*定义FCFS中寻找未执行的进程的最先到达时间*/
int fcfs()
{
int i,j,w;
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].ArriveTime; } } for(i=0;i<=4;i++)/*返回最小到达时间的数组的下标*/ { if(arrayTask[i].ArriveTime==t) { return i; } } } //最短作业优先算法SJF int sjf()/*定义FCFS中寻找未执行的进程的最先到达时间*/ { int i,x=0,a=0,b=0;/*判断是不是第一个执行的进程*/ float g; for(i=0;i<=4;i++) { if(arrayTask[i].status==1)