本文共 1837 字,大约阅读时间需要 6 分钟。
在Mission 1的基础上,我们正式对线程结构体进行了扩展和优化。以下是实现过程的详细步骤说明。
首先,我们在thread.h文件中增加了ticks_blocked成员变量。这个变量用于记录线程被阻塞的时间戳。
/* 记录线程被阻塞的时间戳 */int64_t ticks_blocked;
在创建线程时,ticks_blocked应被初始化为0。在thread_create()函数中添加如下代码:
/* 设置默认 ticks_blocked 为 0 */t->ticks_blocked = 0;
接下来,我们对timer_sleep()函数进行了修改,确保其能够正确唤醒线程。函数逻辑如下:
/* 使当前线程等待指定的时间戳 */void timer_sleep(int64_t ticks) { if (ticks <= 0) { return; } ASSERT(intr_get_level() == INTR_ON); enum intr_level old_level = intr_disable(); struct thread *current_thread = thread_current(); current_thread->ticks_blocked = ticks; thread_block(); intr_set_level(old_level);} 为了支持上述功能,我们对thread_block()函数进行了修改:
/* 让当前线程进入阻塞状态 */void thread_block(void) { ASSERT(!intr_context()); ASSERT(intr_get_level() == INTR_OFF); thread_current()->status = THREAD_BLOCKED; schedule();} 在timer_interrupt()函数中,我们添加了线程阻塞检查的逻辑:
thread_foreach(blocked_thread_check, NULL);
为了检查每个线程的阻塞状态,我们添加了blocked_thread_check函数:
/* 检查线程的阻塞状态 */void blocked_thread_check(struct thread *t, void *UNUSED) { if (t->status == THREAD_BLOCKED && t->ticks_blocked > 0) { t->ticks_blocked--; if (t->ticks_blocked == 0) { thread_unblock(t); } }} 最后,我们对thread_unblock()函数进行了优化:
/* 解除线程阻塞 */void thread_unblock(struct thread *t) { enum intr_level old_level; ASSERT(is_thread(t)); old_level = intr_disable(); ASSERT(t->status == THREAD_BLOCKED); list_push_back(&ready_list, t->elem); t->status = THREAD_READY; intr_set_level(old_level);} 在上述实现过程中,我们遇到了几个需要修复的小错误,最终使代码能够顺利运行。通过对上述修改的逐步应用,我们实现了线程调度与中断处理的正确机制,确保了系统的稳定性与可靠性。
如需了解更多细节或查看完整代码,请访问我的GitHub仓库。
转载地址:http://yhtfk.baihongyu.com/