﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-Aaron's Space</title><link>http://www.cnitblog.com/aaron-li/</link><description>Digital TV</description><language>zh-cn</language><lastBuildDate>Tue, 05 May 2026 03:05:21 GMT</lastBuildDate><pubDate>Tue, 05 May 2026 03:05:21 GMT</pubDate><ttl>60</ttl><item><title>Linux 内核笔记 – 进程调度</title><link>http://www.cnitblog.com/aaron-li/archive/2009/04/11/56271.html</link><dc:creator>Aaron@SMiT</dc:creator><author>Aaron@SMiT</author><pubDate>Sat, 11 Apr 2009 15:20:00 GMT</pubDate><guid>http://www.cnitblog.com/aaron-li/archive/2009/04/11/56271.html</guid><wfw:comment>http://www.cnitblog.com/aaron-li/comments/56271.html</wfw:comment><comments>http://www.cnitblog.com/aaron-li/archive/2009/04/11/56271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aaron-li/comments/commentRss/56271.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aaron-li/services/trackbacks/56271.html</trackback:ping><description><![CDATA[&nbsp;
<p align=left><strong><span>Linux </span></strong><strong><span>内核笔记</span></strong><strong><span> &#8211; </span></strong><strong><span>进程调度</span></strong><strong></strong></p>
<p align=left><strong><span>关键词</span></strong><span>：</span><span> <span><a href="http://tag.bokee.com/tag/Linux" target=_blank><span>Linux</span></a> &nbsp;&nbsp; <a href="http://tag.bokee.com/tag/%C4%DA%BA%CB" target=_blank><span><span>内核</span></span></a> &nbsp;&nbsp; <a href="http://tag.bokee.com/tag/%BD%F8%B3%CC%B5%F7%B6%C8" target=_blank><span><span>进程调度</span></span></a> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p align=left><span>Linux </span><span>内核笔记</span><span> &#8211; </span><span>进程调度</span></p>
<p align=left><span>原文链接</span><span>:</span></p>
<p align=left><span><a href="http://www.linuxforum.net/forum/showthreaded.php?Cat=&amp;Board=linuxK&amp;Number=294463&amp;page=5&amp;view=collapsed&amp;sb=5&amp;o=all"><span>http://www.linuxforum.net/forum/showthreaded.php?Cat=&amp;Board=linuxK&amp;Number=294463&amp;page=5&amp;view=collapsed&amp;sb=5&amp;o=all</span></a></span></p>
<p align=left><span>刘世胜</span><span> <br></span></p>
<p align=left><span><br>Linux </span><span>内核笔记</span><span> &#8211; </span><span>进程调度</span></p>
<p align=left><span>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>前言</span><span><br>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>调度算法</span><span><br><st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False">2.1.1</st1:chsdate>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>常用概念</span><span><br>2.1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>进程数据结构中相关内容</span><span><br>2.1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>调度算法说明</span><span><br>2.1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>相关函数</span><span><br>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>调度程序的执行</span><span><br>3.1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>直接调用</span><span><br>3.1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>延迟调用</span><span><br>3.1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>相关函数</span><span><br>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>进程调度示意图</span><span><br>5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SMP</span><span>系统的调度</span><span><br>6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>问题与答案</span><span><br>7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>参考文献</span></p>
<p align=left><span>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>前言</span><span><br></span><span>本文的许可协议遵循</span><span>GNU Free Document License</span><span>。协议的具体内容请参见</span><span><a href="http://www.gnu.org/copyleft/fdl.html"><span>http://www.gnu.org/copyleft/fdl.html</span></a></span><span>。在遵循</span><span>GNU Free Document License</span><span>的基础上，可以自由地传播或发行本文，但请保留本文的完整性。</span><span><br></span><span>欢迎大家对这篇文章提出意见和指正，我的</span><span>email</span><span>是：</span><span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#104;&#105;&#115;&#104;&#101;&#110;&#103;&#95;&#108;&#105;&#117;&#64;&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;&#46;&#99;&#110;"><span>shisheng_liu@yahoo.com.cn</span></a></span><span>。</span></p>
<p align=left><span>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>调度算法</span><span><br><st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False">2.1.1</st1:chsdate>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>常用概念</span><span><br>2.1.1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>定时中断</span><span><br>&nbsp;&nbsp;&nbsp; </span><span>通过硬件的可编程中断控制器</span><span>8254</span><span>来实现，定时中断发生的频率由</span><span>HZ</span><span>定义，发生的时间间隔被称为</span><span>tick</span><span>。</span><span><br>2.1.1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPU</span><span>节拍（</span><span>tick</span><span>）</span><span><br></span><span>计算机内部时间的一个计数单位，表示发生一次时钟中断的时间间隔。</span><span><br>2.1.1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HZ<br>&nbsp;</span><span>时钟中断发生的频率。在</span><span>i386</span><span>机器上，</span><span>HZ</span><span>被定义为</span><span>100</span><span>，因此时钟中断每</span><span>10ms</span><span>一次。</span><span><br>2.1.1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPU</span><span>时期</span><span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>调度是以</span><span>CPU</span><span>时期为周期的，在一个</span><span>CPU</span><span>时期</span><span>/</span><span>调度周期内，系统中所有程序都被执行直到用完当前的时间片，然后所有进程的</span><span>counter</span><span>值被重新计算，并开始另一个</span><span>CPU</span><span>时期。</span><span><br>2.1.1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>进程的分类</span><span><br></span><span>在调度程序看来，系统中的进程分为两大类，分别是实时进程和普通进程。在任何时候实时进程的执行都高于普通进程。进程数据结构中的</span><span>policy</span><span>成员变量表示了进程是哪一类，而</span><span>sched_set(/get)scheduler</span><span>提供了控制进程调度</span><span>policy</span><span>的用户级编程接口。</span><span><br>2.1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>进程数据结构中相关内容</span><span><br>2.1.2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</span><span>．</span><span>nice <br>&nbsp;&nbsp;&nbsp; </span><span>进程的优先级，影响进程获得</span><span>CPU</span><span>事件的多少，</span><span>20</span><span>为最低，</span><span>-19</span><span>为最高。</span><span><br>2.1.2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2</span><span>．</span><span>counter<br>&nbsp;</span><span>进程时间片所剩余的</span><span>CPU</span><span>节拍数。初始值根据进程的</span><span>nice</span><span>值决定，在每次时钟中断发生时，也就是一个</span><span>CPU</span><span>节拍（</span><span>tick</span><span>）的时候，当前进程的</span><span>counter</span><span>值减</span><span>1</span><span>，如果</span><span>counter</span><span>值变为</span><span>0</span><span>则表示当前进程的时间片已经用完，系统会重新调度，决定下一个执行的进程。</span><span><br>2.1.2.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span><span>．</span><span>need_resched<br>&nbsp; </span><span>标志位。该位在从中断和系统调用中返回的时候被检查，</span><span>need_resched</span><span>为</span><span>1</span><span>的时候表示要求启动调度程序，这通常发生在进程的时间片已经用完，或者因为</span><span>IO</span><span>事件发生而强行抢占当前进程的时候。</span><span><br>2.1.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4</span><span>．</span><span>policy<br>&nbsp; </span><span>进程的调度策略。如果调度策略为</span><span>SCHED_RR</span><span>或者</span><span>SCHED_FIFO</span><span>则表示当前进程为实时进程，否则</span><span>(SCHED_OTHER)</span><span>为普通进程。</span><span><br>2.1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>调度算法说明</span><span> <br>Linux</span><span>采用相当简单但实际证明效果不错的调度算法。在调度的时候，所有正在运行进程的执行权值</span><span>(goodness)</span><span>都被计算，最终权值最高的进程获得执行的机会。假设得到的最大权值为</span><span>0</span><span>，就认为本次</span><span>CPU</span><span>时期已经执行完毕，会重新计算所有进程的</span><span>counter</span><span>值，开始新的</span><span>CPU</span><span>时期。调度算法的核心就是</span><span>goodness</span><span>的计算，计算的基本思路如下：</span><span><br></span><span>如果等待调度的进程是实时进程，它的</span><span>goodness</span><span>为</span><span>1000 + </span><span>本身的优先级</span><span>,</span><span>而普通进程的</span><span>goodness</span><span>远小于</span><span>1000</span><span>，这就保证了实时进程总是优先于普通进程执行。</span><span><br>&nbsp; </span><span>如果进程剩余的</span><span>counter</span><span>为</span><span>0,</span><span>就认为它已经用光了自己在该时期的</span><span>CPU</span><span>时间片，</span><span>goodness</span><span>返回</span><span>0</span><span>。</span><span><br>&nbsp; </span><span>对于其他的情况，用下面的公式来计算</span><span>goodness:<br>goodness = counter + 20 &#8211; nice</span><span>；</span><span><br>2.1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>相关函数</span><span><br>1</span><span>．</span><span>schedule()&nbsp; in kernel/sched.c<br></span><span>主调度函数，选择要运行的进程</span><span><br>2</span><span>．</span><span>goodness() in kernel/sched.c<br></span><span>由</span><span>schedule()</span><span>调用，计算进程的执行权值</span><span><br>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>调度程序的执行</span><span><br></span><span>可以通过两种方式来激活调度程序，分别是直接调用和延迟调用。</span><span><br>3.1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>直接调用</span><span><br>&nbsp;&nbsp; </span><span>当</span><span>current</span><span>进程准备主动放弃</span><span>CPU</span><span>的时候，它会直接调用调度程序</span><span>schedule()</span><span>，将</span><span>CPU</span><span>让给另一个进程。</span><span><br></span><span>促使</span><span>current</span><span>进程主动放弃</span><span>CPU</span><span>的原因有两种，一种情况是</span><span>current</span><span>需要睡眠（阻塞）来等待所需的资源准备好，此时</span><span>current</span><span>的状态被设置为</span><span>TASK_INTERRUPTABLE</span><span>或</span><span>TASK_UNINTERRUPTABLE</span><span>，在调用</span><span>schedule()</span><span>后进程进入睡眠状态；另一种情况下进程设置</span><span>SCHED_YIELD</span><span>的调度策略，然后用</span><span>schedule()</span><span>，此时进程只是短暂的放弃</span><span>CPU</span><span>，在下一次</span><span>schedule()</span><span>被调用的时候进程会继续参与</span><span>CPU</span><span>的竞争。</span><span><br>3.1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>延迟调用</span><span><br></span><span>通过设置当前进程的</span><span>need_resched</span><span>标志来在其后的某个时刻激活调度程序。前面说过，在从中断</span><span>/</span><span>异常</span><span>/</span><span>系统调用中返回时，</span><span>need_resched</span><span>标志被检查，在标志不为</span><span>0</span><span>的时候会激活调度程序。例如：当时钟中断发生时，中断处理程序检查到当前进程的时间片已经执行完毕，它就会设置当前进程的</span><span>need_resched</span><span>标志；另一个例子是当某个</span><span>IO</span><span>中断发生时，中断处理程序发现有进程在等待该</span><span>IO</span><span>事件，它会将正在等待的进程的状态变为执行态，并设置当前进程的</span><span>need_resched</span><span>标志。当中断处理程序结束</span><span>[</span><span>注</span><span>1]</span><span>，系统会重新调度，在这种情况下，新转入执行态的进程很可能会获得执行机会，从而使系统保持对</span><span>IO</span><span>事件的快速响应。</span><span><br>[</span><span>注</span><span>1]</span><span>：如果当前进程运行在内核态，即正在执行系统调用过程中，重新调度会延迟到当前进程的系统调用执行完毕才进行。</span><span><br>3.1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>相关函数</span><span><br>&nbsp; 1</span><span>．</span><span>wake_up_common() in kernel/sched.c<br>&nbsp;&nbsp; </span><span>激活</span><span>IO</span><span>等待队列中的进程，它会顺序调用</span><span>try_to_wake_up()</span><span>，</span><span>reschedule_idle()</span><span>等函数来要求对进程进程重新调度。</span><span><br>&nbsp; 2</span><span>．</span><span>do_timer() in kernel/timer.c<br>&nbsp;&nbsp; </span><span>定时时钟中断程序，减少当前进程的</span><span>counter</span><span>值，如果</span><span>counter</span><span>已经用完，则设置进程的</span><span>need_resched</span><span>域要求重新调度。</span><span><br>&nbsp; 3</span><span>．</span><span>ret_from_intr/sys_call/exception&nbsp;&nbsp; in arch/i386/entry.S<br>&nbsp; </span><span>汇编语言中的程序点，在从中断</span><span>/</span><span>异常</span><span>/</span><span>系统调用中返回时都会执行这一段程序，检查当前进程的</span><span>need_resched</span><span>域，如果不为</span><span>0</span><span>就会激活</span><span>schedule()</span><span>重新调度。</span></p>
<p align=left><span>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>进程调度示意图</span><span><br>linux</span><span>的进程调度如图</span><span>1</span><span>所示。</span><span><br><br>&nbsp;<br>5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SMP</span><span>系统的调度</span><span><br>SMP</span><span>系统中的调度算法的不同主要表现在调度算法的最后，对于被切换出当前</span><span>CPU</span><span>运行权的进程调用了</span><span>schedule_tail</span><span>函数，目的是看能够将它转移到另一个</span><span>CPU</span><span>中运行。</span></p>
<p align=left><span>6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>问题与答案</span><span><br>Q</span><span>．在当前系统下，调度时间片的长度是多少？</span><span><br>A. </span><span>与</span><span>2.2.x</span><span>版的内核相比，</span><span>kernel2.4.x</span><span>的时间片长度缩短了，对于最高优先级的进程来说，时间片的长度为</span><span>100ms</span><span>，默认优先级进程的时间片长度为</span><span>60ms</span><span>，而最低优先级进程的时间片长度为</span><span>10ms</span><span>。</span><span><br>Q. Linux</span><span>如何保证对</span><span>I/O</span><span>事件相对比较快的响应速度，这个响应速度是否与调度时间片的长短有关？</span><span><br>A</span><span>．当</span><span>I/O</span><span>事件发生的是时候，对应的中断处理程序被激活，当它发现有进程在等待这个</span><span>I/O</span><span>事件的时候，它会激活等待进程，并且设置当前正在执行进程的</span><span>need_resched</span><span>标志，这样在中断处理程序返回的时候，调度程序被激活，原来在等待</span><span>I/O</span><span>事件的进程（很可能）获得执行权，从而保证了对</span><span>I/O</span><span>事件的相对快速响应（毫秒级）。</span><span><br>&nbsp;&nbsp;&nbsp; </span><span>从上面的说明可以看出，在</span><span>I/O</span><span>事件发生的时候，</span><span>I/O</span><span>事件的处理进程会抢占当前进程，系统的响应速度与调度时间片的长度无关。</span><span><br>Q</span><span>．高优先级</span><span>(nice)</span><span>进程和低优先级进程在执行上有何区别？例如一个优先级为</span><span>-19</span><span>（最高优先级）的进程和优先级为</span><span>20</span><span>（最低）的进程有何区别</span><span><br>A. </span><span>进程获得的</span><span>CPU</span><span>时间的绝对数目取决于它的初始</span><span>counter</span><span>值，初始的</span><span>counter</span><span>的计算公式</span><span>(sched.c in kernel <st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False">2.4.14</st1:chsdate>)</span><span>如下：</span><span><br>p-&gt;counter = (p-&gt;counter &gt;&gt; 1) + ((20 - p-&gt;nice) &gt;&gt; 2) +1)<br></span><span>由公式可以计算出，对于标准进程（</span><span>p-&gt;nice </span><span>为</span><span>0</span><span>），</span><span> </span><span>得到的初始</span><span>counter</span><span>为</span><span>6</span><span>，即进程获得的时间片为</span><span>60ms</span><span>。</span><span><br></span><span>最高优先级进程（</span><span>nice</span><span>为</span><span>-19</span><span>）的初始</span><span>counter</span><span>值为</span><span>10</span><span>，进程的时间片为</span><span>100ms</span><span>。</span><span><br></span><span>最低优先级进程（</span><span>nice</span><span>为</span><span>20</span><span>）的初始</span><span>counter</span><span>值为</span><span>1,</span><span>进程时间片为</span><span>10ms</span><span>。</span><span><br>&nbsp;</span><span>结论是最高优先级进程会获得最低优先级进程</span><span>10</span><span>倍的执行时间，普通优先级进程接近两倍的执行时间。当然，这是在进程不进行任何</span><span>IO</span><span>操作的时候的数据，在有</span><span>IO</span><span>操作的时候，进程会经常被迫睡眠来等待</span><span>IO</span><span>操作的完成</span><span>,</span><span>真正所占用的</span><span>CPU</span><span>时间是很难比较的。</span><span><br></span><span>我们可以看到每次重新计算</span><span>counter</span><span>的时候，新的</span><span>counter</span><span>值都要加上它本身剩余值的一半，这种奖励只适用于通过</span><span>SCHED_YIELD</span><span>主动放弃</span><span>CPU</span><span>的进程，只有它在重新计算的时候</span><span>counter</span><span>值没有用完，所以在计算后</span><span>counter</span><span>值会增大，但永远不可能超过</span><span>20</span><span>。</span><span><br>Q</span><span>．进程是否可能在执行系统调用的过程中被抢占？</span><span><br>A</span><span>．进程在执行系统调用的过程中不会被抢占。让我们设想进程</span><span>a</span><span>正在执行的过程中发生中断，而中断处理程序判断出系统需要被重新调度，它会设置进程</span><span>a</span><span>的</span><span>need_resched</span><span>标志（</span><span>need_resched</span><span>标志的作用参见前面说明），在中断处理程序结束之后（</span><span>ret_from_intr</span><span>），系统会检查被中断处理程序中断执行的进程的优先级，如果此时进程</span><span>a</span><span>处在用户态，系统会直接激活调度程序完成进程切换；而如果此时进程</span><span>a</span><span>处在内核态，系统会不作调度而恢复进程</span><span>a</span><span>的执行，只有进程</span><span>a</span><span>完成系统调用之后（</span><span>ret_from_sys_call</span><span>），它的</span><span>need_resched</span><span>标志才会被检查，从而完成进程切换。</span><span><br></span><span>进程在内核态不会被抢占的特点减少了单</span><span>CPU</span><span>系统中内核设计的复杂性，因为不需要考虑不同进程对内核代码和数据结构的竞争。</span></p>
<p align=left><span>7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>参考文献</span><span> <br>1</span><span>．</span><span>&nbsp; Linux</span><span>内核源代码版本</span><st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False"><span>2.4.14</span></st1:chsdate><br><span>在任何时候真实的代码总是提供给我们最准确和详细的资料。感谢</span><span>Linus Torvalds</span><span>，</span><span>Alan Cox</span><span>和其它</span><span>linux</span><span>开发者的辛勤劳动。</span><span><br>2</span><span>．</span><span>DANIEL P.BOVET &amp; MARCO CESATI <br>&nbsp; &lt;&gt; ISBN: 0-<st1:chsdate w:st="on" Year="596" Month="2" Day="2" IsLunarDate="False" IsROCDate="False">596-00002-2</st1:chsdate>&nbsp; O&#8217;REILLY 2001<br>&nbsp; </span><span>中译版</span><span> </span><span>《深入理解</span><span>Linux</span><span>内核》</span><span> </span><span>陈莉君等译</span><span> ISBN: 7-5083-0719-4 </span><span>中国电力出版社</span><span> 2001</span><span>。</span><span><br></span><span>本书是专门介绍</span><span>linux</span><span>内核结构的书中最详尽的一本，对代码分析讲解的也比较深入，基于</span><span>2.2</span><span>的内核版本</span><span><br>3</span><span>．</span><span>W.Richard Stevens <br>&nbsp;</span><span>《</span><span>UNIX</span><span>环境高级编程》</span><span> </span><span>尤晋元译</span><span> ISBN: 7-111-07579-X&nbsp;&nbsp; </span><span>机械工业出版社</span><span> 2000<br>&nbsp; UNIX</span><span>编程圣经，程序员手头必备的书籍之一</span><span>,</span><span>对所有</span><span>UNIX</span><span>开发人员，无论水平高低，都有参考价值。翻译的水准也难得一见的高明。</span></p>
<p>&nbsp;</p>
<img src ="http://www.cnitblog.com/aaron-li/aggbug/56271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aaron-li/" target="_blank">Aaron@SMiT</a> 2009-04-11 23:20 <a href="http://www.cnitblog.com/aaron-li/archive/2009/04/11/56271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>