Stanford cs140 Pintos Project1实验目标

前言

本实验出自斯坦福大学cs140课程,实验环境为Pintos+Bochs,鉴于其文档为全英文,故为了方便读者及自己尝试,整理翻译了其中实验1的主要任务。emmm后续应该也会更新自己小组的实验过程&心得。

1. 主要任务

1.1 修改 devices/timer.c,重新实现timer_sleep()函数

尽管timer_sleep()提供了有效的实现,但它“忙于等待”,也就是说,它一直在循环以检查当前时间并进行调用 thread_yield()直到经过了足够的时间。重新实现它以避免繁忙的等待。

函数: void timer_sleep(int64_t ticks)

暂停执行调用线程,直到时间提前至少x个计时器滴答为止。除非系统处于空闲状态,否则线程无需在x个计时器滴答之后醒来。在他们等待了时长正确的一段时间之后,只需将其放在准备好的队列中即可。

timer_sleep() 对于实时操作的线程很有用,例如每秒闪烁一次光标。

timer_sleep()的参数被计时器的滴答所表示,而不是以毫秒或任何其他单位表示。TIMER_FREQ计时器每秒滴答一次,TIMER_FREQdevices/timer.h中定义的宏 。默认值为100。我们不建议更改此值,因为任何更改都可能导致许多测试失败。

函数timer_msleep()timer_usleep()timer_nsleep(),它们分别用于休眠特定数量的毫秒,微秒或纳秒,它们将在必要时自动调用timer_sleep()。不需要修改它们。

1.2 实现优先级调度

1.2.1 实现优先级捐赠(priority donation)

考虑高,中,和低优先级线程H,M和L. 如果H需要等待L(例如,L正在持有锁),并且M在就绪等待列表中,则H 将永远不会获得CPU,因为低优先级线程将不会获得占用一丁点CPU时间。解决此问题的部分方法是,在L持有锁的同时,H将其优先级“捐赠”给L。然后一旦L释放(并因此H获得)锁,便撤回捐赠。

我们需要实现这样的优先级捐赠(实验1只要求实现锁的优先级捐赠)。而且,我们需要考虑优先级捐赠的所有不同情况(有很多对应的测试点)。要保证解决:

  1. 多个优先级捐赠问题,即多个优先级被捐赠给了同一个线程。

  2. 嵌套捐赠。比如:如果H正在等待一个M持有的锁,M正在等待一个L持有的锁,那么M和L都应该被提升至H的优先级(通过捐赠)。如果有必要,应该对嵌套优先级捐赠的深度施加合理的限制,例如8个优先级的差距。

1.2.2 实现thread_set_priority和thread_get_priority函数

这两个函数使线程能够检查和修改其自身的优先级。这些功能的框架在thread / thread.c中提供。

函数1:void thread_set_priority (int new_priority)

将当前线程的优先级设置为new_priority。如果当前线程不再具有最高优先级,则yield该线程(暂停当前正在执行的线程对象)。

函数2:int thread_get_priority (void)

返回当前线程的优先级。在存在优先级捐赠的情况下,返回较高(捐赠的)优先级。

1.3 实现多级反馈调度

需要实现B4.4 描述的BSD调度程序。

简单来说就是这个程序维持了64个队列, 每个队列对应一个优先级, 从PRI_MIN到PRI_MAX。

然后通过一些公式计算来计算出线程当前的优先级, 系统调度的时候会从高优先级队列开始选择线程执行, 这里线程的优先级随着操作系统的数据操作而动态改变。

这个计算涉及到了浮点数运算等问题, pintos本身并没有实现, 需要我们自己来实现。

猜你喜欢

转载自blog.csdn.net/weixin_44765402/article/details/109063035
今日推荐