﻿<?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>博客园-XY</title><link>http://www.cnblogs.com/xuyuan77/</link><description>没有任何借口！！！</description><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2008 21:48:48 GMT</lastBuildDate><pubDate>Mon, 13 Oct 2008 21:48:48 GMT</pubDate><ttl>60</ttl><item><title>分形的乐趣之_Hilbert曲线</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/10/13/1310269.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Mon, 13 Oct 2008 10:30:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/10/13/1310269.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1310269.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/10/13/1310269.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1310269.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1310269.html</trackback:ping><description><![CDATA[摘要: 分形图是奇特而美妙的，今天我们就来看一下有趣的Hilbert曲线的生成过程及编程实现。&nbsp;&nbsp;<a href='http://www.cnblogs.com/xuyuan77/archive/2008/10/13/1310269.html'>阅读全文</a><img src ="http://www.cnblogs.com/xuyuan77/aggbug/1310269.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42969/" target="_blank">[新闻]MySpace推自助广告平台MyAds</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>深入理解计算机系统2_信息存储(读书笔记)</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/10/11/1308830.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Sat, 11 Oct 2008 14:30:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/10/11/1308830.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1308830.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/10/11/1308830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1308830.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1308830.html</trackback:ping><description><![CDATA[摘要: 信息存储是编程的根基，为什么在网络通信中需要对字节序进行转换？
我们编程中经常用到的指针的本质是什么？在本文中将获得答案，
这是我阅读《深入了解计算机系统》第二篇读书笔记。&nbsp;&nbsp;<a href='http://www.cnblogs.com/xuyuan77/archive/2008/10/11/1308830.html'>阅读全文</a><img src ="http://www.cnblogs.com/xuyuan77/aggbug/1308830.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42960/" target="_blank">[新闻]Facebook创始人:信息共享或存摩尔定律</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>远程桌面连接指定会话（Session）</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/10/10/1307745.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Fri, 10 Oct 2008 01:03:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/10/10/1307745.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1307745.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/10/10/1307745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1307745.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1307745.html</trackback:ping><description><![CDATA[<p>不管是哪个用户，先登录远程桌面</p>
<p>&nbsp;</p>
<p>运行CMD</p>
<p>输入query session查看在进行任务那个会话的ID<br />
然后再用tscon ID将当前会话转到需要的那个会话中&nbsp;</p>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1307745.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>【转】UML类图关系全面剖析</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/10/07/1305447.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Tue, 07 Oct 2008 05:05:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/10/07/1305447.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1305447.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/10/07/1305447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1305447.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1305447.html</trackback:ping><description><![CDATA[<p>本文随便转载，请保留出处：<a href="http://blog.csdn.net/dylgsy/">http://blog.csdn.net/dylgsy/</a></p>
<p><font size="1">UML的类图关系分为：&nbsp;关联、聚合/组合、依赖、泛化（继承）。而其中关联又分为双向关联、单向关联、自身关联；下面就让我们一起来看看这些关系究竟是什么，以及它们的区别在哪里。</font><br />
<br />
<strong>1、关联</strong><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_1.JPG" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}"><br />
<br />
<font size="1">双向关联：<br />
C1-C2：指双方都知道对方的存在，都可以调用对方的公共属性和方法。<br />
<br />
在GOF的设计模式书上是这样描述的：虽然在分析阶段这种关系是适用的，但我们觉得它对于描述设计模式内的类关系来说显得太抽象了，因为在设计阶段关联关系必须被映射为对象引用或指针。对象引用本身就是有向的，更适合表达我们所讨论的那种关系。所以这种关系在设计的时候比较少用到，关联一般都是有向的。<br />
<br />
使用ROSE 生成的代码是这样的：</font></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C1&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_10_33_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_10_33_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C2</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;theC2;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C2&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_47_70_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_47_70_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C1</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;theC1;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;</span></div>
</div>
<p><font size="1">双向关联在代码的表现为双方都拥有对方的一个指针，当然也可以是引用或者是值。</font><br />
<br />
<br />
<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_17.JPG" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}"><br />
<br />
<font size="1">单向关联:<br />
C3-&gt;C4：表示相识关系，指C3知道C4，C3可以调用C4的公共属性和方法。没有生命期的依赖。一般是表示为一种引用。<br />
<br />
生成代码如下：</font></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C3&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_10_33_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_10_33_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C4</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;theC4;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C4&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_47_50_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_47_50_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;</span></div>
</div>
<p><font size="1">单向关联的代码就表现为C3有C4的指针，而C4对C3一无所知。</font><br />
<br />
<br />
</p>
<p><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_31.JPG" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}"><br />
<br />
<font size="1">自身关联（反身关联）：<br />
自己引用自己，带着一个自己的引用。<br />
<br />
代码如下：</font></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C14&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_11_36_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_11_36_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C14</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;theC14;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;</span></div>
</div>
<p><font size="1">就是在自己的内部有着一个自身的引用。<br />
<br />
</font><font size="1"><strong>2、聚合/组合<br />
</strong><br />
当类之间有整体-部分关系的时候，我们就可以使用组合或者聚合。</font><br />
<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_39.JPG" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}"><br />
<br />
<font size="1">聚合：表示C9聚合C10，但是C10可以离开C9而独立存在（独立存在的意思是在某个应用的问题域中这个类的存在有意义。这句话怎么解，请看下面组合里的解释）。<br />
<br />
代码如下：</font></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C9&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_10_34_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_10_34_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C10&nbsp;theC10;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C10&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_49_52_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_49_52_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span></div>
</div>
<p>&nbsp;</p>
<p><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_54.JPG" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}"><br />
<br />
<font size="1"><clk>组合（也有人称为包容）：一般是实心菱形加实线箭头表示，如上图所示，表示的是C8被C7包容，而且C8不能离开C7而独立存在。但这是视问题域而定的，例如在关心<nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,0)" onmouseout="kwL(event,this)">汽车</nobr>的领域里，轮胎是一定要组合在汽车类中的，因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里，就算轮胎离开了汽车，它也是有意义的，这就可以用聚合了。在《敏捷开发》中还说到，A组合B，则A需要知道B的生存周期，即可能A负责生成或者释放B，或者A通过某种途径知道B的生成和释放。</clk><br />
<br />
他们的代码如下：</font></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C7&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_10_32_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_10_32_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C8&nbsp;theC8;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C8&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_46_48_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_46_48_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;</span></div>
</div>
<p><font size="1">可以看到，代码和聚合是一样的。具体如何区别，可能就只能用语义来区分了。<br />
<br />
<strong>3、依赖</strong></font><br />
<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_67.JPG" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}"><br />
<br />
<font size="1">依赖:<br />
指C5可能要用到C6的一些方法，也可以这样说，要完成C5里的所有功能，一定要有C6的方法协助才行。C5依赖于C6的定义，一般是在C5类的头文件中包含了C6的头文件。ROSE对依赖关系不产生属性。<br />
<br />
注意，要避免双向依赖。一般来说，不应该存在双向依赖。<br />
<br />
ROSE生成的代码如下：</font><br />
</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #008000">//</span><span style="color: #008000">&nbsp;C5.h</span><span style="color: #008000"><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #000000">＃i nclude&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C6.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C5&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_35_38_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_35_38_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;C6.h</span><span style="color: #008000"><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #000000">＃i nclude&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C5.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C6<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_76_79_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_76_79_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span></div>
</div>
<p><font size="1">虽然ROSE不生成属性，但在形式上一般是A中的某个方法把B的对象作为参数使用(假设A依赖于B)。如下：</font></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #000000">＃i nclude&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">B.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_23_52_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_23_52_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_5.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func(B&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">b);<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span></div>
</div>
<p><font size="1"><strong><font color="#ff0000">那依赖和聚合\组合、关联等有什么不同呢？</font></strong><br />
<br />
关联是类之间的一种关系，例如老师教学生，老公和老婆，水壶装水等就是一种关系。这种关系是非常明显的，在问题领域中通过分析直接就能得出。<br />
<br />
依赖是一种弱关联，只要一个类用到另一个类，但是和另一个类的关系不是太明显的时候（可以说是&#8220;uses&#8221;了那个类），就可以把这种关系看成是依赖，依赖也可说是一种偶然的关系，而不是必然的关系，就是&#8220;我在某个方法中偶然用到了它，但在现实中我和它并没多大关系&#8221;。例如我和锤子，我和锤子本来是没关系的，但在有一次要钉钉子的时候，我用到了它，这就是一种依赖，依赖锤子完成钉钉子这件事情。</font></p>
<p><font size="1">组合是一种整体-部分的关系，在问题域中这种关系很明显，直接分析就可以得出的。例如轮胎是车的一部分，树叶是树的一部分，手脚是身体的一部分这种的关系，非常明显的整体-部分关系。<br />
<br />
上述的几种关系（关联、聚合/组合、依赖）在代码中可能以指针、引用、值等的方式在另一个类中出现，不拘于形式，但在逻辑上他们就有以上的区别。<br />
<br />
<clk>这里还要说明一下，所谓的这些关系只是在某个问题域才<nobr oncontextmenu="return false" onmousemove="kwM(1)" id="clickeyekey1" onmouseover="kwE(event,1, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,1)" onmouseout="kwL(event,this)">有效</nobr>，离开了这个问题域，可能这些关系就不成立了，例如可能在某个问题域中，我是一个木匠，需要拿着锤子去干活，可能整个问题的描述就是我拿着锤子怎么钉桌子，钉椅子，钉柜子；既然整个问题就是描述这个，我和锤子就不仅是偶然的依赖关系了，我和锤子的关系变得非常的紧密，可能就上升为组合关系（让我突然想起武侠小说的剑不离身，剑亡人亡...）。这个例子可能有点荒谬，但也是为了说明一个道理，就是关系和类一样，它们都是在一个问题领域中才成立的，离开了这个问题域，他们可能就不复存在了。</clk><br />
<br />
<br />
<strong>4、泛化（继承）</strong></font><br />
<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_92.jpg" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}"><br />
<br />
<font size="1">泛化关系：如果两个类存在泛化的关系时就使用，例如父和子，动物和老虎，植物和花等。<br />
ROSE生成的代码很简单，如下：</font></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #000000">＃i nclude&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C11.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C12&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;C11<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_41_43_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_41_43_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;</span></div>
</div>
<p><br />
<strong><font size="1">5、这里顺便提一下模板</font></strong><br />
<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_99.jpg" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}"><br />
<br />
<font size="1">上面的图对应的代码如下：</font></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C13&nbsp;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_3.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top><img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_4.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span><span id="_25_27_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_25_27_Open_Text"><span style="color: #000000">{<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_8.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top>}</span></span><span style="color: #000000">;<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.360doc.com/DownloadImg/16773/346970_2.gif" onload="javascript:if(this.width>1000){this.resized=true;this.style.width=1000;}" align=top></span></div>
</div>
<p><font size="1">这里再说一下重复度，其实看完了上面的描述之后，我们应该清楚了各个关系间的关系以及具体对应到代码是怎么样的，所谓的重复度，也只不过是上面的扩展，例如A和B有着&#8220;1对多&#8221;的重复度，那在A中就有一个列表，保存着B对象的N个引用，就是这样而已。<br />
<br />
好了，到这里，已经把上面的类图关系说完了，希望你能有所收获了，我也费了不少工夫啊（画图、生成代码、截图、写到BLOG上，唉，一头大汗）。不过如果能让你彻底理解UML类图的这些关系，也值得了。:)</font></p>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1305447.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>【转】朱镕基的功与过</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/10/04/1303741.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Sat, 04 Oct 2008 04:32:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/10/04/1303741.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1303741.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/10/04/1303741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1303741.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1303741.html</trackback:ping><description><![CDATA[<p>转自：<font face="Verdana"><a href="http://hi.baidu.com/f15854/blog/item/cc4e0b135baa9e26df540167.html">http://hi.baidu.com/f15854/blog/item/cc4e0b135baa9e26df540167.html</a> </font></p>
<p>● 伊铭（纽约）</p>
<p>朱镕基开始活跃于中国政治、经济舞台始于1991年。当年，邓 小 平慧眼识珠，将他拔擢到中央，任国务院副总理。但朱镕基全面接掌经济改革大权应该是在1993年的八届人大会议之后。作为李鹏的主要副手，朱镕基甘居配角，治理整顿、游刃于通膨与通缩之间，运筹帷幄，最终实现经济软着陆。 </p>
<p>　　至1998年，朱镕基当选总理，从而开启了&#8220;朱镕基主义时代&#8221;。中国经济一直在以7％以上的速度增长，成为近年来世界经济最眩目的亮点。</p>
<p>经济、反腐一起抓</p>
<p>　如果说朱镕基执政的五年是一部电视连续剧的话，那么其剧情可以说是起伏跌宕、轰轰烈烈、荡气回肠、悲喜交集，令人喝彩与令人扼腕之处交相呈现。其中，最令人难忘、最动人心魄的恐怕莫过于他的&#8220;就职演说&#8221;。他发誓：&#8220;不管前面是地雷阵还是万丈深渊，我都将一往无前，义无反顾，鞠躬尽瘁，死而后已。&#8221;</p>
<p>　　在五年任期内，朱镕基声望最隆、权势最大的是头一年。在这一年，先有亚洲金融风暴，然后是百年不遇的华南、华中大水灾，朱镕基一一应付下来。而且，他怒批九江长江大堤是豆腐渣工程，探访灾区农民等，都广获好评。他不仅赢得大部分中国人的好感，在海外也受到广泛尊重。香港一些媒体称他&#8220;朱老板&#8221;，显得相当亲切；而西方学者则在送给他一雅号：&#8220;经济沙皇&#8221;。</p>
<p>　　在五年间，朱镕基推动经济改革及加入世贸，带领中国融入国际社会，尤其值得称道。特别是在亚洲金融风暴、全球经济因恐怖袭击加速衰退的恶劣环境下，中国经济仍维持高速增长，无不与朱镕基政府采取的宏观调控措施相关。</p>
<p>　　朱镕基的名字，是正直清廉、疾恶如仇的代名词。他全力打击贪污腐败，将一大批贪官打入另册；他发誓要不惜一切代价，把厦门远华走私大案的首要嫌犯赖昌星引渡回国；他下令全力追查富豪偷税漏税问题，使中国不少富豪中箭下马。因之，他被戏称为现代版的清朝雍正王，也有人把他比喻为&#8220;中国的戈尔巴乔夫&#8221;。事实上，戈尔巴乔夫与朱镕基并无共同之处。朱镕基将中国带向荣景，而戈尔巴乔夫则使强大的苏联解体，国民经济陷入水深火热之中。</p>
<p>　　朱镕基在最后一次政府工作报告中，从九个方面总结这一届政府的工作，赢得11次掌声。这些政绩是非常明显的，但却掩盖不了中国经济面临的困境和问题：财政债台高筑、金融系统出现危机、内需严重不足、失业或半失业人数不断增加、贫富悬殊加剧、城乡差别和东西部差距不断拉大等等。朱镕基大刀阔斧地精简中央政府机构，但推进法治和增加透明度几乎没有进展。</p>
<p>英雄无力的世代</p>
<p>　　所谓&#8220;朱镕基主义&#8221;的基本内容是：一个确保、三个到位和五项改革。由于这些指标带有相当大的主观性，在具体实施中往往互相制约，互相冲突，不得不经常修正。结果，损害权力利益的改革基本上半途而废，而损害社会利益的改革方案则取得实效。究其根源，乃是许多弊病都牵连整个体制问题，党权无限延伸，官僚腐败没有新闻监督与民主制度的约束。光凭武松打虎之力，只有杯水车薪之效。</p>
<p>&nbsp;</p>
<p>　　必须承认，在过去五年里，朱镕基始终高举反腐的大旗，国内两宗最大的贪污走私案，远华案和广东湛江走私案都是他亲自督办，但腐败势头并没有得到有效抑制。</p>
<p>　　这不是朱镕基的过错。这是一个英雄无力的时代，朱镕基的面前有太多的障碍与制约，根据他的能力、胆魄，本来应该成就一番更加令人称羡的事业。但是，受限于政治、权力以及年龄，他只能走到这一步了。</p>
<p>　　朱镕基得罪很多人，不少中央和地方的当权派对他既恨且惧。他精简机构，让230多位副部级官员下岗，得罪了国务院、中央和人大系统的大小官员；他抓税收，打击走私和骗汇，得罪了地方诸侯；他主张禁止军队经商，断了军队既得利益者的财路；他加强金融监管，剥夺了地方长官随意干涉金融的权力。朱镕基为此付出了沉重的代价。除了遭人非议、指摘、内心熬煎以外，他的激情与锐气也遭到挫伤。</p>
<p>　　如果说朱镕基有很多遗憾，那么，这些遗憾也是时代的遗憾，中国的遗憾。　</p>
<p>　　朱镕基曾经说：&#8220;我自己所做的工作是有限的。我只希望在我卸任以后，全国人民能说一句，我朱镕基是一个清官，不是贪官，我就很满意了。如果他们再慷慨一点，说朱镕基还是办了一点实事，我就谢天谢地了。&#8221;这是朱镕基的自谦之言，从另一个方面也反映了他对腐败现象的厌恶。</p>
<p>　　在离任前夕，朱镕基在一次座谈上忍不住感叹：&#8220;因为我不懂得政治艺术，又没有心机去研究、摸索政治艺术，没有从政的志向嘛，也就注定是要遗憾的。&#8221;</p>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1303741.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42957/" target="_blank">[新闻]金融风暴波及全球创业板 中国概念股难独善其身</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>VC常见问题（不断更新）</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/09/25/1298841.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Thu, 25 Sep 2008 07:29:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/09/25/1298841.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1298841.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/09/25/1298841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1298841.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1298841.html</trackback:ping><description><![CDATA[<p>1.没有找到MFC42D.DLL,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题. </p>
<p><strong>解决办法</strong>：在VC6.0中，选择【project】-&gt;【Project settings】-&gt;【general】选项卡-&gt;【Microsoft Fundation class】下拉列表，选择&#8220;Use&nbsp;MFC in a Static Library&#8221;项。使用&#8220;Use&nbsp;MFC in a Static Library&#8221;发布程序，目标机就可以不需要MFC库的dll了。</p>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1298841.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>【转】双语:《阿甘正传》经典台词</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/09/20/1294649.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Sat, 20 Sep 2008 02:44:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/09/20/1294649.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1294649.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/09/20/1294649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1294649.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1294649.html</trackback:ping><description><![CDATA[<p>转自：<font face="Verdana"><a href="http://www.ebigear.com/news-86-54084.html">http://www.ebigear.com/news-86-54084.html</a></font> </p>
<p><strong style="color: red">1</strong>.His back is as crooked as a politician.<br />
<br />
不仅指出了后背的弯曲,而且顺便损了一顿政客的腐败。一语双雕。<br />
<br />
<strong style="color: red">2</strong>.Life was like a box of chocolate ,you never know what you're gonna get.<br />
<br />
人生就像一盒巧克力,你永远不知道会尝到哪种滋味.为什么说巧克力而不说棒棒糖呢,因为在美国巧克力通常有十二快或二十四块,每个都有不同的包装和口味形状和颜色,以前没有标志。只能拆开放在嘴里,品尝了之后才知道个中滋味。<br />
<br />
<strong style="color: red">3</strong>.There is an awful lot you can tell about a person by their shoes.Where they're going. Where they've been.<br />
<br />
通过人家的鞋可以了解别人很多的东西。<br />
<br />
<strong style="color: red">4</strong>.You are no different than anybody else is.<br />
<br />
你和别人没有任何的不同,阿甘的妈妈从小就给阿甘一种自信。<br />
<br />
<strong style="color: red">5</strong>.Stupid is as stupid does.<br />
<br />
傻人做傻事。阿甘看似傻人,然而往往是那些自以为是自恃甚高的人做了傻事,所以看一个人是看她的行动而非外表。这是典型的阿甘用语。<br />
<br />
<span style="color: red"><strong>6</strong></span>.We were like peas and carrots.<br />
<br />
豌豆和胡萝卜丁,一个圆的,一个方的;一个红的,一个绿的。它们的共同点虽然没有太大的味道但营养非常高。故但在美国烹饪时做为主食的点缀,而且它俩都是同时出现。故引申为形影不离。<br />
<br />
<span style="color: red"><strong>7</strong></span>.There must be someing can be done.<br />
<br />
不同的与其可以传递不同的信息,在电影里阿甘妈妈侧身,眼神里充满的诱惑,对校长暧昧地说了这句话。校长没有领会错她的意思～～女孩子慎用!!<br />
<br />
<span style="color: red"><strong>8</strong></span>.Miracles happen every day.<br />
<br />
美国人的宗教信仰。阿甘受的时非常典型的美国教育。<br />
<br />
<span style="color: red"><strong>9</strong></span>. Son-of-bitch.<br />
<br />
狗娘养的、狗崽。骂起人来过瘾!<br />
<br />
<span style="color: red"><strong>10</strong></span>.Sure as hell was.<br />
<br />
绝对可信,铁板定钉了,敢以人格担保的可信,就是这种感觉。 <br />
<br />
<span style="color: red"><strong>11</strong></span>.Ain't I going to be me?<br />
<br />
我不能成为我自己么,真实的,本色的自我?<br />
<br />
<span style="color: red">12</span>.Nobody gives a horse's shit who you are,puss ball.<br />
<br />
没人在乎你是谁,女里女气的男人,明显的骂人的话。<br />
<br />
<span style="color: red">13</span>.Get your maggoty ass on the bus.<br />
<br />
滚到车上来!<br />
<br />
<span style="color: red">14</span>.That is the outstanding answer I've ever heard.<br />
<br />
夸奖别人一定要把这句话挂在嘴上。<br />
<br />
<span style="color: red">15</span>.Just like that ,she was gone.<br />
<br />
就这样,她走了。阿甘一生最爱的人走了,不知该说什么,一切仅在不言之中,阿甘有一点点的心酸,有一点点的无奈。但是更多的一种感觉是:上帝的存在。<br />
<br />
<span style="color: red"><strong>16</strong></span>.I do not know much about it ,but I think some of America's best young men served in this war.<br />
<br />
阿甘对战争不了解,但他知道美国的新鲜血液都战死在越南的战场了。<br />
<br />
<span style="color: red"><strong>17</strong></span>.A little of stinging rain,and big old fat rain.<br />
<br />
牛毛细雨,瓢泊大雨<br />
<br />
<span style="color: red"><strong>18</strong>.</span>There ain&#8217;t something you can find just around the corner.<br />
<br />
形容很不容易找到的东西。<br />
<br />
<span style="color: red"><strong>19</strong></span>.The secret to this game is ,no matter what happens ,never ,ever take your eye off the ball.<br />
<br />
为了表达&#8220;永远&#8221;的口气,口语中要每句说得很清楚<br />
<br />
<strong style="color: red">20</strong>.Nothing just happens,it's all part of a plan.<br />
<br />
没有事情随随便便发生,都是计划的一部分。宿命论! <br />
<br />
<span style="color: red"><strong>21</strong></span>.army&#8217;s value=loyalty,duty, respect,selfless,service honor,ivtegrity,pessonal courage .<br />
<br />
每个单词的首个字母连起来就是LDRSHIP=leadship.美国军人的七项素质。<br />
<br />
<span style="color: red"><strong>21</strong></span>.There is one small step for a man,a giant leap for mankind.<br />
<br />
某人的一小步就是人类的一大步。<br />
<br />
<span style="color: red"><strong>22</strong></span>.A promise is a promise.(made a promise and keep a promise).<br />
<br />
信守承诺。阿甘信守了承诺,最后也得到了最好的回报。<br />
<br />
<strong style="color: red">23</strong>.I am a man of my word.<br />
<br />
我是信守我承诺的人。<br />
<br />
<span style="color: red"><strong>24</strong></span>.Where the hell is this God of yours?<br />
<br />
他妈的你的上帝在哪里?<br />
<br />
<span style="color: red"><strong>25</strong></span>.There is only so much of fortune a man really neads and the rest is just for showing off.<br />
<br />
一个人真正需要的财富就那么一点点,其余的都是用来炫耀的,正应了中国的古话:纵有广厦千间,夜眠三尺之地。<br />
<br />
<span style="color: red"><strong>26</strong></span>. You got to go when you got to go.<br />
<br />
不得不去洗手间的时候,不得不去。<br />
<br />
<span style="color: red"><strong>27.</strong></span>Shit happens!<br />
<br />
不好的事情发生了。<br />
<br />
<span style="color: red"><strong>28</strong></span>.You have got to put the past behinde you before you can move on.<br />
<br />
放下包袱,继续前进。<br />
<br />
<span style="color: red"><strong style="color: red">29</strong></span>.It was like just before the sun goes to bed down on the bayou.There was a million sparkles on the river..<br />
<br />
就像太阳在落山前映射在河口上,有无数的亮点在闪闪发光。<br />
<br />
<span style="color: red"><strong>30</strong></span>.If there is anything you need I will not be far away.<br />
<br />
用情至专!<br />
<br />
<span style="color: red"><strong>31</strong></span>.It's my time. It's just my time. Oh, now, don't you be afraid sweetheart. Death is just a part of life, something we're all destined to do. I didn't know it. But I was destined to be your momma. I did the best I could.<br />
<br />
母亲:别害怕,死亡是生命的一部分,是我们注定要去做的一件事。我不知道怎么回事,但我注定是你的妈妈,并且我尽我的全力去做好。<br />
<br />
<span style="color: red">【词汇】million </span><br />
<br />
I could eat about a million and a half of these. <br />
<br />
我能吃下去无数块巧克力。Million 在美国人的日常用语中经常见到,用夸张的语气表示数量的不胜枚举。例如本句中,阿甘形容自己可以吃下&#8220;一百五十万块巧克力&#8221;,意即百吃不厌。<br />
<br />
1. 阿甘在形容自己是多年来第一批访问中国的美国人时,是这样讲的:I was the first American to visit the land of China in like a million years or something like that. 我是几百万年来第一批访问中国的美国人。 <br />
<br />
2. 当一个美国人在形容自己即将到来的婚礼是多么兴师动众时,他可以这样表述:It&#8217;s like a million people flying in around the world. 似乎有几百万人从世界各地飞来参加我们的婚礼。 <br />
<br />
3. 类似的表达方法还有&#8220;thousand&#8221;,&#8220;hundred&#8221;,甚至&#8220;twenty&#8221;。1) Our house had been in Mama&#8217;s family since her grandpa&#8217;s grandpa&#8217;s grandpa had come across the ocean about a thousand years ago. 自打一千年前妈妈的爷爷的爷爷的爷爷祖父漂洋过海来到这里,这座房子就属于妈妈的家族。2) I&#8217;ve told you a hundred times that today I&#8217;ll come back late. <br />
<br />
我给你讲过无数次了,今天我会晚些回来。 <br />
<br />
【句型】I bet you could walk all day in shoes like that and not feel a thing. <br />
<br />
我保证你穿这鞋走一天路也没有什么感觉。<br />
<br />
表示坚信不疑的常用句型,参考下例:<br />
<br />
1. I bet Nick is sitting in front of his computer surfing on the internet right now. 我担保现在尼克正坐在计算机前上网呢。<br />
<br />
2. --God! I am dog-tired after the hike. &#8211;I bet you are. --天!远足之后我可真累惨了。 --你说的没错。<br />
<br />
3.I bet you will never guess who I saw this morning. 你肯定猜不到今早儿我看到谁了。<br />
<br />
*There must be something can be done. <br />
<br />
咱们肯定能做点什么补救一下。<br />
<br />
阿甘的妈妈在恳求小学校长时的一句话,在此一语双关,意即为了自己的儿子,当妈的&#8220;豁出去了&#8221;。因此在自己处于劣势时,不要轻易放弃,因为一切事情都暗含转机,只要有一线希望,就应该积极寻求事情的解决方法。比如你考试仅差一分没有通过,也许在去见教授之前,你就应该满怀信心:<br />
<br />
There must be something can be done. 肯定能找到补救的方式。 <br />
<br />
【经典】Life is like a box of chocolate. You never know what you&#8217;re going to get. <br />
<br />
是本片最广为传诵的一句台词,更是堪称好莱坞电影中的经典之最。&#8220;人生就像一盒巧克力,你永远不会知道你将尝到什么滋味&#8221;。将生活的百味凝孕在一盒充满诱惑的什锦巧克力中,甜酸苦辣只有在成长过程中去挖掘和回味,才会发现世事之无常,但这一切都是命运的安排,生活的真谛,也许面对各种上帝的赐予,以一颗平常心坦然受之,才会品出其中精彩。 </p>
<div id="resManage"></div>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1294649.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42955/" target="_blank">[新闻]2008年10月13日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Food</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/09/14/1290783.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Sun, 14 Sep 2008 05:46:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/09/14/1290783.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1290783.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/09/14/1290783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1290783.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1290783.html</trackback:ping><description><![CDATA[<p><font face="Verdana">Talking about the food, Chinese food have a rich culture and a long history. Because </font></p>
<p><font face="Verdana">China has so many provinces, so there are a lot kinds of food in china, rich and </font></p>
<p><font face="Verdana">colorful. Ok, let's tell everyone which food I like most. Needless to say, Sichuan-style </font></p>
<p><font face="Verdana">food&nbsp; is my favorite, especially the exponent, Huiguorou or double cooked pork slices. </font></p>
<p><font face="Verdana">You know why? because twice cooked pork give me a strong feeling of satisfied after I </font></p>
<p><font face="Verdana">had&nbsp; it. So it's funny.&nbsp; If I was hungry or if my friends ask me to select sth to eat, </font></p>
<p><font face="Verdana">the twice cooked pork is top-priority. You know, Mapobeen-curd is very famous in </font></p>
<p><font face="Verdana">Sichuan-style food, even in china, but for me, I just feel it Ok, I'm not very </font></p>
<p><font face="Verdana">interested about it. Another famous food, Chop with smeet and sour sauce,is&nbsp; in my hated </font></p>
<p><font face="Verdana">food list, even I know many girls and ladies love that style food very much. Because, </font></p>
<p><font face="Verdana">when I have meal, the rice can't be lacked, but if I eat rice, I don't like&nbsp; sth </font></p>
<p><font face="Verdana">sweet and sour.</font></p>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1290783.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42954/" target="_blank">[新闻]Google Android手机大受欢迎,已经订出150万台</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>第一次参加英语角</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/09/14/1290781.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Sun, 14 Sep 2008 05:26:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/09/14/1290781.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1290781.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/09/14/1290781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1290781.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1290781.html</trackback:ping><description><![CDATA[<p><font face="Verdana"></p>
<p><font face="Verdana">下个月开始要找工作了，希望自己在英语面试的时候有更好的表现，所以觉得有必要再强化一下英语口语。自己已经重新坚持学习英语有半年多了，听力有了明显的提高，基本上</font><font face="Verdana">能够听懂像CRI和CCTV9的节目，至于口语吗，只是自我感觉应该比年初时有了明显进步，当然口语只是自我感觉，要实战演练下，心中才有底，所以决定去一下英语角，于是前天</font><font face="Verdana">（星期五）晚上去了下成都锦江宾馆旁的英语角。</font></p>
<p><font face="Verdana"></font>&nbsp;</p>
<p><font face="Verdana">去之前，因为毕竟是头一次去，所以有些担心，认为有个partner比较合适点，于是就在英语QQ群中约了一个partner（VIVI）。英语角说是傍晚7点开始，下班后怀着一个兴奋又忐忑的心出</font><font face="Verdana">发了。决定先去天府广场逛哈书店，再去英语角。因为怕去早了没人。 但由于一路上，交通比较堵塞，到天府广场时，我看已经没时间逛书店了，于是直接走路去锦江宾馆。在路</font><font face="Verdana">上，自己也不忘演练口语，不断用英语自言自语说些什么，给自己打气。说实话，心中还是有些紧张的。</font><font face="Verdana">到了英语角，刚好7点钟，给VIVI打了个电话，她说要迟些才过来。于是我自己就先溜达一下。但感觉挺失望的，怎么就那么几个人。我见就三四个人围着一个五十多岁的老外，而</font><font face="Verdana">其他长椅上零零星星的坐着几个人，都是各坐各的，似乎是等着什么，等别人前去主动搭话，还是只是在这儿坐着看风景。我带着疑问走过了这些人，因为是在河边，所以我沿着</font><font face="Verdana">河往下游走，因为河边有很多树，视野不是很开阔，我想再往前走走，看还有没有人说英语。可越走，觉得人越少，而且根本就不可能再有人说英语了，应该就是刚才那些人。不</font><font face="Verdana">行，不能走得太远了，自己怕什么，自己来说英语的，于是回头，就算就那几个人，自己也不能白来，那些等着其他的人主动搭话的，我就应该主动一点，主动找搭档。离刚才的</font><font face="Verdana">地方越来越近，自己心中略有紧张，但还是鼓足了劲。首先，我朝那些坐的人走了过去，离我最近的是一位二十来岁的妹妹，穿着比较素，但给人一种还是比较容易接触的感觉，</font><font face="Verdana">离他远一些的是比我岁数大些的小伙。</font></p>
<p><font face="Verdana">我走到她面前，轻声用中文说&#8220;请问你是来参加英语角的吗？&#8221;</font></p>
<p><font face="Verdana">她笑了笑说&#8220;不是，我在这儿等人。&#8221;。</font></p>
<p><font face="Verdana">我说不好意思，第一次来英语角，因为这儿是英语角，误会了。</font></p>
<p><font face="Verdana">她还疑惑的问我说&#8220;这儿是英语角吗&#8221;</font></p>
<p><font face="Verdana">我说是的，然后笑笑走开了，找了一个离她十多米的地方坐了下来。</font></p>
<p><font face="Verdana">不过没没过一分钟，她就拿起她的包，向我走过来，在我旁边坐下，然后对我说，&#8220;那我们来说一会儿英语吧？&#8221;</font></p>
<p><font face="Verdana">于是我们开始交谈，可刚说了两句，就卡壳了。我们互相笑了笑。我用说&#8220;不好意思，突然了点，First， Let's choose a topic.&#8221;我顿了顿，理了下思路，然后开始问她是不是</font><font face="Verdana">学生，什么专业，很快进入了口语交流的状态，虽然中间也偶尔出些小问题，但都没有影响交流的继续，出了问题时，我就说&#8220;If sth you don't know how to express, you </font><font face="Verdana">could talk it in chinese.&#8221;从谈话中，得知她是牙科专业的，经常做一些医学实验。对一个女孩子来讲，不简单。在这个过程中，不时引来了其他人的观望。和她交流了一会儿</font><font face="Verdana">过后，有一个酒店经理加入了我们的谈话，我的英语口语可能要略比那个女孩好些吧，所以就主要是我和这位酒店经理交谈了，恰在这时，那个女孩接了个电话，然后跟我们说拜</font><font face="Verdana">拜，她等的人到了。这下就我和这位酒店经理交谈，这位酒店经理的口语给我的感觉是相当流利，而且语速很快，说实话，我只能听个百分之七八十。还好，勉强能够应付。不过</font><font face="Verdana">说了可能有一二十分钟后，因为话题的关系以及我的口语确实和他差一个档次，所以大脑不停地在搜寻自己新的看法，新的内容。我的错误也越来越多，卡壳的地方也越来越多，</font><font face="Verdana">甚至连我平时觉得很简单的&#8220;primary school&#8221;都想不起，只好问他。我们交流了关于工作、和爱好等方面的内容。最后他感觉到了我的吃力，然后说&#8220;Let's go aound, join </font><font face="Verdana">other group.&#8221;结束了和这位对我来讲是高手的交流。</font></p>
<p><font face="Verdana"></font>&nbsp;</p>
<p><font face="Verdana">这时人已经很多了，我在人群中伫立了一会儿，我感觉也有不少人在寻找说话的对象。这下我的自信心又提高了些，觉得今晚自己还是比较主动的。于是我看到一个十多岁的小伙</font><font face="Verdana">和一个二十多岁的青年在交流，于是我走过去说&#8220;May I join ？&#8221;他们乐意的点了点头。他们主要在谈论物理和数学，和英语的出国考试。那个男孩是个高中生，家里条件应该很好，他老爸站在旁边偶尔和他耳语一些什么，还给他双臂涂抹防蚊虫的一些东西吧，照顾得真周到，我不时的插两句，但主要还是他们两个在交流，可能是因为话题的原因，所以我说得比较少。但感觉那男孩反应比较敏捷，虽然从说话中感觉词汇不如我，但看样子人家毕竟应该是经常在和真人练口语的，所以口语比好多了。虽然说的话比较简单，但人家能够说个不停。也有其他的人围着，但那些人一句也不说，我呢就是偶尔插两句。</font><font face="Verdana">突然接了一个电话，我看是我的搭档VIVI打来的。她说到了。见了她过后，感觉真是很美。长得好像比我还要高。我们很快进入了英文交流。她的口语比我好多了，英文专业的。</font><font face="Verdana">和她侃了一个小时，经常是她说了很多后，说&#8220;Your turn。&#8221;其实我自我感觉是，自己的英语口语已经能够应付这些场面，只是自己的生活过于单调，自己思维敏捷度，提问等能</font><font face="Verdana">力还需要加强，以后需要经常对社会各方面的事情问题发表哈看法。视野还需扩大，不然就算自己的口语再好，也无法长时间侃侃而谈，因为首先得有侃的内容才行。</font></p>
<p><font face="Verdana">和VIVI聊了一个小时，我看时间快到九点了。由于我住得比较远，担心坐不上最后一班公交车，再说今晚已经练得够多了，于是和VIVI说了拜拜。总的感觉，这次参加英语角，效</font><font face="Verdana">果很明显，至少自己走了后，大脑长时间都停不下来，我寻找的正是这种感觉。自己平时大脑的这方面的磨练少了。其次早就该参加下英语角了。一直担心不好找partner，怕害羞</font><font face="Verdana">，其实确实没必要，因为我离开的时候，人气相当旺。其实大家来这个地方都是为了提高口语，没有人会笑你，大家都显得很有耐心。以后决定每次英语角我都要参加了，万事开</font><font face="Verdana">头难，何况今晚感觉还不错，以后更要来了，只是下来多准备点，使下次交流的内容更丰富些。</font></p>
<p><font style="color: red" face="Verdana">最后谢谢那些耐心的朋友们。也欢迎有对英语感兴趣的朋友，和我交流学习英语的心得。</font></p>
<p><font style="color: red" face="Verdana">QQ：277257793</font></p>
<p><font face="Verdana"><br />
</font>&nbsp;</p>
</font>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1290781.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42954/" target="_blank">[新闻]Google Android手机大受欢迎,已经订出150万台</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>【转】人民大学英语角 练习口语好去处</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/09/12/1289921.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Fri, 12 Sep 2008 06:33:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/09/12/1289921.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1289921.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/09/12/1289921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1289921.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1289921.html</trackback:ping><description><![CDATA[<p>转自：<font face="Verdana"><a href="http://xiaobao.cueb.edu.cn/oldxb/042/35.htm">http://xiaobao.cueb.edu.cn/oldxb/042/35.htm</a></font> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 英语，对于学生来讲，是再熟悉不过的。落于纸面上的单词、文章，大部分同学都有能力掌握，而听、说英语时，英语似乎又变得陌生起来。这是由于听、说英语的机会太少，缺乏训练造成的。你想提高英语口语水平，练习口语吗，人民大学的英语角，是个好去处。 </p>
<p align="justify">　　人大英语角，在人大花园中举行。每周五晚上6：]0左右开始，持续至10点左右结束。参加的人有本校及附近院校的学生，还有许多工作后仍想提高口语水平的人。</p>
<p align="justify">　　刚来英语角，最常遇到的问题有两个。首先：如何找个 Partner(搭档)，或加入到别人的谈话中去。最简单的方法是找个地方，安安稳稳一坐，自然有人与你搭话，用英语聊天，或者是你发现有人静静地坐着，便可以走向前去，询问Would you like talking something with me?(愿意和我聊聊吗?)对方若和你一样，是会欣然答应的。而你想加入别人谈话时，可以问： May I join?(我可以加入吗?)你得到的回答多半是 Certainly，you are welcome!(当然了，欢迎)开始时忌讳的是漫无目的四下不停的走动。因为即使有人想和你组成搭档也不可能追着你说的，所以他(她)往往会放弃的。其次，当你发现对方与你谈不来，或水平相距甚远时，想中断谈话，换个Partner．只要言词得当，是不会令对方感到尴尬的。你可以说：Sorry. I want to go around(抱歉，我想四处看看)。这样，你便可离开了。或者你可以邀请他一起加入别人的谈话： Their talk is so hot．lets take part in it.处理好这两个问题，你便可以随意开始交谈，寻找Partner.</p>
<p align="justify">　　另外，去英语角，还有三点值得注意。第一：在去英语角之前先想点可交谈的内容，最好是近期大家都比较了解的话题，准备些单词或几个句子关于所选的话题，这样不致于谈话中冷场，或只听不说。第二，选择适当水平的 Partner．最佳人选是水平比你稍高一些。选择英语水平非常高的人作 Partner，虽然他对知识了解多，口语流利标准，但每个人去英语角的目的都是提高水平，获取知识，把大量时间花在费劲地给水平差于自己很多的人解释不懂的记号，谁又愿意呢?所以循序渐进才好。怎样找个合适的 Partner呢?你可以四下走一下，听听别人的对话，如果他的水平比较适合你，那么，就是他了!第三，英语角在晚上举行，最好有个伴儿，以保证安全。</p>
<p align="justify">　　口语，不说是提高不了的。不要怕说错，音不准，不错永不知正确。你的Partner水平较你高自然会纠正你的错误越多，获得的正确知识也会越多。所以，大声的说出口，英语角为你创造了一个语境，但不开口，再好的语境也没有用。别再犹豫，别再害羞：Speak loudly here!</p>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1289921.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42953/" target="_blank">[新闻]13个大文件邮件传送服务</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>【转】Linux slab 分配器剖析</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/09/08/1287107.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Mon, 08 Sep 2008 13:28:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/09/08/1287107.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1287107.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/09/08/1287107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1287107.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1287107.html</trackback:ping><description><![CDATA[<blockquote>
<p align="left">转自：<font face="Verdana"><a href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/">https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/</a></font> </p>
<p>&nbsp;</p>
<p>良好的操作系统性能部分依赖于操作系统有效管理资源的能力。在过去，堆内存管理器是实际的规范，但是其性能会受到内存碎片和内存回收需求的影响。现在，Linux&#174; 内核使用了源自于 Solaris 的一种方法，但是这种方法在嵌入式系统中已经使用了很长时间了，它是将内存作为对象按照大小进行分配。本文将探索 slab 分配器背后所采用的思想，并介绍这种方法提供的接口和用法。</p>
</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name="N1006D"><span class="atitle">动态内存管理</span></a></p>
<p>内存管理的目标是提供一种方法，为实现各种目的而在各个用户之间实现内存共享。内存管理方法应该实现以下两个功能：</p>
<ul>
    <li>最小化管理内存所需的时间</li>
    <li>最大化用于一般应用的可用内存（最小化管理开销） </li>
</ul>
<p>内存管理实际上是一种关于权衡的零和游戏。您可以开发一种使用少量内存进行管理的算法，但是要花费更多时间来管理可用内存。也可以开发一个算法来有效地管理内存，但却要使用更多的内存。最终，特定应用程序的需求将促使对这种权衡作出选择。</p>
<p>每个内存管理器都使用了一种基于堆的分配策略。在这种方法中，大块内存（称为 <strong>堆</strong>）用来为用户定义的目的提供内存。当用户需要一块内存时，就请求给自己分配一定大小的内存。堆管理器会查看可用内存的情况（使用特定算法）并返回一块内存。搜索过程中使用的一些算法有 <strong>first-fit</strong>（在堆中搜索到的第一个满足请求的内存块）和 <strong>best-fit</strong>（使用堆中满足请求的最合适的内存块）。当用户使用完内存后，就将内存返回给堆。</p>
<p>这种基于堆的分配策略的根本问题是<em>碎片（fragmentation）</em>。当内存块被分配后，它们会以不同的顺序在不同的时间返回。这样会在堆中留下一些洞，需要花一些时间才能有效地管理空闲内存。这种算法通常具有较高的内存使用效率（分配需要的内存），但是却需要花费更多时间来对堆进行管理。</p>
<p>另外一种方法称为 <strong>buddy memory allocation</strong>，是一种更快的内存分配技术，它将内存划分为 2 的幂次方个分区，并使用 best-fit 方法来分配内存请求。当用户释放内存时，就会检查 buddy 块，查看其相邻的内存块是否也已经被释放。如果是的话，将合并内存块以最小化内存碎片。这个算法的时间效率更高，但是由于使用 best-fit 方法的缘故，会产生内存浪费。</p>
<p>本文将着重介绍 Linux 内核的内存管理，尤其是 <strong>slab 分配</strong>提供的机制。</p>
<p><a name="N100A0"><span class="smalltitle">slab 缓存</span></a></p>
<p>Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中，会为有限的对象集（例如文件描述符和其他常见结构）分配大量内存。Jeff 发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间。因此他的结论是不应该将内存释放回一个全局的内存池，而是将内存保持为针对特定目而初始化的状态。例如，如果内存被分配给了一个互斥锁，那么只需在为互斥锁首次分配内存时执行一次互斥锁初始化函数（<code>mutex_init</code>）即可。后续的内存分配不需要执行这个初始化函数，因为从上次释放和调用析构之后，它已经处于所需的状态中了。</p>
<p>Linux slab 分配器使用了这种思想和其他一些思想来构建一个在空间和时间上都具有高效性的内存分配器。</p>
<p>图 1 给出了 slab 结构的高层组织结构。在最高层是 <code>cache_chain</code>，这是一个 slab 缓存的链接列表。这对于 best-fit 算法非常有用，可以用来查找最适合所需要的分配大小的缓存（遍历列表）。<code>cache_chain</code> 的每个元素都是一个 <code>kmem_cache</code> 结构的引用（称为一个 <strong>cache</strong>）。它定义了一个要管理的给定大小的对象池。</p>
<br />
<a name="figure1"><strong>图 1. slab 分配器的主要结构</strong></a><br />
<img height="216" alt="     图  1. slab 分配器的主要结构" src="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/figure1.gif" width="402" /> <br />
<p>每个缓存都包含了一个 <strong>slabs</strong> 列表，这是一段连续的内存块（通常都是页面）。存在 3 种 slab：</p>
<dl>
<dt><strong><code>slabs_full</code> </strong>
<dd>完全分配的 slab
<dt><strong><code>slabs_partial</code> </strong>
<dd>部分分配的 slab
<dt><strong><code>slabs_empty</code> </strong>
<dd>空 slab，或者没有对象被分配 </dd></dl>
<p>注意 <code>slabs_empty</code> 列表中的 slab 是进行<strong>回收（reaping）</strong>的主要备选对象。正是通过此过程，slab 所使用的内存被返回给操作系统供其他用户使用。</p>
<p>slab 列表中的每个 slab 都是一个连续的内存块（一个或多个连续页），它们被划分成一个个对象。这些对象是从特定缓存中进行分配和释放的基本元素。注意 slab 是 slab 分配器进行操作的最小分配单位，因此如果需要对 slab 进行扩展，这也就是所扩展的最小值。通常来说，每个 slab 被分配为多个对象。</p>
<p>由于对象是从 slab 中进行分配和释放的，因此单个 slab 可以在 slab 列表之间进行移动。例如，当一个 slab 中的所有对象都被使用完时，就从 <code>slabs_partial</code> 列表中移动到 <code>slabs_full</code> 列表中。当一个 slab 完全被分配并且有对象被释放后，就从 <code>slabs_full</code> 列表中移动到 <code>slabs_partial</code> 列表中。当所有对象都被释放之后，就从 <code>slabs_partial</code> 列表移动到 <code>slabs_empty</code> 列表中。</p>
<p><a name="N10120"><span class="smalltitle">slab 背后的动机</span></a></p>
<p>与传统的内存管理模式相比， slab 缓存分配器提供了很多优点。首先，内核通常依赖于对小对象的分配，它们会在系统生命周期内进行无数次分配。slab 缓存分配器通过对类似大小的对象进行缓存而提供这种功能，从而避免了常见的碎片问题。slab 分配器还支持通用对象的初始化，从而避免了为同一目而对一个对象重复进行初始化。最后，slab 分配器还可以支持硬件缓存对齐和着色，这允许不同缓存中的对象占用相同的缓存行，从而提高缓存的利用率并获得更好的性能。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tr>
            <td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tr align="right">
            <td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tr>
                        <td valign="middle"><img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<br />
<br />
<p><a name="N10129"><span class="atitle">API 函数</span></a></p>
<p>现在来看一下能够创建新 slab 缓存、向缓存中增加内存、销毁缓存的应用程序接口（API）以及 slab 中对对象进行分配和释放操作的函数。</p>
<p>第一个步骤是创建 slab 缓存结构，您可以将其静态创建为：</p>
<table cellspacing="0" cellpadding="0" width="65%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">struct struct <span class="boldcode">kmem_cache</span> *my_cachep;
            </pre>
            </td>
        </tr>
    </table>
<br />
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
    <tr>
            <td width="10"><img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />&nbsp;&nbsp;&nbsp;&nbsp; </td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tr>
                        <td bgcolor="#eeeeee"><a name="N10140"><strong>slab 缓存的 Linux 源代码</strong></a><br />
                        您可以在 ./linux/mm/slab.c 中找到 slab 缓存的源代码。 <code>kmem_cache</code> 结构也是在 ./linux/mm/slab.c 中定义的。本文着重讨论 2.6.21 Linux 内核中的当前实现。 </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<p>然后其他 slab 缓存函数将使用该引用进行创建、删除、分配等操作。<code>kmem_cache</code> 结构包含了每个中央处理器单元（CPU）的数据、一组可调整的（可以通过 proc 文件系统访问）参数、统计信息和管理 slab 缓存所必须的元素。</p>
<p><a name="N10151"><span class="smalltitle">kmem_cache_create</span></a></p>
<p>内核函数 <code>kmem_cache_create</code> 用来创建一个新缓存。这通常是在内核初始化时执行的，或者在首次加载内核模块时执行。其原型定义如下：</p>
<table cellspacing="0" cellpadding="0" width="65%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">struct kmem_cache *
            <span class="boldcode">kmem_cache_create</span>( const char *name, size_t size, size_t align,
            unsigned long flags;
            void (*ctor)(void*, struct kmem_cache *, unsigned long),
            void (*dtor)(void*, struct kmem_cache *, unsigned long));
            </pre>
            </td>
        </tr>
    </table>
<br />
<p><code>name</code> 参数定义了缓存名称，proc 文件系统（在 /proc/slabinfo 中）使用它标识这个缓存。 <code>size</code> 参数指定了为这个缓存创建的对象的大小， <code>align</code> 参数定义了每个对象必需的对齐。 <code>flags</code> 参数指定了为缓存启用的选项。这些标志如表 1 所示。</p>
<br />
<a name="table1"><strong>表 1. kmem_cache_create 的部分选项（在 flags 参数中指定）</strong></a><br />
<table class="data-table-2" cellspacing="0" cellpadding="0" width="80%" summary="表 1.           kmem_cache_create 的部分选项（在 flags 参数中指定）" border="0">
    <tr>
            <th scope="col">选项</th>
            <th scope="col">说明</th>
        </tr>
        <tr>
            <th class="tb-row" scope="row">SLAB_RED_ZONE</th>
            <td>在对象头、尾插入标志，用来支持对缓冲区溢出的检查。</td>
        </tr>
        <tr>
            <th class="tb-row" scope="row">SLAB_POISON</th>
            <td>使用一种己知模式填充 slab，允许对缓存中的对象进行监视（对象属对象所有，不过可以在外部进行修改）。</td>
        </tr>
        <tr>
            <th class="tb-row" scope="row">SLAB_HWCACHE_ALIGN</th>
            <td>指定缓存对象必须与硬件缓存行对齐。</td>
        </tr>
    </table>
<br />
<p><code>ctor</code> 和 <code>dtor</code> 参数定义了一个可选的对象构造器和析构器。构造器和析构器是用户提供的回调函数。当从缓存中分配新对象时，可以通过构造器进行初始化。</p>
<p>在创建缓存之后， <code>kmem_cache_create</code> 函数会返回对它的引用。注意这个函数并没有向缓存分配任何内存。相反，在试图从缓存（最初为空）分配对象时，<strong>refill</strong> 操作将内存分配给它。当所有对象都被使用掉时，也可以通过相同的操作向缓存添加内存。</p>
<p><a name="N101CA"><span class="smalltitle">kmem_cache_destroy</span></a></p>
<p>内核函数 <code>kmem_cache_destroy</code> 用来销毁缓存。这个调用是由内核模块在被卸载时执行的。在调用这个函数时，缓存必须为空。</p>
<table cellspacing="0" cellpadding="0" width="65%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">void <span class="boldcode">kmem_cache_destroy</span>( struct kmem_cache *cachep );
            </pre>
            </td>
        </tr>
    </table>
<br />
<p><a name="N101DF"><span class="smalltitle">kmem_cache_alloc</span></a></p>
<p>要从一个命名的缓存中分配一个对象，可以使用 <code>kmem_cache_alloc</code> 函数。调用者提供了从中分配对象的缓存以及一组标志：</p>
<table cellspacing="0" cellpadding="0" width="65%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">void <span class="boldcode">kmem_cache_alloc</span>( struct kmem_cache *cachep, gfp_t flags );
            </pre>
            </td>
        </tr>
    </table>
<br />
<p>这个函数从缓存中返回一个对象。注意如果缓存目前为空，那么这个函数就会调用 <code>cache_alloc_refill</code> 向缓存中增加内存。 <code>kmem_cache_alloc</code> 的 flags 选项与 <code>kmalloc</code> 的 flags 选项相同。表 2 给出了标志选项的部分列表。</p>
<br />
<a name="table2"><strong>表 2. kmem_cache_alloc 和 kmalloc 内核函数的标志选项</strong></a><br />
<table class="data-table-2" cellspacing="0" cellpadding="0" width="80%" summary="表 2.          kmem_cache_alloc 和 kmalloc 内核函数的标志选项" border="0">
    <tr>
            <th scope="col">标志</th>
            <th scope="col">说明</th>
        </tr>
        <tr>
            <th class="tb-row" scope="row">GFP_USER</th>
            <td>为用户分配内存（这个调用可能会睡眠）。</td>
        </tr>
        <tr>
            <th class="tb-row" scope="row">GFP_KERNEL</th>
            <td>从内核 RAM 中分配内存（这个调用可能会睡眠）。</td>
        </tr>
        <tr>
            <th class="tb-row" scope="row">GFP_ATOMIC</th>
            <td>使该调用强制处于非睡眠状态（对中断处理程序非常有用）。</td>
        </tr>
        <tr>
            <th class="tb-row" scope="row">GFP_HIGHUSER</th>
            <td>从高端内存中分配内存。</td>
        </tr>
    </table>
<br />
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
    <tr>
            <td width="10"><img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />&nbsp; </td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tr>
                        <td bgcolor="#eeeeee"><a name="N1024D"><strong>NUMA 的 slab 分配</strong></a><br />
                        对于 NUMA（Non-Uniform Memory Access）架构来说，对某个特定节点的分配函数是 <code>kmem_cache_alloc_node</code>。 </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<p><a name="N10257"><span class="smalltitle">kmem_cache_zalloc</span></a></p>
<p>内核函数 <code>kmem_cache_zalloc</code> 与 <code>kmem_cache_alloc</code> 类似，只不过它对对象执行 <code>memset</code> 操作，用来在将对象返回调用者之前对其进行清除操作。</p>
<p><a name="N1026C"><span class="smalltitle">kmem_cache_free</span></a></p>
<p>要将一个对象释放回 slab，可以使用 <code>kmem_cache_free</code>。调用者提供了缓存引用和要释放的对象。</p>
<table cellspacing="0" cellpadding="0" width="65%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">void <span class="boldcode">kmem_cache_free</span>( struct kmem_cache *cachep, void *objp );
            </pre>
            </td>
        </tr>
    </table>
<br />
<p><a name="N10281"><span class="smalltitle">kmalloc 和 kfree</span></a></p>
<p>内核中最常用的内存管理函数是 <code>kmalloc</code> 和 <code>kfree</code> 函数。这两个函数的原型如下：</p>
<table cellspacing="0" cellpadding="0" width="65%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">void *<span class="boldcode">kmalloc</span>( size_t size, int flags );
            void <span class="boldcode">kfree</span>( const void *objp );
            </pre>
            </td>
        </tr>
    </table>
<br />
<p>注意在 <code>kmalloc</code> 中，惟一两个参数是要分配的对象的大小和一组标志（请参看 <a href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#table2" cmimpressionsent="1">表 2</a> 中的部分列表）。但是 <code>kmalloc</code> 和 <code>kfree</code> 使用了类似于前面定义的函数的 slab 缓存。<code>kmalloc</code> 没有为要从中分配对象的某个 slab 缓存命名，而是循环遍历可用缓存来查找可以满足大小限制的缓存。找到之后，就（使用 <code>__kmem_cache_alloc</code>）分配一个对象。要使用 <code>kfree</code> 释放对象，从中分配对象的缓存可以通过调用 <code>virt_to_cache</code> 确定。这个函数会返回一个缓存引用，然后在 <code>__cache_free</code> 调用中使用该引用释放对象。</p>
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
    <tr>
            <td width="10"><img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tr>
                        <td bgcolor="#eeeeee"><a name="N102C7"><strong>通用对象分配</strong></a><br />
                        在 slab 源代码中，提供了一个名为 <code>kmem_find_general_cachep</code> 的函数，可执行缓存搜索，即用来查找最适合所需对象大小的 slab 缓存。</td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<p><a name="N102D1"><span class="smalltitle">其他函数</span></a></p>
<p>slab 缓存 API 还提供了其他一些非常有用的函数。 <code>kmem_cache_size</code> 函数会返回这个缓存所管理的对象的大小。您也可以通过调用 <code>kmem_cache_name</code> 来检索给定缓存的名称（在创建缓存时定义）。缓存可以通过释放其中的空闲 slab 进行收缩。这可以通过调用 <code>kmem_cache_shrink</code> 实现。注意这个操作（称为回收）是由内核定期自动执行的（通过 <code>kswapd</code>）。</p>
<table cellspacing="0" cellpadding="0" width="65%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">unsigned int <span class="boldcode">kmem_cache_size</span>( struct kmem_cache *cachep );
            const char *<span class="boldcode">kmem_cache_name</span>( struct kmem_cache *cachep );
            int <span class="boldcode">kmem_cache_shrink</span>( struct kmem_cache *cachep );
            </pre>
            </td>
        </tr>
    </table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tr>
            <td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tr align="right">
            <td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tr>
                        <td valign="middle"><img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<br />
<br />
<p><a name="N102F8"><span class="atitle">slab 缓存的示例用法</span></a></p>
<p>下面的代码片断展示了创建新 slab 缓存、从缓存中分配和释放对象然后销毁缓存的过程。首先，必须要定义一个 <code>kmem_cache</code> 对象，然后对其进行初始化（请参看清单 1）。这个特定的缓存包含 32 字节的对象，并且是硬件缓存对齐的（由标志参数 <code>SLAB_HWCACHE_ALIGN</code> 定义）。</p>
<br />
<a name="listing1"><strong>清单 1. 创建新 slab 缓存</strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">            static struct kmem_cache *my_cachep;
            static void init_my_cache( void )
            {
            my_cachep = <span class="boldcode">kmem_cache_create</span>(
            "my_cache",            /* Name */
            32,                    /* Object Size */
            0,                     /* Alignment */
            SLAB_HWCACHE_ALIGN,    /* Flags */
            NULL, NULL );          /* Constructor/Deconstructor */
            return;
            }
            </pre>
            </td>
        </tr>
    </table>
<br />
<p>使用所分配的 slab 缓存，您现在可以从中分配一个对象了。清单 2 给出了一个从缓存中分配和释放对象的例子。它还展示了两个其他函数的用法。</p>
<br />
<a name="listing2"><strong>清单 2. 分配和释放对象</strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">            int slab_test( void )
            {
            void *object;
            printk( "Cache name is %s\n", <span class="boldcode">kmem_cache_name</span>( my_cachep ) );
            printk( "Cache object size is %d\n", <span class="boldcode">kmem_cache_size</span>( my_cachep ) );
            object = <span class="boldcode">kmem_cache_alloc</span>( my_cachep, GFP_KERNEL );
            if (object) {
            <span class="boldcode">kmem_cache_free</span>( my_cachep, object );
            }
            return 0;
            }
            </pre>
            </td>
        </tr>
    </table>
<br />
<p>最后，清单 3 演示了 slab 缓存的销毁。调用者必须确保在执行销毁操作过程中，不要从缓存中分配对象。</p>
<br />
<a name="listing3"><strong>清单 3. 销毁 slab 缓存</strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode">            static void remove_my_cache( void )
            {
            if (my_cachep) <span class="boldcode">kmem_cache_destroy</span>( my_cachep );
            return;
            }
            </pre>
            </td>
        </tr>
    </table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tr>
            <td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tr align="right">
            <td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tr>
                        <td valign="middle"><img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<br />
<br />
<p><a name="N1033F"><span class="atitle">slab 的 proc 接口</span></a></p>
<p>proc 文件系统提供了一种简单的方法来监视系统中所有活动的 slab 缓存。这个文件称为 /proc/slabinfo，它除了提供一些可以从用户空间访问的可调整参数之外，还提供了有关所有 slab 缓存的详细信息。当前版本的 slabinfo 提供了一个标题，这样输出结果就更具可读性。对于系统中的每个 slab 缓存来说，这个文件提供了对象数量、活动对象数量以及对象大小的信息（除了每个 slab 的对象和页面之外）。另外还提供了一组可调整的参数和 slab 数据。</p>
<p>要调优特定的 slab 缓存，可以简单地向 /proc/slabinfo 文件中以字符串的形式回转 slab 缓存名称和 3 个可调整的参数。下面的例子展示了如何增加 limit 和 batchcount 的值，而保留 shared factor 不变（格式为 &#8220;cache name limit batchcount shared factor&#8221;）：</p>
<table cellspacing="0" cellpadding="0" width="65%" border="0">
    <tr>
            <td class="code-outline">
            <pre class="displaycode"># <span class="boldcode">echo "my_cache 128 64 8" &gt; /proc/slabinfo</span>
            </pre>
            </td>
        </tr>
    </table>
<br />
<p><code>limit</code> 字段表示每个 CPU 可以缓存的对象的最大数量。 <code>batchcount</code> 字段是当缓存为空时转换到每个 CPU 缓存中全局缓存对象的最大数量。 <code>shared</code> 参数说明了对称多处理器（Symmetric MultiProcessing，SMP）系统的共享行为。</p>
<p>注意您必须具有超级用户的特权才能在 proc 文件系统中为 slab 缓存调优参数。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tr>
            <td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tr align="right">
            <td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tr>
                        <td valign="middle"><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#main" cmimpressionsent="1"><strong></strong></a></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<br />
<br />
<p><a name="N10365"><span class="atitle">SLOB 分配器</span></a></p>
<p>对于小型的嵌入式系统来说，存在一个 slab 模拟层，名为 SLOB。这个 slab 的替代品在小型嵌入式 Linux 系统中具有优势，但是即使它保存了 512KB 内存，依然存在碎片和难于扩展的问题。在禁用 <code>CONFIG_SLAB</code> 时，内核会回到这个 SLOB 分配器中。更多信息请参看 <a href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#resources" cmimpressionsent="1">参考资料</a> 一节。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tr>
            <td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tr align="right">
            <td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tr>
                        <td valign="middle"></td>
                        <td valign="top" align="right"><a class="fbox" href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#main" cmimpressionsent="1"><strong></strong></a></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<br />
<br />
<p><a name="N10376"><span class="atitle">结束语</span></a></p>
<table cellspacing="0" cellpadding="0" width="150" align="right" border="0">
    <tr>
            <td width="10"><img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tr>
                        <td bgcolor="#eeeeee">
                        <p>&nbsp;</p>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
<p>slab 缓存分配器的源代码实际上是 Linux 内核中可读性较好的一部分。除了函数调用的间接性之外，源代码也非常直观，总的来说，具有很好的注释。如果您希望了解更多有关 slab 缓存分配器的内容，建议您从源代码开始，因为它是有关这种机制的最新文档。 下面的 <a href="https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/#resources" cmimpressionsent="1">参考资料</a> 一节提供了介绍 slab 缓存分配器的参考资料，但是不幸的是就目前的 2.6 实现来说，这些文档都已经过时了。</p>
<img src ="http://www.cnblogs.com/xuyuan77/aggbug/1287107.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42952/" target="_blank">[新闻]微型博客Twitter取消IM服务 称其ROI差</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>symbian应用程序开发1</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/09/07/1286355.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Sun, 07 Sep 2008 13:00:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/09/07/1286355.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1286355.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/09/07/1286355.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1286355.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1286355.html</trackback:ping><description><![CDATA[摘要: 本文主要讲述了symbian的开发过程和模拟器的简单介绍。其中给出了Helloworld示例的编译运行过程的详细介绍，供大家参考。&nbsp;&nbsp;<a href='http://www.cnblogs.com/xuyuan77/archive/2008/09/07/1286355.html'>阅读全文</a><img src ="http://www.cnblogs.com/xuyuan77/aggbug/1286355.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42951/" target="_blank">[新闻]用手机聊Gtalk的方法以及应用总结</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>【转】Linux下通用线程池的创建与使用</title><link>http://www.cnblogs.com/xuyuan77/archive/2008/09/06/1285800.html</link><dc:creator>路缘</dc:creator><author>路缘</author><pubDate>Sat, 06 Sep 2008 14:01:00 GMT</pubDate><guid>http://www.cnblogs.com/xuyuan77/archive/2008/09/06/1285800.html</guid><wfw:comment>http://www.cnblogs.com/xuyuan77/comments/1285800.html</wfw:comment><comments>http://www.cnblogs.com/xuyuan77/archive/2008/09/06/1285800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuyuan77/comments/commentRss/1285800.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuyuan77/services/trackbacks/1285800.html</trackback:ping><description><![CDATA[<p>转自：<font face="Verdana"><a href="http://doc.linuxpk.com/5576.html">http://doc.linuxpk.com/5576.html</a></font> </p>
<p>&nbsp;</p>
<p>本文给出了一个通用的线程池框架，该框架将与线程执行相关的任务进行了高层次的抽象，使之与具体的执行任务无关。另外该线程池具有动态伸缩性，它能根据执行任务的轻重自动调整线程池中线程的数量。文章的最后，我们给出一个简单示例程序，通过该示例程序，我们会发现，通过该线程池框架执行多线程任务是多么的简单。<br />
<br />
　　为什么需要线程池<br />
<br />
　　目前的大多数网络服务器，包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点，就是单位时间内必须处理数目巨大的连接请求，但处理时间却相对较短。<br />
<br />
　　传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后，即创建一个新的线程，由该线程执行任务。任务执行完毕后，线程退出，这就是是&#8220;即时创建，即时销毁&#8221;的策略。尽管与创建进程相比，创建线程的时间已经大大的缩短，但是如果提交给线程的任务是执行时间较短，而且执行次数极其频繁，那么服务器将处于不停的创建线程，销毁线程的状态。<br />
<br />
　　我们将传统方案中的线程执行过程分为三个过程：T1、T2、T3。<br />
<br />
　　T1：线程创建时间<br />
<br />
　　T2：线程执行时间，包括线程的同步等时间<br />
<br />
　　T3：线程销毁时间<br />
<br />
　　那么我们可以看出，线程本身的开销所占的比例为(T1+T3) / (T1+T2+T3)。如果线程执行的时间很短的话，这比开销可能占到20%-50%左右。如果任务执行时间很频繁的话，这笔开销将是不可忽略的。<br />
<br />
　　除此之外，线程池能够减少创建的线程个数。通常线程池所允许的并发线程是有上界的，如果同时需要并发的线程数超过上界，那么一部分线程将会等待。而传统方案中，如果同时请求数目为2000，那么最坏情况下，系统可能需要产生2000个线程。尽管这不是一个很大的数目，但是也有部分机器可能达不到这种要求。<br />
<br />
　　因此线程池的出现正是着眼于减少线程池本身带来的开销。线程池采用预创建的技术，在应用程序启动之后，将立即创建一定数量的线程(N1)，放入空闲队列中。这些线程都是处于阻塞（Suspended）状态，不消耗CPU，但占用较小的内存空间。当任务到来后，缓冲池选择一个空闲线程，把任务传入此线程中运行。当N1个线程都在处理任务后，缓冲池自动创建一定数量的新线程，用于处理更多的任务。在任务执行完毕后线程也不退出，而是继续保持在池中等待下一次的任务。当系统比较空闲时，大部分线程都一直处于暂停状态，线程池自动销毁一部分线程，回收系统资源。<br />
<br />
　　基于这种预创建技术，线程池将线程创建和销毁本身所带来的开销分摊到了各个具体的任务上，执行次数越多，每个任务所分担到的线程本身开销则越小，不过我们另外可能需要考虑进去线程之间同步所带来的开销。<br />
<br />
　　构建线程池框架<br />
<br />
　　一般线程池都必须具备下面几个组成部分：<br />
<br />
　　线程池管理器:用于创建并管理线程池<br />
<br />
　　工作线程: 线程池中实际执行的线程<br />
<br />
　　任务接口: 尽管线程池大多数情况下是用来支持网络服务器，但是我们将线程执行的任务抽象出来，形成任务接口，从而是的线程池与具体的任务无关。<br />
<br />
　　任务队列:线程池的概念具体到实现则可能是队列，链表之类的数据结构，其中保存执行线程。<br />
<br />
　　我们实现的通用线程池框架由五个重要部分组成CThreadManage，CThreadPool，CThread，CJob，CWorkerThread，除此之外框架中还包括线程同步使用的类CThreadMutex和CCondition。<br />
<br />
　　CJob是所有的任务的基类，其提供一个接口Run，所有的任务类都必须从该类继承，同时实现Run方法。该方法中实现具体的任务逻辑。<br />
<br />
　　CThread是Linux中线程的包装，其封装了Linux线程最经常使用的属性和方法，它也是一个抽象类，是所有线程类的基类，具有一个接口Run。<br />
<br />
　　CWorkerThread是实际被调度和执行的线程类，其从CThread继承而来，实现了CThread中的Run方法。<br />
<br />
　　CThreadPool是线程池类，其负责保存线程，释放线程以及调度线程。<br />
<br />
　　CThreadManage是线程池与用户的直接接口，其屏蔽了内部的具体实现。<br />
<br />
　　CThreadMutex用于线程之间的互斥。<br />
<br />
　　CCondition则是条件变量的封装，用于线程之间的同步。<br />
<br />
　　它们的类的继承关系如下图所示：<br />
<br />
　　线程池的时序很简单，如下图所示。CThreadManage直接跟客户端打交道，其接受需要创建的线程初始个数，并接受客户端提交的任务。这儿的任务是具体的非抽象的任务。CThreadManage的内部实际上调用的都是CThreadPool的相关操作。CThreadPool创建具体的线程，并把客户端提交的任务分发给CWorkerThread，CWorkerThread实际执行具体的任务。<br />
<br />
　　理解系统组件<br />
<br />
　　下面我们分开来了解系统中的各个组件。<br />
<br />
　　CThreadManage<br />
<br />
　　CThreadManage的功能非常简单，其提供最简单的方法，其类定义如下：<br />
<br />
　　class CThreadManage<br />
<br />
　　{<br />
<br />
　　private:<br />
<br />
　　CThreadPool* m_Pool;<br />
<br />
　　int m_NumOfThread;<br />
<br />
　　protected:<br />
<br />
　　public:<br />
<br />
　　void SetParallelNum(int num);<br />
<br />
　　CThreadManage();<br />
<br />
　　CThreadManage(int num);<br />
<br />
　　virtual ~CThreadManage();<br />
<br />
　　void Run(CJob* job,void* jobdata);<br />
<br />
　　void TerminateAll(void);<br />
<br />
　　};<br