1. 将系所有的就绪线程按照 FCFS 原则,排成一个就绪队列。
    2. 每次调度时将 CPU 分派(dispatch)给队首进程,让其执行一个时间片。
    3. 在时钟中断时,统计比较当前线程时间片是否已经用完。  - 如用完,则调度器(scheduler)暂停当前进程的执行,将其送到就绪队列的末尾,并通过切换执行就绪队列的队首进程。  - 如没用完,则线程继续使用。
    1. use alloc::vec::Vec;
    2. #[derive(Default)]
    3. struct RRInfo {
    4. valid: bool,
    5. time: usize,
    6. prev: usize,
    7. next: usize,
    8. }
    9. pub struct RRScheduler {
    10. threads: Vec<RRInfo>,
    11. max_time: usize,
    12. current: usize,
    13. }
    14. impl RRScheduler {
    15. // 设置每个线程连续运行的最大 tick 数
    16. pub fn new(max_time_slice: usize) -> Self {
    17. let mut rr = RRScheduler {
    18. threads: Vec::default(),
    19. max_time: max_time_slice,
    20. current: 0,
    21. };
    22. rr.threads.push(
    23. RRInfo {
    24. time: 0,
    25. prev: 0,
    26. }
    27. );
    28. rr
    29. }
    30. }
    31. impl Scheduler for RRScheduler {
    32. // 分为 1. 新线程 2. 时间片耗尽被切换出的线程 两种情况
    33. fn push(&mut self, tid : Tid) {
    34. let tid = tid + 1;
    35. if tid + 1 > self.threads.len() {
    36. self.threads.resize_with(tid + 1, Default::default);
    37. }
    38. if self.threads[tid].time == 0 {
    39. self.threads[tid].time = self.max_time;
    40. }
    41. let prev = self.threads[0].prev;
    42. self.threads[tid].valid = true;
    43. self.threads[prev].next = tid;
    44. self.threads[tid].prev = prev;
    45. self.threads[0].prev = tid;
    46. self.threads[tid].next = 0;
    47. }
    48. fn pop(&mut self) -> Option<Tid> {
    49. let ret = self.threads[0].next;
    50. if ret != 0 {
    51. let next = self.threads[ret].next;
    52. self.threads[prev].next = next;
    53. self.threads[ret].prev = 0;
    54. self.threads[ret].next = 0;
    55. self.threads[ret].valid = false;
    56. self.current = ret;
    57. Some(ret-1)
    58. }else{
    59. None
    60. }
    61. }
    62. // 当前线程的可用时间片 -= 1
    63. fn tick(&mut self) -> bool{
    64. let tid = self.current;
    65. if tid != 0 {
    66. self.threads[tid].time -= 1;
    67. if self.threads[tid].time == 0 {
    68. return true;
    69. }else{
    70. return false;
    71. }
    72. }
    73. return true;
    74. }
    75. fn exit(&mut self, tid : Tid) {
    76. let tid = tid + 1;
    77. if self.current == tid {
    78. self.current = 0;
    79. }