因为这篇文章引用博主 superli90有点多了(主要是他写的很清楚,我也不知道在哪找。所以就直接引用过来了Hhh)于是首先附上链接
版权声明:本文为CSDN博主「superli90」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/superli90/article/details/29373593
Exercise 1 调研
调研Linux或Windows中采用的进程/线程调度算法。具体内容见课堂要求。
1. SCHED_OTHER分时调度策略。
2. SCHED_FIFO实时调度策略,先到先服务。一旦占用CPU则一直运行直到有更高优先级任务达到或自己放弃。
3. SCHED_RR实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列。放在队尾保证了所有具有相同优先级的RR任务的调度公平。
Linux内核将进程分成两个级别:普通进程和实时进程。实时进程的优先级都高于普通进,除此之外,它们的调度策略也有所不同。
1:如果一个进程有实时需求(它是一个实时进程),则只要它是可执行状态的,内核就一直让它执行
2:如果有多个实时进程都处于可执行状态,则内核会先满足优先级最高的实时进程对CPU的需要,直到它变为非可执行状态。
3:只要有高优先级的实时进程一直处于可执行状态,低优先级的实时进程就一直不能得到CPU;只要一直有实时进程处于可执行状态,普通进程就一直不能得到CPU。
4:后来内核进行了一些改动,限定了以sched_rt_period_us为周期的时间内,实时进程最多只能运行sched_rt_runtime_us。这样给普通进程留下了一点点能够得到执行的机会。
Exercise 2 源代码阅读
仔细阅读下列源代码,理解Nachos现有的线程调度算法。
code/threads/scheduler.h和code/threads/scheduler.cc
code/threads/switch.s
code/machine/timer.h和code/machine/timer.cc
scheduler.cc:
Scheduler::ReadyToRun (Thread *thread)
将thread加入到线程队列中
Scheduler::FindNextToRun ()
从线程队列中找到第一个线程
Scheduler::Run (Thread *nextThread)
- 保存当前线程为旧线程;
- 如果是用户程序,则保存当前CPU寄