linux的HZ, Tick, xtime, Jiffies, RTC && mdelay() 与msleep()的区别

     Linux核心几个重要跟时间有关的名词或变数,将介绍HZ、tick与jiffies。

(1)HZ

        Linux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ为1000,代表每秒有1000次timer interrupts。 HZ可在编译核心时设定,具体查询设定方法可参见上篇文章《linux运行多久了》。其中HZ可设定100、250、300或1000。以核心版本预设值为250。

(2)Tick

      Tick是HZ的倒数,意即timer interrupt每发生一次中断的时间。如HZ为250时,tick为4毫秒(millisecond)。

(3)全局变量xtime

      xtime是timeval数据结构变量,首先看timeval结构
struct timeval
{
      time_t tv_sec; /***second***/
      susecond_t tv_usec;/***microsecond***/
}

1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000 000皮秒(12个零)。秒用s表现,毫秒用ms,微秒用us表示,纳秒用ns表示,皮秒用ps表示,他们的分级单位是千,即每次3个零。所以microsecond是表示us。
      xtime是从cmos电路中取得的时间,一般是从某一历史时刻开始到现在的时间,也就是为了取得我们操作系统上显示的日期。这个就是所谓的“实时时钟”,它的精确度是微秒。应用层获取方法:

#include<stdio.h>
#include <sys/time.h>
#include <time.h>
int main(void)
{
		struct timeval tv;
		while(1){
			gettimeofday(&tv,NULL);
			printf("time %u:%u\n",tv.tv_sec,tv.tv_usec);
			sleep(2);
		}
		return 0;
}
执行a.out结果:

time 1437404343:341649

time 1437404345:341830

前面的这个时间,即系统时间转化成的unix时间戳。

如何在Linux应用获取系统开机时间点,参考http://blog.csdn.net/u011641885/article/details/46860515#comments。使用time(&cur_time)获取当前时间点,减去从开机到现在的流逝时间info.uptime,即可得到开机时间点。

(4)Jiffies

       在<linux/jiffies.h>,定义了Jiffies为Linux核心变数(32位元变数,unsigned long),在linux内核中jiffies远比xtime重要。每发生一次timer interrupt,Jiffies变数会被加一。由(1)所知,一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz

        硬件给内核提供一个系统定时器用以计算和管理时间,值得注意的是,Jiffies于系统开机时,并非初始化成零,而是被设为-300*HZ (-5分钟)。可以用Jiffies约束开机时的操作,比如开机25秒内不能点击TP,用if((-30000<jiffies) && (jiffies<-27523)) return即可。

      可以利用jiffies设置超时等,譬如:

unsigned long timeout = jiffies + HZ * 2; 

if(time_before(jiffies, timeout)

{
       // 还没有超时

}
else

{
       // 已经超时

}

      另外,80x86架构定义一个与jiffies相关的变数jiffies_64 ,此变数64位元,要等到此变数溢位可能要好几百万年。因此要等到溢位这刻发生应该很难吧。那如何经由jiffies_64取得jiffies资讯呢?事实上,jiffies被对应至jiffies_64最低的32位元。因此,经由jiffies_64可以完全不理会溢位的问题便能取得jiffies。

(5)除了系统定时器jiffies外,还有一个与时间有关的时钟:实时时钟(RTC),这是一个硬件时钟,用来持久存放系统时间,系统关闭后靠主板上的微型电池保持计时。系统启动时,内核通过读取RTC来初始化Wall Time,并存放在xtime变量中,这是RTC最主要的作用。

==================mdelay() 与msleep()的区别====================

         在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay。虽然msleep和mdelay都有延迟的作用,但他们是有区别的。

(1)对于模块本身mdelay是忙等待函数,在延迟过程中无法运行其他任务。这个延迟的时间是准确的.是需要等待多少时间就会真正等待多少时间。msleep是休眠函数,它不涉及忙等待.你如果是msleep(10),那实际上延迟的时间,大部分时候是要多于10ms的,是个不定的时间值。

(2)对于系统:mdelay() 会占用cpu资源,导致其他功能此时也无法使用cpu资源。msleep() 则不会占住cpu资源,其他模块此时也可以使用cpu资源。delay函数是忙则等待,占用CPU时间;而sleep函数使调用的进程进行休眠。  


 参考原文:http://www.360doc.com/content/15/0609/01/7775902_476688253.shtml

参考原文:http://blog.csdn.net/bdc995/archive/2009/05/03/4144031.aspx

参考原文:http://blog.csdn.net/linweig/archive/2010/03/04/5341231.aspx

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
`bool wait(xtime const & timestamp, size_t task_threshold = 0) const`是boost.threadpool中的一个函数,用于等待线程池中的任务完成。该函数接受两个参数:`xtime const & timestamp`和`size_t task_threshold`。 其中,`xtime const & timestamp`是一个xtime结构体,表示等待的时间戳。该结构体的定义如下: ``` struct xtime { long sec; // 秒 long nsec; // 纳秒 }; ``` `size_t task_threshold`表示任务阈值,当线程池中的任务数量小于该值时,`wait()`函数返回false。 `wait()`函数会阻塞当前线程,直到所有任务都已经完成或者等待时间戳已经到达。如果所有任务都已经完成,函数返回true;如果等待时间戳已经到达,但是还有未完成的任务,函数返回false。 下面是一个示例代码,其中使用`wait()`函数等待任务完成: ``` #include <iostream> #include <boost/threadpool.hpp> using namespace std; using namespace boost::threadpool; int main() { // 创建一个线程池对象,参数为线程池中线程数量 threadpool pool(4); // 添加任务 for (int i = 0; i < 10; ++i) { pool.add_task([]() { cout << "Task " << boost::this_thread::get_id() << " is running" << endl; boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); // 延时等待1秒 cout << "Task " << boost::this_thread::get_id() << " is done" << endl; }); } // 等待任务完成,并在2秒后回收线程池中的线程资源 xtime xt; xtime_get(&xt, TIME_UTC); xt.sec += 2; // 2秒后超时 bool success = pool.wait(xt); if (success) { cout << "All tasks have been completed!" << endl; } else { cout << "Timeout! Some tasks are still running." << endl; } // 释放线程池 pool.join(); return 0; } ``` 在上面的示例代码中,我们使用`xtime_get()`函数获取当前时间,并将等待时间戳设置为当前时间+2秒。在调用`wait()`函数时,如果线程池中的所有任务都已经完成,函数会返回true,并输出"All tasks have been completed!";如果等待时间戳已经到达,但是还有未完成的任务,函数会返回false,并输出"Timeout! Some tasks are still running."。最后,我们释放线程池中的线程资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值