操作系统课程设计报告Alarm-Clock

  • 格式:docx
  • 大小:407.30 KB
  • 文档页数:7

西安电子科技大学
操作系统课程设计
(2016年度)




实验名称:Alarm-Clock
班级:1403018
姓名:张可心
学号:14030188030
一实验内容
源代码devices/timer.c中有一个timer_sleep()函数。

定义如图1所示
图1 timer_sleep()函数的定义
该函数的功能是让调用它的线程睡眠一段时间(ticks),然后唤醒。

事实上,品同时已经实现该函数,只是使用的是“忙等待”的方法。

任务要求:重新实现timer_sleep()函数,避免“忙等待”的发生,设计一种策略并实现。

二分析及设计
1. 阅读相关的源代码文件,并了解其中关键的数据结构和函数的含义:在xd/os/pintos/src/threads目录下的thread.h,thread.c文件,它们是有关线程初始化、阻塞、解除阻塞,线程调度等内容。

xd/os/pintos/src/devices/目录下的timer.h,timer.c文件,本实验要修改的timer_sleep()函数就在其中。

同时还要注意定时器中断的处理过程。

2. Thread.h中定义了一个结构体struct thread,这个结构体中用于存放线程的基本信息,如图2所示
图2线程的基本信息
3. Pintos中线程的状态有四种,在thread.h函数中的定义如图3
图 3 线程的状态定义
4.系统的驱动:驱动力为定时器中断函数,定时器中断频率在timer.h中定义如
图4所示
图4 定时器中断频率
由此可知一个定时器中断的时长大约为10ms,这里称为一个ticks。

5.中断处理过程
中断处理函数的调用过程如图5所示
图5中断处理函数的调用过程
原线程中这个timer_sleep函数执行过程是不断地循环检测这个函数执行以及执行过后等待时长是否小于cpu的时钟周期,如果是,则重复循环等待,直至等待时间大于等于ticks,则执行线程后续代码。

此方法的缺点是,函数不断循环试探,占用cpu。

设计方案从去掉循环测试时间开始,将在thread结构体中添加一个变量block_ticks(线程阻塞时间),来标记时间的变化。

当线程度过了ticks,就唤醒它,进入ready状态。

三详细实现
1 改造timer_sleep,如图6所示
图6 改造后的timer_sleep函数2改造thread结构体(thread.h),如图7所示
图7 改造后的thread.h
3定义block_check函数并调用,如图8所示
图8 定义的block_check函数四实验结果
图9 测试结果
五心得体会
本次实验是操作系统课程设计的第一次实验,通过这次实验,我学习了Linux操作系统的一些基本操作,了解了Pintos的部分相关知识,学会了如何更加高效的阅读代码,感觉收获很大。

参考文献
[1]黄伯虎,Alarm-Clock指导手册。

[2]网上相关代码资料等。