操作系统时间片轮转调度算法 进程 到达时间 服务时间 p1 p2 p3 p4

时间片轮转调度算法详细判断流程:

例题:

进程到达时间服务时间
P10.07
P22.04
P34.01
P45.04

时间片为1

先放出来最终的结果

P1P1P2P1P2P3P1P4P2P1P4P2P1P4P1P4
P1P2P3P1P4P2P1P4P2P1P4P1P4
P1P4P2P1P4P2P1P4
P2

因为时间片为1,所以我们每隔1就要中断一下

0时刻,P1到达,第1个时间片执行服务开始,此时队列中的数据如下(箭头向上代表流动方向,上面的代表出队列,下面的代表入队列

P1

1时刻没有陆续到达的,第1个时间片执行完成,队列中仍然是P1

p1已服务时间: 1    ,p2已服务时间: 0   ,p3已服务时间: 0   ,p4已服务时间: 0   

队列如下  

P1

再执行1个时间片(第2个时间片执行服务开始),总状态(除最后一列外的左边列代表已执行过的队列,最后一列代表当前队列)  

P1P1

2时刻P2到达,第2个时间片执行完成,P2入队列,P1出队列循环到队尾,此时队列如下

p1已服务时间: 2    ,p2已服务时间: 0   ,p3已服务时间: 0   ,p4已服务时间: 0   

P2
P1

再执行1个时间片(第3个时间片执行服务开始),总状态 

P1P1P2
P1

3时刻没有到达的,第3个时间片执行完成,继续循环出队列然后进队列,P2到队尾,此时状态

p1已服务时间: 2    ,p2已服务时间: 1   ,p3已服务时间: 0   ,p4已服务时间: 0   

P1
P2

再执行1个时间片(第4个时间片执行服务开始),总状态 

P1P1P2P1
P1P2

继续循环,4时刻,P3到达,第4个时间片执行完成,P1到队尾,此时状态

p1已服务时间: 3    ,p2已服务时间: 1   ,p3已服务时间: 0   ,p4已服务时间: 0   

P2
P3
P1

再执行1个时间片(第5个时间片执行服务开始),总状态

P1P1P2P1P2
P1P2P3
P1

继续循环,5时刻,P4到达,第5个时间片执行完成,P2到队尾,此时的状态

p1已服务时间: 3    ,p2已服务时间: 2   ,p3已服务时间: 0   ,p4已服务时间: 0   

P3
P1
P4
P2

再执行1个时间片(第6个时间片执行服务开始),总状态

P1P1P2P1P2P3
P1P2P3P1
P1P4
P2

继续循环,6时刻,第6个时间片执行完成,P3完成,此时状态

p1已服务时间: 3    ,p2已服务时间: 2   ,p3已服务时间: 1   ,p4已服务时间: 0   

P1
P4
P2

再执行1个时间片(第7个时间片执行服务开始),总状态

P1P1P2P1P2P3P1
P1P2P3P1P4
P1P4P2
P2

继续循环,7时刻,第7个时间片执行完成,P1到队尾,此时状态

p1已服务时间: 4    ,p2已服务时间: 2   ,p3已服务时间: 1   ,p4已服务时间: 0

P4
P2
P1

再执行1个时间片(第8个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4
P1P2P3P1P4P2
P1P4P2P1
P2

继续循环,8时刻,第8个时间片执行完成,P4到队尾,此时状态

p1已服务时间: 4    ,p2已服务时间: 2   ,p3已服务时间: 1   ,p4已服务时间: 1

P2
P1
P4

再执行1个时间片(第9个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4P2
P1P2P3P1P4P2P1
P1P4P2P1P4
P2

继续循环,9时刻,第9个时间片执行完成,p2到队尾,此时状态

p1已服务时间: 4    ,p2已服务时间: 3   ,p3已服务时间: 1   ,p4已服务时间: 1

P1
P4
P2

再执行1个时间片(第10个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4P2P1
P1P2P3P1P4P2P1P4
P1P4P2P1P4P2
P2

继续循环,10时刻,第10个时间片执行完成,P1到队尾,此时状态

p1已服务时间: 5    ,p2已服务时间: 3   ,p3已服务时间: 1   ,p4已服务时间: 1

P4
P2
P1

再执行1个时间片(第11个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4P2P1P4
P1P2P3P1P4P2P1P4P2
P1P4P2P1P4P2P1
P2

继续循环,11时刻,第11个时间片执行完成,P4到队尾,此时状态

p1已服务时间: 5    ,p2已服务时间: 3   ,p3已服务时间: 1   ,p4已服务时间: 2

P2
P1
P4

再执行1个时间片(第12个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4P2P1P4P2
P1P2P3P1P4P2P1P4P2P1
P1P4P2P1P4P2P1P4
P2

继续循环,12时刻,第12个时间片执行完成,P2完成,此时状态

p1已服务时间: 5    ,p2已服务时间: 4   ,p3已服务时间: 1   ,p4已服务时间: 2

P1
P4

再执行1个时间片(第13个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4P2P1P4P2P1
P1P2P3P1P4P2P1P4P2P1P4
P1P4P2P1P4P2P1P4
P2

继续循环,13时刻,第13个时间片执行完成,P1到队尾,此时状态

p1已服务时间: 6    ,p2已服务时间: 4   ,p3已服务时间: 1   ,p4已服务时间: 2

P4
P1

再执行1个时间片(第14个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4P2P1P4P2P1P4
P1P2P3P1P4P2P1P4P2P1P4P1
P1P4P2P1P4P2P1P4
P2

继续循环,14时刻,第14个时间片执行完成,P4到队尾,此时状态

p1已服务时间: 6    ,p2已服务时间: 4   ,p3已服务时间: 1   ,p4已服务时间: 3

P1
P4

再执行1个时间片(第15个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4P2P1P4P2P1P4P1
P1P2P3P1P4P2P1P4P2P1P4P1P4
P1P4P2P1P4P2P1P4
P2

继续循环,15时刻,第15个时间片执行完成,P1完成,此时状态

p1已服务时间: 7    ,p2已服务时间: 4   ,p3已服务时间: 1   ,p4已服务时间: 3

P4

再执行1个时间片(第16个时间片执行服务开始),总状态

P1P1P2P1P2P3P1P4P2P1P4P2P1P4P1P4
P1P2P3P1P4P2P1P4P2P1P4P1P4
P1P4P2P1P4P2P1P4
P2

第16个时间片执行完,16时刻,第15个时间片执行完成,P4结束,全部完成,此时状态

p1已服务时间: 7    ,p2已服务时间: 4   ,p3已服务时间: 1   ,p4已服务时间: 4

最终结束完毕,状态如下:

P1P1P2P1P2P3P1P4P2P1P4P2P1P4P1P4
P1P2P3P1P4P2P1P4P2P1P4P1P4
P1P4P2P1P4P2P1P4
P2

所以调度结果为:

P1P1P2P1P2P3P1P4P2P1P4P2P1P4P1P4

以下是一个简单的时间片轮转调度算法的C++实现: ```cpp #include <iostream> #include <queue> using namespace std; struct Process { int pid; // 进程ID int burst_time; // 执行时间 int remaining_time; // 剩余时间 int arrival_time; // 到达时间 }; void time_slice_round_robin(queue<Process>& process_queue, int time_slice) { int current_time = 0; while (!process_queue.empty()) { Process current_process = process_queue.front(); process_queue.pop(); if (current_process.remaining_time <= time_slice) { current_time += current_process.remaining_time; cout << "Process " << current_process.pid << " has completed at time " << current_time << endl; } else { current_time += time_slice; current_process.remaining_time -= time_slice; process_queue.push(current_process); } } } int main() { // 创建进程 Process p1 = {1, 10, 10, 0}; Process p2 = {2, 5, 5, 2}; Process p3 = {3, 8, 8, 4}; Process p4 = {4, 2, 2, 5}; queue<Process> process_queue; process_queue.push(p1); process_queue.push(p2); process_queue.push(p3); process_queue.push(p4); // 进行时间片轮转调度 time_slice_round_robin(process_queue, 3); return 0; } ``` 在这个例子中,我们创建了4个进程,并将它们放入一个队列中。然后,我们调用`time_slice_round_robin`函数来执行时间片轮转调度。这个函数会不断从队列中取出一个进程,并判断它是否已经完成。如果已经完成,则输出完成信息。否则,它会将剩余时间减去时间片,并将进程重新放回队列中。这样,就能够模拟出时间片轮转调度的过程。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值