ucore操作系统学习(六) ucore lab6线程调度器

Java82

ucore在lab5中实现了较为完整的进程/线程机制,能够创建和管理位于内核态或用户态的多个线程,让不同的线程通过上下文切换并发的执行,最大化利用CPU硬件资源。ucore在lab5中使用FIFO的形式进行线程调度,不同的线程按照先来先服务的策略,直到之前创建的线程完全执行完毕并退出,后续的线程才能获得执行机会。

FIFO的策略固然简单,但实际效果却非常差。在非抢占的FIFO调度策略中,如果之前的线程任务耗时很长,将导致后续的线程迟迟得不到执行机会而陷入饥饿;即使后续的线程是短任务、能很快的执行完,也会由于被迫等待前面长任务线程的执行而导致系统整体的任务吞吐量大幅下降。如果前面线程出现了bug陷入死循环,则整个系统将会被阻塞。

为此,计算机科学家提出了很多线程调度策略来解决这一问题。例如在批处理操作系统中除了 FIFO先来先服务策略,还有 短任务优先最短 剩余时间优先等多种 非抢占式调度算法;而在交互式操作系统中又提出了 时间片轮转调度优先级调度多级队列调度基于抢占的调度算法(在视频公开课的原理篇以及《现代操作系统》中的调度一节对此都有着详细介绍)。

ucore在lab6实现了可以满足上述不同调度算法的的线程调度框架。lab6中采用了和之前内存调度算法框架类似的方式,通过函数指针集合,以面向对象的方式抽象出了一个线程调度器框架。并在参考答案中实现了一个基于线程优先级、时间片轮转的、抢占式的stride调度算法。

通过lab6的学习,使得原本枯燥乏味的关于各种调度算法的纯理论知识有了实践的机会, 可以更深入的了解操作系统线程调度算法的工作机制 。

lab6是建立在之前实验的基础之上的,需要先理解之前的实验内容才能顺利理解lab6的内容。

可以参考一下我关于前面实验的博客:

ucore在lab6中的改进大致可以分为几个部分:

1. 为了支持基于优先级的stride调度算法,改进线程控制块,加入了相关的新字段。

2. 以面向对象的方式实现了基本的线程调度器框架, 在对应的地方以接口的形式(函数指针)进行访问;不同的调度算法只需要实现对应的调度器框架接口即可简单的接入ucore。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长