<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tim[后端技术] &#187; kernel</title>
	<atom:link href="http://timyang.net/tag/kernel/feed/" rel="self" type="application/rss+xml" />
	<link>http://timyang.net</link>
	<description>Tim&#039;s blog, 关于后端架构、互联网技术、分布式、大型网络应用、NoSQL、Key Value等</description>
	<lastBuildDate>Mon, 02 Aug 2010 15:34:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>谈Linux内核定时器</title>
		<link>http://timyang.net/linux/linux-timer-tick/</link>
		<comments>http://timyang.net/linux/linux-timer-tick/#comments</comments>
		<pubDate>Mon, 18 May 2009 12:10:41 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[timer]]></category>

		<guid isPermaLink="false">http://timyang.net/?p=182</guid>
		<description><![CDATA[看了3个周末的Linux内核，包括前两周总结的进程与线程，锁与同步。当时研究这个的原因是因为某个程序CPU context switch过高。不过到现在相关的背景知识也了解了，问题也早已经解决了，所以暂时也没有进一步的兴趣驱动去研究内核了，这里是终结篇。:)
在应用程序运行的时候，特别是抢占式的操作系统里面，内核怎么样取得控制权？这依赖硬件支持的系统定时器来实现。内核中有非常多的功能由定时器触发。系统定时器以固定的频率触发，这个频率称为tick rate(HZ)，每个触发周期的时间叫做tick, 它等于1/HZ秒。触发后系统会转到内核相应的handler去处理。
在系统定时器中断时候内核需要做以下事情

更新uptime, time of day, resource及处理器使用状态
检查多处理器是否负载均衡
检查当前进程是否timeslice是否用完，如果用完则重新分配下阶段计划(reschedule)
运行应用程序自定义的定时器(dynamic timers)

了解了tick rate之后才能比较好理解为什么sleep(), timer等API声称都不是提供精确的时间，因为cpu一个任务timeslice没运行完，系统是不会马上切换到这些dynamic timer的进程的。
Linux 2.5以上将tick从100改成1000，相当于系统时钟从10ms变成每1ms要中断一次，当时也引起较大的争议。
改成1000的优点有：

系统时钟精度更高更准确。
系统调用如poll(), select() 等依赖系统时钟的调用性能得到很大改善。
内核实时运行指标如资源占用，uptime更准确。
抢占式机制更精确。

缺点：
我们知道定时器频繁被触发必将会增加开销，降低throughput。这是很多人反对改成1000的理由。原理上它在CPU的时间中断上将会增加10倍的开销。但由于现代CPU硬件速度的变快。大家也逐渐认可了新的调整不会给整体性能带来大的影响。如果在意这一点的可以重新编译内核， 将&#60;asm/param.h&#62;中HZ的值由1000降低。目前可以接受的值有100,500和1000。
Linux 2.6.21 又增加了一种叫dyntick的技术，dyntick就是在系统空闲的时候，彻底停止时间中断， 避免cpu空转，它会带来节能方面的好处。详情可参看Clockevents and dyntick。这是个新的技术，一般的书上都没来得及写进去。
比较感兴趣的后续课题是virtualization系统中的timer实现。
Similar Posts:了解Linux的进程与线程

Lua coroutine vs Java wait/notify

多服务器通讯层应该如何设计—一次code review小记

了解Linux的锁与同步

高性能网站经验-读杨建的Blog有感
]]></description>
			<content:encoded><![CDATA[<p>看了3个周末的Linux内核，包括前两周总结的<a href="http://timyang.net/linux/linux-process/">进程与线程</a>，<a href="http://timyang.net/programming/linux-synchronization-lock/">锁与同步</a>。当时研究这个的原因是因为<a href="http://twitter.com/xmpp/status/1635132615" target="_blank">某个程序CPU context switch过高</a>。不过到现在相关的背景知识也了解了，问题也早已经解决了，所以暂时也没有进一步的兴趣驱动去研究内核了，这里是终结篇。:)</p>
<p>在应用程序运行的时候，特别是抢占式的操作系统里面，内核怎么样取得控制权？这依赖硬件支持的系统定时器来实现。内核中有非常多的功能由定时器触发。系统定时器以固定的频率触发，这个频率称为tick rate(HZ)，每个触发周期的时间叫做tick, 它等于1/HZ秒。触发后系统会转到内核相应的handler去处理。</p>
<p>在系统定时器中断时候内核需要做以下事情</p>
<ul>
<li>更新uptime, time of day, resource及处理器使用状态</li>
<li>检查多处理器是否负载均衡</li>
<li>检查当前进程是否timeslice是否用完，如果用完则重新分配下阶段计划(reschedule)</li>
<li>运行应用程序自定义的定时器(dynamic timers)</li>
</ul>
<p>了解了tick rate之后才能比较好理解为什么sleep(), timer等API声称都不是提供精确的时间，因为cpu一个任务timeslice没运行完，系统是不会马上切换到这些dynamic timer的进程的。</p>
<p>Linux 2.5以上将tick从100改成1000，相当于系统时钟从10ms变成每1ms要中断一次，当时也引起较大的争议。</p>
<p>改成1000的优点有：</p>
<ul>
<li>系统时钟精度更高更准确。</li>
<li>系统调用如poll(), select() 等依赖系统时钟的调用性能得到很大改善。</li>
<li>内核实时运行指标如资源占用，uptime更准确。</li>
<li>抢占式机制更精确。</li>
</ul>
<p>缺点：<br />
我们知道定时器频繁被触发必将会增加开销，降低throughput。这是很多人反对改成1000的理由。原理上它在CPU的时间中断上将会增加10倍的开销。但由于现代CPU硬件速度的变快。大家也逐渐认可了新的调整不会给整体性能带来大的影响。如果在意这一点的可以重新编译内核， 将&lt;asm/param.h&gt;中HZ的值由1000降低。目前可以接受的值有100,500和1000。</p>
<p>Linux 2.6.21 又增加了一种叫dyntick的技术，dyntick就是在系统空闲的时候，彻底停止时间中断， 避免cpu空转，它会带来节能方面的好处。详情可参看<a href="http://lwn.net/Articles/223185/" target="_blank">Clockevents and dyntick</a>。这是个新的技术，一般的书上都没来得及写进去。</p>
<p>比较感兴趣的后续课题是virtualization系统中的timer实现。</p>
Similar Posts:<ul><li><a href="http://timyang.net/linux/linux-process/" rel="bookmark" title="May 3, 2009">了解Linux的进程与线程</a></li>

<li><a href="http://timyang.net/lua/lua-coroutine-vs-java-wait-notify/" rel="bookmark" title="April 27, 2009">Lua coroutine vs Java wait/notify</a></li>

<li><a href="http://timyang.net/architecture/communication-code-review/" rel="bookmark" title="May 22, 2009">多服务器通讯层应该如何设计—一次code review小记</a></li>

<li><a href="http://timyang.net/programming/linux-synchronization-lock/" rel="bookmark" title="May 10, 2009">了解Linux的锁与同步</a></li>

<li><a href="http://timyang.net/architecture/yangjian-web-server/" rel="bookmark" title="April 28, 2009">高性能网站经验-读杨建的Blog有感</a></li>
</ul><!-- Similar Posts took 20.684 ms -->]]></content:encoded>
			<wfw:commentRss>http://timyang.net/linux/linux-timer-tick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
