问题描述:

实现linux中的thread.sleep()函数,其功能是让调用他的线程睡眠一段时间(ticks),然后唤醒。

pintos 本身的sleep函数

void timer_sleep(int 64_t ticks){Int 64_t start = timer_ticks();ASSERT(intr_get_level ==INTR_ON);while(timer_elapsed(start)<ticks)thread_yield();}

pintos 本身的sleep函数是忙等待的实现方式,其睡眠应为一种伪睡眠,睡眠的线程不断查询自己的睡眠时间,如果没有到给定的睡眠时长,则将自己放到队列的末端,这一操作持续进行,浪费cpu资源。
改进:我们不让线程去不断查询自己的睡眠时长,而是通过中断机制,在每一次时间终端到来时,判读该线程是否已经休眠够了睡眠时长,若是则唤醒它,否则让他的继续睡眠,在睡眠时间上减一。

为此 我们需要在thread,h的thread结构体中增加block_ticks 这一变量,通过它来初始化睡眠总时长。
同时在thread.c中增加thread_block_ticks_check函数,同时在thread.c的thread_ticks()函数中通过thread_foreach()函数遍历所有线程来唤醒满足唤醒条件的线程。

同时重写 sleep函数 对线程的睡眠时间进行设定,并将该线程阻塞,进入睡眠。

1、添加block_ticks变量

struct thread{/* Owned by thread.c. */tid_t tid;                          /* Thread identifier. */enum thread_status status;          /* Thread state. */char name[16];                      /* Name (for debugging purposes). */uint8_t *stack;                     /* Saved stack pointer. */int priority;                       /* Priority. */long long block_ticks;              /*Blocl_ticks */struct list_elem allelem;           /* List element for all threads list. */* Shared between thread.c and synch.c. */struct list_elem elem;              /* List element. */
}

2、在thread.c中加入thread_block_ticks_check函数

void thread_block_ticks_check(struct thread *t){if(t->status ==THREAD_BLOCKED){if(t->block_ticks ==1){thread_unblock(t);}if(t->block_ticks !=0){t->block_ticks--;}}
}

3、 修改thread.c中的thread_ticks()函数

void
thread_tick (void)
{struct thread *t = thread_current ();/* Update statistics. */if (t == idle_thread)idle_ticks++;
#ifdef USERPROGelse if (t->pagedir != NULL)user_ticks++;
#endifelsekernel_ticks++;/* Enforce preemption. */if (++thread_ticks >= TIME_SLICE)intr_yield_on_return ();enum intr_level old_level = intr_disable();thread_foreach(thread_block_ticks_check,NULL);intr_set_level(old_level);
}

4、重写sleep函数

timer_sleep (int64_t ticks)
{//int64_t start = timer_ticks ();//ASSERT (intr_get_level () == INTR_ON);//while (timer_elapsed (start) < ticks) //thread_yield ();if(ticks<=0) return ;enum intr_level old_level = intr_disable(); //close interuptthread_current()->block_ticks = ticks;thread_block();intr_set_level(old_level);
}

在 /home/xd/os/pintos/src/thread 中
make check

得到结果

操作系统课程设计 Pintos 1 ALarm Clock 问题相关推荐

  1. 操作系统课程设计pintos project1实验摘记

    前言: 本篇意在记录本学期结束的操作系统课程设计pintos project1实验报告和实现过程.整个实验参考了多篇文章也查阅了一些代码,其中部分内容或与其他文章相同,还请见谅.同时,也为了测试CSD ...

  2. 操作系统课程设计报告2021-2022——pintos

    操作系统课程设计报告 2021-2022 目录 操作系统课程设计报告 2021-2022 第一章 实验项目介绍 环境配置 ( 一 ). Ubuntu 服务器搭建 图形界面搭建 ( 二 ). Pinto ...

  3. 华南理工大学计算机操作系统课程设计大作业银行家死锁避免算法模拟,2016春操作系统大作业银行家死锁避免算法模拟.doc...

    文档介绍: 2016春操作系统大作业银行家死锁避免算法模拟20160501华南理工大学"计算机操作系统"课程设计大作业计算机科学与技术专业:春2015班级:号:2015047420 ...

  4. linux课程设计死锁避免,linux操作系统课程设计—车辆死锁.doc

    linux操作系统课程设计-车辆死锁.doc 键入文字"操作系统原理"课程设计BX090709吴沛儒操作系统原理课程设计报告姓名吴沛儒班级BX0907学号9指导老师胡静二〇一一年十 ...

  5. 操作系统课程设计--使用多线程模拟时间片轮转法调度

    本篇博文分享操作系统课程设计–使用多线程模拟时间片轮转法调度的思路及代码. 实验环境:虚拟机ubuntu18.04 ,VS Code 博主分享仅为互相学习之用,不懂的地方可以留言提问,谨防抄袭!!!谢 ...

  6. 计算机操作系统课设总结,计算机操作系统课程设计

    <计算机操作系统课程设计>由会员分享,可在线阅读,更多相关<计算机操作系统课程设计(36页珍藏版)>请在人人文库网上搜索. 1.操作系统课程设计实验报告姓 名: 李文孝 班 级 ...

  7. python枪战项目计划书_燕山大学操作系统课程设计计划书

    燕山大学操作系统课程设计计划书 燕山大学课程设计计划书 课程设计名称:操作系统 题目:多道程序缓冲区协同操作 年级:2016级 开发小组名称:WWW. 小组负责人: 课题组成员: 姓名 学号 班级 分 ...

  8. 华科计算机课程设计,华中科大操作系统课程设计报告(附源码).doc

    华中科技大学计算机学院 操作系统课程设计报告 班级: 学号: 姓名:彭博 时间:2010年3月 设计内容一:熟悉和理解Linux编程环境 编写一个C程序,实现文件拷贝功能. 2)编写一个C程序,使用下 ...

  9. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

  10. Linux并发程序课程设计报告,网络操作系统课程设计--进程机制与并发程序设计-linux下生产者与消费者的问题实现.doc...

    网 络 操 作 系 统 课 程 设 计 网络操作系统课程设计 设计内容:进程机制与并发程序设计inux下生产者与消费者的问题实现进程机制与并发程序设计inux下生产者与消费者的问题实现 (1)掌握基本 ...

最新文章

  1. python3 遍历列表得到序号索引和值
  2. 汇编 cmp_ARM汇编语言入门(二)
  3. 【Paper】2019_Distributed Optimal Control of Energy Storages in a DC Microgrid with Communication Dela
  4. WinForm窗体缩放动画
  5. IDEA无法通过类加载器获取resources文件夹配置文件解决办法
  6. GDUFE ACM-1045
  7. 详解虚拟机中为Linux添加硬盘
  8. 初学者应该如何有效率的系统学习Python开发
  9. 在Linux上使用logwatch分析监控日志文件
  10. 浙江工商大学计算机专业有博士点吗,[浙江工商大学]统计学(博士点)
  11. php框架开发(草稿)
  12. DataTrigger 绑定枚举
  13. java ping 实现的_java实现ping功能
  14. http2-协议协商过程
  15. mysql触发器编程_mysql之触发器trigger详解
  16. umijs 隐藏开发工具_Umi UI 插件开发 - UmiJS 中文文档
  17. js的Canvas逆时针旋转90度
  18. 三相电检测电路c语言,三相缺相检测电路的原理分析
  19. 宝付国际跨境知识小课堂 | 人民币外汇市场是个啥?
  20. python自动化办公 51cto_用Python开发钉钉群机器人,自动办公神器

热门文章

  1. 一次编写命令时遇到的问题,Ambiguous method call.both
  2. NLP工具——Stanza依存关系含义详解
  3. html直接使用marked.js解析marked文档
  4. Provision not found. A provision is required for deploying your app to the device. 解决方案
  5. 杨森翔人日诗词;人日书法
  6. win7计算机图标排列,win7系统桌面图标排列顺序打乱的操作方法
  7. 牛客网C++开发面试经验汇总
  8. c语言程序细菌分组实验报告,案例:细菌实验分组 - nimozp的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 基于到达时间差(TDOA)的室内定位(/无线传感器网络定位)——极大似然估计ML
  10. malloc、calloc、realloc函数讲解