首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Linux内核中的xtime变量每1毫秒更新一次?

Linux内核中的xtime变量实际上并不是每1毫秒更新一次。实际上,xtime变量的更新频率取决于系统的时钟中断频率,这个频率在系统启动时通过配置确定,并且通常是每秒更新一次(即Hz=100),而不是每1毫秒。以下是关于Linux内核时间管理的一些详细信息:

Linux内核时间管理的基础概念

  • 实际时间:由硬件时钟(如RTC)提供,用于保存系统时间,即使在断电情况下也能持续运行。
  • 系统时间:由内核管理,用于程序执行和调度等。
  • 定时器:内核中使用的主要时间管理方法,用于调度程序执行。

Linux内核时间管理的优势

  • 精确度:通过硬件时钟和定时器,Linux内核能够提供较高精度的时间管理。
  • 多处理器支持:内核能够处理多处理器系统中的时间同步问题。
  • 节能:通过定时器汇聚等技术,Linux内核能够降低CPU能耗。

Linux内核时间管理的类型和应用场景

  • 静态定时器:用于执行周期性任务,如更新系统运行时间。
  • 动态定时器:根据需要动态创建,使用后销毁,适用于一次性任务。
  • 应用场景:广泛应用于操作系统调度、事件计数、定时任务执行等。

为什么Linux内核中的xtime变量不是每1毫秒更新一次

Linux内核中的xtime变量更新频率是由系统的时钟中断频率决定的,而这个频率在系统启动时通过配置确定。在大多数情况下,这个频率是每秒更新一次,而不是每1毫秒。如果需要更高的时间精度,可以使用其他时间获取函数,如`ktime_get_real_ts64。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

System.currentTimeMillis的性能真有如此不堪吗?

System.currentTimeMillis 确实要访问系统时钟,准确的说,是读取墙上时间(xtime),xtime是Linux系统给用户空间用来获取当前时间的,内核自己基本不会使用,只是维护更新。...而且读写xtime使用的是Linux内核中的顺序锁,而非互斥锁,读线程间是互不影响的 大家可以把顺序锁当成是解决了“ABA问题”的CompareAndSwap锁。...写操作:CAS使序列号+1 读操作:先获取序列号,读取数据,再获取一次序列号,前后两次获取的序列号相同,则证明进行读操作时没有写操作干扰,那么这次读是有效的,返回数据,否则说明读的时侯可能数据被更改了,...跟系统打了一次交道,确实,用户进程必须进入内核态才能访问系统资源,但是,new一个对象,分配内存也属于系统调用,也要进内核态跟系统打交道,难道只是读一下系统的墙上时间,会比移动内存指针,初始化内存的耗时还要高...,每隔1s更新一次 */ public static class CacheClock{ private static ScheduledExecutorService

1.2K11

Linux时间子系统(下)

前言: 上一篇文章我们简单了解了一些关于时间的概念,以及Linux内核中的关于时间的基本理解。而本篇则会简单说明时钟硬件,以及Linux时间子系统相关的一些数据结构。...: 时钟源 clock source又被叫做时钟源,如果它的频率是10MHZ,就代表它每秒增加10M次,每增长一次我们称cycle加一,而且两次增长的时间间隔相同,通过这个性质,可以在两个时间点读取clock...timekeeping模块 所谓timekeeping,如字面意思,就是让时间持续更新下去。 linux内核中维护了有三种时间概念: Wall time 现实时间。...上面三种时间通过 xtime变量计算,xtime会在系统启动的时候通过从rtc获取的值来初始化,之后通过每次时钟中断的时候,加上当前时间和上次中断产生时间的差值。...可能会有的疑问:为什么需要维护xtime,每次需要获取时间的时候读取rtc不就好了?但其实读取rtc也有缺点,比如: 读取rtc的效率不高,所以一般只在初始化的时候维护一次。

88810
  • 万字整理 | 深入理解Linux时间子系统

    对于人类来说时间精确到秒就足够使用了,但是对于科学研究来说还需要更高的精度,于是我们把1秒的1/1000叫做毫秒,1毫秒的1/1000叫做微秒,1微秒的1/1000叫做纳秒。...所以计算机中的时间采用的是两层表示维度,超过1秒的时间用秒表示,不够一秒的时间用纳秒表示,每10亿纳秒向前进位一秒。这样计算机中时间处理就非常方便了。...系统时钟是用一个变量xtime记录现在的时间点,xtime的初始值用RTC来初始化,这样就只用访问RTC一次就可以了,然后xtime的值随着计时器的增长而增长。...xtime的值的更新有两种情况,一种是调度器tick的时候从计时器更新一下,一种是读xtime的时候从计时器更新一下。...,把这个值更新到走时器中,并相应更新其它时间体系的值。

    1.7K20

    闰秒终于要取消了!一文详解其来源及影响

    这就是为什么会在 UTC 时标中插入所谓闰秒,它们可将 UTC 时间进程调整到真实地球自转时间。 为什么会多出这一秒呢?...但因为在 Unix 的 UTC 使用中不存在 23:59:60,Linux内核会采用倒回一秒的方法在 0:00 UTC 后第一次时钟更新时插入闰秒。...正确处理闰秒是应用程序和(/或)操作系统的任务。 从1972年到2020年,平均每21个月就插入一次闰秒。然而,间隔是非常不规则的,而且明显在增加。...因此在更新前对 xtime_lock 加了写锁。闰秒产生时,开发者需要修正 jiffies 的值。...该patch在linux内核版本2.6.22中引入,所以只有2.6.22内核之前的系统可会出现该问题,也就是影响sles10和centos5.5系统。

    2.4K51

    gettimeofday的几种实现方法

    前言: 有同事讨论到gettimeofday的性能问题。想起来大约四五年前,在linux-2.6.x上的时候,用一种很极端的方法实现过time函数。...下面就简单分析一下几种gettimeofday的实现。当然,实现方法是包括但不限于以下。 分析: 1,int 0x80 在早期阶段,x86上的syscall通过int 0x80实现的。...3,vDSO 有一些syscall,例如time、gettimeofday等,这些只是从kernel中请求数据,kernel的实现上,甚至只是把内核变量copy到用户buf上。...那么,是不是可以不用陷入到kernel中处理,只要copy内存就行呢。vDSO的man介绍如下: ?...通过kallsymbol计算出来xtime的地址,然后通过/dev/mem做memory mapping,把xtime的地址直接映射到user space。

    2.9K10

    使用系统定时器SysTick实现精确延时微秒和毫秒函数

    如果SysTick初始化为: SysTick_Config(SystemCoreClock / 1000); //定时1ms 即SysTick定时器每1ms中断一次,如果我们定义全局变量,然后在中断函数中...,让此变量递减,而在延时函数中,一直判断此变量是否减到了0,那么这样就实现了一个延时毫秒的函数。...同理改变定时器的计数值为: SysTick_Config(SystemCoreClock / 1000000); //定时1us 那么就实现了每1us中断一次,所以延时微秒和延时毫秒函数的实现: uint32...= 0); } 在使用延时函数之前,只需要进行系统时钟的更新即可,当然也可以不更新,因为在程序之前之前,系统启动文件中已经执行了系统时钟更新。...总结 由于SysTick定时器是所有的ARM Cortex-M内核MCU都有的一个定时器,所以以上延时微秒和延时毫秒的函数适用于任何 Cortex-M内核的MCU。

    2.8K20

    Linux核心调度器之周期性调度器scheduler_tick--Linux进程的管理与调度(十八)

    对于普通进程则采用CFS完全公平调度器进行调度 1.3 linux调度器的演变 table th:nth-of-type(1){ width: 20%; } 字段 版本 O(n)的始调度算法 linux...-0.11~2.4 O(1)调度器 linux-2.5 CFS调度器 linux-2.6~至今 1.4 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃...)或核心调度器(core scheduler)) 并且每个调度器包括两个内容:调度框架(其实质就是两个函数框架)及调度器类 6种调度策略 linux内核目前实现了6中调度策略(即调度算法), 用于对不同类型的进程进行调度...更新相关统计量 管理内核中的与整个系统和各个进程的调度相关的统计量....在低分辨率定时器的每次时钟中断完成全局统计量更新后, 每个cpu在软中断中执行一下操作 更新该cpu上当前进程内核态、用户态使用时间xtime_update 调用该cpu上的定时器函数 启动周期性定时器

    2.9K20

    QCustomPlot系列(5)-实时动态曲线

    这里只讲2个知识点:1、显示鼠标指向的点坐标,2、实时滚动 1、箭头指向要显示的坐标点,代码步骤: (1)添加新类,继承QCustomPlot 添加private成员变量: QCPItemText *...值转换为时间String textLabel->setText(QString("x = %1\ny=%2").arg(xTime).arg(y));//显示XY值 } } void...我们要做的就两点:1、向graph中添加新的点 this->graph(graphIdx)->addData(currentTime, y); 2、实时修改X轴的显示范围 在我这个例子中,X轴是实时时间...一般设置每30ms刷新一次就足够流畅了,毕竟我们下载的普通电影也就30帧每秒。 因此,我们在一个30ms定时器的槽函数中来做:修改X轴的显示范围+刷新图像。...代码步骤如下: (1)在构造函数中启动QWidget自带的定时器 startTimer(30, Qt::CoarseTimer);//每30ms触发一次timeEvent事件 (2)重写void timerEvent

    6.5K40

    1.docker概述及其历史

    为什么会出现docker? 不用说, 肯定是时代进步的产物. 那么, 他为什么能火?...第二种情况: 解决集群环境, 服务器繁多复杂的问题 通常我们会有三套环境, 开发环境, 测试环境,线上环境. 每一套环境都是一个集群....为什么会使用虚拟机呢? 通常我使用的是windows电脑, 我想要模拟一台linux服务器, 方便部署应用....利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。...容器在DevOps(开发,运维)中的作用 应用更快速的交付和部署 传统: 每台服务器要安装哪些应用, 配置哪些环境变量, 安装顺序, 都会一一记录到帮助文档 docker: 打包镜像, 一键运行.

    1.5K41

    详细介绍下CC++时间相关的那些函数

    )); } }; steady_clock表示稳定的时钟,它只有一个函数,就是now(),后一次调用now()肯定比上一次调用now()的返回值大,不受系统时间修改的影响。...time_t其实就是一个整数类型,是int64_t的重命名,该函数直接使用返回值就好,参数一般传空即可。 timer 存取结果的时间指针变量,类型为time_t,指针变量可以为null。...单位为毫秒 void func() { // 获取当前时间戳,单位为毫秒 struct timeval time; gettimeofday(&time, NULL); cout...,范围从 1 到 31 int tm_mon; // 月,范围从 0 到 11 int tm_year; // 自 1900 年起的年数 int tm_wday; // 一周中的第几天...,范围从 0 到 6,从星期日算起 int tm_yday; // 一年中的第几天,范围从 0 到 365,从 1 月 1 日算起 int tm_isdst; // 夏令时 }; tm_sec

    80110

    添加 K8S CPU limit 会降低服务性能?

    没有配置限制的请求 现在,假设我们为应用程序分配了 0.4 CPU 的 CPU 限制。这意味着应用程序每 100 毫秒周期获得 40 毫秒的运行时间——即使这些时间 CPU 没有其他工作要做。...配置限制的请求 这个时候你查看下所在容器路径下的 cpu.stat throttled_time 你会发现被限制了 240ms(对于每 100 毫秒的周期,应用程序只能运行 40 毫秒,并被限制 60...通过检测内核,我证明了这种情况在我的节点上几乎从未出现过。因此,那 1 毫秒永不过期。该补丁将此逻辑从基于时钟时间更改为周期序列计数,解决了内核中长期存在的错误。...它们已被反向移植到许多可用的内核中: Linux-stable: 4.14.154+, 4.19.84+, 5.3.9+ Ubuntu: 4.15.0–67+, 5.3.0–24+ Redhat Enterprise...id=763a9ec06c4已被修复并合并到运行 4.19 或更高版本的 Linux 发行版的内核中。

    1.6K31

    太极限了,JDK的这个BUG都能被我踩到!

    ,就重新加载配置,画个架构图大概是这样: 今天的重点是文件的变更该如何监听(watch),我们当时的实现非常简单: 单独起个线程,定时去获取文件的最后更新时间戳(毫秒级) 记录每个文件的最后更新时间戳...但后来还是发生了一次比较严重的线上故障,这是为什么呢?...秒这个概率比同一毫秒大的多的多,所以当然就被触发了,导致了一次线上故障。...inotify—Linux内核提供的文件监听机制 至此,我想起了linux上的tail命令,tail 是在文件有变更的情况下输出文件的末尾,理论上也是监听了文件变更,这块刚好在很久之前听过一个技术大佬分享如何自己实现...tail命令,用到的底层技术就是inotify 简单来说,inotify是linux内核提供的一种监控文件变更事件的系统调用。

    20510

    Linux 中的负载高低和 CPU 开销并不完全对应

    好了,另外一个新问题又来了,avenrun 全局数组变量中存储的数据是何时,又是被如何计算出来的呢? 二、内核中负载的计算过程 接上小节,我们继续查看 avenrun 全局数组变量的数据来源。...2.2 定时计算系统平均负载 上一小节中我们找到了系统当前瞬时负载 calc_load_tasks 变量的更新过程。...但是如果用这种简单的算法来计算平均负载的话,存在以下几个问题: 1.需要存储过去每一个采样周期的数据 假设我们每 10 毫秒都采集一次,那么就需要使用一个比较大的数组将每一次采样的数据全部都存起来,那么统计过去...而且每出现一个新的观察值,就要从移动平均中减去一个最早的观察值,再加上一个最新的观察值,内存数组会频繁地修改和更新。 2.计算过程较为复杂 计算的时候再把整个数组全加起来,再除以样本总数。...1.内核定时汇总每 CPU 负载到系统瞬时负载 2.内核使用指数加权移动平均快速计算过去1、5、15分钟的平均数 3.用户进程通过打开 loadavg 读取内核中的平均负载 我们再回头来总结一下开篇提到的几个问题

    71220

    客快物流大数据项目(十三):Docker镜像

    目录 Docker镜像 一、Docker镜像是什么 1、UnionFS(联合文件系统) 2、​​​​​​​Docker镜像加载原理 3、分层的镜像 4、为什么 Docker 镜像要采用这种分层结构 二、...1、UnionFS(联合文件系统) UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下...这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。...3、分层的镜像 以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载 4、为什么 Docker 镜像要采用这种分层结构 最大的一个好处就是 - 共享资源 比如:有多个镜像都从相同的...而且镜像的每一层都可以被共享。

    37961

    太极限了,JDK的这个BUG都能被我踩到

    ,就重新加载配置,画个架构图大概是这样: [p1.png] 今天的重点是文件的变更该如何监听(watch),我们当时的实现非常简单: 单独起个线程,定时去获取文件的最后更新时间戳(毫秒级) 记录每个文件的最后更新时间戳...但后来还是发生了一次比较严重的线上故障,这是为什么呢?...2次变更就无法被程序感知了,同1秒这个概率比同一毫秒大的多的多,所以当然就被触发了,导致了一次线上故障。...inotify—Linux内核提供的文件监听机制 至此,我想起了linux上的tail命令,tail 是在文件有变更的情况下输出文件的末尾,理论上也是监听了文件变更,这块刚好在很久之前听过一个技术大佬分享如何自己实现...tail命令,用到的底层技术就是inotify [p11.png] 简单来说,inotify是linux内核提供的一种监控文件变更事件的系统调用。

    47041

    Docker镜像分层(六)

    的指令修改了,复制的文件变化了,或者构建镜像是指定的变量不同了,对应的镜像镜像层就会失效 某一层的镜像缓存失效后它之后的镜像层缓存都会失效 镜像层是不可变的,如果在某一层中添加一个文件,然后再下一层中删除...,则镜像中依然会包含该文件 注意: (1)如上图所示,Docker镜像层都是只读的,容器层是可写的。...上图中只有透明的writable Container是暴露给用户的。 平时我们在虚拟机上安装Linux操作系统都是好几个G,为什么docker才200M左右呢?...特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。 1....下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版。上层镜像层中的文件覆盖了底层镜像层中的文件。

    1.4K20

    Linux 内核定时器实验

    设置好以后打开 Linux 内核源码根目录下的.config 文件,在此文件中 CONFIG_HZ 为 100, Linux 内核会使用 CONFIG_HZ 来设置自己的系统时 钟。...Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数,系统启动的时候会 将 jiffies 初始化为 0, jiffies 定义在文件 include/linux/jiffies.h...Linux 内核使用 timer_list 结构体表示内核定时器, timer_list 定义在文件 include/linux/timer.h 中,定义如下(省略掉条件编译): 示例代码 50.1.2.1...内核短延时函数 有时候我们需要在内核中实现短延时,尤其是在 Linux 驱动中。.../4.1.15 中,输入如下命令加载 timer.ko 驱动模块: depmod //第一次加载驱动的时候需要运行此命令 modprobe timer.ko //加载驱动 驱动加载成功以后如下命令来测试

    2.4K10
    领券