没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一:Alarm Clock:
整体算法思路:在原始的 timer_sleep(),用 while 循环来检测是否该线程开始
运行了。Waitinglist 用来储存时间未到的线程。添加 thread_wait()用来将未
到时间点的线程添加到 waitinglist 中。在 schedule()中,在 schedule()的调
用过程中遍历 waiting_list ,将 waiting_list 中完成睡眠,时间达到要求的进
程唤醒放入 Ready_list 调用 thread_wakeup()来唤醒到达时间点的线程。
数据结构:
在 devices/timer.c 中
void timer_sleep (int64_t ticks) {
int64_t start = timer_ticks ();
ASSERT (intr_get_level () == INTR_ON);
thread_wait (ticks+start);
}
在 thread.h 中
int64_t totalticks;//时间定时器用来唤醒线程
struct list_elem waitingQue;//将线程放入等待队列的队列
程序代码改动:
在thread.c中
//将线程添加到等待队列中
void thread_wait(int64_t totalticks){
struct thread *cur = thread_current ();
cur->totalticks = totalticks;
enum intr_level old_level;
ASSERT (!intr_context ());
old_level = intr_disable ();
if(cur != idle_thread)
list_insert_ordered(&waiting_list,&cur->waitingelem,thread_is_larger,0);
thread_block();
intr_set_level (old_level);
}
static struct list waiting_list;//未到运行时刻的等待队列
//唤醒线程,并在时间到的时候将线程添加到就绪队列
void thread_wakeup(){
struct list_elem *e;
if(!list_empty(&waiting_list))
for (e = list_begin (&waiting_list); e != list_end (&waiting_list);e=e->next){
struct thread *et = list_entry (e, struct thread, waitingQue);
if(et->totalticks <= timer_ticks()){
list_remove(e);
thread_unblock(et);
et->totalticks = 0;
}} }
//在schedule()的调用过程中遍历waiting_list,将 waiting_list中完成睡眠,时间达到要求的进程唤醒
资源评论
J10072510418
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功