当前位置: 首页 > news >正文

Linux - 时钟

本文是《Linux内核设计与实现》中“定时器与时间管理”的学习笔记。

节拍率Hz

系统定时器频率是通过静态预处理定义的。我的Ubuntu配置的是250Hz(4ms一个周期)。

root@john-virtual-machine:/boot# grep CONFIG_HZ config-4.15.0-154-generic
# CONFIG_HZ_PERIODIC is not set
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250

Hz越高也就意味着中断产生的越频繁,就可以提高事件驱动事件的解析度。

提高Hz的好处

内核定时器能够以更高的频度和准确度运行(调度系统等)

依赖定时执行的系统调用,可以以更高的精度运行,如select(),poll()

关于select() 和poll()的介绍,参看这里

提高Hz的坏处

时钟中断频率的提高,也就意味了加大了系统负载,用于处理中断。

Jiffies

jiffies记录了系统自启动以来的节拍总数。每次时钟中断处理程序都会 jiffies+=1。在Linux中,用unsigned long类型定义jiffies。对于32位系统(100hz)497天就会溢出,对于64位系统,有生之年是看不到它溢出的。。。

硬时钟和定时器

实时时钟 RTC:输出的是UTC,由外部电池供电,所以在系统关机时,它仍然在工作。精度自然不会高(秒级)。在系统启动时,内核通过读取RTC来初始化墙上时间,该时间存放在xtime中。

TSC:time stamp counter,在x86 CPU中有一个CLK引脚,它接收外部振荡器的时钟,来给CPU提供时钟。TSC的值每个时钟增加1.  Rating值为300

PIT:可编程间隔定时器,已被HPET取代。

HPET:高精度事件定时器,一个HPET芯片包含了8个32位或64位的独立计数器,每个计数器由自己的时钟信号驱动,每个计时器又包含了一个比较器和一个寄存器(保存一个数值,表示触发中断的时机)。每一个比较器都比较计数器中的数值和寄存器的数值,相等就会产生中断。Rating值为250.

查看当前时钟源:

root@john-virtual-machine:~# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc

系统支持的时钟源:

root@john-virtual-machine:~# cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm 

rating值越高,作为时钟源就越准确,所以就目前而言,选择TSC就好了。

时钟中断处理程序

分为体系结构相关和体系结构无关,体系结构相关的例程作为系统定时器的中断处理程序注册到内核中。调用体系结构无关的时钟例程tick_periodic():

  1. jiffies变量加一 do_timer()
  2. 更新进程资源消耗统计 account_process_tick() 以tick为颗粒度进行统计,在这个函数根据当时的参数,会分为user/system/idle。
    run_local_timers()标记一个软中断去处理所有到期的定时器。
    void run_local_timers(void)
    {hrtimer_run_queues();raise_softirq(TIMER_SOFTIRQ); //执行软中断softlockup_tick();
    }
  3. 执行已经到期的动态定时器
  4. 执行scheduler_tick() 这个函数在step2中。
  5. 更新墙上时间 update_wall_time()
  6. 计算平均负载 calc_global_load()

实际时间  

struct timespec xtime {_kernel_time_t tv_sec; // 存放自1970年1月1日到现在经过的秒数long tv_nsec; // 记录自上一秒开始经过的纳秒数
}

读写xtime,要先获得一个seqlock。在程序中获取系统事件的函数gettimeofday()就是去读xtime。

 定时器

定时器能够使某些任务在指定的某个时间点上执行,只需设置超时时间,到期后自动执行指定的函数,并销毁这个定时器。

Linux提供了低精度和高精度的定时器,如采用链表的方式,按timeout排序,但是时间复杂度高O(n)。在这里介绍基于时间轮的计算方式,本质思想是空间换时间。

每一个CPU都有一个struct tvec_base结构,代表这个CPU使用的时间轮。

struct tvec_base
{spinlock_t lock;                      // 同步锁struct timer_list * running_timer;    // 当前正在运行的定时器unsigned long timer_jiffies;          // 当前运行到的jiffiesstruct tvec_root tv1;                          struct tvec tv2;struct tvec tv3;struct tvec tv4;struct tvec tv5;
}

struct tvec_root与struct tvec都是数组,数组中的每一项都指定一个链表。struct tvec_root定义的数组大小是256(2的8次方);struct tvec_root定义的数组大小是64(2的6次方)。所以,tv1~6定义的数组总大小是2的(8 + 4*6 = 32)次方,正好对应32位处理器中jiffies的定义(unsigned long)。

因为使用的是wheel算法,tv1~5就代表5个wheel。  tv1是转速最快的wheel,所有在256个jiffies内到期的定时器都会挂在tv1的某个链表头中。  tv2是转速第二快的wheel,里面挂的定时器超时jiffies在2^8 ~ 2^(8+6)之间。  tv3是转速第三快的wheel,超时jiffies在2^(8+6) ~ 2^(8+2*6)之间。  tv4、tv5类似。 

延迟执行 

忙等待

以jiffies为颗粒度,在循环中不断旋转直到希望的节拍数耗尽。

短延迟

void mdelay()
void udelay()
void ndelay()

精度可以达到纳秒级,通过CPU忙循环次数,来计时。

BogoMIPS:记录CPU在给定时间内忙循环的次数。

schedule_timeout()

将需要延迟的任务放入可中断睡眠队列,待timeout时,再将其放入运行队列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-35400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

Elasticsearch:使用 Debian 软件包安装 Elasticsearch

Elasticsearch 的 Debian 包可以从我们的网站或我们的 APT 仓库下载。 它可用于在任何基于 Debian 的系统上安装 Elasticsearch,例如 Debian 和 Ubuntu。 Elasticsearch 的最新稳定版本可以在下载 Elasticsearch 页面上找到。 其他版本可以在过去的版本页面上找到。…...

Python编程进阶 关于变量引用这点事

文章目录一、变量的引用1、 引用的概念2、变量引用的示例3、函数的参数和返回值的传递二、可变和不可变类型1、分类2、不可变类型3、可变类型4、哈希 hash三、局部变量和全局变量1、 局部变量(1)局部变量的作用(2)局部变量的生命周…...

MATLAB基础语法之拟合算法

%data1.mat数据如下 %导入data1的数据 load data1%以x为自变量,y为因变量,o为点的形状作散点图 plot(x,y,o)% 给x和y轴加上标签 xlabel(x的值)ylabel(y的值)%返回data1数据行数n 19 n size(x,1); %最小二乘法求解拟合曲线参数 k (n*su…...

SpringBoot集成支付宝支付(沙箱环境)

项目结构&#xff1a; 项目依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boo…...

Golang高并发:生产者消费者模型

Golang高并发&#xff1a;生产者消费者模型 我们本篇博文主要通过几个例子来介绍生产者消费者模型。 案例1 下面看看第一个例子中的生产者协程。 //生产者协程go func() {for {product : strconv.Itoa(time.Now().Nanosecond())chanShop <- "商品" productf…...

反射动态修改注解属性值

注解Two中有two属性表&#xff0c;在TestTwoAnno这个类初始化结束后&#xff0c;修改Two注解的two属性。 import com.enterprise.support.rocketmq.annotation.Two; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Compo…...

(Java)获取视频中的每一帧图像

代码 /*** 根据读取到的视频文件&#xff0c;获取视频中的每一帧图片* param video 视频文件* http://192.168.0.107:9087/datago/detectsysfiles/204/createFile/frameFile/001/frameFile001.mp4* param picPath 图片的保存路径* E:/detectsysfiles/204/createFil…...

TensorFlow项目1——鸢尾花识别(来源:北大曹健老师tensorflow学习视频)

项目1.鸢尾花识别 1.完整代码 import matplotlib.pyplot as plt from sklearn import datasets from pandas import DataFrame import pandas as pd import numpy as np import tensorflow as tf# 数据处理 #1.读取iris数据&#xff08;sklearn已有&#xff09; #2.随机打乱&…...

Java工作资料!同花顺java开发怎么样

前言 昨天&#xff0c;有个女孩子问我提高数据库查询性能有什么立竿见影的好方法&#xff1f; 这简直是一道送分题&#xff0c;我自豪且略带鄙夷的说&#xff0c;当然是加「索引」了。 她又不紧不慢的问&#xff0c;索引为什么就能提高查询性能。 这还用问&#xff0c;索引…...

IFRS17改造记录

一&#xff0c;为什么要推行IFRS17&#xff08;简称&#xff1a;I17&#xff09; 不同国家&#xff0c;不同的保险产品采用不同的会计计量方法&#xff08;中国保险业现行的会计准则是基于IFRS4准则&#xff09;保险行业的财务报告难于理解对风险没有明确的量化计量部分国家由…...

Linux的概述

Linux的概述&#xff1a; Unix Unix是一个强大的多用户、多任务操作系统 于1969年在AT&T的贝尔实验室开发 UNIX的商标权由国际开放标准组织&#xff08;The Open Group&#xff09;所拥有 UNIX操作系统是商业版&#xff0c;需要收费&#xff0c;价格比Microsoft Windows正…...

js/python 抓取网页数据,导出execl

文章目录前言操作代码前言 js的方式&#xff1a;直接使用post获取所有的数据&#xff0c;因为是分页数据有total显示所有的数据&#xff0c;在请求的时候&#xff0c;就可以直接把每页的数据显示为total的值。没有太大的技术含量 python方式&#xff1a;直接遍历页码获取数据&…...

SpringCloud Alibaba实战(7:nacos注册中心管理微服务)

源码地址&#xff1a;https://gitee.com/fighter3/eshop-project.git 持续更新中…… 在上一节我们已经完成了Nacos Server的本地部署&#xff0c;这一节我们学习如何将Nacos作为注册中心&#xff0c;管理微服务。 1、注册中心简介 1.1、什么是注册中心 在微服务的体系里&am…...

xboot大神的libonnx环境搭建

1.get代码 git clone gitgitee.com:xboot/libonnx.git 2.安装依赖&#xff1a; sudo apt-get install libsdl2-dev sudo apt-get install libsdl2-gfx-dev 3.编译 4.结果 5.验证 进入examples/mnist&#xff0c;执行mnist. 结束&#xff01;...

链表反转。

举个例子来分析一下如何实现链表的反转。 链表示例&#xff1a;9—>6—>8—>7—>1—>null。 1&#xff09;首先定义两个指针cur、pre分别指向链表头和链表尾。 2&#xff09;定义一个临时指针&#xff0c;指向cur.next。 3&#xff09;修改cur指针的指向&#x…...

create_pose算子说明

算子作用&#xff1a;创建一个3D姿态 算子声明&#xff1a; create_pose( : : TransX, TransY, TransZ, RotX, RotY, RotZ, OrderOfTransform, OrderOfRotation, ViewOfTransform : Pose)举例&#xff1a; create_pose (EndX - StartX, EndY - StartY, EndZ - StartZ, 0, 0,…...

Visual Studio

Visual Studio 2019 Enterprise&#xff08;企业版&#xff09;&#xff1a;BF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio 2019 Professional&#xff08;专业版&#xff09;&#xff1a;NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y...

gRPC-go源码剖析五十五之客户端一侧,是如何处理取消功能的?

本篇文章我们深入源码,重点分析一下grpc客户端一侧是如何来处理取消功能的; 1、取消功能是如何触发的?我们以客户端测试用例说明; 进入examples/features/cancellation/client/main.go文件中 1.func main() {2. //---省略掉不相关代码3. c := pb.NewEchoClient(conn...

数据结构与算法常用总结

数据结构1.常用数据结构及其原理1.1 数组1.2 链表1.3 队列1.4 栈1.5 哈希表1.6 二叉树2.常见数据结构面试题2.1数组和链表的区别2.2 排序算法2.3 栈结构与队列的区别1.常用数据结构及其原理 1.1 数组 每一个数组元素的位置由数字编号&#xff0c;称为下标或者索引(index)。大根…...

关于我在 SSL 做纪中题目这档事(2021.8.23)

成绩 ranknamescoreT1T2T3T4666TJHTJHTJH175175175505050404040505050353535 做题 看 T1 发现又是方差&#xff0c;然后看了一下觉得一定是长度为 lll&#xff1f;没证&#xff0c;先去看下一题。 看 T2 发现很数学题&#xff0c;想到了质因数分解却感觉会质因数个数太多。 T…...

阿里云边缘云全新架构升级,助力CDN操控新体验

简介&#xff1a; 本次升级根据上万企业客户的使用反馈和行业应用特征&#xff0c;从简单开通到个性化定制&#xff0c;从内容分发到边缘计算完整解决方案&#xff0c;对客户侧的使用体验进行了全局梳理和全链路优化&#xff0c;推进边缘云CDN操控革新&#xff0c;并逐步构建面…...

Django

Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身基…...

关于在vue2.0中使用wangeditor富文本的一些问题

1.先下载相关依赖 npm install wangeditor 2. 引入相关包 import E from "wangeditor"; 3.注册相关内容 name: "picLibraryDetail", 4.相关代码如下&#xff1a; import E from "wangeditor"; export default {name: "picLibraryDetai…...

关于新手指导IntroJS,vue项目(vue3)和react项目(ant-design)的引用

安装插件 npm i introJs 一、vue3项目中引用intro作新手引导 src/utils/util.js文件 import introJs from intro.js/*** name: 新手指导* param {String} pathname 当前页面的path* param {Array} stepsArr 步骤内容&#xff08;包括element、intro&#xff09;* return {*}…...

nuxt中使用svg 开发svg组件

为什么要使用SVG 虽然我们在日常开发的时候&#xff0c;在使用iview 或者element ui等组件时&#xff0c;通常会包含一些常用icon&#xff1b;但是在面对一些特定的需求时&#xff0c;或者自己想high一下&#xff0c;这些通用的icon并不能很好的满足我们。这个时候我们可能会拿…...

A - Til the Cows Come Home POJ - 2387

A - Til the Cows Come Home POJ - 2387 最短路 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxn 2010; typedef pair<int, int> PII; // first 存距离…...

C#不同状态的按钮 消失or显示

效果展示&#xff1a; 点击前 点击后 //而且 ”备注“ 变成可编辑状态 点击确定后 编辑成功 并变为初始 只有一个的” 编辑 “按钮 并在listView更改成功 列表样式 解决方案&#xff1a; 首先创建三个Button 都放在一个位置上 当然需要有一个按钮重合在编辑上面&#xff08;为…...

vue--CompositionAPI 中如何使用 VueX

a.同步方法改变数据&#xff1a; Home.vue <template><div class"home"><img alt"Vue logo" src"../assets/logo.png"><h1>{{name}}</h1></div> </template><script> import {toRefs} from v…...

5. 断路器hystrix dashboard turbine

hystrix使用 feign中使用 hystrix feign:hystrix:enabled: true #必须配置Component public class EurekaClientHystrix implements EurekaClientFeign{}使用feign配置了&#xff0c;这些&#xff0c;即可进行回退 Feign 的起步依赖中已经包含Hystrix依赖&#xff0c;所以只…...

springBoot 一键启动多个服务

我们启动springboot服务时经常一个一个去启动,这样操作显然是非常麻烦的,那么怎样让他一键启动多个服务呢? 第一步:打开设置 第二步:选择Compound 第三步:选择你要启动的服务 第四步:点击就可以一键启动了...

IDEA编译提示GC overhead limit exceeded

IDEA编译项目时&#xff0c;后台输出GC overhead limit exceeded异常&#xff0c;解决办法如下&#xff1a;...

idea gc overhead limit exceeded解决方法

1.首先地点File 2.选择Settings... 3.选择Compiler 修改Shared build process heap size(Mbytes) 的数值即可...

解决 GC overhead limit exceeded 报错

解决 GC overhead limit exceeded 报错 这种异常是发生在GC占用大量时间为释放很小空间的时候&#xff0c;是一种保护机制。一般是因为堆太小&#xff0c;导致异常的原因&#xff1a;没有足够的内存。 解决方法&#xff0c;增加jvm堆内存&#xff1a;...

weblogic GC overhead limit exceeded

weblogic GC overhead limit exceeded 使用weblogic启动较大项目时&#xff0c;超出GC限制&#xff0c;可以通过修改 C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\bin下的 setDomainEnv.cmd 我的jdk是 C:\Users\Administrator>java -version ja…...

OOM:GC overhead limit exceeded问题解决

是发⽣在GC占⽤⼤量时间为释放很⼩空间的时候发⽣的&#xff0c;是⼀种保护机制。⼀般是因为堆太⼩&#xff0c;导致异常的原因&#xff1a;没有⾜够的内存。 Sun 官⽅对此的定义&#xff1a;超过98%的时间⽤来做GC并且回收了不到2%的堆内存时会抛出此异常。 使用VisualVm观察…...

Sqoop -----Error: GC overhead limit exceeded

sqoop import -Dorg.apache.sqoop.splitter.allow_text_splittertrue \ --connect jdbc:mysql://alg-pub-winneryun.mysql.rds.aliyuncs.com:3906/spider_meituan \ --username uat_test \ --password kangll888 \ --driver com.mysql.jdbc.Driver \ --query select * from me...

matlab overhead,count the number of standing people in the view of an overhead camera

Well pick one that doesnt rely on moving people, if thats your case. I know theyve used it for still crowds, like to estimate the number of people at events and demonstrations, like in Washington DC. It became a heated argument because one group wanted to...

idea gradle GC overhead limit exceeded

Failed to notify build listener. > GC overhead limit exceeded ​ idea打开gradle的java项目时&#xff0c;编译直接报错GC overhead limit exceeded&#xff0c;网上各种解决方案都试了&#xff0c;仍然不能解决&#xff0c;看到很多解决方案都是在.gradle目录下新建gr…...

[内存 溢出 ] GC overhead limit exceeded

目录 前言: 完整报错信息: A同事盘查这个原因是: 发现问题: 物理解决办法: 前言: 服务器其实内存是够用的&#xff01;但是服务器 日志 提示了一下这个日志: 所以得排查一下原因了&#xff01;&#xff01;&#xff01; 完整报错信息: 2021-12-17 14:21:56.469 [http-ni…...

tomcat内存不足报GC overhead limit exceeded和外部无法访问10080端口问题

还不是很了解jvm。。。 一、内存不足 今天捣鼓了一下tomcat&#xff08;tomcat8&#xff0c;windows版)&#xff0c;服务是启动了&#xff0c;但等待了很长时间都无法访问。查看tomcat的报错日志&#xff0c;提示 GC overhead limit exceeded&#xff0c;超出GC开销限制。 服…...

线上服务超时及GC overhead limit exceeded问题的排查

前段时间&#xff0c;公司的老系统频繁的出现超时&#xff0c;各方都不胜其扰&#xff0c;不过由于公司性质问题&#xff0c;线上运维和开发是分属不同的人负责&#xff0c;所以我也就没有办法及时的登录服务器排查问题&#xff0c;这还是有点儿让我这个互联网出身的码农有些难…...

解决线上OutOfMemoryError: GC overhead limit exceeded问题

线上出现OutOfMemoryError如何排查解决 背景&#xff1a;公司之前给甲方开发了一个服务&#xff0c;因为数据问题&#xff0c;甲方要求部署在他们自己的服务器上&#xff0c;后来发现这个服务跑了一段时间后就会挂掉&#xff0c;一直找不到问题&#xff0c;重启以后有没有问题…...

OutOfMemoryError: GC Overhead Limit Exceeded错误解析

面试&#xff1a;你懂什么是分布式系统吗&#xff1f;Redis分布式锁都不会&#xff1f;>>> 简单地说&#xff0c;Garbage Collection (GC)就是JVM回收不再使用的对象&#xff0c;释放内存的过程。GC Overhead Limit Exceeded error是java.lang.OutOfMemoryError家族…...

GC overhead limit exceeded

Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded 问题描述 垃圾回收为了释放较小的空间而占用了大量时间造成的。通常是设置的堆内存太小&#xff0c;导致没有足够的内存。 解决方法 1、检查程序有没有死循环或者其他一些导致内存被大量占用的程序 2、…...

Spark GC overhead limit exceeded

1、在运行spark 代码时&#xff0c;抛出错误&#xff1a; 18/03/24 08:52:00 WARN server.TransportChannelHandler: Exception in connection from /192.168.200.164:37768 java.lang.OutOfMemoryError: GC overhead limit exceededat java.io.ObjectInputStream$HandleTable.…...

【jvm】java jvm 报错 OutOfMemoryError: GC overhead limit exceeded

1.概述 JVM 抛出 OutOfMemoryError 的最后一种情况是 JVM 认为在执行 GC 上花费了太多时间: Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded当满足下列所有条件时就会抛出该错误。 花在 Full GC 上的时间超出了 -XX:GCTimeL…...

OutOfMemoryError系列(2): GC overhead limit exceeded

这是本系列的第二篇文章, 相关文章列表: OutOfMemoryError系列&#xff08;1&#xff09;: Java heap spaceOutOfMemoryError系列&#xff08;2&#xff09;: GC overhead limit exceededOutOfMemoryError系列&#xff08;3&#xff09;: Permgen spaceOutOfMemoryError系列&a…...

OOM:GC overhead limit exceeded分析流程

前言: OOM常见的错误类型有如下: 1.Java Heap Space(堆) 2.GC overhead limit exceeded(GC回收的开销小于回报,下面进行详细分析) 3.PermGen space(永久代) 4.Metaspace(元空间) 该异常的描述是: GC在经过一番运算之后,发现回收的内存很小,不能满足新对象所需的内存,新对象所…...

ElasticSearch gc overhead

在实际使用中经常会有gc overhead异常&#xff0c;其原因是es的内存不足&#xff0c;在进行full gc时资源使用过多&#xff0c;导致心跳检测无法通过&#xff0c;被剔除集群,导致NoNodeAvailableException。 如图&#xff1a; gc异常.png在实际使用中&#xff0c;有以下几种处理…...

JVM报错GC overhead limit exceeded

这是生产上报的错&#xff0c;通过修改jetty.sh 里面的配置&#xff0c;目前没有发生异常&#xff0c;具体如图 具体参考的文章如下&#xff1a; May 31, 2012 11:54:25 AM org.apache.coyote.http11.Http11ProtocolHttp11ConnectionHandlerprocessSEVERE:Errorreadingrequest,…...