1、 操 作 系 统 课程设计报告书 课题名称:课题名称: 专专 业:业: 学学 号号: 姓姓 名名: 指导教师:指导教师: 二一二年五月二二一二年五月二十八十八日日 目录目录 摘要摘要 1 1 设计题目与要求设计题目与要求. 1 11 设计题目 . 1 12 设计要求 . 1 2 2 总的设计思想及系统平台、语言、工具总的设计思想及系统平台、语言、工具 . 1 2.1 设计思想: 1 2.1.1Linux内核对定时器的描述 1 2.1.2Linux 内核定时器 . 2 2.1.3Linux 信号signal处理机制 5 2.1.4多线程编程 6 2.1.5内核定时器机制的实现 8 3数据结构与模
2、块说明(功能与流程图)数据结构与模块说明(功能与流程图) . 11 3.1定时器使用: 11 3.3 程序流程图: 13 4. 4. 源程序:源程序: 13 5 5运行结果与运行情况运行结果与运行情况 . 14 6 6调试记录:调试记录: 15 7 7自我评析和总结:自我评析和总结: . 16 8.8.参考文献参考文献 17 1 摘要摘要 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是 整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它 可以在程序里独立执行。也可以把它理解为代码运行的上下文。内核时间指明线程执行操 作系统代码已经经过了
3、多少个 100ns 的 CPU 时间,linux 是一个具有保护模式的操作系统。 它一直工作在 i386 cpu 的保护模式之下。内存被分为两个单元: 内核区域和用户区域。一 般地,在使用虚拟内存技术的多任务系统上,内核和应用有不同的地址空间,因此,在内 核和应用之间以及在应用与应用之间进行数据交换需要专门的机制来实现,本文站在用户 空间的角度,测试一个多线程程序的程序执行时间。当一个进程希望获得信号量时, 如果 信号量已经被占有, 则该进程将会被放到等待队列上 sleep 直到 cpu 将其唤醒。相对于 spinlock 来说开销太大,适用于长时间占有的 lock。不可用于中断状态,因为它拥
4、有信号 量的进程可以 sleep, 可以被抢占,信号量可以设置为同时允许的进程数。 1 设计题目与要求设计题目与要求 11 设计题目:内核定时器 12 设计要求:通过研究内核的时间管理算法,学习内核源代码;然后应用这些知识并 且使用信号建立一种用户空间机制来测量一个多线程程序的执行时间。 2 2 总的设计思想及系统平台、语言、工具 2.12.1 设计思想: 2.1.1Linux 内核对定时器的描述 Linux 在 include/linux/timer.h 头文件中定义了数据结构 timer_list 来描述一个内核定 时器: struct timer_list struct list_hea
5、d list; unsigned long expires; unsigned long data; void (*function)(unsigned long); ; 各数据成员的含义如下: 2 (1)双向链表元素 list:用来将多个定时器连接成一条双向循环队列。 (2)expires:指定定时器到期的时间,这个时间被表示成自系统启动以来的时钟滴答计 数(也即时钟节拍数) 。当一个定时器的 expires 值小于或等于 jiffies 变量时,我们就说 这个 定时器已经超时或到期了。在初始化一个定时器后,通常把它的 expires 域设置成当前 expires 变量的当前值加上某个时间间
6、隔值(以时钟滴答次数计) 。 (3)函数指针 function:指向一个可执行函数。当定时器到期时,内核就执行 function 所指定的函数。而 data 域则被内核用作 function 函数的调用参数。 内核函数 init_timer()用来初始化一个定时器。实际上,这个初始化函数仅仅将结构中的 list 成员初始化为空。如下所示(include/linux/timer.h) : static inline void init_timer(struct timer_list * timer) timer-list.next = timer-list.prev = NULL; 由于定时器通常被连接在一个双向循环队列中