四Linux内核时钟.ppt_第1页
四Linux内核时钟.ppt_第2页
四Linux内核时钟.ppt_第3页
四Linux内核时钟.ppt_第4页
四Linux内核时钟.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四 Linux内核时钟,时钟与定时器基础知识 Linux系统时钟原理 Linux系统定时器原理 定时器的简单应用,1 时钟与定时器,A Linux system actually has two clocks: One is the battery powered “Real Time Clock“ (also known “CMOS clock“, or “Hardware clock“) which keeps track of time when the system is turned off but is not used when the system is running. The other is the “system clock“ (sometimes called the “kernel clock“ or “software clock“) which is a software counter based on the clock tick. It does not exist when the system is not running, so it has to be initialized from the RTC (or some other time source) at boot time.,Linux系统时钟以读取的硬件时钟为起始点,根据系统启动后的滴答数来计算时间,系统内的所有计时均基于它。系统用一个全局变量jiffies表示,该变量每个时钟周期更新一次,即表示系统自启动以来的时钟滴答数目。,时钟滴答,时钟滴答的长短是由时钟中断的频率决定。 譬如每秒有100次时钟中断,那么一个时钟滴答的就是10毫秒(记为10ms),相应地,系统时间就会每10ms增1。 不同的操作系统对时钟滴答的设置不同。(DOS为55ms) Linux中用全局变量jiffies表示系统自启动以来的时钟滴答数目。,时钟中断的物理产生,bottom half - 任务延迟处理机制,定时器:是系统提供的一种定时服务机制,它能够在某个特定的时刻唤醒某个进程来完成相应的工作。 Linux的链表定时器:,定时器,expires=n(s)+当前系统时间 /以jiffies时间为单位,进程执行有用户模式和核心模式的区别;进程执行时间也分:用户模式下执行时间和核心模式执行时间。 进程可用的定时器分为: ITIMER_REAL:不管进程在什么模式(甚至被阻塞的时候),它都在计数。SIGALRM信号。 ITIMER_VIRTUAL:当进程在用户模式执行时计数。SIGVTALRM信号。 ITIMER_PROF:进程在用户模式和核心模式运行时都计数。SIGPROF信号。,2. Linux系统时钟的实现,相关的数据结构及变量: include/linux/xtime.h struct timeval time_t tv_sec; subseconds_t tv_usec; ; Tick:时钟中断周期。 初值=(1000000+HZ/2)/HZ Xtime:保存系统当前时间的结构体变量。 Jiffies:系统启动以来的时钟滴答数。,相关的数据结构及变量: wall_jiffies:每次bottom half时用来记 录当前jiffies的变量. TSC:保存CPU的ticks数目.,系统时钟初始化:arch/i386/kernel/time.c 调用get_cmos_time()函数从cmos中读取硬件时钟赋给tv_sec,初始化 tv_usec 为0。 调用setup_irq()重新设置时钟中断irq0的中断服务程序入口。 系统时钟的运行: 时钟中断发生时,中断服务程序实际上是依靠do_timer()函数来完成其必须完成的工作; do_timer() 进一步调用update_times函数来更新系统时间,调用run_timer_list函数来检查、执行定时服务,即在bottom half中完成。,系统时钟的设置和调整:系统调用 sys_time; /读取,秒级 sys_stime; /设置,秒级 sys_gettimeofday; /读取,微秒级 sys_settimeofday; /设置,微秒级 sys_adjtimex; /调整,主要用于网络和分布式系统。 时间的准确读取: 最近一次bottom half运行的时间值xtime+ 从最近一次bottom half到最近一次时钟中断的间隔(jiffies- wall_jiffies)+ 最近一次时钟中断到当前的时间间隔usec,3. Linux定时器的实现,数据结构: 链表节点 include/linux/timer.h struct timer_list struct list_head list; unsigned long expires; /定时器的激活时刻 unsigned long data; /函数的参数 void(*function)(unsigned long); /执行函数 ,链表结构体 kernel/timer.c struct timer_vec int index; /定时器链表索引,指向当前要响应的链表。 struct list_head vecTVN_SIZE; /定时器链表数组 ; / TVN_SIZE=64 根链表结构体: struct timer_vec_root int index; /定时器链表索引,指向当前要响应的链表。 struct list_head vecTVR_SIZE; /定时器链表数组 ; / TVN_SIZE=256,定义数组tvecs的5个成员管理定时器链表: static sturct timer_vec tv5; static sturct timer_vec tv4; static sturct timer_vec tv3; static sturct timer_vec tv2; static sturct timer_vec_root tv1; static struct timer_vec * const tvecs = (struct timer_vec *),Index Vec0,Index Vec0, Vecindex , Vecindex ,tvecs,Timer_list,Timer_list,Timer_list,Timer_list,tv3,tv4,tv5,Timer_list型定时器体系结构,tv1,tv2,可以采用以下的假定: Tv1 分 Tv2 时 Tv3 日 Tv4 月 Tv5 年,实现机制: 定时器升序排列,在时钟中断的bottom_half检查当前节点是否到时。 实现: 由5个定时器数组形成树形链表结构加以实现。 -初始化:根据用户空间得到的数据设置初值 并将设定好的定时器挂到链表上。 -运行:判断时间到达,由run_timer_list() 检查并执行定时服务。,run_timer_list()函数的实现思想: 1 首先判断tv1.index的值。如果非0,则激活定时器,递增timer_jiffies和tv1.index,使tv1.vectv1.index指向下一个时钟中断服务处理的链表;否则转2。 2 tv1.index=0,即tv1为空,调用cascade_timers(tvecs1), 从tvecx1 (tv2)搬一组链表,分散插入tvecs0(tv1)的各个链表,如果tvecx1为空,则从tvecx2(tv3)搬来一组链表,分散插入tvecx0(tv1), tvecx1(tv2)的各个链表中,对于定时器的操作: 1 添加 add_timer() 2 修改 先调用detach_timer()将定时器从链表上取下,修改时间后再调用 internal_add_timer()将定时器从新挂接到链表上。 3 删除 del_timer(),4. Linux定时器的应用例,例:设置一个ITIMER_REAL类型的定时器,每秒发出一个信号,等到定时到达时,程序统计经过的时间。 #include #include #include Static void sig_handler(int signo); /声明信号量函数 Long lastsec,countsec; /上一秒时间,总的时间花销 Int main(void) struct itimerval v; /定时器结构体,long nowsec,nowusec; /当前时间 if(signal(SIGUSR1,sig_handler)=SIG_ERR) printf(“Unable to create handler for SIGUSR1n”); exit(0); if(signal(SIGALRM,sig_handler)=SIG_ERR) printf(“Unable to create handler for SIGALRMn”); exit(0); ,v.it_interval.tv_sec=9; v.it_interval.tv_usec=999999; v.it_value.tv_sec=9; v.it_value.tv_usec=999999; /初始化 setitimer(ITIMER_REAL, /设置定时器,并挂接到链表上。,while(1) getitimer(ITIMER_REAL, ,/信号处理函数,根据不同的信号,输出不同的信息。 Static

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论