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

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

Linux内核中的xtime变量每1毫秒更新一次是为了实现系统的时间管理和调度功能。

首先,xtime变量是Linux内核中的一个全局变量,用于记录系统的当前时间。它的更新频率为每1毫秒一次,是为了提供足够精确的时间戳,以满足系统各种时间相关的功能和需求。

更新xtime变量的频率与系统的时钟中断有关。时钟中断是由硬件定时器产生的,它以固定的频率触发,通常是每秒1000次。每次时钟中断发生时,内核会更新xtime变量的值,以反映出经过的时间。

这种每1毫秒更新一次的设计有以下几个优势和应用场景:

  1. 时间管理:通过更新xtime变量,内核可以准确地跟踪系统的运行时间,包括启动时间、运行时间片段等。这对于系统的时间管理非常重要,例如计算进程运行时间、定时任务的触发、时间戳的生成等。
  2. 调度器:内核的调度器需要准确地了解每个进程的运行时间,以便进行合理的任务调度。通过更新xtime变量,内核可以计算出每个进程的运行时间,并根据优先级和调度策略进行合理的任务切换。
  3. 定时器:内核中有很多定时器相关的功能,例如定时触发某个事件、定时执行某个任务等。通过更新xtime变量,内核可以实现这些定时器功能,并保证其精确性和准确性。
  4. 时间戳:在系统中,很多应用需要生成时间戳,用于记录事件发生的时间。通过更新xtime变量,内核可以提供准确的时间戳,以满足应用的需求。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云数据库 MySQL 版(CMYSQL):https://cloud.tencent.com/product/cmysql
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送、移动分析):https://cloud.tencent.com/product/mobile
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 元宇宙(Metaverse):https://cloud.tencent.com/solution/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

System.currentTimeMillis 确实要访问系统时钟,准确说,是读取墙上时间(xtime),xtimeLinux系统给用户空间用来获取当前时间内核自己基本不会使用,只是维护更新。...而且读写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效率不高,所以一般只在初始化时候维护一次

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

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

    1.5K20

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

    这就是为什么会在 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系统。

    1.7K51

    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内存就行呢。vDSOman介绍如下: ?...通过kallsymbol计算出来xtime地址,然后通过/dev/mem做memory mapping,把xtime地址直接映射到user space。

    2.8K10

    使用系统定时器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.3K20

    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.7K20

    1.docker概述及其历史

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

    1.4K41

    详细介绍下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,从 11 日算起 int tm_isdst; // 夏令时 }; tm_sec

    70910

    添加 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.4K31

    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

    5.3K40

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

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

    17910

    Linux内核设备驱动之内核时间管理笔记整理

    /****************** * linux内核时间管理 ******************/ (1)内核时间概念 时间管理在linux内核占有非常重要作用。...相对于事件驱动而言,内核中有大量函数是基于时间驱动。 有些函数是周期执行,比如10毫秒刷新一次屏幕; 有些函数是推后一定时间执行,比如内核在500毫秒后执行某项任务。...定时器产生中断频率称为节拍率(tick rate)。 在内核中指定了一个变量HZ,内核初始化时候会根据这个值确定定时器节拍率。...采用秒和毫秒值,保存了1970年11日0点以来秒数 struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds...长于定时器周期(也称为时钟嘀嗒)延迟可以通过使用系统时钟完成,而非常短延时则通过软件循环方式完成 (1)短延时 对于那些最多几十个毫秒延迟,无法借助系统定时器。

    2.7K31

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

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

    65020

    Linux时间子系统之时间表示示例详解

    前言 在Linux内核,为了兼容原有的代码,或者符合某种规范,并且还要满足当前精度日益提高要求,实现了多种与时间相关但用于不同目的数据结构: 1)jiffies和jiffies_64 内核用jiffies...但是,由于历史原因,内核源代码还包含了另一个叫做jiffies变量。...但是翻遍所有代码你也找不到全局变量jiffies定义,最终在内核链接脚本(对于Arm64架构来说脚本位于arch/arm64/kernel/vmlinux.lds.S)找到了下面这行: jiffies...最重要是后面,先将两个无符号长整形相减,然后将他们变成有符号长整型,再判断其是否为负数,也就是32位最高位是否为1为什么这样可以部分解决所谓回绕问题呢?...另外,jiffies是每个Tick更新一次,而Tick周期又是编译时候定义好,所以可以将jiffies数值转换成具体过了多少时间,反之亦然。

    3.8K21

    客快物流大数据项目(十三):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 镜像要采用这种分层结构 最大一个好处就是 - 共享资源 比如:有多个镜像都从相同...而且镜像一层都可以被共享。

    35861

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

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

    44141

    Docker镜像分层(六)

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

    1.1K20
    领券