草庐IT

实时时钟、系统时钟和主机服务器时钟的区别

NTP校时服务器 2023-03-28 原文

实时时钟、系统时钟和主机服务器时钟的区别

实时时钟、系统时钟和主机服务器时钟的区别

京准电子科技官微——ahjzsz

实时时钟:RTC时钟,用于提供年、月、日、时、分、秒和星期等的实时时间信息,由后备电池供电,当你晚上关闭系统和早上开启系统时,RTC仍然会保持正确的时间和日期。

系统时钟:是一个存储于系统内存中的逻辑时钟。用于系统的计算,比如超时产生的中断异常,超时计算就是由系统时钟计算的。这种时钟在系统掉电或重新启动时每次会被清除。  

CPU时钟:即CPU的频率,当然这里的时钟频率指的是工作频率,即外频,还有什么主频=外频×倍频,这个网上资料一大堆,就不介绍了。 

系统定时器,是不分体系结构都会有的,依赖于驱动内核的时钟滴答
时间片、进程执行被打断执行调度程序都依赖这个时钟滴答,HZ 、jffes 都是这个时钟的概念
这个时钟对硬件的要求就是可编程,让它按照固定的HZ发时钟中断就行了
默认是占用IRQ0 中断线

rtc是体系结构相关的,一般提供开机时墙上时钟,断电不丢失,
也可以当作一个普通定时器用,硬要用rtc来实现上面那个系统定时器需要的时钟中断也行

系统时钟

6.1.2 系统时钟

操作系统应该具备在将来某个时刻调度某个任务的能力,所以需要一种能保证任务准时调度运行的机制。该机制的核心就是系统时钟。与实时钟RTC不同,系统时钟是定时器硬件和系统软件的结合。

1.系统时钟中断源

系统时钟硬件在通过编程配置后可以产生一定频率的中断。在个人计算机中,与该中断相关的中断向量号是0。系统软件通过累计从开机到现在产生该中断的次数来维护系统时间,形成系统时钟。本小节主要介绍在个人计算机中常见的、可以用于系统时钟的硬件定时器。

(1)8254可编程定时器。

当 前使用最普遍的定时器硬件芯片是Intel 8254可编程定时器芯片(Programable Interval Timer,简称为PIT),该芯片由一个1 193 181Hz的振荡器驱动,含有3个独立的通道;每个通道包含一个16位的计数器。对于每一个到达的时钟脉冲,通道中计数器中的值减1,当计数器减到0时, 相应的通道就会产生一次输出。其中通道0的输出连接到了中断控制器,其对应的中断向量号为0,用于产生系统时钟所需要的滴答;通道1的输出在早期的计算机 中用于DRAM的刷新,新近的计算机系统中有专门的硬件负责DRAM的刷新,通道1的功能已经不存在了;通道2的输出连接到了位于主板上的蜂鸣器(PC Speaker),控制蜂鸣器发出一定频率的声音。

这里介绍一下驱动8254工作时钟频率的来历。最初的个人电脑设计时出于成本上的考虑, 主板上采用了当时广泛用于电视机且价格最便宜的一个14.318 18MHz振荡器,该振荡器的频率远远高于系统其他器件所要求的工作频率。设计师采用了3分频后得到4.77MHz驱动中央处理器8088;采用4分频后 得到3.58MHz信号用于驱动彩色图形适配器;最后将系统各种频率的基频1.193 181 6MHz(各种频率的最大公约数,即12分频)信号用做系统可编程定时器芯片的输入时钟。为了保持兼容性,可编程定时器8254一直采用这个频率的时钟作 为输入。

(2)高精度事件定时器。

高精度事件定时器(High Precision Event Timers)被设计用于取代8254可编程定时器的全部功能和实时钟RTC芯片的周期性中断功能,和8254可编程定时器相比,该定时器能产生更高精度 的周期性中断;和实时钟RTC芯片的周期性中断相比,该定时器能提供更高精度、更宽范围的中断频率。

该硬件定时器遵循Intel和 Microsoft联合制定的高精度事件定时器规范。该规范中规定一个高精度事件定时器最多拥有32个定时器。通过配置后,timer 0用于取代8254可编程定时器所产生的时钟中断;timer 1作为硬件定时器取代实时钟RTC芯片的周期性中断功能;其余的timer作为硬件定时器供内核或用户进程直接使用。

(3)处理器本地时钟。

在多处理器系统中,处理器本地时钟(CPU Local Timer)用于向本地处理器发送时钟中断请求,更新本地处理器上的相对时间jiffies。

2.其他辅助时钟源

这 类辅助时钟源不具备向系统发出中断请求的功能,但有比能产生系统时钟中断的定时器硬件更高的计时精度。在系统时钟中断处理过程中,处理程序可以利用这些时 钟的值来完成高精度时间度量,如"6.6微秒级延迟"中的udelay、ndelay就使用了这类的时钟源(如时间戳计数器)完成高精度的延迟。下面介绍 常见的这类辅助时钟源。

(1)时间戳计数器。

从Pentium开始,所有的Intel处 理器都包含一个64位的寄存器,该寄存器被称为时间戳记数器(Time Stamp Counter,简称为TSC)。TSC在CPU的每个时钟信号到来一次时加1,实际上该寄存器是一个不断增加的计数器,如果处理器的主频为1GHz,那 么TSC寄存器的每1ns增加1。汇编指令rdtsc可用于读取TSC的值。利用CPU的TSC,操作系统通常可以得到更为精准的时间度量。

(2)电源管理时钟。

内核中,除了使用上面的时间戳记数器作为系统时钟的辅助时钟源外,电源管理时钟(ACPI Power Management Timer)也可作为系统的辅助时钟源。这里对这些时钟源不做详细介绍。

3.与系统时钟相关的宏定义

(1)宏定义HZ。

宏定义Hz记录了不同体系结构下,系统时钟所要求的可编程定时器产生中断的频率。在IA32体系结构下该宏定义在文件src/include/asm-i386/param.h中的第6行定义如下:

#define HZ CONFIG_HZ /* Internal kernel timer frequency */

其中的CONFIG_HZ是内核配置选项,该内核配置选项有3个频率候选值依次是100Hz、1 000Hz、250Hz,分别用于要求高系统吞吐量的服务器系统、要求快速响应的个人桌面计算机系统以及兼有两种类型应用的计算机系统中。

(2)宏定义CLOCK_TICK_RATE。

宏定义CLOCK_TICK_RATE记录了不同体系结构下,驱动可编程定时器工作的输入时钟频率。在IA32体系结构下该值在文件src/include/asm-i386/timex.h中的第15行定义如下:

#define CLOCK_TICK_RATE 1193182 /* Underlying HZ */

其中,数值1 193 182是8254可编程定时器的输入时钟频率。详情请参见本小节中对8254可编程定时器的分析。

(3)宏定义LATCH。

宏定义LATCH记录了上述两个宏定义的比值,用于在内核初始化过程中设置可编程定时器中计数器寄存器counter的初始值。在IA32体系结构下,该宏定义在文件src/include/ Linux/jiffies.h中第46行定义如下:

#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */

有关实时时钟、系统时钟和主机服务器时钟的区别的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  6. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  7. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  8. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  9. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  10. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

随机推荐