热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

内核中的jiffies变量

关于内核中的jiffies变量,可通过下图解释。在内核中很多函数的参数都是都是以jiffies为单位的,如定时器中mod_timer(&timer,ji

关于内核中的jiffies变量,可通过下图解释。

在内核中很多函数的参数都是都是以jiffies为单位的,如定时器中mod_timer(&timer, jiffies + 2*HZ);

jiffies代表当前发生中断的次数,2*Hz代表发生了发生了2*Hz次中断,那jiffies+2Hz就是未来时间点的中断次数,转换成时间就是2s后的时间点。

还有很多表示时间的用jiffies为单位的函数,如

 

/*** mod_timer - modify a timer's timeout* @timer: the timer to be modified* @expires: new timeout in jiffies** mod_timer() is a more efficient way to update the expire field of an* active timer (if the timer is inactive it will be activated)** mod_timer(timer, expires) is equivalent to:** del_timer(timer); timer->expires = expires; add_timer(timer);** Note that if there are multiple unserialized concurrent users of the* same timer, then mod_timer() is the only safe way to modify the timeout,* since add_timer() cannot modify an already running timer.** The function returns whether it has modified a pending timer or not.* (ie. mod_timer() of an inactive timer returns 0, mod_timer() of an* active timer returns 1.)*/
int mod_timer(struct timer_list *timer, unsigned long expires)
{expires = apply_slack(timer, expires);/** This is a common optimization triggered by the* networking code - if the timer is re-modified* to be the same thing then just return:*/if (timer_pending(timer) && timer->expires == expires)return 1;return __mod_timer(timer, expires, false, TIMER_NOT_PINNED);
}
EXPORT_SYMBOL(mod_timer);

 

/*** wait_event_interruptible_timeout - sleep until a condition gets true or a timeout elapses* @wq: the waitqueue to wait on* @condition: a C expression for the event to wait for* @timeout: timeout, in jiffies** The process is put to sleep (TASK_INTERRUPTIBLE) until the* @condition evaluates to true or a signal is received.* The @condition is checked each time the waitqueue @wq is woken up.** wake_up() has to be called after changing any variable that could* change the result of the wait condition.** Returns:* 0 if the @timeout elapsed, -%ERESTARTSYS if it was interrupted by* a signal, or the remaining jiffies (at least 1) if the @condition* evaluated to %true before the @timeout elapsed.*/
#define wait_event_interruptible_timeout(wq, condition, timeout) \
({ \long __ret = timeout; \if (!___wait_cond_timeout(condition)) \__ret = __wait_event_interruptible_timeout(wq, \condition, timeout); \__ret; \
})

 

/*** schedule_delayed_work - put work task in global workqueue after delay* @dwork: job to be done* @delay: number of jiffies to wait or 0 for immediate execution** After waiting for a given time this puts a job in the kernel-global* workqueue.*/
static inline bool schedule_delayed_work(struct delayed_work *dwork,unsigned long delay)

当然,也有相应的函数将我们常用的时间如ms转化成jiffies的,如msecs_to_jiffies

unsigned long msecs_to_jiffies(const unsigned int m)
{/** Negative value, means infinite timeout:*/if ((int)m <0)return MAX_JIFFY_OFFSET;#if HZ <&#61; MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)/** HZ is equal to or smaller than 1000, and 1000 is a nice* round multiple of HZ, divide with the factor between them,* but round upwards:*/return (m &#43; (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)/** HZ is larger than 1000, and HZ is a nice round multiple of* 1000 - simply multiply with the factor between them.** But first make sure the multiplication result cannot* overflow:*/if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))return MAX_JIFFY_OFFSET;return m * (HZ / MSEC_PER_SEC);
#else/** Generic case - multiply, round and divide. But first* check that if we are doing a net multiplication, that* we wouldn&#39;t overflow:*/if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))return MAX_JIFFY_OFFSET;return (MSEC_TO_HZ_MUL32 * m &#43; MSEC_TO_HZ_ADJ32)>> MSEC_TO_HZ_SHR32;
#endif
}
EXPORT_SYMBOL(msecs_to_jiffies);

 

 

 

 

 


推荐阅读
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 题目描述:给定一个N*M的网格,初始时网格中有k个芯片,每个芯片的位置已知。玩家可以在每一步操作中将所有芯片沿同一方向移动一格。如果芯片到达边界,则保持不动。目标是通过一系列操作,使每个芯片依次访问指定的目标位置。 ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • This request pertains to exporting the hosted_zone_id attribute associated with the aws_rds_cluster resource in Terraform configurations. The absence of this attribute can lead to issues when integrating DNS records with Route 53. ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文探讨了如何在 F# Interactive (FSI) 中通过 AddPrinter 和 AddPrintTransformer 方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 本文探讨了在Java中如何正确地将多个不同的数组插入到ArrayList中,避免所有数组在插入后变得相同的问题。我们将分析代码中的问题,并提供解决方案。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • HDU 2871 内存管理问题(线段树优化)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871。本题涉及内存管理操作,包括重置、申请、释放和查询内存块。通过使用线段树进行高效管理和维护。 ... [详细]
author-avatar
乐橙味_367
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有