时间片长度设置
//时间片长度
#define TIME_SLICE 50
进程
//任务的结构体
struct process
{
ll id;
char name[50];
ll runtime;
int priority;
ll intput_time; //输入等待队列的时间
int has_done; //已完成时间
};
输出的时间片信息
//时间片数据
struct TimeSlice {
ll pro_id;
char pro_name[50];
int priority;
int last_time;
};
输入队列
struct WaitList {//输入队列
int has_done = 0; //已完成任务数
int has_input = 0; //已经输入任务书
int maxnum; //所有任务数
process waitlist[10000];
int find_next(int start, int last) {
//找到当前等待队列中优先级最高的任务,运行
if (start >= last) {
return -1;
}
int next = start;
for (int i = start; i < last; i++) {
if (waitlist[next].priority < waitlist[i].priority)
next = i;
else if (waitlist[next].priority == waitlist[i].priority && waitlist[i].intput_time < waitlist[next].intput_time)
next = i;
}
Swap(&waitlist[start], &waitlist[next]);
return start;
}
bool isFinished() {
//所有任务是否都被执行完毕
if (has_done >= maxnum)
return false;
return true;
}
void Input(ll sys_time) {
while (has_input<maxnum && waitlist[has_input].intput_time<=sys_time) {
has_input++;
}
}
void init() {
/*输入所有数据 按照输入时间排序*/
//设置一共几个任务
maxnum = 3;
//任务1信息
waitlist[0].id = 1;
memcpy(waitlist[0].name, "1hao", 50);
waitlist[0].intput_time = 0;
waitlist[0].priority = 1;
waitlist[0].runtime = 60;
//任务2信息
waitlist[1].id = 2;
memcpy(waitlist[1].name, "2hao", 50);
waitlist[1].intput_time = 48;
waitlist[1].priority = 2;
waitlist[1].runtime = 60;
//任务3信息
waitlist[2].id = 3;
memcpy(waitlist[2].name, "3hao", 50);
waitlist[2].intput_time = 138;
waitlist[2].priority = 4;
waitlist[2].runtime =60;
}
};
主要程序
每次找到下一个适合的任务来运行。
把运行信息放入输出数组。
ll sys_time = 0;
int main() {
waitlist.init();
while (waitlist.isFinished()) {
waitlist.Input(sys_time);
//找到当前优先级最高的
int next=waitlist.find_next(waitlist.has_done, waitlist.has_input);
if (next != -1) {
process* p = &(waitlist.waitlist[next]);
//生成时间片数据
output[index].pro_id = p->id;
output[index].priority = p->priority;
memcpy(output[index].pro_name, p->name, 50);
p->runtime -= TIME_SLICE; //执行时间片,减去时间片时间
output[index].last_time = p->runtime;
if (output[index].last_time < 0)
output[index].last_time = 0;
if (p->runtime <= 0) {//如果任务执行结束
ll last = -p->runtime; //时间片剩余时间
waitlist.has_done++; //代表已经结束任务的变量加一
}
}
else {
output[index].pro_id = -1;
}
index++; //进入下一个时间片
sys_time += TIME_SLICE;
}
//----------------------输出信息-------------------
printf("------------------------------\n");
for (int i = 0; i < index; i++) {
if (output[i].pro_id == -1)
continue;
printf("时间片%d 编号:%d", i, output[i].pro_id);
printf(" 名称:%s 剩余时间:%d \n", output[i].pro_name, output[i].last_time);
}
return 0;
}