-
Notifications
You must be signed in to change notification settings - Fork 10
ProjectⅠ
文档称应该有个名为DESIGNDOC
的纯文本文件来描述改了什么,但我想用markdown。
- 重写
timer_sleep()
,避免busy waiting - 把FCFS调度改成优先级调度
-
schedule
应选择高优先级线程 - 高优先级线程加到
ready_list
时,应抢占 - 锁、信号量、条件变量应优先唤醒高优先级线程
- 当前线程降低自身优先级后,应yield,与
thread_set_priority
有关 - 需考虑优先级反转,实现优先级捐赠(仅对于锁),与
thread_get_priority
有关 - 线程不会修改其它线程的优先级
-
- 实现多级反馈队列
重写timer_sleep()
,避免busy waiting
pintos自带的三种同步原语(Semaphore
Lock
Monitor
)看起来都不太适用,还是得用底层的thread_block
和thread_unblock
。
struct thread
加个属性wake_up_time
,表示这个线程什么时候醒。
加个struct list sleep_list
,存所有在睡觉的线程。
timer_sleep()
的实现改为【计算并设置wake_up_time
】【按升序加进sleep_list
】【thread_block()
】。
timer_interrupt()
里加个检查,判断sleep_list
队首(睡醒时间最早的那个)是不是该醒了。
可以用堆重写一下以提升性能。
但是27个tests没有一个是关于timer_sleep()
的,懒得写了。
thread_pop_highest_priority
从ready_list
中找到优先级最高的线程,移除并返回之。
next_thread_to_run
不再使用list_pop_front
,以thread_pop_highest_priority
替代之。
现在next_thread_to_run
的复杂度从O(1)
涨到了O(n)
,n
为ready_list
的长度,用堆重新写一下应该能降到O(lgn)
。
thread_create
中加上thread_yield
即可。
首先是信号量,把thread_pop_highest_priority
扩展一下就可以复用了。
锁调用了信号量,于是自然完成不必修改。
最后是条件变量,需要重新实现,把信号量包装一下就行了,两者区别仅在于sema_up
或者叫cond_signal
会不会增加存量而已。
thread_set_priority
中加上thread_yield
即可。
todo