博客
关于我
pintos project (2) Project 1 Thread -Mission 1 Code
阅读量:793 次
发布时间:2023-03-02

本文共 1837 字,大约阅读时间需要 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仓库。

转载地址:http://yhtfk.baihongyu.com/

你可能感兴趣的文章
PHP相关代码
查看>>
RabbitMQ
查看>>
php知识点记录
查看>>
PHP知识笔记:CGI, FastCGI, PHP-CGI, PHP-FPM, Spawn-FCGI区别
查看>>
PHP第三方登录—OAuth2.0协议
查看>>
php筛选js,php如何多条件筛选js代码
查看>>
R730服务器做了raid的硬盘,插在R720上面可以用吗?
查看>>
PHP类数组式访问(ArrayAccess接口)
查看>>
PHP系列:浅谈PHP中isset()和empty() 函数的区别
查看>>
PHP索引数组unset的坑-array_values解决方案
查看>>
PHP索引数组排序方法整理(冒泡、选择、插入、快速)
查看>>
PHP线程安全和非线程安全
查看>>
R3LIVE开源项目常见问题解决方案
查看>>
php缃戠珯,www.wfzwz.com
查看>>
php缓存查询函数
查看>>
php编写TCP服务端和客户端程序
查看>>
php编码规范
查看>>
PHP编码规范-PSR1、psr2 /psr3 psr4
查看>>
PHP编程效率的20个要点
查看>>
PHP网页缓存技术优点及代码
查看>>