操作系统-抢占式优先调度 C语言设计

时间片长度设置

//时间片长度
#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;
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值