pintos project (2) Project 1 Thread -Mission 1 Code
发布日期:2025-05-05 09:25:33 浏览次数:2 分类:精选文章

本文共 1801 字,大约阅读时间需要 6 分钟。

使线程结构体支持时间统计的实现

在Mission 1的基础上,我们正式对线程结构体进行了扩展和优化。以下是实现过程的详细步骤说明。

1. 添加ticks_blocked成员

首先,我们在thread.h文件中增加了ticks_blocked成员变量。这个变量用于记录线程被阻塞的时间戳。

/* 记录线程被阻塞的时间戳 */int64_t ticks_blocked;

2. 初始化ticks_blocked

在创建线程时,ticks_blocked应被初始化为0。在thread_create()函数中添加如下代码:

/* 设置默认 ticks_blocked 为 0 */t->ticks_blocked = 0;

3. 修改timer_sleep函数

接下来,我们对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);}

4. 优化thread_block函数

为了支持上述功能,我们对thread_block()函数进行了修改:

/* 让当前线程进入阻塞状态 */void thread_block(void) {    ASSERT(!intr_context());    ASSERT(intr_get_level() == INTR_OFF);    thread_current()->status = THREAD_BLOCKED;    schedule();}

5. 修改timer中断处理

timer_interrupt()函数中,我们添加了线程阻塞检查的逻辑:

thread_foreach(blocked_thread_check, NULL);

6. 实现blocked_thread_check函数

为了检查每个线程的阻塞状态,我们添加了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);        }    }}

7. 优化thread_unblock函数

最后,我们对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仓库。

上一篇:PinYin4j库的使用
下一篇:Pinterest 大规模缓存集群的架构剖析

发表评论

最新留言

不错!
[***.144.177.141]2026年06月12日 17时54分28秒