时间与延时

量化延时法时间测量_「交易技术前沿」交易系统低延时测试与分析 本文选自 《交易技术前沿》总第三十三期文章(2018年12月)证券期货行业测试中心(中金所) 魏畅 陈冬严 张鸿晔摘要:订单延时(Latency)是衡量交易系统性能的重要指标。本文利用交换机端口流量镜像功能(Port Mirroring)和低延时交换机产生的纳秒级时间戳,实现了高精度的交易系统逐笔订单延时测量。通过分析逐笔订单延时数据,验证了交易系统性能微笑曲线,获得了交易系统的最佳表现区间(舒适... 阅读详情
内核时间,延时与缓存

 

时间

内核通过定时器中断来跟踪时间流,记录每次时钟周期的滴答数,现代大多数默认时1000HZ ,每次开机后内核会初始化时间变量,然后每过一个时钟周期,变量加一,我们应当充分的信任内核不要随便去改动,除非有特殊的理由。

jiffies 变量用来存储时钟中断次数,是一个64位的无符号长整形。它的访问一直是原子的。

内核定义:

```

extern u64 __jiffy_data jiffies_64;

extern unsigned long volatile __jiffy_data jiffies;

 

```

 

比较当前值和缓存值的几个宏:

 

```

#define time_after(a,b) \

(typecheck(unsigned long, a) && \

typecheck(unsigned long, b) && \

((long)((b) - (a)) < 0))

#define time_before(a,b) time_after(b,a)

 

#define time_after_eq(a,b) \

(typecheck(unsigned long, a) && \

typecheck(unsigned long, b) && \

((long)((a) - (b)) >= 0))

#define time_before_eq(a,b) time_after_eq(b,a)

 

```

时钟中断计时法和现实时间的转化。

```

static __always_inline unsigned long usecs_to_jiffies(const unsigned int u);

extern unsigned long timespec64_to_jiffies(const struct timespec64 *value);

extern void jiffies_to_timespec64(const unsigned long jiffies,truct timespec64 *value);

static inline unsigned long timespec_to_jiffies(const struct timespec *value);

static inline void jiffies_to_timespec(const unsigned long jiffies,struct timespec *value);

extern unsigned long timeval_to_jiffies(const struct timeval *value);

extern void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value);

extern clock_t jiffies_to_clock_t(unsigned long x);

extern unsigned long clock_t_to_jiffies(unsigned long x);

```

使用64位寄存器直接获取变量。

static inline u64 get_jiffies_64(void)

{

return (u64)jiffies;

}

 

内核就是通过这个全局的变量来获取时间的,一般来说驱动程序是不需要知道墙上时间的,真实世界时间一般放在用户空间使用。

在CODE代码中有一个获取时间模块,我们加载后,可以从/proc/currentime中获取当前时间

 

结果如下


正在上传…
取消


 

 

### 延时

 

有时我们需要延时比较长的时间,内核给我们提供了一个函数time_before(jiffies,j1) ,这个函数用来不挺的测试jiffies 是否超过了我们设置的j1如果超过了则返回一个负值。

我们使用如下的代码来忙等待我们设置的值。

 

 

```

case JIT_BUSY:

while (time_before(jiffies, j1))

break;

```

 

我们执行cat 这个命令会不断的调用read ,我们每次查找其中含有22字符的信息,可以发现他是有我们设置的延时的。结果如下:


正在上传…
取消


 

 

此处需要实践运行才能看出来,截图看不出来等待。

 

 

一个需要注意的问题是, 如果我们需要等待,最好调用schedule();让出处理器,效果差不多,直接提高效率,此处不再测试。

 

```

case JIT_SCHED:

while (time_before(jiffies, j1)) {

schedule();

}

break;

```

 

 

####  短延时

 

当我们需要非常短暂的延时,使用时钟中断显然不是一个好方法,内核给我们提供了一些精度更高的延时函数,这是根据CPU 硬件不同设置不同的。我们不需要关心实现,首先看看定义"linux/delay.h"

 

```

void calibrate_delay(void);

void msleep(unsigned int msecs);

unsigned long msleep_interruptible(unsigned int msecs);

void usleep_range(unsigned long min, unsigned long max);

 

static inline void ssleep(unsigned int seconds)

{

msleep(seconds * 1000);

}

```

 

 

### 内核定时器

 

```

内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件中。

被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则:

1) 没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。

2) 不能执行休眠(或可能引起休眠的函数)和调度。

3) 任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件。

内核定时器的调度函数运行过一次后就不会再被运行了(相当于自动注销),但可以通过在被调度的函数中重新调度自己来周期运行。

在SMP系统中,调度函数总是在注册它的同一CPU上运行,以尽可能获得缓存的局域性。

内核定时器的数据结构

struct timer_list {

struct list_head entry;

unsigned long expires;

void (*function)(unsigned long);

unsigned long data;

struct tvec_base *base;

/* ... */

};

其中 expires 字段表示期望定时器执行的 jiffies 值,到达该 jiffies 值时,将调用 function 函数,并传递 data 作为参数。

当一个定时器被注册到内核之后,entry 字段用来连接该定时器到一个内核链表中。base 字段是内核内部实现所用的。

 

需要注意的是 expires 的值是32位的,因为内核定时器并不适用于长的未来时间点。

初始化

在使用 struct timer_list 之前,需要初始化该数据结构,确保所有的字段都被正确地设置。初始化有两种方法。

方法一:

DEFINE_TIMER(timer_name, function_name, expires_value, data);

该宏会定义一个名叫 timer_name 内核定时器,并初始化其 function, expires, name 和 base 字段。

方法二:

struct timer_list mytimer;

setup_timer(&mytimer, (*function)(unsigned long), unsigned long data);

mytimer.expires = jiffies + 5*HZ;

 

注意,无论用哪种方法初始化,其本质都只是给字段赋值,所以只要在运行 add_timer() 之前,expires, function

和 data 字段都可以直接再修改。

 

关于上面这些宏和函数的定义,参见 include/linux/timer.h。

 

 

定时器要生效,还必须被连接到内核专门的链表中,这可以通过 add_timer(struct timer_list *timer) 来实现。

 

要修改一个定时器的调度时间,可以通过调用 mod_timer(struct timer_list *timer, unsigned long expires)。

mod_timer() 会重新注册定时器到内核,而不管定时器函数是否被运行过。

 

注销一个定时器,可以通过 del_timer(struct timer_list *timer) 或 del_timer_sync(struct timer_list *timer)。

 

 

del_timer_sync 是用在 SMP 系统上的(在非SMP系统上,它等于del_timer),当要被注销的定时器函数正在另一个 cpu 上运行时,

 

del_timer_sync() 会等待其运行完,所以这个函数会休眠。

 

另外还应避免它和被调度的函数争用同一个锁。对于一个已经被运行过且没有重新注册自己的定时器而言,注销函数其实也没什么事可做。

 

int timer_pending(const struct timer_list *timer)

 

这个函数用来判断一个定时器是否被添加到了内核链表中以等待被调度运行。注意,当一个定时器函数即将要被运行前,

内核会把相应的定时器从内核链表中删除(相当于注销)

 

```

 

动态内核定时器机制的原理

 

Linux内核2.4版中去掉了老版本内核中的静态定时器机制,而只留下动态定时器。相应地在timer_bh()函数中也不再通过run_old_timers()函数来运行老式的静态定时器。动态定时器与静态定时器这二个概念是相对于Linux内核定时器机制的可扩展功能而言的,动态定时器是指内核的定时器队列是可以动态变化的,然而就定时器本身而言,二者并无本质的区别。考虑到静态定时器机制的能力有限,因此Linux内核2.4版中完全去掉了以前的静态定时器机制。

Linux是怎样为其内核定时器机制提供动态扩展能力的呢?其关键就在于“定时器向量”的概念。所谓“定时器向量”就是指这样一条双向循环定时器队列(对列中的每一个元素都是一个timer_list结构):对列中的所有定时器都在同一个时刻到期,也即对列中的每一个timer_list结构都具有相同的expires值。显然,可以用一个timer_list结构类型的指针来表示一个定时器向量。

显然,定时器expires成员的值与jiffies变量的差值决定了一个定时器将在多长时间后到期。在32位系统中,这个时间差值的最大值应该是0xffffffff。因此如果是基于“定时器向量”基本定义,内核将至少要维护0xffffffff个timer_list结构类型的指针,这显然是不现实的。

另一方面,从内核本身这个角度看,它所关心的定时器显然不是那些已经过期而被执行过的定时器(这些定时器完全可以被丢弃),也不是那些要经过很长时间才会到期的定时器,而是那些当前已经到期或者马上就要到期的定时器(注意!时间间隔是以滴答次数为计数单位的)。

基于上述考虑,并假定一个定时器要经过interval个时钟滴答后才到期(interval=expires-jiffies),则Linux采用了下列思想来实现其动态内核定时器机制:对于那些0≤interval≤255的定时器,Linux严格按照定时器向量的基本语义来组织这些定时器,也即Linux内核最关心那些在接下来的255个时钟节拍内就要到期的定时器,因此将它们按照各自不同的expires值组织成256个定时器向量。而对于那些256≤interval≤0xffffffff的定时器,由于他们离到期还有一段时间,因此内核并不关心他们,而是将它们以一种扩展的定时器向量语义(或称为“松散的定时器向量语义”)进行组织。所谓“松散的定时器向量语义”就是指:各定时器的expires值可以互不相同的一个定时器队列。

 

我们的定时期生效,不断的打印标记字符串。



 

FFmpeg时间体系解析:时基、时间戳与延时控制的音视频同步实践 在音视频处理领域,时间管理是确保播放流畅与同步的核心技术基础。其原理基于一套精密的时间度量与调度系统,通过定义时间基准单位、为每帧数据标记时序信息,来协调音视频流的解码与呈现。这项技术的核心价值在于解决音画不同步、剪辑不准、播放卡顿等常见工程问题,广泛应用于视频剪辑、流媒体传输、实时通信等场景。理解FFmpeg中的时基(Timebase)和时间戳(PTS/DTS)机制,正是掌握音视频同步、实现精准延时控制的关键。通过操作时基转换与PTS修正,开发者可以有效地诊断和修复由编码、封装或网络引入的同步问题,提升多 阅读详情

相关推荐

深入解析MCU Systick:从基础配置到精准延时与系统时间获取实战

本文深入解析MCU Systick定时器的基础配置与高级应用,涵盖精准延时实现、系统时间获取及与RTOS协同工作等实战技巧。通过详细代码示例和调试经验,帮助开发者掌握Systick在嵌入式系统中的核心功能,提升系统运行时间的精确管理能力。

weixin_30839881的博客 385

关于linux内核中jiffies和jiffies_64解析

1、前言 linux内核中定义了jiffies变量来记录从系统启动到当前时刻系统时钟所产生的tick数。jiffies变量是一个无符号整型数值,即unsigned long类型。 它的声明如下(在 include/linux/jiffies.h 中): 假定HZ=1000,那么jiffies只需要约49.7天就会产生回绕(溢出),这是因为jiffies本身是unsigned long 类型,因此在32位系统中支持的最大值为(2^32)-1=4294967295,又因为HZ是100...

zhanghui962623727的博客 3644

FPGA时序约束本质:建立时间、保持时间与物理延时的工程校准

时序约束是数字电路设计中确保硬件可靠运行的基础机制,其核心围绕建立时间(Setup Time)和保持时间(Hold Time)两大物理参数展开,反映信号在触发器输入端必须满足的时间窗口要求。这些参数直接受制于传播延时(Tcq、Tlogic、Tnet)及PCB走线、工艺偏差等真实物理因素。在FPGA开发中,缺乏精准约束将导致亚稳态、跨时钟域失效、高频接口丢包等典型问题。通过静态时序分析(STA)驱动布局布线优化,约束成为连接RTL代码与硅片物理行为的关键契约。本文深入解析时序违例的物理根源与XDC实战方法,覆

weixin_34779181的博客 494

[Linux内核驱动]延时

jiffies(系统时钟中断计数器)是一个全局变量,用于跟踪自系统启动以来经过的“滴答数”(tick counts)。每个“滴答”对应一个时钟中断的周期,这个周期的长度由内核配置中的 HZ 值决定。因此,jiffies 可以用来计算两个时间点之间的时间差,或者确定某个事件自上次发生以来已经过了多少时间。由于 jiffies 是一个无符号整数,因此它有一个最大值(这取决于 jiffies 的数据类型和大小)。

qq_66623299的博客 863

007、时间管理:系统节拍、延时函数与时间片

本文详细探讨了FreeRTOS中的时间管理机制。主要内容包括:系统节拍(SysTick)作为嵌入式系统的心跳,其配置对系统时序的关键影响;三种延时函数(vTaskDelay、vTaskDelayUntil、pdMS_TO_TICKS)的使用场景与常见误区;时间片调度原理及优先级的影响。作者分享了实战经验:如何选择节拍频率、实现微秒级延时、处理系统卡死问题、获取精确时间戳等,并强调嵌入式系统中只有"相对可靠"的时间概念。最后建议系统启动后进行时间校准,合理使用vTaskDelay(0)等技

weixin_56415590的博客 23

COMSOL仿真教程—激光烧蚀

本例使用二维模型,将来自激光的入射热通量模拟为金属表面上空间分布的热源,从而得到金属的烧蚀过程和瞬态温度分布。

qq_40977332的博客 2万+

linux内核接口,linux内核中的时间接口

时钟中断:是硬件中的定时器以固定的时间产生一次中断。时钟中断频率:1s中的时钟中断次数;我们可以通过更改相应的配置,来改变一个系统的时钟中断频率。先来看看X86平台上的时钟中断频率:有以上可知,内核通过使用 HZ 宏来表示在内核中的时钟频率为CONFIG_HZ,当然我们就可以通过改变相应的体系结构中的config文件中CONFIG_HZ的值,来调整内核中的时钟频率值。如果 CONFIG_HZ=10...

weixin_40003046的博客 371

车载与安防项目实战:如何用RK3588搭配NVP6158C实现4路AHD摄像头BT1120接入与同步预览

本文详细解析了基于RK3588处理器与NVP6158C解码芯片实现4路AHD摄像头BT1120接入与同步预览的技术方案。针对车载环视和安防监控场景,重点探讨了硬件架构设计、BT1120接口配置、多路同步机制及Android HAL适配等核心问题,提供了从底层驱动到上层应用的完整实现路径,为相关领域的工程实践提供可靠参考。

weixin_30571465的博客 486

内核变量——Jiffies

全局变量jiffies表示自系统启动以来系统产生的嘀嗒数。当启动时,内核初始化该变量为0。每次时钟中断就会增1,所以系统运行时候可以计算为:jiffies/HZ秒。        jiffies变量定义如下: extern unsigned long volatile jiffies; 将jiffies转换为秒:(jiffies / HZ)。将秒换算为jiffies:(seconds*HZ)

山庄来客的专栏 1092

幸狐RV1106开发板运行Yolo8示例

rknn_model_zoo 是瑞芯微官方提供的 RKNPU 支持的各种主流算法的部署示例,目前对 Luckfox Pico 所使用的 RV1103/RV1106 有限支持,最新的示例支持 mobilenet 模型部署和 yolo 模型部署,本章以部署 yolov8修改版本为例介绍 rknn_model_zoo 示例的使用。:可选项,用于指定 RKNN 模型的保存路径,默认保存在 ONNX 模型同一目录下,名称为 ‘yolov8.rknn’例如“rv1106”。

qq_42730522的博客 3224

第一章、isaacsim 及 isaaclab 安装教程

本专栏所有内容将根据上述资源地址展开,请结合食用~

m0_47719040的博客 4783

驱动开发之始,(六)Linux内核时间,延迟操作

时钟中断由系统定时硬件周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个与体系结构有关的常数。定义在<asm-genric/param.h>中(每个人下载的内核版本不同可能位于不同的文件下)。每次当时钟中断发生时,内核内部计数器的值就增加一。这个计数器的值在系统引导时被初始化为0。因此,它的值就是自上次操作系统引导以来的时钟滴答数,成为“jiffies_64”。 1.使用j...

lijunnanxcx的博客 346

mipi协议中的calibration和scramble模式

在MIPI(Mobile Industry Processor Interface)协议中,calibration(校准)和scramble(加扰)模式是两个重要的特性,它们分别用于优化数据传输的准确性和减少信号干扰。

flomingo1的专栏 2401

【BUG】滴答定时器的时间片轮询与延时冲突

SysTick定时器是ARM Cortex-M内核的系统定时器,常用于时间戳记录和精确延时。其核心配置包括CTRL、LOAD和VAL寄存器,通过设置这些寄存器可以实现1ms中断,进而记录系统运行时间。然而,在实现延时函数时,直接操作SysTick寄存器可能导致中断被关闭,进而破坏时间戳功能。例如,delay_us函数在结束时将CTRL寄存器设置为0x04,导致SysTick中断被永久关闭,tick_ms计数器停止更新,依赖时间戳的应用逻辑失效。为解决这一问题,提出了两种方案:一是使用独立定时器(如TIM2)

学习日记 1299

纯方位观测下的三维定位,IV-PLKF(Inverse Velocity-Weighted Pseudo-Linear Kalman Filter)

在现代定位系统中,纯方位观测因其无需测距设备的优势,在无线通信、无人机导航和室内定位等领域备受关注。本文深入探讨基于算法的三维定位方法,并提供完整的MATLAB仿真例程。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 672

卫星轨道坐标转换:轨道六根数到经纬高(经STK验证)

a:半长轴(km)e:偏心率i:轨道倾角(度)Ω:升交点赤经(度)ω:近地点幅角(度)ν:真近点角(度)

weixin_52370774的博客 170

FreeRTOS时间系统:Tick、延时与调度全解析

本文系统讲解了FreeRTOS中四个关键时间概念的关系:configTICK_RATE_HZ(系统节拍频率)、系统节拍(Tick)、时间片(Time Slice)和vTaskDelay()延时单位。核心关系是:configTICK_RATE_HZ决定系统节拍长度,而系统节拍又是时间片和vTaskDelay()延时的基准单位。设置configTICK_RATE_HZ需要权衡时间精度、系统开销和功耗,建议根据应用场景选择100Hz-1000Hz。理解这些关系是掌握FreeRTOS调度和定时功能的基础。

Shylock_Mister的博客 1067

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

☆ 延时输出 与 即时输出系统时间

相信我们大家都用过PPT的自动放映功能, 但是联系到C语言我们难免会想到:在C的世界中能不能做到利用延时输出来达到自动放映的效果呢? 当然是可以的,下面将在这一个知识点的基础上进行放射性展开。 ****************************************************************************************************...

⚡ 5843

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

RTOS的时间管理:深入FreeRTOS中的定时器与延时机制

RTOS(实时操作系统)中的时间管理是一个非常关键的部分,直接关系到任务的调度、延时机制、定时器的使用等。硬件定时器是RTOS中时间管理的另一关键部分,通常与硬件相关。今天的内容将会让你了解定时器是如何在RTOS中实现精准调度的,如何通过链表实现定时器管理,如何高效地处理延时,甚至如何实现不同的延时机制,包括。硬件定时器的工作原理是:定时器模块计数,当达到设定的值时,会触发中断,执行中断服务程序(ISR)。,尤其是软件定时器、硬件定时器、定时器链表的实现,以及定时器中断服务程序和延时机制的工作原理。

探索技术、创意与生活的交汇点,分享个人成长与思考,带你发现生活中的美好与智慧 1291

FreeRTOS任务延时列表与时间片

在 FreeRTOS 中,有一个任务延时列表(实际上有两个,为了方便讲解原理,我们假 装合并为一个,其实两个的作用是一样的),当任务需要延时的时候,则先将任务挂起, 即先将任务从就绪列表删除,然后插入到任务延时列表,同时更新下一个任务的解锁时刻 变量:xNextTaskUnblockTime 的值。为了方便在逻辑分析仪中地分辨出任务 1 和任务 2 使用的时间片大小,任务 1 和任务 2 的主体编写成一个无限循环函数,不会阻塞,任务 3 的阻塞时间设置为 1 个 tick。在真正的项目中,并不会这样写。

m0_57421941的博客 534

RocketMQ - 时间轮算法与延时消息的深度解析

本文深度解析了Apache RocketMQ中延时消息的实现机制,其核心是高效的时间轮算法。通过将消息暂存于内部主题SCHEDULE_TOPIC_XXXX并进行时间轮调度,RocketMQ能够精准、低耗地处理海量延时任务,广泛应用于订单超时、阶梯提醒等场景,实现了业务触发与定时逻辑的解耦。

ik6789012的博客 392

有关延时时间的计算与测定方法介绍

有关延时时间的计算与测定方法介绍

perseverance51博客 2171

Linux基础(9)--延时与时间

延时与时间1. 延时1.1 基本知识2. 时间2.1 基本概念2.2 时间调用2.3 时间转换2.4 处理器性能测试 1. 延时 1.1 基本知识 linux中延时函数很简单,却经常用到。在操作系统中和单片机处理延时方式就完全不一样了,不可能是使用 for循环浪费系统资源。而是有专门的接口函数 • linux系统编程中常用的延时函数: – sleep、usleep等 • linux内核中的常用的延...

魔法师の屋子★↓☆ 3383

C/C++高精度时间与延时实战:从时钟源到混合延时策略

在音视频同步、传感器采集和网络协议等场景中,时间精度往往是系统稳定性的地基。理解墙钟与单调时钟的区别,是使用高精度时间接口的前提:前者易受校时干扰,适合显示时间戳;后者单调递增,适合测量间隔与超时。C++11的std::chrono库封装了底层时钟源,但真正的精度取决于操作系统API,如Linux的clock_gettime(CLOCK_MONOTONIC)与Windows的QueryPerformanceCounter。针对延时需求,系统睡眠、忙等待和混合策略各有权衡:睡眠省CPU但精度低,忙等待精度高却

weixin_34127717的博客 270

基于事件触发机制与延时矩阵的固定时间共识

这种基于事件触发机制和延时矩阵的固定时间共识方法,不仅能提高系统的效率,还能增强系统的鲁棒性。在分布式系统中,节点之间的通信总会有延迟,这个延迟可不是固定的,可能今天快明天慢。今天咱们聊聊一个挺有意思的解决方案——基于事件触发机制,带有延时矩阵的固定时间共识。这个时间可以是系统设计时设定的,也可以是根据实际情况动态调整的。假设我们有一个简单的分布式系统,里面有3个节点,它们需要通过事件触发机制来达成共识。方法是事件触发的核心,当某个重要事件发生时,节点会根据延时矩阵计算最佳响应时间,然后尝试达成共识。

YRYDZFtyVKg的博客 194
上一篇: 高级IO操作
下一篇: linux 驱动程序 内存管理
zmrlinux
博客等级 码龄12年 409粉丝 327原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值