<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>smallyu</title>
    <link>http://old-blog.smallyu.net/</link>
    <atom:link href="http://old-blog.smallyu.net/auto.xml" rel="self" type="application/rss+xml" />
    <description>Hello World</description>
    <language>zh-CN</language>
    <lastBuildDate>Thu, 31 Aug 2017 00:00:00 +0800</lastBuildDate>
    <item>
      <title>Z-Blog插件：站点信息统计</title>
      <link>http://old-blog.smallyu.net/indexf8d4.html?id=65</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=65</guid>
      <description><![CDATA[<p style="white-space: normal;">在系统原有的站点信息的基础上，增加了文章总字数和页面总字数统计；可自定义显示条目。<br/></p><p style="white-space: normal;"><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708311504159671197077.png" title="搜狗截图20170831140253.png"/></p><p style="white-space: normal;">后台配置页面，1为显示，0为不显示，提交后保存，属性同其它系统模块。</p><p style="white-space: normal;"><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708311504159671696231.png" title="搜狗截图20170831140134.png"/></p><p style="white-space: normal;">前台显示效果会受到主题样式影响。</p><p style="white-space: normal;">附件：<a href="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708311504162009746764.zip" title="SiteInfoCount.zip" style="line-height: 16px; font-size: 12px; color: rgb(0, 102, 204);">SiteInfoCount.zip</a></p><p style="white-space: normal;"><br/></p><hr/><p style="white-space: normal;"><br/></p><p style="white-space: normal;">偶然想到要统计一下自己博客上文章的总字数，几经辗转，还是新建一个插件，开始看着官方文档，试图实现这个功能。</p><p style="white-space: normal;">这是smallyu尝试开发的第一个zblog插件。</p><p style="white-space: normal;">插件目录使用系统默认的结构，插件嵌入页include.php和插件管理页main.php。<br/></p><p style="white-space: normal;">经过一整天+的探索时间，smallyu渐渐明白了zblog插件的运行机制，最终实现了包括但不限于文章总字数统计的功能。<br/></p><p style="white-space: normal;">因为之前smallyu就受限于系统自带的站点信息不能定制化显示，于是这次在插件上添加了这样的功能。<br/></p><p style="white-space: normal;">也因为smallyu比较懒，可能代码的实现形式比较low，也没有考虑插件给系统性能带来的影响，如果有机会，也许smallyu会重构这个插件的代码。</p><p style="white-space: normal;">同时因为zblog后台并不支持直接提交插件到官方审核，然后smallyu对这个插件也非常没有信心，不认为能够通过审核，就不掺和了。</p><p style="white-space: normal;"><br/></p><p style="white-space: normal;">在插件嵌入页include.php，一共挂载了5个接口，当这些接口事件发生时，模块内容就会被更新（但前台页面需要重新编译）。</p><pre class="prism-highlight prism-language-php">function&nbsp;ActivePlugin_SiteInfoCount()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;Add_Filter_Plugin(&#39;Filter_Plugin_Zbp_BuildTemplate&#39;,&#39;updateSIC&#39;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;模板重新编译接口
&nbsp;&nbsp;&nbsp;&nbsp;Add_Filter_Plugin(&#39;Filter_Plugin_PostArticle_Succeed&#39;,&#39;updateSIC&#39;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;文章编辑成功接口
&nbsp;&nbsp;&nbsp;&nbsp;Add_Filter_Plugin(&#39;Filter_Plugin_DelArticle_Succeed&#39;,&#39;updateSIC&#39;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;文章删除成功接口
&nbsp;&nbsp;&nbsp;&nbsp;Add_Filter_Plugin(&#39;Filter_Plugin_PostPage_Succeed&#39;,&#39;updateSIC&#39;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;页面编辑成功接口
&nbsp;&nbsp;&nbsp;&nbsp;Add_Filter_Plugin(&#39;Filter_Plugin_DelPage_Succeed&#39;,&#39;updateSIC&#39;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;页面删除成功接口
}</pre><p style="white-space: normal;">插件的ID定义为SiteInfoCount，简写为SIC。官方定义了插件接口的挂载函数ActivePlugin_ID，在该函数里可以使用Add_Filter_Plugin函数挂载系统接口。</p><p style="white-space: normal;">当文章或页面被编辑，统计字数就会发生改变，所以在这些事件发生时，需要更新模块内容，这里定义更新模块内容的函数为updateSIC，也就是接管系统接口之后会被执行的函数。</p><pre class="prism-highlight prism-language-php">function&nbsp;updateSIC()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;$zbp;
&nbsp;&nbsp;&nbsp;&nbsp;$config&nbsp;=&nbsp;configInit();
&nbsp;&nbsp;&nbsp;&nbsp;if(isset($zbp-&gt;modulesbyfilename[&#39;SICMoudle&#39;])){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$zbp-&gt;modulesbyfilename[&#39;SICMoudle&#39;]-&gt;Content&nbsp;=&nbsp;cttBycof($config);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;$zbp-&gt;AddBuildModule(&#39;SICMoudle&#39;,&nbsp;&#39;updateSIC&#39;);
}</pre><p style="white-space: normal;">这是updateSIC函数的内容。先声明使用全局变量$zbp，然后获取配置信息到变量$config，其中configInit函数是自定义的函数。if语句判断模块是否存在，如果存在则更改模块内容。最后面的语句<strong>可能</strong>是用于执行更新，samllyu并没有完全了解zblog的函数。<br/></p><p style="white-space: normal;">理论上更新模块有两种方式，一种是if语句内的样子，直接更改模块内容，另一种是使用下面的AddBuildMoudle函数执行更新模块的操作，函数内的两个参数分别表示要更新的模块是执行更新的用户函数。</p><p style="white-space: normal;">smallyu懒得测试模块到底是怎样更新的了，就把两句都写上，反正程序可以正常执行……即使是更新了两次模块，也并不会给系统带来太大额外开销。</p><pre class="prism-highlight prism-language-php">function&nbsp;configInit($config&nbsp;=&nbsp;array()){
&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;$zbp;
&nbsp;&nbsp;&nbsp;&nbsp;$configFileName&nbsp;=&nbsp;&quot;config.sic&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;文件不存在、没有参数
&nbsp;&nbsp;&nbsp;&nbsp;if(!is_file($configFileName)&nbsp;&amp;&amp;&nbsp;count($config)&nbsp;==&nbsp;0)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$config&nbsp;=&nbsp;array(1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5,&nbsp;6,&nbsp;7,&nbsp;8);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configInput($config);
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;文件存在
&nbsp;&nbsp;&nbsp;&nbsp;if(is_file($configFileName))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;有参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(count($config)&nbsp;!=&nbsp;0)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configInput($config);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;没有参数，读取文件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$configText&nbsp;=&nbsp;file_get_contents($zbp-&gt;host.&quot;zb_users/plugin/SiteInfoCount/&quot;.$configFileName);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$config&nbsp;=&nbsp;explode(&quot;|&quot;,&nbsp;$configText);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$config;
}</pre><p style="white-space: normal;">这是上面用到的configInit函数。函数接收一个数组类型的参数，用于处理插件管理页面提交并需要保存的配置。</p><p style="white-space: normal;">没错，配置信息是写入到文件里的，读取分别使用explode和implode将字符串分割为数组。</p><p style="white-space: normal;">至于为什么，smallyu之前不知道zblog系统提供了选项机制，可以使用类似$zbp-&gt;Config(&quot;ID&quot;)-&gt;test的形式储存数据，然后就没有改。虽然代码量不大，但要把数据从文件储存全部换成使用选项机制储存，也相当于重构整个插件了。</p><p style="white-space: normal;">文件储存也并不影响使用，就是看起来新手一点。</p><p style="white-space: normal;">其它使用到的函数还有：</p><pre class="prism-highlight prism-language-php">moudleInit();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;初始化模块，也就是新建模块，函数内配置了模块的一些信息
configInput();&nbsp;&nbsp;&nbsp;//&nbsp;细化的配置写入函数，在postInit函数里调用
cttBycof();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;根据config检出content，接收数组参数
postInit();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;处理提交的配置信息</pre><p style="white-space: normal;">每个函数的代码量都不大。其中站点信息截取了ModuleBuilder类的Statistics方法，直接获取到了字符串形式的站点信息。</p><p style="white-space: normal;">插件管理页面main.php则只是把数据填充过来，其中也用到了看起来不太好的for循环，还把循环次数写死了，像这样：<br/></p><pre class="prism-highlight prism-language-php">//&nbsp;数组转存
foreach($config&nbsp;as&nbsp;$value)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;$config[$value]&nbsp;=&nbsp;$value;
}
//&nbsp;获得显示数组
for($i&nbsp;=&nbsp;1;&nbsp;$i&nbsp;&lt;=8;&nbsp;$i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;$cofValue[$i]&nbsp;=&nbsp;$config[$i]&nbsp;==&nbsp;$i&nbsp;?&nbsp;1&nbsp;:&nbsp;0;
}</pre><p style="white-space: normal;">从代码上看，好像不明所以。是的，仅仅过了一个小时，smallyu现在也不明所以……</p><p style="white-space: normal;">-------------------------------------</p><p style="white-space: normal;">刚才zblog社区有人说插件改0后会出错</p><p style="white-space: normal;">应该是全部改0后，会写入配置文件空的内容，然后取配置的时候没能得到参数，程序就报错了，这个bug之前好像也遇到过</p><p style="white-space: normal;">全部改0意思就是不显示任何内容，那么……也许可以试着直接把模块撤掉……这样就可以不显示任何内容了</p><p style="white-space: normal;">好吧，我懒……得改</p><p style="white-space: normal;"><br/></p>]]></description>
      <pubDate>Thu, 31 Aug 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>我的世界，你做主</title>
      <link>http://old-blog.smallyu.net/index3221.html?id=63</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=63</guid>
      <description><![CDATA[<p><br/></p><p>我要带你去绿色生态园看风景</p><p>看高大的树木进幽谧的森林</p><p>坐在丛林里板凳上休息</p><p><br/></p><p>我要带你去文化生态园看灯展</p><p>看炫丽的灯光拍好看的照片</p><p>站在熙攘的人群里说笑</p><p><br/></p><p>我要带你去旅游</p><p>去任意的地方</p><p>只要和你在一起</p><p>去哪里都可以</p><p><br/></p><p>我要和你一起参加活动</p><p>也许是好多人的聚会</p><p>也许是两个人的约会</p><p><br/></p><p>虽然要去很多地方</p><p>但不是我开车</p><p>因为我不想开车</p><p>我要和你一起坐在车的后排</p><p>也许是别人的车</p><p>也许是自己的车</p><p><br/></p><p>我想到过很多和你在一起的场景</p><p><br/></p><p>比如一起奋斗</p><p>可能是准备一场考试</p><p>可能是寻找一份工作</p><p>可能是做一次失败的生意</p><p><br/></p><p>比如一起购物</p><p>买两张周末的电影票</p><p>买两张回老家的车票</p><p>买新房子里装修用的瓷砖</p><p><br/></p><p>比如一起无聊</p><p>你在房间里无所事事</p><p>我就看着你无所事事</p><p>和你在一起又怎么会无聊</p><p><br/></p><p>好像我经历过的回忆中，都有你</p><p><br/></p><p>最近天在下雨</p><p>变凉了</p><p>注意身体</p><p>也要注意安全</p><p><br/></p><p>其实我没有想你</p><p>但我还是忍不住关心你</p><p>虽然我联系不到你</p><p><br/></p><p>也没有你</p><p><br/></p><hr/><p><br/></p><p>欢迎来到我的世界。</p><p><br/></p><p>入坑我的世界好多天，经历了各种生生死死，游戏一次又一次地安装卸载。</p><p>刚进入游戏，到了晚上会被僵尸杀死，被拿弓箭的白色僵尸射死，被蜘蛛咬死，被末影人打死，还遇见不知名的拿药水瓶的人，把你毒死。</p><p>自作孽的时候，被爬行者炸死，从高处掉到地上摔死，泡水里淹死，跑岩浆里被火烧死，饿死。</p><p>直到慢慢的，收集地上的泥土，垒起两格高的围墙，把自己围在中间，晚上就在里面等啊等，等到白天再继续活动。</p><p>随着圈起围墙的地盘越来越大，开始学会收集木块，然后知道了最最最最关键的一个步骤：用木块合成木板，这是一切一切的开始。</p><p>有了木板，就能有木棍，就能有工作台，就能有木锹、木槁、木锄、木剑，用木锹挖土，用木槁挖圆石，用木锄种小麦，用木剑打怪兽。</p><p>有了木槁，就能有圆石，就能有熔炉，就能有木炭，就能有火把，火把用来把自己的地盘照亮，照亮的地方就不会有僵尸出生了。</p><p>然后学会挖矿，铁矿、银矿、金矿、钻石矿，还有至关重要的黑曜石，并且用黑曜石搭建地狱门，可以进入地狱。</p><p>……</p><p>我的世界已近神作，自由度太高了，它是给真正体验游戏的玩家玩的游戏。</p><p><br/></p><p>虽然时间不长。</p><p>我并没能完成在游戏里想要完成的操作，比如建一座城堡。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504020835168711.jpg" title="javaw 2017-08-29 21-18-52-441.jpg" alt="javaw 2017-08-29 21-18-52-441.jpg" width="641" height="345" style="width: 641px; height: 345px;"/></p><p>这个是我的圈地用的城墙，目前四个面只留了这么一个入口，一扇木门。原想在城堡的四周都开一个入口，这样每次回家都不用跑到这个面找这个门。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504020861370867.jpg" title="javaw 2017-08-29 21-19-21-753.jpg" alt="javaw 2017-08-29 21-19-21-753.jpg" width="642" height="344" style="width: 642px; height: 344px;"/></p><p>这个是改造中的城墙，原想把泥土搭的城墙全部换成圆石墙，地面全部换成圆石。可是我圈地比较大，没能来得及换完。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504020904758447.jpg" width="643" height="351" style="width: 643px; height: 351px;"/></p><p>这只狗是在很远的森林里遇到，喂了两根骨头就从良的，一直跟在身边。遇到僵尸攻击的时候，小狗也会积极配合上前攻击。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504020942112737.jpg" title="javaw 2017-08-29 21-19-44-978.jpg" alt="javaw 2017-08-29 21-19-44-978.jpg" width="646" height="353" style="width: 646px; height: 353px;"/></p><p>这个长长的杵上天的柱子，是暂时用来当信号灯用的。如果离开城堡，到了旁边的森林，又不是特别远，有这根柱子，一眼就能看出城堡的方向。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504020971931782.jpg" width="648" height="342" style="width: 648px; height: 342px;"/></p><p>这些是在城堡里圈养的动物，有羊、鸡、兔子、狗。游戏中只要喂这些动物食物，它们就会繁殖了，羊吃小麦，鸡吃小麦种子，兔子吃萝卜，狗吃肉。</p><p>在城堡里如果放一些水用来种小麦和萝卜，那这个城堡里的生态圈就可以无限循环啦！以前是有的，后来为了城堡里面的地面平坦一点，加上准备把泥土地面全换成圆石的，就先撤掉了。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504020995103342.jpg" title="javaw 2017-08-29 21-20-18-033.jpg" alt="javaw 2017-08-29 21-20-18-033.jpg" width="653" height="346" style="width: 653px; height: 346px;"/></p><p>这个东西，里面是岩浆，外面是一圈玻璃。仅仅只是为了好玩放在那儿，岩浆晚上会发光，也能起到一点照明的作用。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504021016855166.jpg" title="javaw 2017-08-29 21-20-22-380.jpg" alt="javaw 2017-08-29 21-20-22-380.jpg" width="655" height="355" style="width: 655px; height: 355px;"/></p><p>这些箱子就是用来放物品的地方。除了工作台和熔炉，有六个箱子。东西太多了，很难分类分清楚，有建筑石块、矿石、装饰块、食物、杂物、工具……</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504021029298290.jpg" title="javaw 2017-08-29 21-20-32-655.jpg" alt="javaw 2017-08-29 21-20-32-655.jpg" width="656" height="349" style="width: 656px; height: 349px;"/></p><p>这个，就是地狱之门了。用十块黑曜石搭成的2x3的门，图中用玻璃把紫色的传送门挡住了，因为地狱里面的僵尸猎人太厉害，每次进去都被秒杀，把门堵住，防止自己误进，也防止门里面的僵尸猎人出来，还有偶尔小狗也会自己跳进去。</p><p>游戏里黑曜石很难天然形成，必须得自己，把水倒在岩浆上，然后用钻石镐挖。感觉钻石很难找。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504021046188132.jpg" title="javaw 2017-08-29 22-40-44-725.jpg" alt="javaw 2017-08-29 22-40-44-725.jpg" width="657" height="378" style="width: 657px; height: 378px;"/></p><p>这个留空的没有城墙的角落，是用来钓鱼的，而且很安全，僵尸们上不来，因为下面只铺了踩着的那一层，再下面就是悬空的了。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708291504021070646815.jpg" width="660" height="386" style="width: 660px; height: 386px;"/></p><p>最后是一张不算全景照的全景照。其实地方蛮大的，还有不少能想到的想做的工作没做完。截图是在晚上，没能白天，也算是遗憾吧。</p><p><br/></p><p>没做完，以后接着做？</p><p>单机游戏，实在不愿花费过多时间。</p><p>尽管和已经弃坑的王者荣耀比，我的世界用的时间一点都不多。王者荣耀，永远也不会有我的世界这么精彩的游戏内容。</p><p>而且要开学了，刚放假的时候，对学校还是很不陌生的感觉。</p><p>转眼暑假过去了。</p><p>很陌生。</p><p>现在想想，当时依旧是浑浑噩噩不知所以。</p><p>现在也依旧是浑浑噩噩不知所以。</p><p>平凡才是常态？</p><p>“连自己都找不到，还怎么找另一半？”</p><p>值得思考的，思考不出来的，思考出来做不到的，能做到但又不想做的，种种</p><p><br/></p><p>拿起酒杯敬自己</p><p>敬明天</p><p>敬未来</p><p><br/></p><p>未知的路才要前行</p><p><br/></p>]]></description>
      <pubDate>Tue, 29 Aug 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>轻舟虽过万重山，心到桥头自然沉</title>
      <link>http://old-blog.smallyu.net/index619c.html?id=62</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=62</guid>
      <description><![CDATA[<p><strong><span style="text-decoration: none;">欢迎来到欢乐场。</span></strong></p><p><br/></p><p>今天8月22，星期二，天气，阴，心情，糟</p><p><br/></p><p>CET4是有及格线的，425，因为只有425以上，才有资格报考CET6，是一条约定俗成的及格线，虽然官方并没有这样的说法。</p><p>本来向从各个途径找一点点哪怕一点聊以自慰的理由，实在找不到。</p><p>CET4重要吗？太不重要了，因为没人过不了。</p><p>会在乎425，是因为，我考了420，幸好，不是424。</p><p>上一次考382的时候，也没怎么在意，并没有伤心，毕竟差得很远。</p><p><br/></p><p>呃</p><p>smallyu很菜对不对</p><p>上大学以来，CET4是smallyu唯一没有通过的考试，连续两次。</p><p>四次期末考试，GPA最低3.2，最高3.7，目前平均不到3.5，不过没关系。</p><p>计算机二级</p><p>计算机三级</p><p>很想说服自己，CET4证书没用，所以过不了也没关系。</p><p><br/></p><p>计算机等级证书有用吗？虽然不愿相信这个事实，但确实没用，尤其对于找工作来说。</p><p>非计算机相关类工作，自然没用。计算机相关类工作，那点水平又远不够用。</p><p><br/></p><p>那CET4证书有用吗？</p><p>英语相关类工作，那点水平同样远不够用。但非英语相关类工作，才是CET4发挥作用的地方。</p><p><br/></p><p>过了，不能说明什么，过不了，说明你很差啊。就像企业招人都会招985、211，不是说人才一定都在那些院校，只是在那些院校招到的人，是人才的概率大。企业在节省招人的成本。</p><p><br/></p><p>想要考NCRE，也只是随便考考，找点乐子……</p><p><br/></p><p>计算机相关考试，目前只有NCRE。</p><p>软考？PAT？嗯……</p><p><br/></p><p>下面引用的这段是逻辑很不清的随便写写，注释掉：</p><p>/**</p><p>为什么NCRE会沦为完全没用的这样一个考试？</p><p>可能NCRE和CET的性质不同。</p><p>对于英语，多会一句，少会一句，多懂一句，少懂一句，运气稍微好以下，运气稍微差一下，都会产生一些影响。</p><p>真正的工作场景中，除了英语相关专业，使用英语的场景，以及对英语的要求并不高。</p><p>那么这里的问题在于，你怀揣CET证书，要应聘的并不是英语相关类的工作，像英语教师、人工翻译、同声传译。</p><p>要想找英语专业相关工作，CET4也远远不够。</p><p>而NCRE没用的说法是对于计算机相关专业类的工作而言。</p><p>应聘程序猿、攻城狮，一张证书不能说明什么。</p><p>面试官不会在意你二级了解了C语言，三级学会了局域网组网，四级学过了操作系统原理。</p><p>Android软件会开发吗？eclipse用熟了吗？Spring会吗？多线程、高并发了解多少？</p><p>技术相关的问题，会就是会，不会就是不会。</p><p>*/</p><p><br/></p><p>计算机技术的道路，可以走下去吗？</p><p>一方面，大量的计算机人，和大量冲着程序猿这个金字招牌，以及火热的人工智能、大数据，入行IT。</p><p>另一方面，大把的IT人呼叫着35岁危机，复制粘贴，增删改查，单身，加班。</p><p>现在的码农，劳苦程度不亚于几十年前坐在缝纫机上的裁缝阿姨，和工厂流水线上工作的工人大叔。</p><p>码农，还是在打工啊。</p><p>要想赚钱，得经商。</p><p>无奸不商啊。</p><p><br/></p><p>那要不要考研？</p><p>考研大概有这么几种原因：</p><p>1.爱学习，爱生活，为知识而拼搏</p><p>&nbsp; &nbsp; 这样的人高考成绩一定炸，已经与我无关</p><p>2.认为高学历就能够找到好工作</p><p>&nbsp; &nbsp; 考研：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 成本：3年的读研时间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1年以上复习、准备考研的时间，大量精力</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 回报：研究生学历</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 知识、技能成长</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 认识更多厉害的人，包括导师</p><p>&nbsp; &nbsp; 就业:</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 成本：3年的工作时间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 回报：工作经历</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 薪水</p><p>&nbsp; &nbsp; <strong>老梁</strong>的观点是，研究生无用，因为目前大多数基层工作岗位需要的技能，本科学历足够。</p><p>&nbsp; &nbsp; 读研，企业需要付给你更高的薪水。但是，你能带来比本科学历的人更高的价值吗？</p><p>&nbsp; &nbsp; 研究生三年，国内学校的尿性是人尽皆知的，尤其是实战操作能力，三年不一定能够学到太多东西，反而本科毕业有整整三年工作经历的人，工作能力上的提高，不见得比三年学院生活少。</p><p>&nbsp; &nbsp; <strong>卿未离</strong>，知乎上最近在关注的很厉害的一个人，他对读研的观点是，如果想要在一线城市北上广深从事技术性强的相关工作，就可以选择读研，否则，该干嘛干嘛。</p><p>&nbsp; &nbsp; 也就是说，只要不在一线城市，无论从事什么工作，都不要读研。</p><p>&nbsp; &nbsp; 当然，事业单位除外，什么公务员、老师，甚至从政。</p><p>&nbsp; &nbsp; <strong>张雪峰</strong>是考研神嘴，提倡考研，比较关键的一个观点是，考研，可以让你认识一个非常牛的人物，那就是你的导师，甚至如果你将来的就业可以用上那么一点他的人脉资源，那就赚大了。</p><p>&nbsp; &nbsp; 这些观点，都很难取舍。</p><p>3.想要逃避现实生活，再在学校呆3年</p><p>&nbsp; &nbsp; 当然不可取</p><p>4.随大流</p><p>&nbsp; &nbsp; 也不可取</p><p>有的人的观点是，你考研先考上再说，再去问要不要读研。</p><p>这样的观点，有一定道理，但也站不住。</p><p><br/></p><p><br/></p><p><strong><span style="text-decoration: none;">当你背上所有的梦与想。</span></strong></p><p><br/></p><p>上大学了，我要好好学习，因为努力就有回报，因为我仅用高三一年的时间，就可以达线，就可以考上大学。</p><p>有很多很多日夜不眠，拼死奋战的人，也就将将达线，甚至没有达线。</p><p>我的努力是有成效的。</p><p>因为高三之前，实在荒废了太多时间，高中期间回家从没有写过作业。于是考上大学，高三一年学了高中三年的东西，再甚包括初中两年的。</p><p>这么容易！</p><p>吃到甜头，还想再吃。</p><p><br/></p><p>于是，大学，上课第一排，虽然不爱写作业。做事积极尝试，虽然明知道自己不行，但也要尝试。试过了，才配说不行。</p><p><br/></p><p>工作？是，工作了，一定要出人头地，光，宗，耀，祖，你们都赚不到的钱，我一定要赚到，你们不敢想的薪水，我一定要拿到。钱钱钱！你们都在乎钱，你们都没有钱，我要有！</p><p>赚钱？是本科就业好，还是读研再就业好？</p><p><br/></p><p>对了，越来越喜欢教育行业，尤其是老师，工作量不大，铁饭碗，社会地位高，赚的不多，但稳定的一塌糊涂。越来越崇尚，越来越，懒惰？是啊，懒又怎么样，我可不想毕业就失业，也不想整天加班，增删改查做CMS，不想找不到女朋友，不想35岁就被开除。</p><p><br/></p><p>家里就我一个孩子，可惜，我完全没有信心，做出为人杰的事情。</p><p><br/></p><p><br/></p><p><strong>当你看到，各色的脸上，各色的妆。</strong></p><p><br/></p><p>他们都变了，我的小学同学们，女生学会画浓妆，学会打麻将，男生抽烟，当保安挣钱。</p><p>初中时候不懂事的她，追求你的她，陪在你身边的她，要结婚了？</p><p>高中时候单纯的她，你心疼的她，让你失望的她，曾决心一起度过一生的她，让你奋发图强，努力奋斗的她，好吧，你已经不认识了。</p><p>大学同学们，来自全国各地，家庭背景不一样，社会背景不一样，成长环境不一样，经济条件不一样，未来的前景不一样。</p><p>大学同学，只不过是按照当初随便报的专业，按照学号，机缘巧合被分在一起，去完成四年的学业任务而已。</p><p>情？</p><p>宿舍舍友？坐火车的时候，如果是软卧，也不得不和，来自不同地方，有着不同目的地的人，在同一间屋子里，睡上几觉。</p><p>我说不出更多东西忘了。</p><p><br/></p><p><br/></p><p><strong>没人会记得，你的模样。</strong></p><p><br/></p><p>我始终一个人。</p><p><br/></p><p>拿起酒杯，</p><p>对自己说，</p><p><br/></p><p>一杯敬你，另一杯还敬你。</p><p><br/></p><p>人生苦短何必念念不忘？</p><p><br/></p><p>说得容易。</p><p><br/></p><p>清醒的人不荒唐，一点都不荒唐。</p><p><br/></p><p>这首歌明明不好听，曲不如摄影艺术，词不如雅俗共赏，人不如VAE。</p><p><br/></p><p>可是念念不忘。</p><p><br/></p><p><br/></p><p>你的大学是否也会遇见，让你心烦意乱的人？</p><p><br/></p><p>第一次四级考不过，所以她不是你应该依靠的人。</p><p>第二次四级考不过，因为第一次的考试结果伤透了你的心。</p><p><br/></p><p>第二次四级考不过，因为你还在等一个可以依靠的人。</p><p>第二次四级考不过，因为你还在等一个给你信念让你考过的人。</p><p><br/></p><p>考研犹豫不决，是因为对她的态度还毫无所知。</p><p><br/></p><p>但，我是外人，我管你有什么理由考试不过？我管你有什么理由停滞不前？</p><p><br/></p><p>我是外人，你不比我强，我不比你差。</p><p><br/></p><p>是，我比你差，没有你强。</p><p><br/></p><p>你过了四级，人们会说，啊，他四级竟然过了！</p><p>我没过四级，人们会说，啊，你四级竟然没过！</p><p><br/></p><p>smallyu是不是很自恋。</p><p>smallyu是不是有假想敌。</p><p>smallyu是不是心理有问题。</p><p><br/></p><p>生而为人，而已。</p><p><br/></p><p><br/></p><p>总在盼望，总在失望，日子还不都这样。</p><p><br/></p><p><br/></p><p>天亮之后，不要离场，不要潦草。</p><p><br/></p><p><strong>我送你。</strong></p><p><strong><br/></strong></p>]]></description>
      <pubDate>Tue, 22 Aug 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>NCRE4 · 网络工程师《计算机技术》概要</title>
      <link>http://old-blog.smallyu.net/index2fc6.html?id=61</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=61</guid>
      <description><![CDATA[<p><strong><span style="font-size: 18px;">前言——2013年下计算机等级考试四级新标准</span></strong><br/></p><p>&nbsp; &nbsp; 一、开考类别</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 科目名称 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;科目代码 &nbsp; &nbsp;考核课程代码</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 网络工程师 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 41 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;401、403&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 数据库工程师 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;42 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;404、405 &nbsp; &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 软件测试工程师 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 43 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;401、405</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 信息安全工程师 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 44 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;401、403 &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 嵌入式系统开发工程师 &nbsp; &nbsp; 45 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;401、402</p><p>&nbsp; &nbsp; 二、专业核心课程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 课程代码 &nbsp; &nbsp;课程名称</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 401 &nbsp; &nbsp; &nbsp; &nbsp; 四级操作系统原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 402 &nbsp; &nbsp; &nbsp; &nbsp; 四级计算机组成与接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 403 &nbsp; &nbsp; &nbsp; &nbsp; 四级计算机网络</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 404 &nbsp; &nbsp; &nbsp; &nbsp; 四级数据库原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 405 &nbsp; &nbsp; &nbsp; &nbsp; 四级软件工程</p><p>&nbsp; &nbsp; 三、获证条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 通过四级科目考试，并已经（或同时）获得三级相关证书。</p><p>&nbsp; &nbsp; 四、考试形式：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.考试环境：采用无纸化考试的形式；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.考试时间：两门专业核心课程总时间为90分钟；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.合格标准：满分100分，两门课程分别同时达到30分；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.题型及分值：单选题30分，多选题20分。</p><p>&nbsp; &nbsp; 五、题型分析</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.总体难度分析</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由于两门课程合计考试时间为90分钟，总体难度不会太大。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.考核能力分析</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 题型为单选题与多选题，对课程大纲要求的知识点考核以理论基础的理解与判断为主，设计到复杂计算的内容较少。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.单选题应试方法分析与学习建议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 单选题以概念理解为主。考前学习中注意知识的理解，尽量减少死记硬背的内容。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 应试中建议利用排除法。类比法快速确定答案，所以在考前学习中注意概念的理解，和概念的对比记忆。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）单选题常见题型1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基本网络技术名词、概念的考核。多个名词的功能与原理的区别。难易度不大。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）单选题常见题型2</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 某个网络技术相关概念、名词的理解，从选项中判断正误。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 学习中注意概念的理解，应试中善于利用排除法。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）单选题常见题型3</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 某个网络技术相关参数的简单计算。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于通过固定公式计算的知识点主要记牢计算公式；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于网络中常见的数值进制转换、子网计算等在学习中掌握计算方法，提高计算时间与准确率。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.多选题应试方法分析与学习建议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多选题以概念理解为主。考前学习中注意知识的理解，加强知识点的归纳总结，和概念的对比记忆。</p><p><br/></p><p><strong><span style="font-size: 18px;">计算机网络课程（课程代码403）介绍</span></strong></p><p>&nbsp; &nbsp; 基本要求：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一、理解计算机网络的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二、掌握局域网的基本工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三、掌握TCP/IP及相关协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四、掌握Internet基本服务类型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五、掌握较为新型的网络技术应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 六、理解网络管理与网络安全原理</p><p>&nbsp; &nbsp; 考试内容：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一、网络技术基础</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.计算机网络的形成与发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.计算机网络的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.分组交换技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.网络体系结构与网络协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.互联网应用的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二、局域网技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.局域网与城域网的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.共享式局域网的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.高速局域网的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.交换式局域网与虚拟局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.无线局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三、Internet基础</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.Internet的构成与接入</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.IP协议与服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.IP地址与IP数据报</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.差错与控制报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.路由与路由选择</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.组播技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7.IPv6协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 8.TCP协议和UDP协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9.NAT的基本原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四、Internet基本服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.应用进程通信模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.域名系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.远程登录服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.FTP服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.电子邮件系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.Web服务系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五、新型网络应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.即时通信系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.文件共享系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.IPTV</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.VoIP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.网络搜索技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.社交网络应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 六、网络管理与网络安全</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.网络管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.网络安全基础</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.加密技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.认证技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.安全技术应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.入侵检测与防火墙</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7.计算机病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 总体分析：考察内容与原三级网络技术的内容大部分相同，提出部分章节的老旧内容，新增部分前沿知识。90%以上内容相同。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 应试建议：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.学习上以教材为主，配合网课。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.习题上以原三级网络技术的历年真题为主，多做试题。</p><p><br/></p><p><strong><span style="font-size: 18px;">第1章 网络技术基础</span></strong></p><p>&nbsp; &nbsp; 学习目标：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.了解计算机网络的形成与发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.掌握计算机网络的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.掌握分组交换技术与包交换技术的基本原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.掌握网络体系结构与网络协议的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.了解互联网应用的发展</p><p>&nbsp; &nbsp; 一、计算机网络的形成与发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）计算机网络的发展阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第一阶段：20世纪50年代，将独立的计算机技术与通信技术结合；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第二阶段：20世纪60年代，美国的APRANET与分组交换技术开始；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第三阶段：20世纪70年代，ISO推动系统参考模型与网络协议；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第四阶段：20世纪90年代，互联网、高速通信网络、无线网络与网络安全技术的发展，基于P2P的网络应用成为互联网产业与信息服务业的新增长点。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）计算机网络的形成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.有一台中央主机通过通信线路连接大量的地理上分散的终端，构成面向终端的通信网络，终端分时访问中心计算机的资源，中心计算机将处理结构返回终端。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.世纪60年代中期，出现了多天计算机通过通信系统互连的系统，开创了“计算机——计算机”通信时代，这样分布在不同地点且具有独立功能的计算机就可以通过通信线路，彼此之间交换数据、传递信息。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.ARPANET的发展以及OS的规定，使各种不同的网络互联、互相通信变为现实，实现了更大的范围内的计算机资源共享。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.Internet是覆盖全球的信息基础设施之一，用户可以利用Internet实现全球范围的信息传输、信息查询、电子邮件、语音与图像通信服务等功能。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）网络体系结构与协议标准化</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在计算机网络发展的第三阶段，出现了很多网络，导致网络之间的通信困难。迫切需要统一的网络体系结构和统一的网络协议。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ISO制定了OSI参考模型，作为国际认可的标准模型。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP/IP协议以及体系结构早于OSI参考模型，因此TCP/IP协议与体系结构也是业内公认的标准。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）互联网应用与高速网络技术发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.互联网高速发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 互联网不仅是一种资源共享、数据通信和信息查询的手段，主键成为了人们了解世界、讨论问题、休闲、学术研究、商贸、教育甚至军事活动等重要领域。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.信息高速公路</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 高速网络技术主要体现在：异步传输模式（ATM），宽带综合业务数字网（B-ISDN）,高速局域网，交换局域网，虚拟网络与无线网络。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.基于WEB技术的互联应用的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Web技术的出现使网站的数量和网络的通信量呈指数增长。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.基于P2P技术的应用技术发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 区别于C/S结构，对等（P2P）网络淡化了服务提供者和服务使用者的界限，扩大了网络资源的范围和深度。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.网络安全技术的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计算机及网络犯罪，使得网络必须具备足够的安全机制，防止信息被非法窃取、破坏与泄露。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 搜索引擎是一种运行在Web上的应用软件系统；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; P2P以“非中心化”方式使更多的用户同时身兼客户机与服务器的双重身份，达到信息共享最大化的目标。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五）宽带城域网的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 宽带城域网与传统的通信网络在概念和技术上发生了很大的变化，主要体现在以下几个方面：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传统局域网、城域网与广域网在技术上的界限模糊。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传统的电信传输技术与计算机网络技术的界限越来越模糊。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传统的电信服务与互联网应用的界限越来越模糊。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 电信传输网。计算机网络与广播电视网络技术的界越来越模糊。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.宽带城域网应该包括核心交换网与接入网；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.目前，可作为用户接入网的主要有三类：计算机网络、电信通信网与广播电视网；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.从技术角度来看，互联网的用户接入方式主要分为五类：地面有线通信系统、无线通信和移动通信网、卫星通信网、有线电视网和地面广播电视网。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.三网融合：计算机网络、电信通信网与电视传输网。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 六）无线网络的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.无线局域网（WLAN）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 以微波、激光与红外等无线电波作为传输介质，IEEE 802.11工作组专门从事WLAN标准的研究。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 无线局域网主要有四个应用领域：传统局域网的扩充、建筑物之间的互联、漫游访问与特殊网络。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 无线局域网的传输技术：红外线、扩频、窄带微波。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.无线自组网（Ad hoc）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 是一种自组织、对等式、多跳的无线移动网络，无线自组网技术的发展趋势：一是向军事和特定行业发展的无线传感器网络，二是向民用的接入网领域发展的无线网状网。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.无线传感器网（WSN）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将Ad hoc与传感器技术相结合，WSN的三个要素是传感器、感知对象和观察者。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.无线网状网（WMN）：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由无线路由器构成骨干网，用于大范围的信号与节点连接。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WMN作为WLAN、WiMax技术的补充，成为解决无线接入“最后一公里”问题的新技术方案。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802.11S工作组专门为WMN制定了MAC与PHY层协议。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.蓝牙技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802.15工作组制定了蓝牙通信标准。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 七）操作系统的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 操作系统包括两部分：客户机操作系统与服务器操作系统。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 带网络功能的操作系统的基本任务：用屏蔽本地资源与网络资源的差异性，为用户提供各种网络服务功能，并提供网络系统的安全服务。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.Windows操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.Unix</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 原本为小型机环境开发的操作系统。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要用C语言写成。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 符合易移植操作系统环境（POSIX）标准。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX系统是一种多用户、多任务的分时操作系统。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX系统结构分为两大部分：操作系统内核和外壳。内核原语可以直接对硬件起作用，使得系统易读、易修改、易移植。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX提供了强大的shell语言（外壳语言）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX采用树状目录结构具有良好的安全性、保密性和可维护性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX提供多种通信机制，如管道、软中断通信等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX采用进程对换的内存管理机制和请求调页的存储管理方式。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 常用的UNIX系统有SUN公司的solaris，IBM公司的AIX，HP公司的HP-UX等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.Linux</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基于Intel硬件、在微型机上运行，类似于Unix的操作系统。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 编写内核效仿Unix，兼容Unix工具与外壳。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 符合POSIX标准，开放源代码。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Linux的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Linux操作系统是自由软件，具有开放性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Linux操作系统支持多用户、多任务。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Linux操作系统能把CPU的性能发挥到极限，具有出色的高速度。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Linux操作系统具有良好地用户界面。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Linux操作系统具有丰富的网路功能。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Linux操作系统采用了许多安全措施，为网络多用户提供了安全保障。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 具有可移植性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 具有标准的兼容性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 八）我国互联网的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; 二、计算机网络的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）计算机网络的定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.三类定义观点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广义、资源共享、用户透明性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 符合网络特征的是资源共享的观点。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.资源共享观点定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; “以能够相互共享资源的方式互联起来的自治计算机系统的集合”，主要表现在以下方面：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 建立计算机网络的主要目的是实现计算机资源的共享、</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 互联计算机是分布在不同地理位置的多台独立的“自治计算机”。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 联网计算机之间的通信必须遵循共同的网络协议。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）计算机网络的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 按网络的覆盖范围可以分为：局域网、城域网、广域网、个人区域网。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 局域网：balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 城域网：balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广域网：balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 个人区域网：balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）计算机网络的拓扑结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.网络拓扑的定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 抽象</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; “点”：工作站、服务器、通信设备等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; “线”：通信介质。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络拓扑结构：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通过网络中节点与通信线路之间的几何关系表示网络结构，反应出网络中各个实体间的结构关系。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.网络拓扑的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 按通信子网中的通信信道类型分为：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广播信道通信子网的拓扑与点到点线路的通信子网。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广播信道通信子网的拓扑结构包括4种：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 总线型、树型、环型、无线与卫星通信。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 点到点线路的通信子网的拓扑结构包括4种：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 星型、环型、树型、网状型。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）星型拓扑</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 结点通过点对点线路与中心结点连接，结构简单、易于实现、便于管理，中心结点是整个网络的可靠性瓶颈。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）环型拓扑</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 结点通过点对点线路连接成闭合环路，结构简单、传输延时确定，但环中每条通信线路都会成为网络可靠性的瓶颈。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）树形拓扑</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 结点按层次进行连接，是星型拓扑的扩展，适用于汇聚数据的应用需求。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）网状拓扑</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 结点之间的连接是任意的，主要优点是可靠性高，目前广域网主要用网状拓扑构型。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）描述计算机网络传输特性的参数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.数据传输速率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据传输速率是每秒钟传输二进制比特数，单位比特/秒，计作bps</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 公式：S=1/T（bps）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T为发送每个比特所需的时间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据传输速率与带宽</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 带宽：某个信号具有的频率宽度，单位是赫兹（Hz）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; “带宽”和“速率”几乎成了同义词</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通信信道最大传输速率与信道带宽之间存在着明确的关系</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 奈圭斯特准则</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 香农定理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）奈圭斯特准则</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 描述了有限带宽、无噪声信道的最大数据传输速率与信道带宽的关系。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 二进制数据信号的最大数据传输速率Rmax与通信信道带宽（B=f，单位Hz）的关系为：Rmax=2f</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）香农定理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 描述了有限带宽、有随机热噪声信道时，最大传输速率与信道带宽、信号噪声功率比之间的关系：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Rmax = Blog2( 1 + S / N )</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 其中Rmax：数据最大传输速率。单位是bps</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B：信道带宽，单位是Hz</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S/N：信号与噪声功率比</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 香农定理给出了一个有限带宽、有热噪声信道的最大数据传输速率的极限值</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.误码率的定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 误码率是指二进制码在数据传输系统中被传错的概率，它在数值上近似等于：Pe=Ne/N</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 其中N指传输二进制码元总数，Ne为被传错的元数。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于当前使用的电话线路，传输速率在300~2400ps之间时，平均误码率在10^4~10^6之间；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传输速率在4800~9600bps之间时，平均误码率在10^2~10^4之间；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计算机通信的平均误码率要求低于10^(-9)。</p><p>&nbsp; &nbsp; 三、分组交换与包交换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 早期的广域网通信子网中，数据交换分为两类：线性交换、存储转发交换。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）线路交换的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 线路交换的通信过程分为3个阶段：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.线路建立阶段：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 两台主机要传输数据，首先通过子网建立两台主机之间的线路连接。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.数据传输阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 线路连接后，可以实现实时、双向的交换数据。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.线路释放阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据传输结束后，源点向目的主机发送释放请求，目的同意后逐步释放连接。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 线路交换方式的优点是：通信实时性强，适用于交互式会话类通信。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 线路交换方式的缺点是：对突发性通信不适应，系统效率低，同时不具备数据存储能力和差错控制能力，不能平滑通信量，也无法发现和纠正传输过程中发送的差错。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）存储转发交换的特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.发送的数据中包含目的地址、源地址与控制信息，按一定的格式组成一个数据单元；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.通信子网中的节点是通信控制处理剂，负责完成数据单元的接收、差错校验、存储、路由选择和转发功能。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储转发交换方式可以分为两类：报文交换和报文分组交换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 报文交换中不控制数据的长度，在发送数据时，只把数据当作一个逻辑单元，在数据中加上目的地址、源地址与控制信息后，按一定格式打包后组成一个报文。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分组交换则限制数组的最大长度，源节点需要将一个长报文分成多个分组，由目的结点将多个分组按顺序重新组织成报文。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储转发交换方式，它克服了电路交换方式的缺点，具有明显的优点。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通信子网的路由器可以存储分组，因此多个分组可以共享通信信道，线路利用率高。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器具有路由选择功能，可以动态选择分组通过通信子网的最佳路径，同时可以平滑通信量，提高系统的效率。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分组在通过通信子网的每个路由时，都需要进行差错检查和纠错处理，因此可以减少传输错误，提供系统的可靠性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器可以对不同通信速率的线路进行速率转换，也可以对不同的数据代码格式进行转换。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）数据报方式与虚电路方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.数据报方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 即分组存储转发的一种形式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 同一报文的不同分组可以经过不同的传输路径通过通信子网；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 同一报文的不同分组到达目的节点时可能出现乱序、重复与丢失现象；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每个报文在传输过程中都必须带有目的地址与源地址；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据报方式的传输延迟较大，适用于突发性通信、不适合于长报文、会话式通信。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.虚电路方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 虚电路方式视图将数据报和电路交换方式结合起来，发挥其各自的优点，以达到最佳的数据交换效果。主要特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每次传输分组之前，在源节点与目的结点之间建立一条逻辑连接；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一次通信的所有分组都通过虚电路顺序传输，分组中不必携带目的地址、源地址等信息，不会出现乱序、重复和丢失现象</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分组通过虚电路上的每个结点只需进行差错检测，不许进行路由选择</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通信子网中的每个结点可以与任何结点建立多条虚电路连接</p><p>&nbsp; &nbsp; 四、网络体系结构与网络协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）网络体系结构的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络协议的定义：为网络数据交换而定义的规则、约定与标准。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络协议三个要素：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 语法：用户数据与控制信息的结构和格式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 语义：需要发出何种控制信息，以及完成的动作与做出的响应</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 时序：对事件实现顺序的详细说明</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络层次模型和各层协议的集合定义为网络体系结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计算机网络体系结构采用层次结构，好处是：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 各层之间是独立的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设计灵活</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 结构上可分割开</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 易于实现和维护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 能促进标准化工作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第一个计算机网络体系结构：IBM公司的SNA</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）ISO/OSI参考模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.OSI参考模型的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由ISO定义开放系统互联（OSI）模型定义了网络互联的七层框架，OSI定义了各层提供的服务，服务和实现无关。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分层的体系结构、三级抽象：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第一级抽象：体系结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第二级抽象：服务定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第三级抽象：协议规格说明</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OSI/RM并不是一个标准，而只是一个概念性的框架</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.ISO/OSI参考模型结构和各层功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OSI参考模型结构的划分基本原则：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络中各结点都具有相同的层次；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不同结点的同等层具有相同的功能；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 同一结点内相邻层之间通过接口通信；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每层可以使用下层提供的服务，并向其上层提供服务；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不同结点的同等层通过协议来实现对等层之间的通信。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）物理层（Physical layer）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 利用物理传输介质为数据连链路层提供物理连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 透明地传送比特流</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）数据链路层（Data link layer）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在通信的实体之间建立数据链路连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传送以“帧”为单位的数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 采用差错控制、流量控制方法，使有差错的物理线路变成无差错的数据链路</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）网络层（Network layer）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通过路由算法，为分组通过通信子网选择一条最佳路径</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络层要实现路由选择、拥塞控制与网络互连等功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）传输层（Transport layer）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 向用户提供可靠的端到端（End-to-End）服务，透明地传送报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 向高层屏蔽了下层数据通信的细节</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计算机通信体系结构中最关键的一层</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）会话层（Session layer）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组织两个会话进程之间的通信，并管理数据的交换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 建立传输错纠正与保证数据完整性的控制机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6）表示层（Presentation layer）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理在两个通信系统中交换信息的表示方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据格式变换、数据加密与解密、数据压缩与恢复等功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7）应用层（Application layer）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为应用程序提供了网络服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 应用层需要识别并保证通信对方的可用性，使得协同工作的应用程序之间的同步</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 建立传输错误纠正与保证数据完整性的控制机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）TCP/IP参考模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.TCP/IP参考模型与协议的发展过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP/IP——Transmission Control Protocol/Internet Protocol，传输控制协议/互联网协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 最早在ARPANET中使用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP/IP特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 开放的协议标准，可以免费使用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 独立于特定的网络硬件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 统一的网络地址分配方案</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 标准化的高层协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.TCP/IP参考模型与层次结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP/IP的主机-网络层实现了OSI模型中物理和链路层的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP/IP的互联层功能主要体现在3个方面：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理来自传输层的分组发送请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理接受的数据报</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理互联的路径、流控与拥塞问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要协议：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP、ICMP、IGMP、ARP、RARP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传输层实现应用进程间的端到端通信，具有两个协议：TCP和UDP协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）TCP：是一种可靠面向连接的协议，允许将一台主机的字节流无差错地传送到目的主机。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）UDP：不可靠的无连接协议。不要求分组顺序到达目的地。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 应用层的主要协议有：远程登录协议（Telnet），文件传输协议（FTP），简单邮件传输此而已（STMP），域名服务（DNS），路由信息协议（RIP），网络文件协议（NFS），超文本传输协议（HTTP）等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.OSI与TCP/IP参考模型比较</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）共同点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 层次结构的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传输层功能相似</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）OSI参考模型的主要缺陷</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 模型的层次数量与内容不是最佳的选择</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 把“服务”与“协议”的定义结合起来使得模型变得很复杂，寻址、流量控制与差错控制在每一层重复出现，效率低</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 受到通信思想的支配，不适合计算机与软件的工作方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）TCP/IP参考模型主要缺陷:</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在服务、接口与协议的区别上不清楚</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在某些层次的划分上不够合理</p><p>&nbsp; &nbsp; 五、互联网应用的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）基于WEB应用的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WEB技术的出现使互联网从最初的主要由计算机专家和大学生使用，变为一种广泛使用的信息交流工具，使得网站的数量和网路的通信量呈指数增长，已经广泛用于电子政务、电子商务、远程教育与信息服务等领域，并有继续扩大的趋势。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）搜索引擎技术发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 搜索引擎是运行在WEB上的应用系统软件，是对网络上大量资源建立索引并提供检索服务的应用软件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）博客技术的应用&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 博客是基于互联网的数字广播技术之一。balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）博客技术的应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五）网络电视的应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络电视（IPTV）通过宽带IP网络传输，可以实现与用户的互动点播，同时能够方便地将传统电视与WWW、E-MAIL等互联网结合起来。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 六）P2P技术的应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.P2P网络的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 是信息达到最大化为目的而设计的“非集中式”的网络结点之间的结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不依赖与互联网的DNS，并具有使用网络拓扑动态变化的独立自制系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可以与网络中已有的“集中式”共享网络资源的结构共存于互补</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; P2P网络中的每一台计算机既可以作为网络服务的使用者，又可以作为网络服务的提供者</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.典型的P2P应用：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p><br/></p><p><strong><span style="font-size: 18px;">第2章 局域网技术</span></strong></p><p>&nbsp; &nbsp; 学习目标</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一、了解以太网与城域网的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二、掌握共享式以太网技术特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三、掌握告诉局域网的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四、掌握交换式局域网与虚拟局域网的技术特点与原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五、掌握无线局域网工作原理</p><p>&nbsp; &nbsp; 一、局域网与城域网的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）决定局域网与城域网的三要素：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络拓扑、传输介质与介质访问</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）局域网网络拓扑结构类型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 局域网覆盖范围是“有限地址范围”，所以基本通信机制与广域网不同，从存储转发方式改变为共享介质交换方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 局域网网络拓扑主要为：总线型、环型、星型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 局域网传输介质主要为：双绞线、同轴电缆与光纤</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.总线型拓扑</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 总线型局域网的介质访问控制方法采用“共享介质”方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 所有结点都通过网卡连接到公共传输介质总线上</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 总线通常采用双绞线或同轴电缆作为传输介质</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 所有结点可以通过总线发送或接受数据，但在同一段时间内只允许一个结点通过总线发送数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可能出现冲突而造成传输失败</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 结构简单、容易实现、易于扩展，可靠性较好</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不易管理，故障诊断和隔离比较困难</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.环型拓扑</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 环型拓扑是共享介质局域网的主要拓扑结构之一，环型拓扑结构中，节点之间通过网卡利用点-点线路连接构成闭合的环型，数据在环中按一个方向绕环逐站传输，通常采用令牌环控制方式实现介质访问控制。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要优点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 初始安装比较容易，传输线路较短</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 故障诊断定位比较准确</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 适用于光纤连接，例如FDDI</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要缺点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可靠性较差</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 重新配置较为困难</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）传输介质类型与介质访问控制方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 局域网的传输介质类型常用的有同轴电缆、双绞线、光缆、无线信道</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE802.2标准定义的共享介质局域网有三类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 带有冲突检测的载波侦听多路访问（CSMA/CD）的总线型局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 令牌总线（Token Bus）方法的总线型局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 令牌环（Token Ring）方法的环型局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）IEEE 802参考模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802参考模型研究重点是OSI参考模型中的数据链路层与物理层</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.IEEE 802标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802参考模型将数据链路层划分为两个子层：逻辑链路控制子层（LLC）与介质访问控制子层（MAC），不同局域网在MAC子层和物理层可以采用不同的协议，但在LLC子层必须采用相同协议。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.IEEE 802标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802标准主要有四个：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802.3标准：定义CSMA/CD总线介质访问MAC子层与物理层标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802.11标准：定义无线局域网介质访问MAC子层与物理层标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802.15标准：定义近距离个人无线网络介质访问MAC子层与物理层标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IEEE 802.16标准：定义快带无线局域网介质访问MAC子层与物理层标准</p><p>&nbsp; &nbsp; 二、共享式以太网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）Ethernet技术的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1976年7月，Bob在ALOHA网络的基础山，提出总线型局域网的设计思想，并提出冲突检测、载波侦听与随机后退延迟算法，将这种局域网命令为以太网（Ethernet）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 以太网的核心技术是：介质访问控制方法CSMA/CD</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 这种方法解决了多结点共享公用总线的问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 早期以太网的传输介质是同轴电缆，后用双绞线，再后来用光纤</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）Ethernet工作过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.发送流程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 载波侦听过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 冲突检测方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 发现冲突、停止发送</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 随机延迟重发</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 载波侦听过程：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 发送数据前侦听总线是否空闲，如果线上已有数据在传输，总线电平将按曼切斯特编码规律出现跳变，则可判断此时“线路忙”</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 冲突检测方法：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 载波侦听不能完全消除冲突，在节点A发送数据到结点B时，数据传输时需要时间的，在此过程中如果结点B也发送数据，则可能发生冲突</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 以太网标准规定冲突窗口长度为51.2us，以太网数据传输速率为10Mbps，冲突窗口51.2us可以发送64B的数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 发现冲突、停止发送</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果检测到冲突，发送结点要进停止发送数据、随机延迟后重发数据，随机延迟重发的第一步是发送“冲突加强信号”，目的是让网中的所有结点能检测出冲突。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 随机延迟重发</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 最大重发次数为16次，如果超过16，则认为线路故障，进入“冲突过多”的结束状态。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CSMA/CD后退延迟算法：截止二进制指数后退延迟</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; （TBEB）：r=2^k*R*a</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 其中r为重新发送所需的后退延迟时间：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a为冲突窗口值</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; R为随机数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; K=min[重传次数n, 10]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.Ethernet接收流程分析</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第一步：判断接收帧是否小于最小长度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第二步：判断目的地址是否自己可以接收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第三步：CRC校验</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CRC校验正确，进行帧长度检测，如果长度不对，报告“帧长度错”，长度正确，数据交给LLC子层，报告“成功接收”</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CRC校验错误，判断该帧是否8的整数倍。若是，则报告“帧校验错”，若否，则报告“帧比特错”</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.Ethernet帧结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 前导码与帧定界符：用于接收同步阶段，比特序列101010...11，不计入帧头长度。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目的地址和源地址：目的地址第一位为0表示单播，为1表示多播，全1为广播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 类型：表示网络层使用的协议类型，如0x0800表示IP，0x8137表示IPX</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据字段：46-1500B，所以帧长度范围为64-1518B</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 帧校验：多项式为 G(x)=x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.Ethernet实现方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从现实的角度来看，构成以太网网络连接的设备包括网卡、收发器和收发器电缆</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从功能角度来看，包括发送与接收信号的收发器、曼切斯特编码器与解码器、以太网数据链路控制、帧装配及主机的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从层次的角度来看，这些功能覆盖了IEEE 802.3标准的MAC子层与物理层</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.Ethernet物理地</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 物理地址按照48位编码（EUI-48），计作12个十六进制，两两一组，“-”分割，前三组（字节）为公司表示，后三组生产商自行分配，例如006008为3com公司的一个机构唯一标识符（OUI），生产的某一网卡地址为00-A6-38，则网卡的物理地址为00-60-08-00-A6-38</p><p>&nbsp; &nbsp; 三、高速局域网的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.高速局域网的发展</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 局域网的规模不断的扩大，网络通信负荷加重时，冲突和重发现象将大量发生，网络效率急剧下降，网络传输延迟增长，网络服务质量下降</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了克服传统网络规模与性能之间的矛盾，高速局域网的解决方案：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）提高带宽</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）将大型局域网划分成多个用网桥或路由器互联的子网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）将共享介质方式改为交换方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.Fast Ethernet - 802.3u标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有关传输介质的标准：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 100BASE-TX：使用2对5类非屏蔽双绞线或2对1类屏蔽双绞线，1对用于发送，1对用于接收，支持全双工</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 100BASE-T4：使用4对3类非屏蔽双绞线，3对用于传输，一对用于检测，不支持全双工</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 100BASE-FX：支持2芯的单模或多模光纤，传输距离达2km，支持全双工</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.Gigabit Ethernet - 802.3z标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有关传输介质的标准：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000BASE-T：使用5类非屏蔽双绞线，长度可达100m</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000BASE-CX：使用5类屏蔽双绞线，长度可达25m</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000BASE-LX：使用波长1300nm的单模光纤，长度可达3000m</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000BASE-SX：使用波长850nm的多模光纤，长度可达300~550m</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.10 Gigabit Ethernet - 802.3ae标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 与10M/100M/1Gbps以太网的帧格式相同</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 保持802.3对以太网最小和最大帧长度的规定</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不再使用双绞线，而使用光纤作为传输介质</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 只有全双工工作方式，传输距离不受冲突检测的限制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 物理层标准：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 局域网物理层（LAN PHY）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广域网物理层（WAN PHY）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.40/100 Gigabit Ethernet</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 40Gbps网络使用波分复用技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 100 Gigabit Ethernet物理接口类型：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 10X10Gbps短距离互联的LAN接口技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4X25Gbps中短距离互联的LAN接口技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 10m的铜缆接口和1m的系统背板互联技术</p><p>&nbsp; &nbsp; 四、交换式局域网与虚拟局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）交换式局域网的基本结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.交换机的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 典型的交换式局域网是交换式以太网，它的核心设备是以太网交换机</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 共享端口-&gt;专用端口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 端口之间可有多个并发连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.交换机的技术特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 低交换传输延迟</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从传输延迟时间的量级来看，局域网交换机延迟为几十us，网桥为几百us，路由器为几千us。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 高传输带宽</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于10Mbps的端口，半双工端口带宽为10Mbps，而全双工端口带宽为20Mbps；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于100Mbps的端口，半双工端口带宽为100Mbps，而全双工端口带宽为200Mbps。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 允许不同速率的端口共存</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 采用了自动侦测（Autosenese）技术时，交换机端口可以同时支持10Mbps/100Mbos、全双工/半双工两种工作方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 支持虚拟局域网服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）局域网交换机的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.交换机的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.端口号/MAC地址映射表 &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 交换机利用“端口/MAC地址映射表”进行数据交换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 交换机的“地址学习”是通过读取帧的源地址并记录帧进入交换机的端口，如果端口与地址的对应关系不存在则加入映射表中，如果已经存在则更新表中对应关系</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每次更新或新加入的映射表表项，会被赋予一个计时器（生命），计时器到达时没有得到该表项的对应关系，则删除</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.交换机的帧转发方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 直接交换方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 交换机只要接受一个帧并检测到目的地址，就立即转发该帧。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点是交换延迟短，缺点是缺乏差错检测能力你，不支持不容速率端口之间的帧转发。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储转发交换方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 交换机完整接受一个帧并进行差错检测，然后转发</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点是具有差错检测能力，支持不同速率端口之间的帧转发，缺点是交换延迟增大</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 改进的直接交换方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 接收到一个帧的前64自节后，检测帧头字段是否正确，如果正确则转发。这种方法对于短的Ethernet帧，交换延迟与直接交换方式相近；对于长的Ethernet帧，由于它只检测的地址字段与控制字段，因此交换延迟将会减少。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）虚拟局域网（WLAN）的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.虚拟网络的概念：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 虚拟网络建立在交换式技术的基础上，如果网络中的结点按工作性质与需要换分为若干个“逻辑工作组”，则一个逻辑工作组就是一个虚拟网络。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 虚拟网络以软件方式实现逻辑工作组的换分与管理，工作组的结点不受物理位置的限制（相同工作组的结点不一定在相同的物理网段，只要能够通过交换机互联）。从一个工作组到另一个工作组时，只要通过软件设定，无需改变结点在网络中的物理位置。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.虚拟局域网的组网方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）用交换机端口定义虚拟局域网：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 虚拟局域网从逻辑上将交换机的端口划分为不同的虚拟子网，各个虚拟子网相对独立</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不允许不同虚拟网包含相同的物理网段或端口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：当结点转移到另一个端口时，管理者必须重新配置虚拟局域网的成员。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）用MAC地址定义虚拟局域网：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由于MAC地址是与硬件相关的地址，结点将自动保持原来的虚拟局域网成员划分，因此允许结点移动到其他物理网段，是一种基于用户的虚拟局域网。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 建立局域网阶段需要将用用户配置到虚拟局域网中。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：在大规模的网络环境中，人工完成这么多用户的初始配置非常麻烦。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）用网络层地址定义虚拟局域网：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 使用结点的网络层地址来定义虚拟局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：用户可以按照协议类型来组建虚拟局域网，用利于组建基于服务或应用的虚拟局域网；用户可以随意移动结点，而无需重新配置网络地址，对基于TCP/IP的用户特别有利。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：性能比较差，因为检查网络层地址比检查MAC地址更加费时。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）基于广播组的虚拟局域网：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当有广播包要发送到多个目的结点时，就需要动态建立虚拟局域网的代理，代理通过广播信息通知各个结点，如果结点响应信息就可以加入广播组，并成为基于广播组的虚拟局域网成员。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：可以根据服务灵活地组建，并可以跨越与广域网互联。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.虚拟局域网的优点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）方便网络用户管理，减少网络管理开销</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）提供更好的安全性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）改善网路服务质量</p><p>&nbsp; &nbsp; 五、无线局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）无线局域网的应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.传统局域网的扩充</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.建筑物之间的互联</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.漫游访问</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.特殊无线网络结构（如无线自组网）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）无线局域网的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.红外无线局域网（IR）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 按视距方式传输，发送点与接收点中间必须无阻挡</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 红外无线局域网的数据传输技术：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 定向光束红外传输</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 全方位红外传输——需要在天花板安装一个基站</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 漫反射红外传输</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：通信安全性好，抗干扰性强，系统安装简单，易于管理，但是传输距离受一定限制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.扩频无线局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 扩频通信是军事电子对抗中经常使用的一种方法，它是将数据基带信号频谱扩展几倍或几十倍，以牺牲通信的频带宽度为代价，来提高系统的抗干扰性与安全性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 扩频技术主要有2种：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）跳频扩频通信</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将利用的频带分为多个子频带，子频带称为信道。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每个信道带宽相同，中心频率有伪随机数发生器的随机数确定，变化频率叫跳跃系列。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 发送端和接收端采用相同的跳跃系列。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）直接序列扩频通信</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将发送数据经过伪随机数发生器产生的伪随机码进行异或操作，再将异或操作的结果调制后发送</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 所有接受结点使用相同频段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 发送端与接收端使用相同的伪随机码</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.窄带微波无线局域网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 窄带微波是指使用微波无线电频带进行数据传输，其带宽刚好能容纳信号。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）无线局域网标准IEEE 802.11</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.IEEE 802.11协议结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 该协议采用的是层次模型结构，其中物理层定义了红外、跳频扩频与直接序列扩频的数据传输标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MAC层主要功能是对无线环境的访问控制，可以在多个接入点上提供漫游支持，同时提供数据验证与保密服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MAC层支持无争用服务与争用服务两种访问方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 无争用服务：系统中存在中心控制结点。中心控制结点具有点协调功能（PCF）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 争用服务：类似以太网的随机争用访问控制方式，成为分布协调功能（DCF）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MAC层采用冲突避免的方法是CSMA/CA（载波侦听多路访问/冲突避免）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.IEEE 802.11的MAC层工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CSMA/CA方法要求每个发送结点在发送帧之前先侦听信道。如果信道空闲，结点可以发送帧，在发送完一帧后，必须再等待一个短的时间间隔，检查接收站是否发回帧的确认ACK。如果接收到确认，则说明此次发送没有出现冲突，发送成功；如果在规定时间内没接收到ACK，表明出现冲突，发送失败，并重发该帧。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.IEEE 802.11协议的帧结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.IEEE 802.11网络的结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 端站STA</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 接入点AP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 接入控制器AC</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AAA服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.IEEE 802.11协议族组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 标准名称 &nbsp; &nbsp;标准描述</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 802.11a &nbsp; &nbsp; 5G Hz波段，速率54Mbps</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 802.11b &nbsp; &nbsp; 2.4G Hz波段，速率11Mbps</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 802.11g &nbsp; &nbsp; 2.4G Hz波段，速率54Mbps</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 802.11n &nbsp; &nbsp; 5G Hz波段，速率100Mbps</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 802.11i &nbsp; &nbsp; 增强无线通信安全的规范</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 802.11e &nbsp; &nbsp; 服务质量QOS</p><p><br/></p><p><strong><span style="font-size: 18px;">第3章 Internet基础</span></strong></p><p>&nbsp; &nbsp; 学习目标</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一、了解Internet的构成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二、掌握Internet不同接入方式的原理和特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三、掌握IP服务的特点和IP层的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四、掌握IP地址、IP数据包的基本知识</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五、掌握基本的路由选择算法并运用算法进行计算</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 六、掌握RIP和OSPF协议的基本原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 七、了解组播的概念和特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 八、掌握组播的相关协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 九、了解IPv6协议的基本特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 十、掌握IPV6地址表示和数据报格式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 十一、掌握TCP和UDP协议的特点和提供的服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 十二、掌握TCP的可靠性和流量控制的实现fagnfa</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 十三、掌握NAT技术的基本工作原理和技术特点</p><p>&nbsp; &nbsp; 一、Internet的构成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 从设计者角度看：Internet是计算机互联网的一个实例；从使用者角度看：Internet是一个信息资源网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）Internet的主要组成部分</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.通信线路：Internet的基础设施，包括有线线路和无线线路</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.路由器：网络互联的桥梁。主要任务是数据从一个网络到另一个网络时，路由器为它选择最佳路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.主机：是信息资源和服务的载体。所有连接Internet的计算机统称为主机</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.信息资源：信息资源是用户最关注的问题之一。用户方便、快捷获取资源一直是Internet的研究方向。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）Internet的接入方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.通过电话网接入</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.利用ADSL（非对称数字用户线路）接入</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 下行数据传输速率远远大于上行数据传输速率（非对称）。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.使用HFC（有线电视网）接入</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HFC采用非对称数据传输速率。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.通过数据通信线路接入 &nbsp; &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 种类有：DOM，ATM，帧中继等，用户可以租用。</p><p>&nbsp; &nbsp; 二、IP协议与IP层服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）IP互联网的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Internet是将提供不同服务的、使用不同技术的、具有不同功能的网络互联起来形成的。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP协议精确定义了IP数组格式、并且对数据寻址和路由、数据报分片和重组、差错控制和处理等作出了具体规定。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 工作原理：假设主机A发送数据到主机B</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主机A的应用层形成的数据传输层送互联层处理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 互联层将数据封装成IP数据报，并决定发送给最近的路由器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主机A把IP数据报利用以太网控制传送到路由器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 经由路由器对数据报进行拆封和处理；如果仍需传输，再封装后利用互联层的广域网控制程序传输</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 经由通信子网传输到主机B</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）IP服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 运行IP协议的互联层可为其高层用户提供的服务有三个特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.不可靠的数据投递服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.面向无连接的传输服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.尽最大努力投递服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）IP互联网的特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.IP互联网隐藏了底层物理网络细节，向上为用户提供通用的、一致的网络服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.IP互联网不制定网络互联的拓扑结构、也不要求网络之间全互联</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.IP互联网在物理网络之间转发数，信息可以跨网传输</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.IP互联网平等的对待互联网中的每一个网络</p><p>&nbsp; &nbsp; 三、IP地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）IP地址的作用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 以太网中利用MAC地址（物理地址）标识网络中的一个结点，两个以太网结点需要知道对方的MAC地址才能通信</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 以太网不是唯一的网络，各种网络技术互不相同，它们之间通信是需要解决的问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 统一物理地址的方法不现实。在互联网层将各种物理地址统一必须通过上层软件完成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 屏蔽各种物理地址的差异，使用IP协议规定的地址（IP地址）。IP地址中管理机构统一管理和分配，保证在网络中的每台计算机不会发生冲突</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP地址的作用是标识网络连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; （严格地说，IP地址指定的不是一台计算机，而是计算机到一个网络的连接，例如一台计算机有块网卡，有两条连接，有两个IP地址；或多个IP地址绑定在一条物理连接上）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP地址由32比特的二进制数表示</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）IP地址的层次结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP地址有两层：网络层和主机号</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络号：标识互联网中一个特定的网络；而主机号标识该网络中主机的一个特定连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP地址含有主机的信息和网络的地址信息，所以主机从一个网络移动到另一个网络时，IP地址必须重新分配，否则不能与其他计算机通信</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）IP地址的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A、B、C、D、E五类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A类地址的前一个字节表示网络地址，且最前端的1个二进制位固定是0，表示的地址范围是从1.0.0.0~126.255.255.255</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B类地址的前两个字节表示网络地址，且最前端的2个二进制位固定是10，表示的地址范围是从128.0.0.0~191.255.255.255</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C类地址的前三个字节表示网络地址，且最前端的3个二进制位是110，表示的地址范围是从192.0.0.0~223.255.255.255</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）IP地址的直观表示法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 点分十进制：32位的二进制，8个一组，形式4组，魅族二进制转换成十进制，计作w.x.y.z的格式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五）特殊的IP地址形式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.网络地址：网络位不变，主机位全0</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.广播地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 直接广播：网络位不变，主机位全1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有限广播：网络位全1，主机位全1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.回送地址：127.0.0.1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.本地地址：即私有地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 六）子网编址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.子网编址的方法 &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 标准的IP地址分为网络号和主机号两部分，为了避免IP地址的浪费，子网编制将IP地址的主机号部分进一步划分成子网部分和主机部分</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在一个IP网络中划分子网使我们能将一个逻辑上单一的大型网络分成若干个小小的网络，即允许将网络划分成许多个部分供内部使用，但是对于外部网络仍像一个网络一样。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 子网编制将IPv4地址分为三部分：网络部分、子网部分和主机部分</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.子网表示法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 子网掩码采用了和IP地址一样的编码方式，用32位二进制数值。其二进制数值必须是连续的1+连续的0组成。其中1位数对应IP地址的网络号部分，0位数对应IP地址的主机号部分。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.子网编址思路：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）你所选的子网掩码将会产生多少个子网？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2的x次方-2（x代表借位部分掩码位，即2进制为1的部分）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）每个子网能有多少主机？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2的y次方-2（y代表主机位，即2进制为0的部分）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）每个子网的广播地址？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广播地址=下个子网号-1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）每个子网的有效主机分别是？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 忽略子网内全为0和全为1的地址剩下的就是有效主机地址：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 最后有效1个主机地址=下个子网号-2（即广播地址-1）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.可变长子网掩码VLSM子网编址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VLSM（Variable Length Subnet Mask，可变长度子网掩码），是在标准掩码上面再划分的子网的网络号码，无类路由选择网络可以使用VLSM，而有类路由选择网络中不能使用VLSM。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.CIDR（无类域间路由技术）地址规划方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）CIDR的技术特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 表示为“网络前缀+主机号”的二级地址结构。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络前缀相同的连续的IP地址形成了一个CIDR地址块，它是由块起始地址决定的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）CIDR的应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 超网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 支持路由聚合</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 七）地址解析协议ARP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.ARP协议的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 互联网中高层软件通过IP地址来指定源地址和目的地址，而低层的物理网络通过物理地址发送和接收信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ARP就是以太网中使用的将IP地址映射到物理地址的实现方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.ARP实现中采用的高速缓存技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了避免ARP请求与相应信息的频繁发送与接收对网络产生的影响，每一个主机都设有一个ARP高速缓存（ARP cache）。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.其他提高ARP效率的技术&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; 四、IP数据报</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IP数据报是IP协议使用的数据单元</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）IP数据报的格式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP数据报的格式可以分为报头区和数据区两大部分。其中数据区包括高层需要传输的数据，报头区包含了源IP地址、目的IP地址等控制信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP数据报各字段的功能：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.版本与协议类型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.长度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.服务类型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.生存周期</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.头部校验和</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）IP封装、分片、重组</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP数据报在互联网上传输，可能跨越多个网络，IP数据报最终需要封装成帧进行传输</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器只在内存中保留IP数据报而没有附加帧头信息，只有IP数据报通过一个物理网络时，才会被封装进帧中，接受路由器会解封装帧</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.MTU与分片</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 根据网络使用的技术不同，每种网络都规定了一个帧最多能够携带的数据量，这一限制称为最大传输单元（MYU）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.重组</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在所有段的基础上重新产生原数据报的过程叫重组</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.分片控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在IP数据报报头中，标识、标志和片偏移三个字段与控制分片和重组有关</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）标识：发送方将一个惟一的标识放进每个输出数据报的标识域中，接收方就可利用收到的分片的标识数和IP源地址来确定该分片属于哪个数据报，以便于数据报重组</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）标志：标识该数据是否已经分片，是否是最后一个分片</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）片偏移：用来指出本片数据在初始IP数据区中的位置，以8字节为单位。目的是提供重组的分片顺序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）IP数据报选项</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP数据报选项主要目的：控制和测试</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP数据报选项：选项码、长度、选项数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 选项数据：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.源路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP数据报穿越互联网所经过的路径由源主机指定，分为严格源路由选项和松散路由选项</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.记录路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录IP数据报经过路径上各个路由器的IP地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.时间戳</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 经过每个路由器时的当地时间</p><p>&nbsp; &nbsp; 五、差错与控制报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IP层使用的控制与差错协议是ICMP（互联网控制报文协议）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; ICMP报文是作为IP数据报的数据部分而传输的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; ICMP协议的两种典型应用：ping和traceroute</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）ICMP差错控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ICMP最基本的功能是提供差错报告</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每一个ICMP报文的产生总是对应与一个数据报，要么这个数据报遇到了问题，要么这个数据报携带者一个ICMP请求报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个路由器从输入的数据报的头部中取出源地址，然后放到携带ICMP报文的数据报的头部中的目的地域中</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ICMP差错报文的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.携带ICMP报文的数据报并没有什么特别优先权——它们像其他数据报一样转发</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.ICMP差错报告数据中包含故障IP数据报报头之外，还包含IP数据报数据区的前64比特数，目的是了解高层协议信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.ICMP差错报告时伴随着抛弃出错IP数据报而产生的，一旦发现传输错误，先把出错报文抛弃</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ICMP出错报告种类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.目的地不可达报告</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.超时报告（存活周期TTL）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.参数出错报告</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用ICMP报文测试可达性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ping程序可以测试一个给定的目的地是否可达</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它发送一个包含ICMP回应请求的报文给目的地，然后等待一段很短的时间如果没有收到应答，则重新传送请求如果重传的仍没有收到应答（或收到一个ICMP目的不可达报文），ping声称该远程机器为不可达</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用ICMP跟踪路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）ICMP控制报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP层控制主要包括：拥塞控制、路由控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.拥塞控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器的处理速度太慢，不能完成IP数据报排队等日常工作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器传入数据速率大于传出数据速率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 最终没有足够的缓冲区存放大量涌入的IP数据报</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 解决方案：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 利用ICMP源抑制报文抑制源主机发送IP数据报的速率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.拥塞控制与源抑制报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ICMP源值报文的方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果路由器的某输出队列已满，那么缓冲区空出之前，该队列将抛弃新来的IP数据报，并向源主机发送ICMP源和抑制报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为路由器的输出队列设置一个阈值，当队列的数据报超过阈值后，如果再有新的数据报到来，向源主机发送ICMP源抑制报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.路由控制与重定向报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）ICMP控制报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ICMP控制报文包括源抑制报文和重定向报文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 源抑制报文——用于拥塞控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 重定向报文——用于路径控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）ICMP请求/应答报文对</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ICMP请求/应答报文对可以获取的信息：回应请求/应答</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.回应请求与应答</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 回应请求/应答ICMP报文对用于测试目的主机或路由器的可达性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.时戳请求与应答</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 同步时钟</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.掩码请求与应答</p><p>&nbsp; &nbsp; 六、路由器与路由选择</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 在IP互联网中，路由选择（routing）是指选择一条路径发送IP数据报的过程，而进行这种路由选择的设备叫路由器（Router）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）表驱动IP选路</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在需要路由选择的设备中保存一张IP路由表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP路由表村塾着有关可能的目的地址及怎样到达目的地址的信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在转发IP数据报时，查询IP路由表，决定把数据报发往何处</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由表中的目的地址如何表示？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）大型互联网（如因特网）中可能存在成千上万台主机</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）路由表中不可能包括所有目的主机的地址信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 内存资源占用巨大</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由表搜索时间很长</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）隐藏主机信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP地址：网络号（netid）和主机号（hostid）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP路由表中保存相关的目的网络信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.标准路由选择算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）下一站选路的基本思想</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由表仅指定从该路由器到目的路径上的下一步，而该路由器并不知道到达目的完整路径</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）标准的IP路由表包含许多（N，R）对序偶</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; N：目的网络的IP地址（使用目的主机IP地址的较少）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; R：到N路径上的“下一个”路由器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.子网选路——标准路由选择算法的扩充</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.路由表中的特殊路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）默认路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）特定主机路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.统一的路由选择算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）特定主机路由表项</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）默认路由表项</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）标准网络路由表项</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）子网路由表项</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）路由表的建立与更新</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.静态路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 什么是静态路由？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 静态路由是由人工建立和管理的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 静态路由不会发生变化</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 静态路由必须手工更新以后反应到互联网拓扑结构或连接方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 静态路由的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优势</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 安全可靠、简单直观，避免了动态路由选择的开销</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 适用环境</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不太复杂的互联网结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 劣势</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不适用于复杂的互联网结构：建立和维护工作量大，容易出现路由环；互联网出现故障，静态路由不会自动做出更改</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.动态路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 动态路由可以通过自身学习，自动修改和刷新路由表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 动态路由要求路由器之间不断的交换路由信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优势：更多的自主性和灵活性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 适用环境：拓扑结构复杂、网络规模庞大的互联网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 自动排除错误路径</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 自动选择性能更优的路径</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 适用动态路由的基本条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器运行相同的路由选择协议，执行相同的路由选择算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广泛采用的路由选择协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由信息协议RIP：利用向量-距离算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 开放式最短路径优先协议OSPF：利用链路-状态算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由收敛（convergence）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 含义：互联网中的所有路由器都运行着相同的。精确的、足以反映当前互联网拓扑结构的路由信息。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 快速收敛是路由选择协议最希望具有的特征</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）RIP协议与向量-距离算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.向量-距离路由算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器周期性地向其相邻路由器广播自己知道的路由信息，用于通知相邻路由器自己可以到达的网络以及到达该网络的距离</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 相邻路由器可以根据收到的路由信息修改和刷新自己的路由表更改</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 向量-距离路由算法执行过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）路由器启动时初始化自己的路由表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）各路由器周期性地向其相邻的路由器广播自己的路由表信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）路由器收到其他路由器广播的路由信息后，刷新自己的路由表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 向量-距离路由算法更新过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 收到对方（发送路由表的路由器）的路由表后是否学习总体原则</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 比我原有的表目好的判断原则：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对方的距离+1&lt;本身原有的距离</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 学习的计算：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 距离+1 &nbsp; &nbsp;路径为对方</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;向量-距离路由算法的特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）优点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 算法简单、易于实现</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）缺点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 慢收敛问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 需要交换的信息量巨大</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）适用环境</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由变化不剧烈的中小型互联网&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.RIP协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）RIP协议是向量-距离选择算法在局域网上的直接实现</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）RIP协议规定了路由器之间交换路由信息的时间、交换信息的格式、错误的处理等内容</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 相邻的路由器之间每30s交换一次路由信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由信息来源与本地路由表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器到达目的网络的距离以“跳数”计算</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RIP协议的实现问题：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 相同开销路由：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 先见为主</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 过时路由：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 使用计时器超时时间一般为180s，相当于6个RIP刷新周期</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 慢收敛问题与对策</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 慢收敛问题的产生原因</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 慢收敛问题的解决对策</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）限制路径最大“距离”对策</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RIP协议规定，当路由表目“距离”等于或大于16为不可达路由，从路由表中删除</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）水平分割对策</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由器从某个接口发送路由刷新报文时，不能包含该接口原有获取的信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）保持对策</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RIP协议规定在得知目的网络不可能到达后的一定时间内（60秒），不接受关于此网路的任何可达信息。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）带触发刷新的毒性逆转对策</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当某路径崩溃后，最早广播比路由的路由器将原路由保留在更新报文中，并距离置位无限长，同时使用触发刷新技术，立即广播，不等待更新周期到来</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.RIP协议与子网路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）RFC颁布第一个版本之前，RIP协议已经被写成各种程序并被广泛使用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要原因：配置和部署简单</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）RIP Version 1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 使用标准的IP地址，不支持子网路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）RIP Version 2</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 支持子网路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 支持身份验证</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 支持多播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）OSPF协议与链路-状态算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 链路-状态（L-S）路由选择算法的基本思想：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 互联网上的每个路由器周期性地向其他路由器广播自己与相邻路由器的连接关系</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 互联网上的每个路由器利用收到的路由信息画出一张互联网拓扑结构图</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 利用画出的拓扑图和最短路径优先算法，计算自己到达各个网络的最短路径</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OSPF路由选择协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OSPF路由选择协议以链路-状态算法为基础</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要优势</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 收敛速度快</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 支持服务类型选路</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 提供负载均衡和身份认证</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 使用环境</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 规模庞大、环境复杂的互联网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要缺陷</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 要求较高的路由器处理能力</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一定的带宽需求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要解决方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分层（区域）--骨干区域为area0，区域标识按IP地址格式指派路由器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 向量-距离算法与链路-状态算法的原理性差异</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五）部署和选择路由协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.静态路由</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 适用于小型、单路径、静态IP互联网环境</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传输只能通过一条路径进行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.RIP路由协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.OSPF路由协议</p><p>&nbsp; &nbsp; 七、组播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）单播、广播与组播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1。单播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 单播的特点是一对一地传输数据，数据发送方发出的信息包只能传送到一个接收方</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 若发送方同时给多个接收方传输相同的数据包，发送方必须发送多份的相同数据包</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当客户机数量大、单机流量包也大时，服务器将不堪重负，发生延迟长、网络拥塞现象</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.广播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广播的特点是路由器和交换机将同一个信息包无条件地发往每一条分支路径，由接收方自行决定接下来还是将其丢弃</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 服务器不用向每个用户单独发送数据，流量负载低，如有线电视网</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 但这种方式对于路由器而言，有多少分支就要重复发送多少次，而不论这些主机是否乐于接受该数据包，无法针对每个用户的要求和时间及时提供个性化服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.组播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组播是一种允许一个或者多个发送方发送单一数据包到多个接收方的网络传输方式，它采用组播地址，只向需要数据包的主机和网络发送数据包</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 采用这种方式，需要相同数据流的客户端可以加入相同的组，共享一条数据流，节省了服务器的负载，提高了网络传输速率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 与单播协议相比，组播协议可根据接收者的需要对数据流进行复制转发，服务器端的服务总带宽不受客户机接入带宽的限制，单组播协议没有纠错机制，发生丢包、错包后难以弥补</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP组播的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 使用组地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 动态的组地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 底层硬件支持</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.单播、广播、组播比较</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）单播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通信模式：一对一</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目的地址：单播地址（A、B、C类地址）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 服务器及时响应客户机的请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 服务器针对每个客户不同的请求发送不同的数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 应用举例：网络浏览</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）广播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通信模式：一对所有</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目的地址：广播地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）组播</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通信模式：一对一组</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目的地址：组播地址（D类地址）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）组播技术基础</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.组播的相关协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 根据协议的作用范围，组播协议分为组播管理协议和组播路由协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组播管理协议是主机和路由器之间的协议，又包括Internet组管理协议（IGMP）和Ciso专用的组管理协议（CGMP）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组管理协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IGMP协议运行于主机和主机直接连接的组播路由器之间，其功能是：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一方面通过协议，主机通知本地路由器希望加入并接收某个特定组播组的消息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 另一方面，...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IGMP协议的发展经过了IGMPv1、IGMPv2、IGMPv3、IGMPv4.目前通用的是IGMPv3.</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组播路由协议是路由器与路由器之间的协议，又分为域内组播路由协议以及域间组播路由协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IP组播路由协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组播路由协议是IP组播协议体系中最核心的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组播路由由源地址、组地址、入接口列表和出接口列表4部分组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组播路由协议分为域内组播路由协议以及域间组播路由协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 域内组播路由协议又分为密集模型（适用于带宽充裕的网络）和稀疏模型（适用于带宽未必有充裕的网络）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络上使用较多的域内组播协议有DVMRP、MOSPF协议和PIM协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于域间组播路由的协议主要有多协议便捷网关协议（MBGP）和组播源发现协议（MSDP）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 各种组播协议都需要获得网络的单播拓扑结构</p><p>&nbsp; &nbsp; 八、IPv6协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）IPv6的局限性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.地址空间的局限性：IP地址空间耗尽制约了互联网的发展，子网划分、无类域间路由（CIDR）等方法虽使IP地址得到有效的利用，但也仅仅是缓解了地址短缺的矛盾</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.IP协议的性能问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.IP协议的安全性问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.自动配置问题：IP协议涉及初没有考虑自动配置问题。后来最优DHCP（动态主机配置协议）在一定程度上解决了地址自动配置问题，但需要对DHCP服务器配置，比较麻烦。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.服务质量（QoS）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）IPv6地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.IPv6的地址表示：128位地址长度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基本表示法：按16位一段，每个位段转换为4位十六进制数，并用冒号隔开。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 零压缩法：在有多个零出现时，用一位0标识一个位段。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果几个连续的段位的值都为0，那么这些零可以简写为::，称为双冒号表示法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在使用零压缩法时，不能把一个位段内部的有效0也压缩掉</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 双冒号在一个地址中只能出现一次</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.IPv6前缀：与无类域间路由类似，IPv6采用前缀表示法形如“地址/前缀长度”。前缀是IPv6的一部分，用来表示路由或子网标识。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.IPv6地址类型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 单播地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 组播地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 任播地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特殊地址：全0地址（地址不存在），回送地址（0::1），IPv4兼容的IPv6地址，映射到IPv4的IPv6等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）IPv6数据报格式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IPv6的数据报由一个IPv6的基本头、多个扩展头和一个高层协议数据单元组成。基本头固定的40字节长度。一些可选的内容放在扩展头部分实现，此种设计方法可提高数据报的处理效率。IPv6数据报格式对IPv4不向下兼容。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.IPv6数据报各域段含义：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 版本：取值为6，意思是IPv6协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通信类型：表示IPv6的数据报类型或优先级，以提供区分服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 流标记</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 载荷长度：有效载荷长度，包含扩展头和高层数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 下一个报头：存在扩展头，该域段的值指明下一个扩展头的类型；如果无扩展头，该域段的值指明高层数据的类型，如TCP、UDP或ICMPv6等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 跳数限制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 源地址：源IPv6</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.IPv6扩展头</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IPv6的基本报头固定40字节长，一些可选头信息由IPv6扩展头实现。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）IPv6数据报</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 扩展头包含的内容</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 逐跳选项头：类型为0</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目的选项头：类型为60</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 路由头：类型43</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分片头：类型44</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 认证头：类型51</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 封装安全有效载荷报头：类型52</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）IPv6地址自动配置</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分为两类：有状态和无状态两种形式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 无状态地址配置：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 128的IPv6地址由64位前缀和64位网络接口标识符组成。如果主机与本地网络的主机通信可以直接通信，主机之间可以利用该地址直接通信；如果与其他网络互联时，主机需要从网络中的路由器中获得该网络使用的网络前缀，然后与64位网络接口标识符结合形成有效的IPv6的地址。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有状态地址配置：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 自动配置需要DHCPv6服务器的支持，主机向DHCPv6服务器发多播“DHCP请求信息”，DHCPv6返回“DHCP应答消息”中将分配的地址返回请求主机，主机利用该地址作为自己的IPv6进行配置。</p><p>&nbsp; &nbsp; 九、TCP与UDP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 可靠性是一个计算机系统的基础，在网络数据传输中用户希望互联网能够提供迅速、准确、可靠的通信功能，保证不发生丢失、重复、错婿等可靠性问题。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 传输层是TCP/IP体系结构中至关重要的一层。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）端对端通信</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP：传输控制协议；UDP：用户数据报协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传输层需要提供从一台主机到另一远程主机的端对端通信控制。传输层利用互联层发送数据，每一传输层都需要封装在一个互联层的数据报中通过互联网，到达目的地后，互联层再将数据提交给传输层。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）传输控制协议TCP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 保证可靠性是传输层的主要责任</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.TCP提供的服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从TCP用户的角度看，TCP可以提供面向连接、可靠的、全双工的数据流传输服务，保证数据在数据连接关闭之前被可靠地投递到目的地</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 面向连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 完全可靠性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 流接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 连接的可靠性与优雅关闭</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.TCP的可靠性实现</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可靠性问题即包括数据丢失后的恢复问题，又包括连接的可靠性建立问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.数据丢失与重发</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 发送方利用重发技术补偿数据报的丢失，需要通信双方协同解决。（确认机制）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP选择重发等待时间具有适应性（如利用KARN算法计算）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.连接的可靠建立与优雅关闭</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为确保连接建立和终止的可靠性，TCP使用了“三次握手”法。简答说在建立和终止过程中，通信双方需要交换3个报文。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.TCP缓冲、流控与窗口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP使用窗口机制进行流量控制，当连接建立时，连接的每一端分配一块缓冲区存储接收的数据，并将缓冲区的尺寸（大小）发送另一端。当数据到达时，接收方发送确认，其中包含自己剩余的缓冲区尺寸。将剩余的缓冲区空间的数量称为窗口。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 窗口和窗口通告可以有效控制TCP的流量，使发送方的数据不会溢出接收方的缓冲空间。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.TCP连接与端口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个TCP连接的两端称为端口，端口用16位的二进制数表示</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP可利用端口提供多路复用功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）用户数据协议UDP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从用户角度看，UDP虽处于传输层，但UDP提供了面向非连接，不可靠的传输服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UDP面向非连接，它可以将数据直接封装在IP数据报中进行发送。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：运行高效和实现简单</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）端口号的分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目的：区分不同的应用程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 三种端口组：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 熟知（著名）端口：0~1023</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 注册端口：1024~49151</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 动态或私有端口：49152~65535</p><p>&nbsp; &nbsp; 十、NAT的基本工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）为何使用网络地址转换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NAT是为了在现阶段解决IP地址短缺和不足的问题而设计的。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 根据NAT技术的分类，主要分为：静态NAT，动态NAT和网络地址端口转换NAPT</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.静态NAT</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.动态NAT</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当NAT地址池中的全局地址被全部占用后，NAT设备将拒绝再来的地址转换申请</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.网络地址端口转化NAPT</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NAPT是目前最常使用的一种NAT类型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 外部网络的主机不能主动访问内部网络中的主机</p><p><br/></p><p><strong><span style="font-size: 18px;">第4章 Internet基本服务</span></strong></p><p>&nbsp; &nbsp; 学习目标</p><p>&nbsp; &nbsp; &nbsp; &nbsp; ...</p><p>&nbsp; &nbsp; 一、应用进程通信模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）客户机/服务器模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.什么是客户机/服务器模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 客户机和服务器分别是指两个应用程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 服务器处于守候状态，并监视客户机的请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当客户机向服务器发出服务请求时，服务器做出响应</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.客户机与服务器的特性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）服务器程序特性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一种专门用途的、享有特权的应用程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 能够同时处理多个远程客户机的请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在一台共享计算机上运行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 被动的等待客户机的通信请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）客户机程序特性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个非常普通的应用程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个用户服务可以随即开始和停止</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在用户计算机上本地运行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主动地与服务器程序进行联系</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）实现中需要解决的主要问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&gt;标识一个特定的服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 互联网TCP或UDP通常使用端口号作为自己特定的标识</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;响应并发请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 客户机发出的请求是随机的，可能很多客户机同时请求不同服务，因此服务器必须具备多个并发处理能力，服务器有两种实现方案：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 重复服务器：服务器包含请求队列，按照先进先出原则处理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 并发服务器：是一个守护进程，没有请求时，它处于等待状态；客户机每来请求，服务器立即创建一个子进程，然后回到等待；并发服务器称主服务器，而子进程称从服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3&gt;服务器程序的安全问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）对等计算模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.什么是对等计算模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对等计算模型（P2P）通过直接交换来共享计算机资源和服务。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.P2P网络的基本结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）集中目录式结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Napster是一种典型的代表软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 要求服务器要持续运转</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）分布式非结构化P2P网络结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 采用随机图的组织方式形成一个松散的网络</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有较好的容错能力，支持复杂查询（多关键词、模糊查询）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多采用洪泛方式查询和定位资源（网络负载重）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可扩展性差</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 典型代表：Gnuella，没有中心服务器，用TTL机制决定是否继续转发信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）分布式结构化P2P网络</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 采用基于分布式散列表（DHT）的分布式发现资源路由算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DHT是由广域范围的大量节点共同维护的巨大散列表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DHT的节点是动态的，且数量巨大，非中心化和自组织成为两个重要的指标</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 典型代表：pastry，tapestry，chord，CAN</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）混合式结构P2P网络</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在分布式模式的基础上，将用户结点按能力进行分类，包括用户结点、搜索结点和索引结点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 典型代表：skype、pplive、BT</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.P2P网络的应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分布式科学计算</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 协同工作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分布式搜索引擎</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 流媒体直播</p><p>&nbsp; &nbsp; 二、域名系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）互联网的命名机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 互联网利用IP地址识别主机，不便于记忆，使用字符串记忆主机好读易记（域名系统诞生）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 命名机制遵循的原则：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 全局唯一性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 名字便于管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 高效地进行映射</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.无层次命名机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在无层次命名机制中，主机名简单地由一个字符串组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 无层次名字的管理与映射很简单</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 但随着互联网中主机的增加，这种命名机制的缺点就明显得表现出来</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目前，无层次命名机制已被层次型命名机制所取代</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.层次型命名机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 名字中加入结构，而这种结构是层次型的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 层次命名机制对名字的管理非常有利。类似树状结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主机的名字就是从树叶到树根路径上各结点标识符的有序序列</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.TCP/IP互联网域名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在TCP/IP互联网中的层次型名字管理机制是由域名系统DNS（Domain Name System）来实现的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.Internet域名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DNS把整个因特网划分成多个顶级域，并为每个顶级域规定了国际通用的域名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 顶级域的划分采用了两种划分模式，即组织模式和地理模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）域名解析</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 域名解析</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将域名翻译为对应IP地址的过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 域名解析器 &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 请求域名解析服务的软件，运行在客户端</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 域名服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 负责对域名的解析工作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 域名体系具有层次型，因此域名服务器也有不同的级别</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 最靠近用户的是本地域名服务器，最顶层为根域名服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.域名解析方式和解析过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 域名解析采用自顶向下的算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在域名解析时，首先是向本地域名服务器提出域名请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 两种方式：可一次性完成全部名字地址变换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 反复解析：每次请求一个服务器，不行再请求别的服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.提高域名解析效率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 解析从本地服务器开始</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 域名服务器的高速缓存技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主机上的高速缓存技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.对象类型与资源记录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对象类型与类别</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 资源记录</p><p>&nbsp; &nbsp; 三、远程登录服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）远程登录协议（Telnet）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户使用Telnet命令，使自己的计算机成为远程计算机的一台仿真终端</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 远程登录允许任意类型的计算机之间进行通信，具体实现的功能有：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 本地用户与远程计算机上运行的程序交互</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 远程登录后，可以运行远程计算机上的任何应用程序（有权限），屏蔽不同型号计算机之间的差异</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）远程登录的工作原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Telnet采用客户机/服务器模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通过Tcp连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络虚拟终端NVT格式将不同的用户本地终端格式统一起来，是的各个终端只与虚拟终端NVt打交道</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）使用远程登录</p><p>&nbsp; &nbsp; 四、FTP服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）FTP客户机/服务器模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TCP建立双重连接：一个控制连接和一个数据连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 建立数据连接的方式有两种：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主动模式（默认模式）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 被动模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）FTP命令与响应</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FTP命令和应答采用7位ASCII码</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FTP命令有30多种</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）FTP文件格式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FTP协议支持两种文件传输方式：文本文件传输和二进制文件传输</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文本文件传输</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 二进制文件传输（图像文件类型）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）用户接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传统FTP命令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 浏览器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 下载工具</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五）FTP访问控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FTP服务器利用用户账号来控制用户对服务器的访问权限</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户名：Anonymous</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 口令：guest</p><p>&nbsp; &nbsp; 五、电子邮件系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）电子邮件系统的基本知识</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.电子邮件系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 电子邮件系统采用客户机/服务器工作模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 电子邮件应用程序的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.TCP/IP电子邮件的传输过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 利用SMTP（简单邮件传输协议）协议向邮件服务器发送邮件，使用POP3（邮局协议）或IMAP协议从邮件服务器邮箱中读取邮件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.电子邮件地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）电子邮件传递协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.SMTP协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SMTP协议负责邮件从一个邮局传送到另一个邮局，分为3个阶段：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 连接建立：连接建立后，客户机与服务器互通自己的域名，同时确认对方域名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 邮件传递：将邮件源地址、目的地址和邮件内容传递到SMTP服务器，SMTP服务器进行相应的相应并接收邮件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 连接关闭：SMTP客户机发出QUIT命令，服务器处理命令后相应，随后关闭TCP连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.POP3协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3指第3个版本。一旦建立TCP连接，POP3客户机向服务器发送命令，下载和删除邮件。分为3个阶段：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 认证阶段：邮箱具有权限，客户机将用户名和密码传递给服务器，服务器判断是否合法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 事务处理阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 更新阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）电子邮件的报文格式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.RFC822</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 邮件头</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 邮件体</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.MIME协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对RFC822作了补充</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 添加了一些邮件头字段，主要有：MIME-Version、Content-Type、Content-Transfer_Encoding等</p><p>&nbsp; &nbsp; 六、Web服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）WWW服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.WWW服务系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WWW（world wide web）或WEB服务，以超文本标记语言（HTML）和超文本传输协议（HTTP）为基础。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 以超文本方式组织网络多媒体信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可在世界范围内任意查找、检索、浏览及添加信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 提供生动直观、易于使用、统一的图形用户界面</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 服务器之间可相互连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可访问图像、声音、影像和文本信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.WWW服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WWW服务器上以web页方式组织文档，还包含指向其他页面的指针。利用超链接将分布在网络中的服务器建立关联。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 超文本可利用引用链接其他不同类型的文件，这些具有多媒体操作的超文本，称为超媒体</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.WWW浏览器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WWW客户机程序称为WWW浏览器，是用来浏览服务器中WEB页面的软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 过程：WWW浏览器负责接收用户的请求，利用HTTP协议将用户的请求传送给WWW服务器。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.页面地址——URL</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WWW服务器中的页面很多，通过URL（统一资源定位器）指定什么协议、哪台服务器和哪个文件等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; URL由三部分组成：协议类型、主机名和路径及文件名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）WWW系统的传输协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 超文本协议是建立在TCP连接基础上，面向对象的协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HTTP将一次请求/服务的全过程定义为一个简单事务处理，它由一下四个步骤组成：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 连接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 应答</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 关闭</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）WWW系统的页面标识方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）Web的安全性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.浏览器的安全性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.Web服务器的安全性</p><p><br/></p><p><strong><span style="font-size: 18px;">第5章 新型网络应用</span></strong></p><p>&nbsp; &nbsp; 学习目标</p><p>&nbsp; &nbsp; &nbsp; &nbsp; ...</p><p>&nbsp; &nbsp; 一、即时通信系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）即时通信系统的概述</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 即时通信（IM）是一种基于Internet的通信服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.应用软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）即时通信的基础通信模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.P2P通信模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.中转通信模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）即时通信实例</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.QQ用户登录过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.QQ聊天通信过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.QQ文件传输过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）即时通信系统的通信协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.SIP协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户代理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 代理服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 重定向服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 注册服务器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.SIMPLE &nbsp; &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 是SIP协议的扩展，支持即时通信服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.XMPP</p><p>&nbsp; &nbsp; 二、文件共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）网络文件系统NFS</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）Windows LAN文件共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.NetBIOS协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.CIRS协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）P2P文件共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.P2P文件共享历史</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.P2P文件共享的理论基础</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.P2P文件共享系统示例——Maze</p><p>&nbsp; &nbsp; 三、IPTV</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）IPTV系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.视频点播（VOD）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.直播电视</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.时移电视</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）IPTV系统关键技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IPTV基本技术形体可概括为视频数字化、传输IP化、播放流媒体化</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 关键技术包括：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 媒体内容分发技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数字版权管理技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IPTV运营支撑管理系统</p><p>&nbsp; &nbsp; 四、VOIP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）VOIP实现方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PC-to-PC</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PC-to-Phone</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Phone-to-Phone</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）VOIP系统的组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 终端设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网关</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多点控制单元</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网守</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）Skype</p><p>&nbsp; &nbsp; 五、网络搜索技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）网络搜索引擎</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）搜索引擎的原理与组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.全文搜索引擎功能模块的组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 搜索器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 索引器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 检索器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.目录导航和网页搜索引擎组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.Google和百度搜索引擎</p><p>&nbsp; &nbsp; 六、社交网络</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）社交网络的概念与历史</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）社会网络的基本模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）社会网络应用实例</p><p><br/></p><p><br/></p><p><strong><span style="font-size: 18px;">第6章 网络管理与网路安全</span></strong></p><p>&nbsp; &nbsp; 一、网络管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）网络管理的基本概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.网路管理的定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.网络管理对象：硬件资源和软件资源</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）网络管理的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 配置管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 故障管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计费管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 性能管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 安全管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）网络管理模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.网络管理的基本模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 集中式管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分布式管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）网络管理协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.发展简史</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.SNMP协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从被管理设备中收集数据有轮询和基于中断两种方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.CMIP协议</p><p>&nbsp; &nbsp; 二、信息安全技术概述</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）安全信息的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要目标：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 真实性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 保密性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可用性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不可抵赖性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可控制性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可审查性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）信息安全策略</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 信息安全的实现要靠先进的技术、严格的安全管理、法律约束与安全教育</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）信息安全等级</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络安全性标准（DoD5200.28_STD），即可信任计算机标准评估准则。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A1、B1、B2、B3、C1、C2、D1</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在我国，以《计算机信息系统安全保护等级划分准则》（GB17859-1999）位指导，将信息和信息系统的安全系统分为5个等级：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 自主保护级</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 指导保护级</p><p>&nbsp; &nbsp; 三、网络安全问题与安全策略</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）网络安全的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.安全的目的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对网络系统而言主要有信息的存储安全和信息的传输安全</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传输安全则需要预防：网上信息的监听、用户身份的认证、网络信息的篡改、发出信息的否认、信息重放</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.安全措施</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 社会法律政策、企业规章以及网络安全教育</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 技术方面措施</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 审计与管理措施</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）OSI安全框架（X.800）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OSI安全框架关注三个方面：安全攻击、安全机制和安全服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.安全攻击</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 被动攻击</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主动攻击</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 服务攻击和非服务攻击</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.安全机制 &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分为两类：特定协议层实现的和不输于任何的协议层的安全服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.安全服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）网络安全模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对发送信息的相关安全变换，如消息加密</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 双方共享某些秘密信息，并希望这些消息不为攻击者所知，如加密密钥</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 安全服务主要包含4个方面：安全传输、信息保密、分配和共享秘密信息、通信协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由程序引起的威胁有2种：信息访问威胁和服务威胁</p><p>&nbsp; &nbsp; 四、加密技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）密码学基本术语</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 明文：原始的消息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 密文：加密后的消息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 加密：从明文到密文的变换过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 解密：从密文到明文的变换过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 密码编辑学：研究各种加密方案的学科</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 密码分析学：研究破译密码获得消息的学科</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 密码学</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.密码编码学</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 转换明文为密文的运算类型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 所用的秘钥数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理明文的方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.密码分析学</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 密码分析攻击、穷举攻击</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.无条件安全与计算上的安全</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.代换与置换技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 代换法：将明文字母替换成其他字母、数字或符号的方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 置换法：通过置换而形成新的队列</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）对称密码</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.对称密码的模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 明文：作为算法的输入</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 加密算法：对明文进行各种代换和置换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 密钥：加密算法的输入，不同于明文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 密文：算法的输出</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 解密算法：加密算法的逆</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.数据加密标准</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广泛使用的加密体制是数据加密标准（DES）采用64位明文初始置换重新排列后和64位密钥进行一系列变换得到64位输出密文</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1977年被美国的NIST，即国家标准和技术研究所采纳为联邦信息处理标注46（FIPS PUB 46）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.其他常见的对称加密算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 三重DES</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2001年NIST将Rijndarl作为AES算法，它的密钥长度为128、/12或256位，分组长度为128位</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Blowfish算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RC5</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）公钥密码</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.公钥密码体制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.公钥密码体制的应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 加密/解密</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数字签名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 密钥交换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.RSA算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RSA既能用于加密，也能用于数字签名的算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 选取密钥的过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 解密过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.其他的公钥加密算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Elgama算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基于离散对数的公钥密码体制和椭圆曲线加密体系</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 背包加密算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基本原理：背包问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）密钥管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.密钥的分发</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.密钥的验证</p><p>&nbsp; &nbsp; 五、认证技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）消息认证</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.消息认证的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.消息认证的方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.消息认证的模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.认证函数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）数字签名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.数字签名的需求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.数字签名的创建</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.数字签名的验证</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）身份认证</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.口令认证</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.持证认证</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.生物识别</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）常用的身份认证协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目前满足条件的协议主要有：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一次一密机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 请求应答机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 询问应答方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; X.509认证协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Kerberos认证协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Kerberos基于对称密钥体制，一般采用DES</p><p>&nbsp; &nbsp; 六、安全技术应用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）安全电子邮件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.PGP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 鉴别、机密性、压缩、电子邮件的兼容性和分段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数字签名：采用DSS/SHA或RSA/SHA</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 报文加密：CAST或DEA，或3DES或RSA</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 压缩：ZIP</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 兼容：64-BASE转换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分段：支持分段和重新分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.S/MIME</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 功能：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 加密数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 签名的数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 透明签名的数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 签名并且加密的数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）网络层安全：IPSEC</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要协议：身份认证头（AH）协议和封装安全负载（ESP）协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.AH协议（身份认证头协议）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AH协议提供源身份认证和数据完整性，但没有提供秘密性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AH头在原有IP数据报数据（例如TCP或UDP段）和IP头之间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.ESP协议</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ESP协议提供了数据完整性、身份认证和秘密性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ESP协议不但提供了源主机身份认证，而且提供了网络层秘密性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）WEB安全</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.Web所面临的威胁</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.Web流量安全性方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络级、传输级、应用级</p><p>&nbsp; &nbsp; 七、入侵检测技术与防火墙</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）入侵者</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.假冒者</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.非法者</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.秘密用户</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）入侵技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 统计异常检测</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基于规则的检测</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.审计记录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 原有的审计记录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 专门用于检测的审计记录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.统计异常检测</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 阈值检测和基于轮廓的检测</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.基于规则的入侵检测</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基于规则的异常检测方法是基于对过去行为的观察</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基于规则的渗透鉴别采用了基于专家系统技术的方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.分布式入侵检测</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分布式入侵检测是要保护居于网内或内部互联网络内所有的主机安全</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三）防火墙的特性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 防火墙的定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.防火墙的设计目标</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 所有从内到外和从外到内的通信量都必须经过防火墙</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 只有被授权的通信才能通过防火墙</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 防火墙对于渗透是免疫的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.用来控制访问和执行站点安全策略的4中常用技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 服务控制（确定可以访问的Internet服务类型）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 方向控制（决定哪些特定方向上服务请求可以被发起并通过防火墙）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户控制（根据哪个用户尝试访问服务来控制对一个服务的访问）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 行为控制（控制怎样使用特定的服务）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.防火墙的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四）防火墙的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 包过滤防火墙、应用级网关、电路级网关、堡垒主机</p><p>&nbsp; &nbsp; 八、计算机病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一）计算机病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计算机病毒的定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.病毒的生命周期</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 潜伏阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 繁殖阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 触发阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 执行阶段</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.病毒的结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.病毒的种类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 寄生病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储器驻留病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 引导区病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 隐形病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多态病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.几种常见的病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 宏病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 电子邮件病毒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特洛伊木马</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计算机蠕虫</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二）计算机病毒的防治策略</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 反病毒软件分为四代：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 简单的扫描程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 启发式的扫描程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 行为陷阱</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 全方位的保护</p>]]></description>
      <pubDate>Wed, 09 Aug 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>用你的魔法和勇气，与小伙伴们一起勇闯《西方世界》</title>
      <link>http://old-blog.smallyu.net/index011a.html?id=60</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=60</guid>
      <description><![CDATA[<p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502186363869142.png"/></p><p><br/></p><p><strong><span style="font-size: 18px;">章节一 追逐父亲</span></strong></p><p><span style="font-size: 16px;">一位父亲和他的四个女儿相约去某个神秘的地方，由于种种原因，章节一的女主来晚了，还没等见到父亲，父亲就已经出发了。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502186460176045.png"/></p><p><span style="font-size: 16px;">女主在追逐父亲的途中，遇到了她的姐妹们，她的姐妹们也没能和父亲一起前去。但她们找到一个传送装置，可以通过传送装置直接到达父亲所在的神秘地方。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502186547159716.png"/></p><p><span style="font-size: 16px;">不过这个装置很危险，它并不一定能够准确到达目的地，而有可能传送到达任何地方。女主一进入传送装置，装置就被一个不明所以傻傻分不清的姐妹启动了。然后女主来到了这个不知道什么地方的地方。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502186622177148.png"/></p><p><span style="font-size: 16px;">女主属性：</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 武器：魔法杖</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 技能：使用魔法杖短距离攻击，使用魔法球，魔法球可反弹</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 远程：瞬移一段距离，可以穿过薄栅栏</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 特技：能够驱动魔法井 &nbsp; </span>&nbsp;</p><p><br/></p><p><strong><span style="font-size: 18px;">章节二 一个孩子和他的铁铲</span></strong></p><p><span style="font-size: 16px;">这小子被困在了地下，回不去地表。在这儿看到了这么一棵树，就推测，树是需要阳光的，阳光从正上方照射下来，所以这里一定有出口。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502186740696895.png"/></p><p><span style="font-size: 16px;">哦不，上面的内容是第一映像得到的剧情。真实剧情是，男主所在是一个挖矿工团伙。团伙中每个人都深信不疑他们现在是在月球上挖月岩。男主看到了地表穿透下来的阳光，怀疑这里根本不是月球是地球，然后把这一消息告诉了团伙老大。</span></p><p><span style="font-size: 16px;">然后被团伙老大赶了出来。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502186839438370.png"/></p><p><span style="font-size: 16px;">所有人都开始厌恶男主，认为男主是卑鄙的。男主不服，开始了证明他的猜疑之旅。</span></p><p><span style="font-size: 16px;">男主属性：</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 武器：铁锹、溜冰鞋、炸药</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 技能：使用铁锹短距离攻击，扔炸弹远距离攻击</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 远程：溜冰</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 特技：能够穿过低矮的洞穴，能够使用铁锹潜入土质松软的地下，使用溜冰鞋在水面上行走能够</span></p><p><br/></p><p><strong><span style="font-size: 18px;">章节三 魅惑雇佣兵</span></strong></p><p><span style="font-size: 16px;">女主奉老板之命到西部区域的一处圣地取一块价值不菲的宝石。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502187087413734.png"/></p><p><span style="font-size: 16px;">任务途中女主遇到了老巫师和章节二中的铁铲小子，还看到了具有神秘力量的石柱，石柱上画着四个人的脸，包括女主的和铁铲小子的。</span></p><p><span style="font-size: 16px;">老巫师告诉女主，石柱上的四人将结为同伴，共同做一些不可描述的事情，她已经在石柱旁等了很长很长时间，石柱上的四人相遇是先前预言家预言过的。石柱还拥有让人瞬移的能力，在地图多处都有这样的石柱。</span></p><p><span style="font-size: 16px;">女主不信，继续找宝石。</span></p><p><span style="font-size: 16px;">寻找宝石的过程中，女主偶尔遇到困难，和铁铲小子合作通过了难关。</span></p><p><span style="font-size: 16px;">终于在西部区域的圣地拿到了宝石。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502187412265589.png"/></p><p><span style="font-size: 16px;">女主回到老板处交付宝石，并索取报酬。没想到老板背叛了她，不但没有给付报酬，还将她关押在地牢。</span></p><p><span style="font-size: 16px;">女主属性：</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 武器：罩巾、催眠术士的面具</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 技能：使用罩巾中距离攻击，敌人被击中会眩晕。催眠术士的面具让女主可控制被眩晕到的敌人</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 远程：移动加速</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 特技：使用罩巾拉动远方木桩，将自己拉送木桩所在位置</span></p><p><br/></p><p><strong><span style="font-size: 18px;">章节四 呔嗬</span></strong></p><p><span style="font-size: 16px;">呔嗬是一位探险家，驾着船只从远方而来。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502187489142561.png"/></p><p><span style="font-size: 16px;">探险途中遇到了老巫师，以及章节一寻找父亲会使用魔法的女主。</span></p><p><span style="font-size: 16px;">男主属性：</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 武器：拳套</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 技能：拳击</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 远程：公牛冲锋</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 特技：击碎石头</span></p><p><br/></p><p><strong><span style="font-size: 18px;">章节五 勋爵和白鼬</span></strong></p><p><span style="font-size: 16px;">现在呔嗬和卢米纳（会魔法的章节一女主）要合力前进了。</span></p><p><span style="font-size: 16px;">呔嗬追寻的是一只可与自己匹敌的野兽，卢米纳想要的则是回家的方法。</span></p><p><span style="font-size: 16px;">呔嗬打败了一直体型庞大的凶猛野兽，实现了愿望。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502187564145932.png"/></p><p><span style="font-size: 16px;">不过卢米纳却落空了。她要找的正是章节三女主拿走的宝石。卢米纳不得不去找她。</span></p><p><span style="font-size: 16px;">卢卡纳依旧落空了，宝石在老板那里。卢卡纳救出了被老板押禁的女主，然后一起乘飞行器前往沙漠，追寻老板和宝石。</span></p><p><br/></p><p><strong><span style="font-size: 18px;">章节六 追击</span></strong></p><p><span style="font-size: 16px;">两个人来到了沙漠。</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502187615135058.png"/></p><p><span style="font-size: 16px;">在一个下着雪的神秘洞穴，遇到了这一章节的BOSS</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/08/201708081502187730115963.png"/></p><p><span style="font-size: 16px;">没错，宝石依旧不在这里</span></p><p><br/></p><p><span style="font-size: 16px;">宝石不在沙漠，在哪里呢？故事还远没有结束。</span></p><p><span style="font-size: 16px;">游戏剧情还是比较简陋的，大多是没有开头的故事，看的时候会不禁想问为什么，毕竟游戏没有把主人公的背景交代清楚</span></p><p><span style="font-size: 16px;">不过游戏很好玩，冒险解谜类游戏，尤其是好几个主人公在同一张地图中利用不同的技能穿过特性，真心想如果这是一款多人合作游戏该多好</span></p><p><span style="font-size: 16px;">但就单机游戏，它可以让人体会不同的人物情节，人物能力，以及合作的乐趣</span></p><p><span style="font-size: 16px;">画面也非常漂亮</span></p><p><span style="font-size: 16px;">尤其是你用一个人物第一遍走过了地形，第二遍还是同样的地方，却不得不因为人物的特殊能力另寻方法的时候，会感觉到游戏设计的精妙</span></p><p><span style="font-size: 16px;">人物和怪物都是Q版</span></p><p><span style="font-size: 16px;">难度不高，也不低，有些地方可能需要重复不止10次才能通过</span></p><p><span style="font-size: 16px;">游戏过程会有能力的提升，使用魔法的小女孩在到达天空（之城）后会学会使用可反弹的魔法球，后来在打败沙漠里的女BOSS后，学会了瞬移到魔法球所在位置的能力，位移距离大大增加，铁铲小子的炸药也是在后面的章节找到的</span></p><p><span style="font-size: 16px;">糙大叔之前只能爬矮墙，到后面高墙也能直接爬上去了</span></p><p><span style="font-size: 16px;">到之后相信那罩巾的和那铲子的也会学到新的能力</span></p><p><span style="font-size: 16px;">还会有更多的游戏内容</span></p><p><span style="font-size: 16px;">但是我不想再玩了</span></p><p><span style="font-size: 16px;">游戏整体稍（太）显（TM）幼（难）稚（了）</span></p><p><br/></p><p><span style="font-size: 16px;">如果再年轻几岁，一定要死命玩通关</span></p>]]></description>
      <pubDate>Tue, 08 Aug 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>NCRE4 · 网络工程师《操作系统原理》概要</title>
      <link>http://old-blog.smallyu.net/index37ab.html?id=59</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=59</guid>
      <description><![CDATA[<p><strong><span style="font-size: 18px;">前言</span></strong><br/></p><p>&nbsp; &nbsp; 考试方式：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 上机考试，总分50分，与四级其他一门课程合计考试时间长90分钟。</p><p>&nbsp; &nbsp; 题型：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 单选题 10道题 30分</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 多选题 10道题 20分</p><p>&nbsp; &nbsp; 基本要求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.掌握操作系统的基本概念、基本结构及运行机制。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.深入理解进程线程模型，深入理解进程同步机制，深入理解死锁概念及解决方案。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.掌握存储管理基本概念，掌握分区存储管理方案，深入理解虚拟页式存储管理方案。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.深入理解文件系统的设计、实现，以及提高文件系统性能的各种方法。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.了解I/O设备管理的基本概念、I/O软件组成，掌握典型的I/O设备管理技术。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 6.了解操作系统的演化过程、新的设计思想和实现技术。</p><p><br/></p><p><span style="font-size: 18px;"><strong>第一章 操作系统概论</strong></span></p><p>&nbsp; &nbsp; 考试内容：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.操作系统基本的概念、特征、分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.操作系统主要功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.操作系统发展演化进程，典型操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.操作系统结构设计，典型的操作系统结构</p><p>&nbsp; &nbsp; 操作系统基本的概念：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; 操作系统的特征：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.并发性：在多道程序环境下，并发性是指两个或多个时间在同一时间间隔内发生，即宏观上有多道程序同时执行，而微观上，在单处理机系统中每一个时刻仅能执行一道程序。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.共享性：共享指系统中的资源可供多个并发执行的进程使用。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 涉及资源：中央处理器、内存储器、外存储器、外部设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 共享方式：互斥共享、同时共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.随机性：也称异步性，不确定性，是指多道程序环境下，允许多个进程并发执行，由于资源的限制，进程的执行不是“一气呵成”的，是“走走停停”的。</p><p>&nbsp; &nbsp; 操作系统的功能：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.进程管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程管理、进程同步、进程间通信、调度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.存储管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 内存的分配与回收、存储保护、内存扩充</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.文件管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件存储空间的管理、目录管理、文件系统的安全性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.设备管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缓冲管理、设备分配、设备处理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.用户接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 命令接口、程序接口</p><p>&nbsp; &nbsp; 操作系统分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 按照用户界面的使用环境和功能特征，分为三种：批处理系统、分时系统、实时系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 随着计算机体系结构的发展，出现的多类型操作系统：个人操作系统、网络操作系统、分布式操作系统、嵌入式操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一、批处理操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.基本工作方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户将作业交给操作员，在受到一定数量的作业后，由操作员把这批作业输入到计算机，最后将结果交给用户</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.特点与分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 成批处理作业，</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：用户不直接与计算机交互，不适合调试程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：自动化较高，资源利用率高，作业吞吐量大，提高整个系统效率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分类：简单批处理系统、多道批处理系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 单道批处理系统：主要特征：自动性、顺序性、单道性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多道批处理系统：引入的好处：提高CPU的利用率；可提高内存和I/O设备的利用率；增加系统吞吐量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.设计思想</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 先把一个作业调入内存，等这个作业运行完毕，再调入下一个作业，如此反复，直到作业处理完毕</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 作业及作业的衔接都有监控程序自动控制，提高了作业运行效率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.作业控制说明书</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由作业控制语言编写的一段程序，通常放在程序前面，执行师，由程序读入作业控制说明书，按照说明书中的语句执行。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STEP1 ASM A</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STEP2 FTN B</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STEP3 LINK A,B,C</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STEP4 RUN C</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5.一般指令和特权指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特权指令：输入输出指令、停机指令等。只要监控程序才能执行特权指令。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户只能执行一般指令，如需执行特权指令，处理器会将控制权移交给监控程序。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.假脱机技术（SPOOLing）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.1假脱机的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 假脱机技术（SPOOLing）是指在联机情况下实现的同时外围操作，也称假脱机输入输出操作，它是操作系统中的一项将独占设备改为共享设备的技术。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.2假脱机技术的组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 假脱机技术由输入井和输出井、输入缓冲区和输出缓冲区、输入进程和输出进程、请求打印队列组成。SPOOLing系统的组成如下图所示。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6.3假脱机技术的特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; （1）提高了输入输出速度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; （2）将独占设备改造为共享设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; （3）实现了虚拟设备的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二、分时系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.基本工作方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户通过终端交互式地向系统提出命令，系统接受命令后，采用时间片轮转方式处理服务请求</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.设计思想</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将CPU的时间划分为若干个时间段、操作系统以时间片为单位，轮流为每个终端用户服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多路性：多个用户在同时使用一台计算机</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 交互性：用户直接干预操作的每一步</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 独占性：用户感觉不到计算机为他人服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 及时性：系统能对用户提出的额请求即使给予响应</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.影响响应时间的因素</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 机器处理能力</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 请求服务的时间长短</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 系统中连接的终端数目</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 服务请求的分布</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 调度算法（时间片的选取）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三、实时系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 实时系统是指系统能及时响应外部事件的请求，在规定的时间内，完成对该事件的处理，并控制所有实时任务协调一致地运行。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第一类：实时过程控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 工业控制，军事控制，...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第二类：实时通信（信息）处理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 电讯（自动交换），银行，飞机订票，故事行情</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 实时系统的特征：有多路性、独立性、及时性、交互性和可靠性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 四、嵌入式操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在各种设备、装置或系统中，完成特定功能的软硬件系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它们是一个大设备、装置或系统中的一部分，这个大设备、装置或系统可以不是“计算机”</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通常工作在反应式或对处理时间有较严格要求环境中</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由于它们被嵌入在各种设备、装置或系统中，因此称为嵌入式系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 嵌入式领域广泛使用的操作系统有：嵌入式Linux、Windows Fmbedded、VxWorks等，以及应用在智能手机和平板电脑的Android、iOS等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：系统内核小、专用性强、系统精简、高实用性、多任务的操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 五、个人计算机操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 单用户多任务的操作系统，比如Windows</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：界面友好、使用方便、用户无需具备专门的知识，也能熟练使用。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 六、网络操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络操作系统用于管理网络中的各种资源，为用户提供各种资源。其主要功能有网络通信管理、网络资源管理、网络安全管理和网络服务等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 类型：客户/服务器模式（C/S），对等模式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 七、分布式操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分布式处理系统是指由多个分散的处理单元经互联网络的连接而形成的系统。在分布式系统上配置的操作系统成为分布式操作系统。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分布性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 并行性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 透明性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 共享性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 健壮性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 八、智能卡操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它一般是紧紧围绕着它所服务的智能卡的特点而开发的。由于不可避免地收到了智能卡内微处理器芯片的性能及内存容量的影响，因此，在很大程度上不同于我们通常所见到的微机上的操作系统（例如DOS、UNIX等）。</p><p>&nbsp; &nbsp; 网络和分布式操作系统的区别：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.分布具有各个计算机间相互通讯，无主从关系；网络有主从关系、</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.分布式系统资源为所有用户共享；而网络有限制地共享。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.分布式系统中若干个计算机可相互协作共同完成一项任务。</p><p>&nbsp; &nbsp; 操作系统的发展（演化）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.手工操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.监控程序（早期批处理） &nbsp; &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.多道批处理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.分时系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.UNIX通用操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 6.个人计算机操作系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 7.Android操作系统</p><p>&nbsp; &nbsp; 操作系统结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 按照系统的功能和特性要求，选择合适的结构，使用相应的结构设计方法将系统逐步地分解、抽象和综合，使操作系统结构清晰、简单、可靠、易读、易修改，而且使用方便，适应性强。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 整体式结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 层次式结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 微内核（客户机/服务器）结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 一、整体结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 模块接口法、无序模块法、模块组合法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：根据功能划分模块</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：结构紧密，接口简单直接，模块之间转接的灵活性使系统效率高</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：由于模块之间可以任意相互调用，形成网络，各模块相互联系，独立性差，系统结构不清晰</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 结论：可适应性较差，使用与规模较小、使用环境比较稳定却要求效率较高的系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 二、层次结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 三、微内核结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p><br/></p><p><span style="font-size: 18px;"><strong>第二章 操作系统运行机制</strong></span></p><p>&nbsp; &nbsp; 考试内容：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.内核态与用户态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.中断与异常</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.系统调用接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.存储系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.I/O系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 6.时钟（CLock）</p><p>&nbsp; &nbsp; 一、CPU的构成与基本工作方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 处理器由运算器、控制器、一系列的寄存器以及高速缓存构成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 运算器实现指令中的算术和逻辑运算，是计算机计算的核心</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 控制器负责控制程序运行的流程，包括取指令维护CPU状态、CPU与内存的交互等等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 寄存器是指令在CPU内部做处理的过程中暂存数据、地址以及指令信息的存储设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 在计算机的存储系统中它具有最快的访问速度，高速缓存处于CPU和物理内存之间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 利用程序局部性原理使得高速指令处理和低速内存访问得以匹配，从而提高CPU的效率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.处理器中的寄存器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 寄存器提供了一定的存储能力</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 速度比驻村快得多</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 造价高，容量一般都很小</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 两类寄存器：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户可见寄存器，高级语言编译器通过算法分析并使用之，以减少程序访问主存次数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 控制和状态寄存器，用于控制处理器的操作由OS的特权代码使用，以控制其它程序的执行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户可见寄存器：机器语言直接引用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 包括数据寄存器、地址寄存器以及条件码寄存器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据寄存器（data register）又称通用寄存器，主要用于各种算术逻辑指令和访存指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 地址寄存器（address register）用于存储数据及指令的物理地址、线性地址或者有效地址，用于某种特定方式的寻址。如index register、segment pointer、stack pointer</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 条件码寄存器保存CPU操作结果的各种标记位，如算术运算产生的溢出、符号等等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 控制和状态寄存器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用于控制处理器的操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 大部分对于用户是不可见的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一部分可以在某种特权模式（由OS使用）下访问</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 常见的控制和状态寄存器：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序计数器（PC：Program Counter），记录将要取出的指令的地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 指令寄存器（IR：Instruction Register），包含最近取出的指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序状态字（PSW：Program Status Word），记录处理剂的运行模式信息等等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.指令执行的基本过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 两个步骤：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 先从储存器中每次读取一条指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 然后执行这条指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个单条指令处理过程称为一个指令周期</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序的执行是由不断取和执行的指令周期组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 仅当关机、出错或有停机相关指令时，程序才停止</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.特权指令和非特权指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特权指令：只能由操作系统使用的指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 使用多道程序设计技术的计算机指令系统必须要区分为特权指令和非特权指令，特权指令一般引起处理器状态的切换。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理器通过特殊的机制将处理器状态切换到操作系统运行的特权状态（管态）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.处理器的状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 根据运行程序对资源和机器指令的使用权限将处理器设置为不同状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 管态：操作系统管理程序运行的状态，较高特权级别，又成为特权态（特态）、系统态、核心态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目态：用户程序运行时的状态，较低的特权级别，又称为（普态）、用户态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有些系统将处理器状态分为核心状态，管理状态和用户程序状态（目标状态）三种。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 管态和目态的差别：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 全部指令（包括特权指令）可以执行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可使用所有资源</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 具有改变处理器状态的能力</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目态-&gt;管态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 其转换的唯一途径是通过中断</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 管态-&gt;目态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可用设置PSW（修改程序状态字）可实现</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.程序状态字PSW</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在PSW中专门设置一位，根据运行程序使用指令的权限而设置，PSW（Program Status Word）：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CPU的工作状态码——指明管态还是目态，用来说明当前在CPU上执行的是操作系统还是一般用户，从而决定其是否可以使用特权指令或拥有其它的特殊权利</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 条件码——反映指令执行后的结果特征</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断屏蔽吗——指出是否允许中断</p><p>&nbsp; &nbsp; 二、存储体系</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 支持OS运行硬件环境的一个重要方面：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 作业必须把它的程序和数据存放在内存中才能运行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多道程系统中，若干程序和相关的数据要放入主存储器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 操作系统要管理、保护程序和数据，使它们不至于受到破坏</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 操作系统本身也要存放主存储器中并运行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.存储器的层次结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储系统设计三个问题：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 容量、速度和成本</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 容量：需求无止境</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 速度：能匹配处理器的速度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 成本问题：成本和其它部件相比应在合适范围之内</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.存储保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对主存中的信息加以严格的保护，是操作系统及其它程序不被破坏，是其正确运行的基本条件之一</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多用户、多任务操作系统：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OS给每个运行进程分配一个存储区域</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了保证软件程序只影响程序的内部</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 硬件可提供如下功能：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 界地址寄存器（界限寄存器）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 实现方法：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在CPU中设置一对下限寄存器和上限寄存器存放用户作业在主存中的下限和上限地址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 也可将一个寄存器作为基址寄存器，另一寄存器作为限长寄存器（指示存储区长度）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每当CPU要访问主存，硬件自动将被访问的主存地址与界限寄存器的内容进行比较，以判断是否越界</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果未越界，则按此地址访问主存，否则将产生程序中断——越界中断（存储保护中断）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储键</p><p>&nbsp; &nbsp; 三、中断与异常机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 中断对于操作系统的重要性就像机器中的驱动齿轮一样，所以有人把操作系统成为是由“中断驱动”或者“（中断）事件驱动”，它使得OS可以捕获用户程序发出的系统功能调用及时处理设备的中断请求，定时启动指定程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 中断的概念：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CPU对系统发生的某个事件作出的一种反应</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CPU暂停正在执行的程序，保留现场后自动转去执行相应事件的处理程序，处理完成后返回断电，继续执行被打断的程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.中断是随机的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.中断是可恢复的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.中断是自动处理的 &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 中断/异常概念：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断/异常：balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断的引入：balabala... &nbsp; &nbsp; &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 异常的引入：balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 早期的中断和异常并没有区分，都把它们叫做中断。随着它们的发生原因和处理方式的差别愈发明显，才有了以后的中断和异常</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 中断的分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 广义中断：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断（外中断）：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; I/O中断</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 时钟中断</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 硬件故障中断</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 异常（内中断）例外：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 系统调用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺页异常</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 断点指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 其他程序性异常（如算术溢出等）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 中断（狭义）与异常的区别：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断：与正执行指令无关，可以屏蔽</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 异常：与正执行指令有关，不可屏蔽</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 中断系统是现代计算机系统的核心机制之一。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 中断系统的两大组成部分：硬件中断装置和软件中断处理程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 中断寄存器：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有的计算机中，由于可能有很多中断源请求同时发生，为了区分和不丢失中断信号，对应每个中断源分别用一固定触发器寄存中断信号。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 规定值为1时，表示有中断信号，为0时表示无</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 这些触发器的全体称为中断寄存器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每个触发器称为一个中断位</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 所以中断寄存器是由若干个中断位组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 处理器如何发现中断信号？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理器的控制部件中设一个能检测中断的机构成为中断扫描机构。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在每条指令执行周期的最后时刻扫描中断寄存器，询问是否有中断信号。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 若无中断信号，继续执行下一条指令。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 若有中断，中断硬件将该中断触发器内容按规定编码送入PSW的相应位，称为中断码。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 典型的中断处理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; I/O中断</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由I/O设备的控制器或者通道发出</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 两类I/O中断：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; I/O操作正常结束</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果要继续I/O操作，需要在准备好以后重新启动I/O</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 若请求I/O程序正处于等待I/O状态，则应将其唤醒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; I/O异常</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设备故障或特殊情况</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设备故障时需要重新执行失败的I/O操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 重试次数有上限，次数过大，系统将判定硬件故障</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 时钟中断</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 系统多道能力的重要推动力量，时钟中断处理程序通常做与系统运转、管理和维护相关的工作，包括：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 维护软件时钟：系统有若干个软件时钟，控制定时任务以及进程的处理器时间配额，时钟中断需要维护、定时更新这些软件时钟</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理器时间调度：维护当前进程时间片软件时钟，并在当前进程时间片到时以后运行调度程序选择下一个被调度的进程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 控制系统定时任务：通过软件时钟和调度程序定时激活一些系统任务，如检测死锁、系统记账、系统审计等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 硬件故障中断</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 硬件故障中断处理程序一般需要做的工作：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 保存现场，使用一定警告手段，提供些辅助诊断信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在高可靠系统中，中断处理程序还要评估系统可用性，尽可能恢复系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序性中断</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序指令出错、指令越权或者指令寻址越界而引发</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 两类处理方法：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.只能由操作系统的相关扩展功能模块完成，多为程序试图做不能做的操作引起得系统保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.可由系统自己完成，如一些算术运算错误</p><p>&nbsp; &nbsp; 四、系统调用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.系统调用与一般过程调用的特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）运行在不同的系统状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）状态的转换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）返回问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）嵌套调用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 系统调用的处理步骤</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; 五、I/O技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 主要的I/O控制方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通道</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DMA技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缓冲技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通道</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 独立于中央处理器，专门负责数据I/O传输的处理机，它对外设实现统一管理，代替CPU对I/O操作进行控制，使CPU和外设可以并行工作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通道又称为I/O处理机</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 引入通道的目的：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了使CPU从I/O事务中解脱出来</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 同时为了提高CPU与设备、设备与设备之间的并行度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DMA技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断的引入大大地提高了处理器处理I/O的效率，当处理器和I/O间传送数据时，效率任旧不高</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 解决方法：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 直接存储器访问（DMA：Direct Memory Access）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通过系统总线中一独立控制单元——DMA控制器自动控制成块数据在内存和I/O单元间的传送，大大提高处理I/O的效能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缓冲技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缓冲区是硬件设备之间进行数据传输时，用来暂存数据的一个存储区域</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缓冲技术的三种用途：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理器与主存储器之间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理器和其它外部设备之间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设备和设备之间的通信</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目的：解决硬件之间速度不匹配的问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 单缓冲区：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设备向缓冲区输入数据直到装满后，必须等待CPU将其取完，才能继续向其中输入数据。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了提高设备利用率，单缓冲区不够</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多缓冲区（Cache）技术：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cache：离CPU最近，使CPU快速访问常使用的数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果没有，CPU到二级Cache中找</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果没有，CPU到系统内存中找</p><p>&nbsp; &nbsp; 六、时钟</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 操作系统时钟是微机上所有软件获取时间的主要来源，其位置至关重要。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 操作系统时钟的时间是硬件提供的，如果危机硬件时钟有错，就会影响到操作系统。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 时钟一般分为硬件时钟和软件时钟</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 时钟的用途可分为绝对时钟和相对时钟</p><p><br/></p><p><strong><span style="font-size: 18px;">第三章 进程线程模型</span></strong></p><p>&nbsp; &nbsp; 考试内容：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.并发环境与多道程序设计</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.进程的基本概念，进程控制块（PCB）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.进程状态及状态转换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.进程控制：创建、撤销、阻塞、唤醒、fork()的使用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.线程基本概念，线程的实现机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 6.处理机调度</p><p>&nbsp; &nbsp; 一、并发环境与多道程序设计</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.程序的顺序执行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序：指令或语句序列，体现了某种算法，所有程序是顺序的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 顺序环境：在计算机系统中只有一个程序在运行，这个程序独占系统中所有资源，其执行不收外界影响。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 顺序执行的特征：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 顺序性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 封闭性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序执行结果的确定性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序结果的可再现性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.多道程序系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计算机能够同时处理多个具有独立功能的程序，以增强系统的处理能力和提高机器的利用率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多道程序的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 独立性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 随机性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 资源共享性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.程序的并发执行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 并发环境：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在一定时间内物理机器上有两个或两个以上的程序同处于开始运行但尚未结束的状态，并且次序不是事前确定的。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 并发的特征：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）并发程序在执行期间具有相互制约关系</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）程序与计算不在一一对应</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）并发程序执行结果不可再现</p><p>&nbsp; &nbsp; 二、进程模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.进程的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程是正在执行的程序，从操作系统角度可分为系统进程和用户进程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程和程序既有联系又有区别。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.进程的特性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 并发性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 动态性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 独立性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 交往性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 异步性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.进程的基本状态及其转换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程的基本状态：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不同系统设置的进程状态数目不同</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 三状态进程模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 五状态进程模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 七状态进程模型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程的三种基本状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）就绪状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）运行状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）等待状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）创建状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）结束状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6）挂起状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7）激活状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程状态间的转换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）新状态-&gt;就绪状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）就绪状态-&gt;执行状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）执行状态-&gt;阻塞状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）执行状态-&gt;就绪状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）阻塞状态-&gt;就绪状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6）执行状态-&gt;终止状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.进程控制块（PCB）的内容：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分为调度信息和现场信息两大部分。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 调度信息供进程调度时使用，描述进程当前所处的状况。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 现场信息刻画了进程的运行情况。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程的组成：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序、数据和进程控制块（PCB）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.PCB表的组织方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）线性方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）索引方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）链接方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 6.进程控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 创建、撤销进程以及完成进程各状态之间的转换，由具有特定功能的原语完成。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 创建原语</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 撤销原语</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 阻塞原语</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 唤醒原语</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Unix的fork()函数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 父进程通过fork()创建子进程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：只被执行一次，返回两次结果，一次是在调用进程中，一次是在创建的子进程中，父进程中返回的是子进程的PID，子进程中fork()返回0。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;main(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;pid;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid&nbsp;=&nbsp;fork();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pid==0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;child:x=%d\n&quot;,++x);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;parent:x=%d\n&quot;,--x);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有两种可能的运行结果：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; child:x=2;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent:x=0</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序1</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;main(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fork();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;hello!\n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 输出两个hello!</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序2</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;main(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fork();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fork();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;hello!\n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 输出四个hello!</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程的创建</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 创建一个PCB</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 赋予一个统一进程标识符</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为进程映像分配空间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 初始化进程控制块</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设置相应的链接</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程的撤销</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）引起进程撤销的事件有三类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程正常结束</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在进程运行期间，由于出现某些错误和故障而使进程被迫中止</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程应外界的请求而终止运行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）进程撤销的过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程阻塞和进程唤醒</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）引起进程阻塞的事件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 请求系统服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 启动某种操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 新数据尚未到达</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 无新工作可做</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）引起进程唤醒的事件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 请求系统服务得到满足</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 启动某种操作完成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 新数据已经到达</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有新工作可做</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 7.线程的控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程作为系统中的一个基本单位，具有两个属性：一是资源分配和拥有的基本单位。二是一个可以地理调度和执行的基本单位。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 而在进程操作过程中，因为进程是一个资源的拥有者。所以，系统要不断地进行资源的分配与回收、现场的保存、恢复等工作。系统要为此付出较大的时间与空间的开销。此外，在系统中所设置的进程数目不能过多，进程切换的频度不能过高，这就限制了系统并发程度的进一步提高。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如何能使进程更好地并发执行，同时又能尽量减少系统开销呢？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将进程的两个属性分开，由操作系统分别处理，即只作为资源分配与拥有的单位，不再是调度和执行的基本单位，使之轻装前进，而对资源分配与拥有的基本单位，不进行频繁的切换处理，以减少系统开销。正是因为这种思想，产生了一个新的概念——线程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 8.线程的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 线程是进程中的一个实体，是被系统独立调度和执行的基本单位。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 线程自己基本上不拥有系统资源，只拥有一点在运行中必不可少的资源（如程序计数器、一组寄存器和栈），但是它可以与同属于一个进程的其他线程共享进程所拥有的全部资源。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个线程可以创建和撤销另一个进程，同一进程中的多个线程之间可以并发执行。线程之间也会相互制约，使其在运行中呈现异步性。因此，线程同样具有就绪、执行、阻塞三种基本状态。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 9.线程与进程的比较</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）调度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 传统操作系统中，进程是作为资源分配和独立调度的基本单位。在引入线程的操作系统中，则把线程作为调度和分派的基本单位，把进程作为资源拥有的基本单位。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）并发性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 引入线程的操作系统中，不仅进程之间可以并发执行，而且在一个进程中的多个线程之间也可以并发执行。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）拥有资源</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 无论哪种操作系统，进程都是拥有资源的一个独立单位，一般情况，线程自己不拥有系统资源，但线程可以访问属于进程的资源。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）系统开销</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 由于进程的创建和撤销都需要分配拟或回收资源，因此操作系统所付出的开销显著大于创建和撤销进程时的开销。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 同样，进程切换的开销也远大于线程切换的开销。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 简而言之，一个程序至少有一个进程，一个进程至少有一个线程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 10.线程的实现机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）用户级线程。用户级线程是由用户控制的，对于用户级线程的创建、撤销与切换，都与系统控制无关，完全由用户自己管理。简单来说就是系统并不知道有用户级线程的存在，在系统中各种控制仍然是基于进程的。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）内核级线程。内核级线程是依赖于内核，即无论是用户进程中的线程，还是系统进程中的线程，它们的创建、撤销与切换都是由内核实现的。在系统中保留了一张线程控制块，系统根据该线程控制块来赶回线程的存在，并对线程进行控制。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）混合实现方式。同时实现用户级和内核级线程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 11.Pthread进程包</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Pthread是一套用户级线程库，定义了线程标准，大部分的UNIX系统都支持该标准。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 12.进程调度的概述</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 调度分层次的，可分为高级调度、中级调度、低级调度。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 高级调度：它用于确定把后备队列上的哪些作业调入内存。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中级调度：核心按一定的调度算法，将内存中处于等待状态的某些进程调至外存对换区，来腾空这部分内存。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 低级调度（进程调度）：指在多道程序环境下，内核按一定的调度算法，从就绪队列中选出一进程，把处理机分配给它。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程调度的时机：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）正在执行的进程运行完毕</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）正在执行的进程调用阻塞原语将自己阻塞，进入等待状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）调用激活原语激活等待资源的进程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）时间片用完</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）就绪队列中的某个进程的优先级高于当前运行进程的优先级</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 13.调度算法设计原则</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）面向用户的原则。这是为满足用户的需求而遵循的一些准则。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）面向系统的原则。这是为了满足系统要求而遵循的一些准则。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 14.进程（线程调度算法）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）先来先服务调度算法（FCFS）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 先来先服务调度算法的裁决模式是非抢占式的，优先权函数=花费在系统中的实际时间，仲裁规则是随机的。这种调度算法有利于长进程，而不利于短进程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）最短作业优先调度算法（SPF）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 短进程优先调度算法的裁决模式是非抢占式的，优先权函数=-运行时间，仲裁规则是按照时间先后顺序或随机方式。这种调度算法照顾到了系统中的短进程，有目的地降低了进程的平均等待时间，提高了系统的吞吐量。但是，这种算法对长进程不利。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）最短剩余时间优先调度算法（SRT）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 最短剩余时间优先调度算法的裁决模式是抢占式的，优先权函数是动态的，随着进程运行和完成时间的减少而增加，仲裁规则是按照时间先后顺序或随机方式。这种调度算法充分照顾到了剩余运行时间短的进程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）最短剩余时间优先调度算法（SRT）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 时间片轮转调度算法的裁决模式是面向时间片的，所有就绪进程的优先权函数值相同，仲裁规则是轮转规则。这种调度算法适用于交互进程的调度。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）最高优先级调度算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优先权调度算法的裁决模式是抢占式的或非抢占式的，优先权函数是用户或系统赋予给它的优先权，仲裁规则是随机的或先进先出的。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6）多级反馈队列调度算法（MLF）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 多级反馈队列调度算法的裁决模式是抢占式的或非抢占式的，优先权函数是从最大值开始每执行一次递减1，仲裁规则是轮转的或按照时间先后次序。</p><p><br/></p><p>第四章 并发与同步</p><p>&nbsp; &nbsp; 考试内容</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.进程的同步与互斥</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.信号量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.管程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.进程的通信</p><p>&nbsp; &nbsp; 1.进程的相互作用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.1相关进程和无关进程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）进程互斥</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）进程同步</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.2与时间有关的错误</p><p>&nbsp; &nbsp; 2.进程互斥</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 解决办法两种：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）由竞争双方平等协商</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）引入进程管理者</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 资源共享的程度分为三个层次：互斥、死锁、饥饿</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.1临界资源的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 临界资源的访问过程：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进入区、临界区、退出区、剩余区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.2进程同步机制应遵循的原则</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）空闲让进</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）忙则等待</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）有限等待</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）让权等待</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 进程互斥的软件方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）单标志算法</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(turn!=i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;临界区
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;turn=j;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;剩余区</pre><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）双标志、先检查算法</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(flag[j])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag[i]=true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;临界区
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag[i]=flase;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;剩余区</pre><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）双标志、后检查算法</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag[i]=true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(flag[j]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag[i]=false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;剩余区</pre><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）先修改、后检查、后修改者等待算法</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag[i]=true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;turn=j;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(flag[j]&amp;&amp;turn==j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;临界区
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag[i]=false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;剩余区</pre><p>&nbsp; &nbsp; &nbsp; &nbsp; 进程互斥的硬件方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）TS指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每个临界区设置一个公共变量lock:true表示正被占用，false表示空闲进入区利用TS进行检查和修改表示lock。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）Swap指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）信号量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1965年，荷兰学者Dijksrea提出的信号量机制是一种很有效的进程同步工具，得到了广泛的使用。这里讲介绍最简单的经常使用的信号量——整型信号量。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 信号量是一种特殊变量，它用来表示系统中资源的使用情况。而整型信号量就是一个整型变量。当其值大于“0”时，表示系统中对应可用资源的数目；当其值小于“0”时，其绝对值表示因该资源被阻塞的进程的数目；当其值等于“0”时，表示系统中对应资源已经用完，并且没有因该资源而被阻塞的进程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对信号量的操作：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于整型信号量，仅能通过两个标准的原语操作来访问，这两个操作被称为P操作、V操作，也合称为PV操作。其中P操作在进入临界区前执行，V操作在退出临界区后执行。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; P操作，用wait(s)来描述：</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait(s)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--s.count;&nbsp;&nbsp;//&nbsp;表示申请一个资源
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(s.count&lt;0)&nbsp;&nbsp;&nbsp;//&nbsp;表示没有空闲资源
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用进程进入等待队列s.queue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;阻塞调用进程;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; V操作，用signal(s)来描述：</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal(s)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++s.count;&nbsp;&nbsp;//&nbsp;表示申请一个资源
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(s.count&lt;0)&nbsp;&nbsp;&nbsp;//&nbsp;表示没有空闲资源
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从等待队列s.queue中取出头一个进程；
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进程P进入就绪队列；
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p>&nbsp; &nbsp; 3.经典的进程同步问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 简单生产者-消费者问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 生产者进程P：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(true){</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; P(empty)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 生产一个产品;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 送到缓冲区;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; V(full);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 消费者进程Q：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(true){</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; P(full)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从缓冲器取产品;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; V(full);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 消费产品;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 利用PV操作实现进程同步的方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）使用PV操作的规则</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&gt;分清哪些是互斥问题，哪些是同步问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;对于互斥问题要设置互斥信号量，互斥信号量的个数只与临界资源的种类有关。通常，有几类临界资源就设置几个互斥信号量，且初值为1，代表临界资源可用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;对于同步问题要设置同步信号量，通常同步信号量个数与可参与同步的进程种类有关。同步信号量表示该资源是否可以开始或者进程是否已经结束。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4&gt;在每个进程中用于实现互斥的PV操作必须成对出现；用于实现同步的PV操作也必须成对出现，但是，它们分别出现在不同的进程中；在某个进程中如果同时存在互斥与同步的P操作，则其顺序不能颠倒。必须先执行对同步信号量的P操作，再执行对互斥信号的P操作。但是，V操作的顺序没有严格要求。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）同步互斥问题的解题步骤：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&gt;确定进程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;确定同步互斥关系</p><p>&nbsp; &nbsp; 4.管程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.1引入管程的原因</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每个访问临界资源的进程都必须使用PV操作，是的大量的同步操作分散在各个进程中。这不仅给系统的管理带来了麻烦，还可能因同步操作使用不当而导致系统故障，如顺序不当、读写、漏写等。为此，又产生了一种新的进程同步管理工具——管程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.2管程的组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 管程由四部分组成：管程名称、共享数据的说明、对该数据进行操作的一组过程、对共享数据设置初始值的语句。此外，每个管程都有唯一的名字来标示。管程类似于面向对象程序设计中的类。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.3利用管程实现经典的同步问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程或者线程的阻塞和唤醒，可以通过管程的wait和signal操作来巧妙地实现，所有管程中的过程是互斥的。balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）wait原语</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）signal原语</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了区别阻塞的原因，需要设置一个条件变量。条件变量是一个整型变量，用condition说明，balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 管程具有的三个特征：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）模块化</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）抽象数据类型</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）信息隐蔽</p><p>&nbsp; &nbsp; 5.进程通信</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 进程的同步与互斥成为低级通信。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 用户直接利用操作系统提供的一组通信命令，高效地传送大量数据，成为高级通信，又称管道通信。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 进程之间的通信方式：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）共享内存</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）消息机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）通过共享文件</p><p>&nbsp; &nbsp; 6.共享内存</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 在相互通信的进程之间设置一个公共的内存区，一组进程向该公共内存中写，另一组进程从内存中读，通过这种方式实现两个进程之间的信息交换。</p><p>&nbsp; &nbsp; 7.消息机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 在消息机制中，进程间的数据交换是以消息为单位进行的。用户直接利用系统中提供的一组通信命令（原语）进行通信。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）消息缓冲通信</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 发送原语：Send(Receiver,message);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 接收原语：Receive(Send,message);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）信箱通信方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&gt;信箱通信的操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;信箱的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3&gt;进程间的关系</p><p>&nbsp; &nbsp; 8.管道通信系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p><br/></p><p>第五章 存储管理方案</p><p>&nbsp; &nbsp; 考试内容</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.存储管理基本概念，存储管理基本任务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.分区存储管理方案</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.覆盖技术与交换技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.虚存概念与虚拟存储技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.虚拟页式存储管理方案</p><p>&nbsp; &nbsp; 1.存储体系</p><p>&nbsp; &nbsp; 2.存储器管理的主要任务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 存储器由外存和内存组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 内存空间分为两部分：系统区、用户区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）内存的分配和回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）存储共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3）存储保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4）权限保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.1内存的分配和回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）记住每个存储区域的状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）实施分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 实现方法：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 位示图表示法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 空闲页面表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 空闲块表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 内存分配的方式：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）静态分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）动态分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.2存储共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 指两个或多个进程公用内存中的相同区域，使多道程序动态地共享，提高内存利用率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 共享内容：代码共享、数据共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.3存储共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储保护内容</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）地址越界保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）权限保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）存储键保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.4扩充内存</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户在编程的时候，不应该受内存容量限制，要采用一定的技术“扩充”内存的容量。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 采用虚拟存储技术或其他交互技术。</p><p>&nbsp; &nbsp; 3.地址转换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 将用户程序的逻辑地址转换为运行时的物理地址的过程称为地址转换，也称为地址映射（即重定位）。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 静态重定位：在程序装入时，把程序中的指令地址和数据地址全部转换成绝对地址。由于地址转换工作是在程序开始执行前集中完成的，所以在程序执行过程中就无需在进行地址转换工作。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 动态重定位：在程序装入时，不进行地址转换，而是直接把程序装入到分配的内存区域中。在程序执行过程中，每当执行一条指令时由硬件的地址转换机构将指令中的逻辑地址转换成物理地址。</p><p>&nbsp; &nbsp; 4.固定分区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 基本定理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 固定分区存储管理方式是最早使用的一种可以运行多道程序的存储管理方式。它要求把作业全部装入主存，且装入一个连续的存储空间。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 基本特点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）一个作业只能装入一个分区，不能装入两个或多个相邻分区。一个分区只能装入一个作业，当分区大小不能满足作业的要求时，该作业暂时不能装入。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）通过对“分区分配表”的改写，来实现对主存空间的分配与回收。作业在执行时，不会改变存储区域，所以采用静态地址重定位方式易于实现，且系统开销小。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）当分区较大作业较小时，仍然浪费许多主存空间，并且分区总数固定，限制了并发执行的作业数目。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 主存空间的分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在作业分配之前，根据主存分区的划分情况，在分区分配表中填入每个分区的起始地址（简称始址）、大小，在状态栏中一律跳入“0”，表示该分区可用，当作业装入时填入作业名。</p><p>&nbsp; &nbsp; 5.可变分区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 可变分区存储管理方式又称为动态分区存储管理方式。它是根据用户作业的大小，在作业要求装入主存时，动态地划分分区，使分区的大小正好适应作业的要求。采用这种存储管理方式，分区的大小是不定的，分区的数目也是不定的。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 可变分区存储管理方式必须解决三个问题：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一是分区分配中所用的数据结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 二是分区的分配算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 三是分区的分配和回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 移动技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可变分区中，内存经过一段时间的分配和回收后，会存在很小的空闲快，这些小块不足以满足程序进一步分配内存的要求，但其总和却可以满足程序的分配要求，解决的办法就是“碎片整理”，这一技术成为“移动技术”。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 移动技术注意的问题：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）移动会增加系统的开销</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）移动是有条件的 &nbsp; &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.1采用的数据结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了实现可变分区分配，系统必须配置相应的数据结构，用来记录主存的使用情况，包括空闲分区的情况和已分分区的情况，为作业分配主存空间提供依据。为此，设置了两张表，即已分分区表和空闲分区表。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.2主存空间的分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分配主存时，先分配小地址，再分配大地址。空闲分区表中记录的排列也是从小地址向大地址排列的。首次分配时，只有一个空闲区。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 常用的主存分配算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）最先适应分配算法（FF）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它要求空闲分区表中的记录按地址递增的顺序排列。在每次分配主存时，总是从第1条开始顺序查找空闲分区表，找到第一个能满足作业长度要求的空闲区，分割这个空闲区。一部分分配作业，另一部分仍作为空闲区。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它的特点是分配算法简单，容易差生过多的主存碎片。主存碎片是指小的不能使用的主存空间；这种算法把大的空闲区分成了小的空闲区，当有大作业要求分配时，不能满足要求，降低了系统的效率。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）最优适应分配算法（BF）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它是从所有的空闲分区中挑选一个能满足作业要求的最小的空闲区进行分配。这样可以保证不去分割一个更大的空闲区，使装入大作业时比较容易得到满足。为了实现这种算法，把空闲区按长度递增次序登记在空闲分区表中，分配时，顺序查找。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它的优点是解决了大作业的分配问题，不足是容易产生主存碎片，降低了主存空间的利用率。另外收回主存时，要按长度递增顺序插入到空闲分区表中，增加了系统开销（操作系统所占有的系统资源和所需要的处理器的时间成为“系统开销”）。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）最坏适应分配算法（WF）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它每次分配主存时总是挑选一个最大的空闲区，分割一部分给作业使用，使剩下的部分不至于太小而成为主存碎片。为了实现这种算法，把空闲区按长度递减的次序登记在空闲分区表中，分配时，顺序查找。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 它的优点是不会产生过多的碎片，不足是影响大作业的分配。另外收回主存时，要按长度递减的顺序插入到空闲分区表中，增加了系统的开销。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）下次分配算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当接到内存申请时，查找分区说明，从上一次分配的位置开始扫描内存，选择下一个大小足够的可用块。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.3主存空间的回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）回收的分区前后没有相邻的空闲分区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）回收分区的前后有相邻的空闲区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）回收分区的后面有相邻的空闲分区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）回收分区的前后都有相邻的空闲分区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分区管理的优缺点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）分区的长度不是预先固定的，而是按作业的实际需求来划分的。分区的个数也不是预先确定的，而是由装入的作业个数决定的。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）分区的大小由作业的大小决定，提高了主存的使用频率。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）在主存分配过程中，会产生许多主存碎片，造成主存空间的浪费。</p><p>&nbsp; &nbsp; 6.覆盖技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 覆盖技术是指一个程序的若干程序段或几个程序段的某个部分共享一个存储空间。覆盖技术的实现是把程序划分为若干个功能上相对独立的程序段，按照其自身的逻辑结构是那些不会同时执行的程序共享一块内存区域。未执行的程序段先保存在磁盘上，当有关程序段的前一部分执行结束后，把后续程序段写入内存，覆盖前面的程序段。</p><p>&nbsp; &nbsp; 7.交换技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 交换技术是指把主存中暂时不能运行的进程，或暂时不用的程序和数据，换出到外存上，把已具备运行条件的进程，或进程所需要的程序或数据换入到主存的技术。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）换出进程的选择</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）交换时机的确定</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3）交换空间的分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4）换入进程换回内存时位置的确定</p><p>&nbsp; &nbsp; 8.页式存储管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 在页式存储管理方式中，将用户作业的地址空间分成若干大小相同的区域，称为页面或页，并为每个页从“0”开始编号。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 相应地，主存空间也分为与页大小相同的若干存储块，成为物理块或页框，并且采用同样的方式为它们进行编号，从0开始：0块，1块，...，n-1块。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 程序的逻辑地址页号和页内地址组成，页号的长度决定了分页的多少，页内地址的长度决定了页面的大小。在为作业分配主存时，以块为单位将作业中的若干页分别装入到多个不相邻的块中。作业执行时根据逻辑地址中的页号找到它所在的块号，再确定当前指令要访问的物理地址。它的地址转换属于动态重定位，由于进程的最后一页经常装不满一块，而形成不可利用的碎片，称为“页内碎片”。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 8.1主存空间的分配与回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1)采用的数据结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了实现页式存储管理方式，系统设置了主存分配表、位示图和页表，记录主存空间的使用情况和每个作业的分配情况。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）主存空间的回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当一个作业执行结束，则应收回该作业所占用的主存块。根据主存分配表中的记录，取出该作业的页表。从该作业的页表中取出每一个归还的块号，计算出该块在位示图中的位置，将占用标志位置“0”。最后，把归还的块数加入到空闲块数中，删除该作业的页表，并把分区分配表中该作业的记录删除。</p><p>&nbsp; &nbsp; 9.地址转换和快表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 9.1地址转换。两个与地址计算有关的方法。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一是，由逻辑地址计算出页号和页内地址的计算方法如下：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 页号=逻辑地址/页长（商）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 页内地址=逻辑地址 % 页长（余数）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 二是，由块号计算物理地址的计算方法为：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 物理地址=块号*块长+块内地址+用户区基址</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 页表：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）多级页表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）散列页表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）反置页表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 页式管理特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）有效地解决了“碎片”多的问题。可以使程序和数据存放在不连续的主存空间，而不必像可变分区管理那样通过增加系统开销来解决主存碎片的问题。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）通过位示图和页表来记录主存的使用情况和每个作业的分配情况，当主存很大，并且作业也很大时，位示图和页表都有可能占用较大的存储空间。另外，它要求有相应的硬件支持，从而增加了系统成本，也增加了系统开销。例如需要地址变换机构、快表等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）要求页的大小固定。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 9.2快表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 因页表在主存中，CPU在存取数据时，要访问主存两次。第一次是访问主存中的页表，从中找出该页的物理块号，将此块号与页内地址拼接形成物理地址，第二次是根据上一步得到的物理地址，到主存中获取数据。这样就降低了计算机的处理速度。为了提高处理速度，可以使用快表和两级页表的方法对页式存储管理进行改进。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 具有快表的地址变换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 具有两级页表的地址转换</p><p>&nbsp; &nbsp; 10.虚拟存储管理方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 虚拟存储器的定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 虚拟存储器是指仅把作业的一部分装入主存便可以运行的存储器系统。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 虚拟存储器的逻辑容量也称为最大容量，是由地址寄存器的位数决定的。如果计算机的地址寄存器是24位，地址按单字节编址，则虚拟存储器的最大（逻辑）熔炼容量是224B。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 虚拟存储器的物理容量也称为实际容量。当最大容量大于等于主存与硬盘容量之和时，虚拟存储器实际容量为主存与硬盘容量之和；当最大值小于主存与硬盘容量之和时，虚拟存储器实际容量就是最大容量。虚拟存储器的运行速度接近于主存速度，而其成本却又接近于外存。可见，虚拟存储技术是一种性能非常优越的存储器管理技术，故被广泛的应用于各类计算机中。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 10.1页式虚拟存储管理基本原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 页式虚拟存储管理是建立在纯分页基础上的，增加了请求调页功能和页面置换功能所形成的页式虚拟存储管理系统。他把作业分成大小相等的若干页，把主存分成与页大小相等的若干块；对每个作业限定分给它的主存块数，先把作业的部分页装入主存的这些块中，在作业运行时再装入所需要的页。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 10.2采用的数据结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 虚拟存储器在实现上是有一定难度的，既需要一定的硬件支持，又需要较多的软件支持，但是，请求分页式存储管理方式相对容易，因为它换进、换出的基本单位是固定长度的页面。采用的数据结构如下：位示图、页表和主存分配表。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 10.3页面调度策略：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 调入策略</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）请求调页</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）预调页</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 置页策略</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 置换策略</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）固定分配局部置换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）可变分配全局置换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）可变分配全局置换</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 10.4页面置换算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）先进先出置换算法（FIFO）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 该算法淘汰最早进入主存的页面。因为，最早进入的页面，不再使用的可能性比最近调入的页面要大。先进先出置换算法实现简单，只要把各调入主存的页按其进入主存的先后顺序连成一个队列即可，总是淘汰队首的那一页。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）最近最久未使用算法（LRU）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 该算法选择在最近一段时间内最久没有使用过的页淘汰掉。它依据的是程序局部性原理。最近最久未使用算法是利用一个特殊的栈来保存当前使用的各个页的页号。每当访问某页时，考察栈内是否有于此相同的页号，若有则将该页的页号从栈中抽出，再将它压入栈顶。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）最近最不经常使用算法（LFU）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 该算法选择到当前时间为止被访问次数最少的页置换。其实现方法是为每页设置一个访问计数器，每当页面被访问时，该页面的访问计数器就加“1”；发生缺页时，淘汰计数器淘汰值最小的页，同时将所有计数器清“0”。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）理想页面置换算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从主存中溢出永远不需要的页。若无这样的页，则移出最长时间不需要访问的页。该算法只有理论意义。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）最近未使用页面置换算法（NRU）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第0类：没有被访问，没有被修改</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第1类：没有被访问，已被修改</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第2类：已被访问，没有被修改</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第3类：已被访问，已被修改</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6）第二次机会页面置换算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7）时钟页面置换算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺页中断率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺页中断率=中断次数/页面访问总次数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 影响缺页中断的因素：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&gt;分配给程序的内存块数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;页面的大小</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3&gt;程序编制方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4&gt;页面置换算法</p><p>&nbsp; &nbsp; 11.段式存储管理方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 基本原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在段式存储管理方式中，作业的地址空间被划分为若干段，每段定义了一组逻辑信息。例如，有主程序段MAIN、子程序段X、数据段D及栈段S等。每个段都有自己的名字。为了实现简单，通常可用一个段号来代替段名，每个段都从0开始编址，并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定，因而各段长度不等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 整个作业的逻辑地址空间，由于分成多个段，因而是二维的，即其逻辑地址由段号和段内地址所组成。</p><p>&nbsp; &nbsp; 12.段页式存储管理方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 基本原理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 段页式存储管理方式的基本原理是段式和页式系统工作原理的组合，即先把用户程序分成若干段，并为每个段划分成大小相等的若干页，把主存分成与页大小相同的块。每段分配与其页数相同的主存块，主存块可以连续，也可以不连续。</p><p><br/></p><p><strong><span style="font-size: 18px;">第六章 文件管理</span></strong></p><p>&nbsp; &nbsp; 考试内容</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.文件的基本概念、文件逻辑结构、文件的物理结构和存取方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.文件目录的基本概念，文件目录的实现</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.文件的操作，目的操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.磁盘空间的管理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.文件系统的可靠性和安全性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 6.文件系统的性能问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 7.Windows的文件系统FAT，UNIX的文件系统</p><p>&nbsp; &nbsp; 1.什么是文件？</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件是指存放在外存上的已命名的一组相关信息的集合，通常将程序和数据组织成文件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件中的基本访问单位是位、字节或记录。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件的属性包括文件类型、文件长度、文件的物理位置、文件的存取控制、文件的建立时间。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件是一种抽象机制，它提供了一种把信息保存在存储介质上而且便于以后存取的方法，用户不用关心文件的实现细节。</p><p>&nbsp; &nbsp; 2.文件系统的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 操作系统中与文件和目录相关的子系统统称为文件系统能够，是操作系统中统一管理信息资源的一种软件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 信息的存储要求：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）能够存储大量的信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）长期保存信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）可以共享信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 操作系统为系统管理者提供了对文件的透明存取。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 研究文件系统的两种角度：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）用户的角度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要关心文件由上面组成，如何命名，如何保护，如何操作等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）操作系统的角度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 主要关心文件目录怎样实现，怎样管理存储空间，文件存储位置，磁盘实际运作方式等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）按文件的用途分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 系统文件：操作系统和各种应用程序和数据所组成的文件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 库函数文件：标准子程序及常用应用程序组成文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户文件：用户委托文件系统保存的文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）按文件的阻值形式分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 普通文件：文件的组织格式为文件系统中所规定的最一般格式的文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目录文件：由文件的目录构成的特殊文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特殊文件：形式上与普通文件相同，也可以进行查找目录操作，但有其特殊的性质，比如，UNIX系统中，输入输出设备被看作是特殊文件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）按文件中的保护方式分类：只读文件、读写文件、可执行文件、无保护文件等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）按信息的流向分类：输入文件、输出文件和输入输出文件等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）按文件的存放时限分类：临时文件、永久文件和档案文件等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6）按文件使用的介质类型分类：磁盘文件、磁带文件、卡片文件和打印文件等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7）按照文件的组织结构分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 逻辑文件：流式文件和记录文件等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 物理结构：顺序文件、链接文件和索引文件等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX操作系统中的文件分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.普通文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.目录文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.特殊文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目的：对不同的文件进行管理，提高系统效率，同时提高文件系统的用户界面友好性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件系统的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）统一管理文件的存储空间，实施存储空间的分配和回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）实现文件的按名存取</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）实现文件信息的共享，并提供文件的保护和保密措施</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）向用户提供一个方便使用的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）系统维护及向用户提供有关信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6）保持文件系统的执行效率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7）提供与I/O的统一接口</p><p>&nbsp; &nbsp; 3.文件的结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）文件逻辑结构的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件的逻辑结构是用户组织文件时可见的结构，即用户所观察到的文件组织形式。文件的逻辑结构是用户的文件组织形式。文件的逻辑结构是用户可以直接处理的数据及其结构，它独立于物理特性，又称为文件组织。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 选择文件的逻辑结构主要有一下原则：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&gt;查找快捷。根据给定的逻辑结构，应使文件系统在尽可能短的时间内找到所需要的记录或基本信息单位。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;修改方便。便于在文件中增加、删除和修改一条或多条记录。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3&gt;空间紧凑。应使文件的信息占据尽可能小的存储空间。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4&gt;易于操作。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）文件逻辑结构的形式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件的逻辑结构从形式上分为两类：有结构的记录式文件和无结构的流式文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 流式文件：文件中的数据是一串字符，没有结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录文件：由若干逻辑记录组成，每条逻辑记录又由相同的数据项组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录式文件可分为定长记录文件和不定长记录文件。</p><p>&nbsp; &nbsp; 4.文件物理结构的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）文件物理结构的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件的物理结构，又称为文件的存储结构，它是指文件在外存上存储时的组织结构。文件的物理结构与存储介质的物理特性及用户对文件的访问方式有关。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件的物理结构通常划分为大小相等的物理块。这些物理块也称为物理记录，它是文件分配及传输信息的基本单位。物理记录的大小与物理设备有关，与逻辑记录的大小无关。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）文件物理结构的形式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 根据文件存储设备的特征以及用户对文件的访问方式，可以在文件存储器中使用以下三种：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&gt;顺序结构。顺序结构是很简单的一种物理结构。顺序结构将一个在逻辑上连续的文件信息一次存放在外存连续的物理块中，即所谓的逻辑上的连续，物理上也连续。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 顺序结构的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一旦知道文件在存储设备上的其实块号和文件长度，能快速进行存取</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 顺序结构支持顺序存取和随机存取</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 顺序结构的缺点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件不能动态增长</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件分配内存空间比较慢</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 容易产生存储碎片 &nbsp; &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;链接结构。克服顺序文件缺点的办法之一是采用链接结构。链接结构将文件存放在外存的若干个物理块中，这些物理块不必连续，并且在每一个物理块中设一个指针，指向下一个物理块的位置，从而使得存放在同一个文件的物理块链接起来。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; windows的FAT文件系统采用的就是链接结构。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 链接结构的优点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储碎片问题解决</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 有利于文件动态扩充，有利于文件插入、删除</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 提高磁盘利用率</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 链接结构缺点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存取速度慢</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不适合随机存取文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁盘磁头移动多，效率比较低</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存放文件的可靠性较差</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 链接指针需要额外的空间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3&gt;索引结构。索引文件克服了顺序文件和链接文件的缺点。索引结构将文件存放在外存的若干个物理块中，并将</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 索引文件的优点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 保持了链接结构的优点，又解决了其缺点。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 索引文件既适合于顺序存储，也适合于随机存储。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 索引文件缺点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 会引起较多的寻道次数和寻道时间，索引表增加存储空间的开销。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 索引文件结构对空间占用比较严重，索引表是定长还是不定长，解决问题如下：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）索引表的链接模式。这种模式存取文件需要读所有的索引表，对于大文件需要读很多块。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）多级索引</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4&gt;索引结构的实例——I节点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; I节点是一种多级索引结构，最早出现在UNIX系统中。I节点在一般多级索引结构文件基础上，进行了结构的变化。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; I节点的思想，是给每个文件赋予一张成为I节点的小表，这张小表列出了文件属性和文件中个这块在磁盘上的地址。</p><p>&nbsp; &nbsp; 5.文件的存储介质，主要是文件的外存储设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.1顺序存储设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 顺序存储设备是按信息的物理位置进行定位和读/写操作的存储设备。在顺序存储设备中，只有前面的物理块被存取之后，才能存取其后的物理块。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁带的存储特性如下：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）磁带是一种顺序存取的存储设备，总是从磁头的当前位置开始读写</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）磁带上的块不由地址来标识，而由其在次带上的位置来识别</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）块与块之间有间隙，磁带上的物理块就是通过间隙来区分的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）磁带的存取速度与信息密度、磁带带速和块间间隙有关。如果带速高，信息密度大，且所需块间隙小，则磁带存取速度高。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）磁带的容量大，采用顺序存取方式时存取速度高，采用随机存取方式效率较低</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.2随机存储设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 允许文件系统直接存取对应存储介质上的任意物理块的存储设备。如磁盘就是典型的随机存储设备。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 与磁盘有关的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）磁道。磁盘盘片上的一系列同心圆成为磁道；为了描述磁道，对磁道由外向内进行编号，成为磁道号（编号均从0开始）。即系统通过磁道号完成对磁道的操作。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）柱面。与盘片中心有相同距离的所有磁道组成一个柱面；当磁臂移动到某一位置时，所有的读写磁头 都在同一个柱面上，盘面上的磁道号即为柱面号；对于软盘，一个柱面仅包含两个磁道。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）扇区。磁道沿径向又分成大小相等的若干区域，每个区域成为一个扇区，每个扇区可以存放相等字节数（一般为512字节）的信息，按照与磁盘旋转相反的方向依次给扇区编号，成为扇区号。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）磁头号。所有的读写磁头由上至下进行编号成为磁头号。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁盘空间的位置由三个因素决定：柱面号、磁头号、扇区号。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 访问磁盘的时间由三部分组成，即寻道时间、延迟时间和传输时间。其中寻道时间是指将磁头从当前位置移动到指定磁道所经历的时间，也称为移臂时间；延迟时间是通过磁盘的旋转将所指定扇区移动到磁头下面的时间，也称为旋转时间；传输时间是指将扇区上的数据从磁盘读出或向磁盘写入数据所经历的时间。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁盘每个物理块的位置可用柱面号、磁头号和扇区号表示：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）已知物理块号，则磁盘地址：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 柱面号=[物理块号/(磁头数*扇区数)]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁头号=[(物理块号%(磁头数*扇区数))/扇区数]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 扇区号=[(物理块号%(磁头数*扇区数))%扇区数]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）已知磁盘地址：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 物理块号=柱面号*(磁头数*扇区数)+磁头数*扇区数+扇区号</p><p>&nbsp; &nbsp; 6.文件的存取方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 随机存取方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 随机（直接）存取方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件目录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 是指存放文件有关信息的一种数据结构。它包含多条记录，每条记录为一个文件的文件控制块（FCB）的有关信息。最简单的记录包含文件名和文件的其实地址，用以建立文件名和存储地址的对应关系。较复杂的记录包含文件控制块的全部内容，此时，文件目录就是文件控制块的集合。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件目录是文件实现按名存取的重要手段，是文件符号到文件物理地址之间的一种映射机制。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目录项：构成文件目录的项目（目录项即使FCB）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目录文件：用户新建一个文件时，与文件有关的信息在该文件的文件控制块内，多个文件的文件控制块一起组成了文件的目录。为了实现对文件目录的管理通常将文件目录以文件的形式保存在外存。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件目录的管理形式可以分为一级目录、二级目录、多级目录三种。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一级目录，也称为单级目录，是一种最简单、最原始的目录结构。它采用的方法是为外存的全部文件建立一张目录表。表中包括全部文件的文件名、索引表的始址以及文件的其他属性，如文件长度、文件类型等。每个文件占据表中的一条记录。该目录表存放在外存的某个固定区域，需要时系统将其全部或部分导入主存。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一级目录的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）目录结构易于实现，管理简单，只需要建立一个文件目录，对文件的所有操作，都是通过该文件目录实现的。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）易发生重名问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）当文件较多时，查找时间较长</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）不便于实现文件共享，适用于PC机的单用户系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了克服单级目录结构所存在的缺点，可以把单级目录扩充为二级目录。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在二级目录中，有主文件目录和用户文件目录。在主文件目录中，每个用户文件目录都占有一个目录项，其中包括用户名和指向该用户目录文件的指针。用户文件的文件说明组成的目录文件成为用户文件目录，不同的用户拥有不同的用户文件目录，这些文件目录具有相似的结构，由用户所有文件的文件控制块组成。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 二级目录的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）提高了检索目录的速度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）可以解决用户文件重名问题</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）可以使不同用户共享同一个文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）可以实现对文件的保护和保密</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）二级文件目录虽然解决了不同用户之间文件同名的问题，但是，同一用户的文件不能同名。当一个用户的文件很多时，这个矛盾就比较突出了。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为了解决用户文件同名的问题，可以把二级目录的层次关系加以推广，就形成了树型目录。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在二级目录结构中，如果进一步允许用户创建自己的子目录并相应地组织自己的文件，即可以形成三级目录结构，依次类推，还可以进一步形成多级目录。通常把三级或三级以上的目录结构成为树型目录结构。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在树型目录结构中，除了最低一级外，其他每一级存放的都是下一级目录或文件的说明信息，最高层为根目录，最底层为文件。UNIX和DOS系统中都采用了树型目录结构。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 树型目录的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）层次清楚：不同性、不同用户的文件可以构成不同的子树，便于管理；不同用户的文件可以被赋予不同的权限，有利于文件的保护。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）解决了用户文件重名问题：只要在同一目录下的文件名不发生重复，就不会由文件重名引起混乱。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）搜索速度快：可为每类文件建立一个子目录，对于多级目录，每次只查找子目录，因此速度比一级和二级目录时快。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 用户在访问文件时，需要进行目录检索，用户给出文件名，系统按名寻找目录项。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 有两种根据路径检索的方法：全路径名和相对路径。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 全路径名：需要从根目录开始，列出由根到用户的所有子目录，又称为“绝对路径名”。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：每次都从根目录开始检索，很不方便，因为通常目录放在外存故影响访问速度，尤其当目录层次较多时，检索需要耗费很长时间。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 相对路径：用于检索的路径只是从当前目录开始到所要访问文件的一段路径，即以当前目录作为路径的相对参照点。这样检索速度比较快。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件寻址：根据FCB中文件物理地址等信息，求出文件的任意记录或字符在存取介质上的地址，称为文件寻址。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件目录改进</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 为加快目录检索可采用目录项分解法：把FCB分成两部分：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 符号目录项（次部）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件名，文件号</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 基本目录项（主部）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 除文件名外的所有项目</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 分解之后的查找过程：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 查找一个目录项就分成两步：首先访问符号目录文件，根据文件名查找相应的文件内部号；然后访问基本目录文件，根据文件内部号，可直接计算出相应基本目录项所在基本目录文件中的相对位置和物理位置，并将它直接读入内存。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 目录操作：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 以UNIX为例：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.Creat</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.Delete</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.Opendir</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4.Closedir</p><p>&nbsp; &nbsp; 7.存储空间的分配和回收</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）位图法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用一串二进制位反应磁盘空间中分配使用情况，每个物理块对应一位，分配物理块为1，否则为9</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 申请物理块时，可以在位示图中查找为0的位，返回对应物理块号</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 归还时，将对应位转置0</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 描述能力强，适合各种物理结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 计算公式：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 已知字号i，位号j</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 块号=i*字长+j</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 已知块号：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 字号=[块号/字长]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 位号=块号%字长</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）空闲块表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将所有空闲块记录在一个表中，即空闲块表特别适合文件物理结构为顺序结构的文件系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3）空闲块链表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 把所有空闲块链成一个链</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4）成组链接法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件系统的实现</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 内存中多需的表目</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）系统打开文件表（整个系统一张）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 放在内存。用于保存已打开文件的FCB</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 此外，文件号，共享计数，修改标志</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）用户打开文件表（每个进程一个）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件描述符，打开方式，读写指针，系统打开文件进程的PCB中，记录了用户打开文件表的位置</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）用户打开文件表与系统打开文件表之间的关系</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户打开文件表指向系统打开文件表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果多个进程共享同一个文件，则多个用户打开文件表目对用系统打开文件表的同一入口</p><p>&nbsp; &nbsp; 8.记录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 记录是一组相关数据项的集合，用于描述数据对象某方面的属性。它是文件中数据处理的基本单位，是组成文件的基本元素。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 在一个由大量记录组成的文件中，为了能惟一地标识一条记录，可以在记录的各个数据项中，确定出一个或几个数据项，把它（或它们）成为关键字（key）。如在描述学生的数据项中，学号可以作为关键字。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 记录的成组和分解</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 每个用户的文件是由用户按照自己的需要组织的，逻辑记录的大小是由文件的性质决定的。而存储介质上的分块是根据存储介质的特性划分的。所以，逻辑记录的大小往往与存储块的大小不一致。为了节省存储空间，提高主存的利用率，系统引入了记录的成组和分解。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 记录成组</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录成组是指把若干条逻辑记录合并成一组存入一个物理块的过程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 记录分解是指从一条物理记录中把逻辑记录分离出来的过程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录成组存放后，当用户需要某一条记录时，必须把含有该条记录的整块信息独处，再从这一组逻辑记录中找出用户所需要的记录进行处理。记录分解也需要使用主存缓冲区。</p><p>&nbsp; &nbsp; 9.文件的操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 提供设置和修改对用户文件存取权限</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 提供建立、修改、改变、删除目录的服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 提供文件共享，设置访问路径的服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 提供创建、打开、读、写、关闭、撤销文件等服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件系统维护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件系统的转储和恢复</p><p>&nbsp; &nbsp; 10.文件的保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件的共享</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）定义</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个文件被多个用户或程序使用</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 共享形式：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 被多个用户使用，由存取权限控制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 被多个程序使用，但各用自己的读写指针</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 被多个程序使用，但共享读写指针</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）目的</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 节省时间和存储空间，减少了用户工作量；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进程间通过文件交换信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件安全是指避免合法用户有意或无意的错误操作破坏文件，或非法用户访问文件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 影响文件安全性的主要因素有：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）认为因素</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）系统因素</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）自然因素</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 为了确保文件系统的安全性，可以采取以下措施：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）建立副本，通过“后备系统”来防止由自然因素所造成的不安全性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）定时转储，通过系统容错技术来防止系统部分的故障所造成的文件不安全性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）规定文件的存取权限，通过存取控制机制来防止由人为因素引起的文件不安全性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：建立副本的方法简单，但是系统开销大，且文件更新时，所有副本都必须更新。这种方法使用容量较小且极为重要的文件。定时转储的方法简单，但是较为费时，在转储过程中一般要停止文件系统的使用。这种方法适用于容量较大的文件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件的使用权限可以设为：只能读、可读可写、只能执行、不能删除等。对多用户共享的文件采用属性、目录结构，反得到某级目录权限的用户就可以得到该目录所属的全部目录和文件。</p><p>&nbsp; &nbsp; 11.文件的存取权限</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）存取控制矩阵：系统以一个二维矩阵来实施文件的存取控制。其方法在概念上比较简单。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）二级存取控制：两个存取级别。第一级，把用户按照某种关系分为若干组，进行对访问者的识别，第二级，进行对操作权限的识别。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; UNIX中的文件存取权限：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第一级：对访问者的识别</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对用户分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件主（owner）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件主的同组用户（group）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 其它用户（other）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第二级：对操作权限的识别</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对操作分类：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 读操作（r）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 写操作（w）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 执行操作（x）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不能执行任何操作（-）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 文件属性rwxr--xr--x用二进制表示是111101101，在UNIX中使用八进制，因此权限是755</p><p>&nbsp; &nbsp; 12.文件保密</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件保密是指文件本身不得不被未授权的用户访问，防止他人窃取文件。实现文件保密采用的方法有：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）隐藏文件目录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）设置口令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）使用密码</p><p>&nbsp; &nbsp; 13.文件系统的优化</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 文件系统的物理基础是磁盘设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 常见的技术措施：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）块高速缓存</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）合理分配磁盘空间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）磁盘的驱动调度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）信息的优化分布</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5）RAID技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&gt;块高速缓存</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 系统在内存中保存一些块。逻辑上它们属于磁盘</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&gt;合理分配磁盘空间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3&gt;磁盘的驱动调度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 公平：一个I/O请求在有限时间内满足</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 高效：减少设备机械运动所带来的时间浪费</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁盘调度考虑的问题：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一次访盘时间=寻道时间+旋转延迟时间+传输时间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁盘驱动调度由“移臂调度”和“旋转调度”组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 移臂调度目的是尽可能减少寻找磁道时间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 旋转调度目的是尽可能减少寻找扇区时间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁盘调度算法：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）先来先服务（FCFS）：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 按访问请求到达的先后次序服务</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优点：简单，公平</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缺点：效率不高，相邻两次请求可能会造成最内到最外的柱面寻道，使磁头反复移动，增加了服务时间，对机械也不利</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）最短寻道时间优先（SSTF）：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 优先选择距当前磁头最近的访问请求进行服务，主要考虑寻道优先</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：该调度算法，虽然减少了磁臂的移动距离，但是，会经常改变磁臂的移动方向，花费时间多又影响机械部件，还会导致“饥饿”现象，即较远距离的鼓励的访问者可能很长时间不能获得访问磁盘的机会。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）扫描算法（SCAN电梯算法）：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 克服了最短寻道有限的缺点，考虑了距离和方向</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）循环扫描（C-SCAN）调度算法：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在扫描算法的基础上改进的。balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4&gt;旋转调度算法</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 旋转调度：根据延迟时间来决定执行次序的调度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5&gt;信息的优化分布</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录在磁道上的排列方式也会影响磁盘的输入输出时间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6&gt;RAID技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 磁盘时机械设备，一方面速度慢，一方面也容易出现故障。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RAID是一种把多块独立的硬盘（物理硬盘）按不同的方式组合起来形成一个硬盘组（逻辑硬盘），从而提供比单个硬盘更高的存储性能和提供数据备份技术。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Windows的FAT文件系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FAT文件系统是各种Windows操作系统都支持的一个简单的文件系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FAT文件系统一簇为单位进行分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FAT有三个版本：FAT-12，FAT-16，FAT-32</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FAT卷的结构包括：引导扇区、文件分配表、根目录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; UNIX文件系统</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX目录中为每个文件保留了一项，每个目录项包含了两个域，文件名和节点号。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIX普通文件的物理结构是三级索引结构</p><p><br/></p><p><strong><span style="font-size: 18px;">第七章 I/O设备管理</span></strong></p><p>&nbsp; &nbsp; 考试内容</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1.设备与设备分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.I/O硬件组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3.I/O软件的特点及结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.典型技术：通道技术，缓冲技术，SPOOLing</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 5.I/O性能问题及解决方案</p><p>&nbsp; &nbsp; 1.设备与设备的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 按设备的使用特性分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）存储设备。存储设备是指用来存放信息的设备，如磁盘、磁带等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）I/O（输入输出）设备</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 按设备共享属性分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）独占设备。独占设备是指在一段时间内只允许一个进程访问的设备。系统一旦把这种设备分配给一个进程后，便由该进程独占，直到用完释放，其他进程才能使用。多数低速设备都属于此类设备，如打印机。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）共享设备。共享设备是指在一段时间内允许多个进程访问的设备，如磁盘。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）虚拟设备。虚拟设备是指通过虚拟技术将一台独占设备变换为若干台逻辑设备，供若干个进程同时使用的设备，如虚拟打印机。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 按设备的信息组织方式来分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）块设备。块设备是指处理信息的基本单位是字符块。一般块的大小为512B~4KB，如磁盘、磁带等。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）字符设备。字符设备是指处理信息的基本单位是字符，如键盘、显示器、打印机等。</p><p>&nbsp; &nbsp; 2.I/O硬件组成</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.1计算机的I/O系统结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从硬件的角度来看，一个典型的计算机结构，中央部分是CPU和主存，通过总线与第二层的接口部分连接，第三层各种外围设备控制器，最外层是外围设备。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.2I/O设备数据传输控制方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序直接控制方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序直接控制方式也称为“忙——等待”方式，即在一个设备的操作没有完成时，控制程序一直检测设备的状态，直到该操作完成，才能进行下一个操作。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 步骤为：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）当用户需要输入数据时，由处理器向设备控制器发出一条输入输出指令，启动设备进行输入。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）当用户进程需要像设备输出数据时，也必须发出启动命令启动设备输出，并等待输出操作完成。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：工作过程简单，CPU的利用率低。直接控制方式适用于早期的无中断的计算机系统。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 程序中断控制方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断控制是指计算机在执行期间，系统内发生任何给寻常的或非预期的急需处理事件，使得CPU暂时中止当前执行的程序而转去执行相应的时间处理程序，待处理完毕后又返回原来被中止处继续执行或调度新的进程。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：中断控制方式比程序直接控制方式提高了CPU的利用率。每输入一个数据都会发生中断，传输一组数据需要多次中断，浪费了CPU的时间。中断控制方式应用与现代计算机系统中。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 直接存储器存取控制方式（DMA）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 直接存储器存取方式是指对输入输出设备的控制由DMA控制器完成，在DMA控制器的作用下，设备和主存之间可以成批地进行数交换，而不用CPU的干涉。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：数据的传送方向、存放数据的主存始址及传送数据的长度等都由CPU控制，具体的数据传送由DMA控制器负责，每台设备需要配一个DMA控制器，这样输入输出传输速度快，CPU负担少。直接存储器存取控制方式适用于块设备的数据传输。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通信控制方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; I/O通信是一种特殊的处理机</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 具有执行I/O指令的能力</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 具有执行通道（I/O）程序控制I/O操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 指令类型单一，主要限于I/O操作有关的指令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 没有自己的内存，通道程序放在主机内存中</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点：通道所需要的CPU干预更少，并可以实现CPU、通道和输入输出设备三者之间的并行操作，从而更有效地提高整个系统资源的利用率。通道控制方式适用于现代计算机系统中的大量数据交换。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2.3输入输出通道的分类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 输入输出通道是用于控制外围设备的。根据信息交换方式的不同，把通道分成三种类型：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）选择通道。可以连接多台高速设备，由于它只含有一个分配型子通道，在一段时间内只能执行一个通道程序，控制一台设备进行数据传送，致使当某台设备占用了该通道后，便一直由它独占，直至该设备传送完毕后释放该通道。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据选择通道虽然有很高的传输速率，但它每次只允许一个设备传输设备，这种通道利用率很低。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）字节多路通道。通常都含有许多非分配型子通道，其数量可以从几十到数百个，每一个子通道连接一台输入输出设备，这些子通道按时间片轮转方式共享主通道。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 字节多路通道连接低速或中速设备时，不会丢失信息。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）数组多路通道。将数据选择通道传输速率高和字节多路通道能使各子通道（设备）分时并行操作的优点相结合，而形成的一种新通道。它含有多个非分配子通道，因而这种通道既具有很高的数据传输速率，又能获得令人满意的通道利用率。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 该通道被广泛地用于连接多台高、中速的外围设备，其数据传送是按数组方式进行的。</p><p>&nbsp; &nbsp; 3.I/O软件的特点及结构</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 设计I/O最关键的目标是设备独立性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; I/O设备管理软件的结构，基本思想是分层构造，使底层与硬件相关，把硬件与较高层次的软件隔离。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; I/O软件分为四层：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断处理程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设备驱动程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 与设备无关的系统软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户空间的I/O软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 设备驱动程序的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; balabala...</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 设计I/O最关键的目标是设备独立性。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; I/O设备管理软件的结构，基本思想是分层构造，使底层与硬件相关，把硬件与较高层次的软件隔离。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; I/O软件分为四层：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 中断处理程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设备驱动程序</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 与设备无关的系统软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用户空间的I/O软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 设备驱动程序的特点：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）驱动程序主要是在请求输入输出的进程与设备控制器之间的一个通信程序。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）驱动程序与输入输出设备的特性密切相关</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）驱动程序与输入输出控制方式紧密相关</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）驱动程序与硬件紧密相关，其部分被固化在ROM中</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 与设备无关的系统软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 除了一些I/O软件与设备相关外，大部分软件是与设备无关的。一般情况，所有设备都需要的I/O功能可以在于设备独立的软件中实现。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 设备无关软件层实现的一些功能：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 统一命名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设备保护</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 提供与设备无关的逻辑块</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 缓冲</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 存储设备的块分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 独占设备的分配与释放</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 出错处理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 用户空间的I/O软件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 大部分I/O软件都包含在操作系统中，但是用户程序可以和库函数连接在一起</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 标准的I/O库包含了许多设计I/O的过程，他们都是作为用户程序的一部分运行的</p><p>&nbsp; &nbsp; 4.缓冲技术</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 为了提高输入输出设备的速度和利用率，在输入输出设备与处理器交换数据时引入了缓冲技术。缓冲技术是输入输出设备在与主存交换数据时使用缓冲区的技术。缓冲管理的主要功能是组织好缓冲区，并提供获得和释放缓冲区的手段。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.1缓冲的引入</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）缓和CPU与输入输出设备间速度不匹配的矛盾</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）减少对CPU的中断频率，放款对中断响应时间的限制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）提高CPU与输入输出设备间的并行性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.2单缓冲</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 单缓冲是指在设备和处理器之间设置一个缓冲区，用于数据的传输</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.3双缓冲</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 双缓冲是指在设备和处理器之间设置两个缓冲区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.4多缓冲</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在设备和处理器之间设置多个缓冲区</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4.5缓冲池</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当系统较大时，可以利用多个进程共享的缓冲池来提高缓冲区的利用率</p><p>&nbsp; &nbsp; 5.I/O性能问题及解决方案小结</p><p>&nbsp; &nbsp; &nbsp; &nbsp; I/O性能常常成为系统性能的瓶颈，因此提高I/O性能十分重要</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）通过缓冲技术，减少或缓解不同设备之间传输速度的差距</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）通过异步I/O技术，使CPU计算不必等待I/O操作结果</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3）通过应用DMA和通信部件，使CPU摆脱I/O操作，与这些部件并行执行</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4）通过虚拟设备技术，提高独占设备的利用率</p><p><br/></p><p><strong><span style="font-size: 18px;">第八章 死锁</span></strong></p><p>&nbsp; &nbsp; 活锁概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 数据资源释放时间不确定，导致某些事务长时间等待，得不到封锁的机会</p><p>&nbsp; &nbsp; 饥饿的概念</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 系统没有发生死锁，但某些进程可能会长时间等待，当等待时间给进程推进和响应带来明显影响时，称进程饥饿</p><p>&nbsp; &nbsp; 死锁的原因</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）竞争资源</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）进程推进顺序不合理</p><p>&nbsp; &nbsp; 产生死锁的必要条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 死锁并不一定都会出现，如果一旦产生死锁，一定会满足下述4个必要条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）互斥条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）不剥夺条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3）请求和保护条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4）循环等待条件</p><p>&nbsp; &nbsp; 解决死锁的方法分为四种</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1）预防死锁。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 预防死锁是在进行资源分配之前，通过设置某些资源分配的限制条件，来破坏产生死锁的四个必要条件的一个或几个。预防死锁是一种较简单的方法，容易使用，但是，由于施加了限制条件，会导致系统资源利用率和吞吐量的下降。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2）避免死锁。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 避免死锁是在资源分配前不设置限制条件，在进行资源分配的过程中，用某种方法对每次资源分配进行管理，以避免某次分配使系统进入不安全状态，以致产生死锁。这种方法限制较小，可以获得较好的系统资源利用率和吞吐量。目前比较完善的系统中，通常采用此种方法。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3）检测死锁</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 允许系统产生死锁，但在系统中设置检测机构，一旦发生死锁，采取措施解除死锁</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4）解除死锁</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 通过撤销或挂起一些死锁中的进程，回收相应的资源，进行资源的再次分配，从而将进程死锁状态解除。这种方法没有限制，可以获得较好的系统资源利用率</p><p>&nbsp; &nbsp; 死锁的预防</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 通过对资源分配的原则进行限制，而使产生死锁的四个必要条件中的1个或多个条件不能成立，来预防产生死锁。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 破坏“互斥条件”条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 进制进程独占资源，如果资源不被一个进程独占，你们死锁肯定不会发生</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 此条件实现比较困难，限制比较多</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 破坏“不剥夺”条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个已经占有某些资源的进程，当它再提出新的资源需求而不能立即得到满足时，必须释放它已经占有的所有资源，待以后需要时再重新申请。这意味着进程已经拥有的资源，在运行过程中可能会暂时被迫释放，即被系统剥夺，从而摒弃了“不剥夺条件”</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 这种预防死锁的方法，实现起来比较复杂，并付出较大的代价，会使前段时间的工作实效等。此外这种方法还会因为反复地申请和释放资源，延长进程的周转时间，增加系统开销，降低系统吞吐量。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 破坏“请求和保持”条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 系统要求进程必须一次性地申请其在整个运行期间所需要的全部资源。若系统有足够的资源，便一次性将其所需要的所有资源分配给该进程，这样一来，该进程在整个运行过程中，便不会再提出资源请求，从而摒弃了“请求”条件。而在分配时，只要有一个资源要求不能满足，系统将不分配给该进程任何资源，此时进程没有占有任何资源，因而也摒弃了“保持”条件，所以，可以预防死锁的产生。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 这种预防死锁的方法，简答方便、易于实现，但是，因为进程将一次性获得所有资源，并且独占使用，其中可能有些资源在该进程运行期间很少使用，造成资源严重浪费；同时有些进程因不能一次性获得所需要的资源，导致长时间不能投入运行。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 破坏“循环等待”条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在这种方法中规定，系统将所有的资源按照类型进行线性排序，赋予不同的资源序号。并且所有进程对资源的请求和分配必须严格的按照资源序号有小到大地进行，即只有先申请和分配到序号小的资源，才能申请和分配序号大的资源。这样在最后形成的资源分配图中，将不可能再出现环路，从而摒弃了“环路等待”条件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 这种预防死锁的方法与前两种相比，其资源利用率和系统吞吐量，都有明显的改善。但是，这种方法涉及对各类资源的排序编号，考虑到实际的使用，其排序的合理性将受到很大的挑战。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 破坏“循环等待”条件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在这种方法中规定，系统将所有的资源按照类型进行线性排序，赋予不同的资源序号。并且所有进程对资源的请求和分配必须严格的按照资源序号有小到大地进行，即只有先申请和分配到序号小的资源，才能再申请和分配序号大的资源。这样在最后形成的资源分配图中，将不可能再出现环路，从而摒弃了“环路等待”条件。</p><p>&nbsp; &nbsp; 死锁的避免</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 在死锁的避免中，所施加的限制较弱，可以获得较好的系统性能。该方法的系统状态分为安全状态和不安全状态，只要能使系统时钟处于安全状态，便可以避免死锁发生。</p><p>&nbsp; &nbsp; 安全状态和不安全状态</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 安全状态是指系统能够按照某种顺序为每个进程分配搜需要资源，直到最大需求，使每一个进程都可以顺利完成。反之，如果系统不存在这样的一个安全序列，则称系统处于不安全状态。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 当系统进入不安全状态后，很有可能进入死锁状态；反之，只要系统处于安全状态，便可避免进入死锁状态。因此，避免死锁的实质就是如何是系统不进入不安全状态。</p><p>&nbsp; &nbsp; 利用银行家算法避免死锁</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 最具代表性的避免死锁的算法是Dijkstra和Habermann的银行家算法。这是由于该算法能用于银行系统现金贷款的发放而得名。</p><p>&nbsp; &nbsp; 死锁的检测与接触</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 当系统为进程分配资源时，如果没有采取任何限制措施，系统必须提供死锁的检测与解除机制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 死锁的检测</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在进行死锁的检测时，系统必须能保存有关资源的请求和分配的信息，并提供一种算法，以便利用这些信息来检测系统是否进入死锁状态。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 死锁的解除</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 当检测到系统发生死锁时，就必须立即把死锁状态解除，常用的方法是：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）剥夺资源法。从其他进程剥夺足够数量的资源给死锁进程，使其得到足够的资源，然后继续执行，以解除死锁状态。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）撤销进程法。系统采用强制手段将死锁进程撤销。最简单的方法是将全部死锁进程一次性撤销，但是，代价较大；另一种方法是按照一定的算法，从死锁进程中一个一个地选择进行撤销，并同时剥夺这些进程的资源，直到死锁状态解除为止。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 死锁定理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1）如果资源分配图中没有环路，则系统没有死锁</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2）如果资源分配图中出现了环路，则系统可能出现死锁</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果环路中每个资源的数目只有一个，则意味着死锁的存在，此时，环路是死锁的中分必要条件。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果处于环路的每个资源数目不为1，则是死锁产生的必要而不是充分条件</p><p><br/></p>]]></description>
      <pubDate>Wed, 02 Aug 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>黑幕！黑色的明天等待着我们</title>
      <link>http://old-blog.smallyu.net/index48db.html?id=58</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=58</guid>
      <description><![CDATA[<p style="text-align: left;">考试前一天晚上，所有人都知道了考试题目……</p><p>大学，期末考试，某门课，考试前一天晚上，很多（几乎所有）人，都知道了第二天考试要考的，80%（以上）的试题，</p><p>一字不差的那种。</p><p><br/></p><p>试题的流传过程是这样的。</p><p>背景，学生A和学生B都是宿舍A的。</p><p>背景，学生A和学生B对试题的传播几乎没有过交流。</p><p>老师同时把题给了学生A和学生B，然后人情社会，利益相关，</p><p>学生A把题告诉了宿舍A（也就是自己宿舍）和宿舍C（平时玩的比较好），</p><p>学生B把题告诉了宿舍B（可能玩的比较好）和宿舍D（其实这里稍有误）。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/07/201707251500981564881973.png" title="搜狗截图20170725174343.png" alt="搜狗截图20170725174343.png" width="434" height="324" style="width: 434px; height: 324px;"/></p><p>图中虚线表示学生A和学生B都是宿舍A的，实线表示试题的流传过程。</p><p><br/></p><p>泄题本身很难判断对错。</p><p>学生A的成绩差，老师一片好心。</p><p>学生B是班长，（脑补原因）。</p><p>噢对，学生A是老师的助理。（所以老师才会关心他的成绩差，而不是别人。成绩差也是能当助理的）</p><p>对于成绩差的学生A，我们丝毫不介意甚至迫切希望老师泄题给他，因为我们也不希望他挂科。（好吧一个宿舍的）</p><p>然后从结果上看，老师泄题，我们几乎所有人（起码我）得知了第二天要考的题目。</p><p>我们平时还盼着老师给划个重点，现在真题都有了，难不成还站在道德的制高点说泄题的行为是错误的？</p><p>当然不可以，但直接出来那么多真题确实有点怀疑人生。</p><p>原来人情，连这种违反规定的事情，都可以解决。</p><p>但是同样从人情的角度看，老师背着违反规定的风险泄题给你，想让你不挂科，给你个机会，这是老师在做好。</p><p>对我们有利，所以我们不能（也不会）说它是错的。</p><p>不过如果我们（我）不是受益者，可能我就会改变说法。</p><p><br/></p><p>泄题的过程才让人感慨。（泄不泄题和我没太大关系，对成绩影响不大）</p><p>全班几十个学生，老师只告诉了两个人，其中没有你，你伤不伤？</p><p>学生A只告诉了宿舍A和宿舍C，那么宿舍B和宿舍D的，你伤不伤？</p><p>同理，学生B只告诉了宿舍B和宿舍D的，尤其，连它自己的宿舍A都没告诉，你伤不伤？</p><p>问题是，资源在人家手里，想给谁给谁。</p><p>尴尬的是，最后，几乎所有人都知道了。</p><p>宿舍B的人跑到宿舍A，咦，你这题哪儿来的？</p><p>宿舍A黑人问号脸，咦，怎么，你知道？</p><p><br/></p><p>哈哈哈哈哈哈哈哈</p><p><br/></p><p>谁都能理解，谁都不想理解。</p><p>面对资源，部分人性可以显露。</p><p>所以石油才会引发大国之间的战争？《文明6》里面加成资源算是很值钱的东西，像牛羊马，鹿，鱼，或者战略资源，石油，铀，硝石。</p><p><br/></p><p>问：好人是从什么时候开始变坏的？</p><p>答：觉得不公平的时候。</p><p><br/></p><p>可是 (公平!=公正)==true</p><p><br/></p><p>社会我社会</p><p><br/></p><p>我等身与名俱灭，不废长江万古流啊</p>]]></description>
      <pubDate>Tue, 25 Jul 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>2017年上半年年度总结，2017年下半年年度展望</title>
      <link>http://old-blog.smallyu.net/index850a.html?id=57</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=57</guid>
      <description><![CDATA[<p>没啥好总结的，没啥好展望的。</p><p><br/></p><p>（不忍心总结过去的半年，没有勇气开始新的半年）</p>]]></description>
      <pubDate>Thu, 13 Jul 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>SPL中的常用迭代器和函数</title>
      <link>http://old-blog.smallyu.net/indexadbc.html?id=56</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=56</guid>
      <description><![CDATA[<blockquote><p>有一天，我去世了，恨我的人，翩翩起舞，爱我的人，眼泪如露。</p><p>第二天，我的尸体头朝西埋在地下深处，恨我的人，看着我的坟墓，一脸笑意，爱我的人，不敢回头看那么一眼。</p><p>一年后，我的尸骨已经腐烂，我的坟堆雨打风吹，恨我的人，偶尔在茶余饭后提到我时，仍然一脸恼怒，爱我的人，夜深人静时，无声的眼泪向谁哭诉。</p><p>十年后，我没有了尸体，只剩一些残骨。恨我的人，只隐约记得我的名字，已经忘了我的面目，爱我至深的人啊，想起我时，有短暂的沉默，生活把一切都渐渐模糊。</p><p>几十年后，我的坟堆雨打风吹去，唯有一片荒芜，恨我的人，把我遗忘，爱我至深的人，也跟着进入了坟墓。对这个世界来说，我彻底变成了虚无。我奋斗一生，带不走一草一木。我一生执着，带不走一分虚荣爱慕。</p><p>今生，无论贵贱贫富，总有一天都要走到这最后一步。</p><p>到了后世，霍然回首，我的这一生，形同虚度！我想痛哭，却发不出一点声音，我想忏悔，却已迟暮！用心去生活，别以他人的眼光为尺度。爱恨情仇其实都只是对自身活着的，每一天幸福就好。</p><p>珍惜内心最想要珍惜的，三千繁华，弹指刹那，百年之后，不过一捧黄沙。</p></blockquote><p><strong><br/></strong></p><p><strong>SPL的常用迭代器</strong>,通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历，而这种统一的遍历工具我们叫做迭代器。</p><blockquote><p>ArrayIterator</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$fruits&nbsp;=&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&quot;apple&quot;&nbsp;=&gt;&nbsp;&#39;apple&nbsp;value&#39;,&nbsp;//&nbsp;position&nbsp;=&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;&quot;orange&quot;&nbsp;=&gt;&nbsp;&#39;orange&nbsp;value&#39;,&nbsp;//&nbsp;position&nbsp;=&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;&quot;grape&quot;&nbsp;=&gt;&nbsp;&#39;grape&nbsp;value&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&quot;plum&quot;&nbsp;=&gt;&nbsp;&#39;plum&nbsp;value&#39;
];
//&nbsp;一般方式
print_r($fruits);
foreach($fruits&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$value){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$key.$value;
}

//&nbsp;使用ArrayIterator遍历数组
$obj&nbsp;=&nbsp;new&nbsp;ArrayObject($fruits);
$it&nbsp;=&nbsp;$obj-&gt;getIterator();
//&nbsp;foreach方式
foreach($it&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$value){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$key.$value;
}
/*&nbsp;foreach方式和普通的foreach方式没有区别，因为我们在使用foreach的过程中程序默认使用了迭代器，也就是底层实现的方式，先实例化数组为一个对象，然后调用迭代器的方法，进行遍历。&nbsp;*/
//&nbsp;while方式
$it-&gt;rewind();&nbsp;//&nbsp;调用current之前一定要rewind
while($it-&gt;valid()){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$it-&gt;key().$it-&gt;current();
&nbsp;&nbsp;&nbsp;&nbsp;$it-&gt;next();
}
/*&nbsp;while遍历的时候一定要记得rewin重置指针的位置。和普通foreach实现遍历相比，迭代器方式可以实现跳过某些元素再进行遍历，比如从位置1开始，而不是位置0.&nbsp;*/
//&nbsp;跳过某些元素进行打印
$it-&gt;rewind();
if($it-&gt;valid()){
&nbsp;&nbsp;&nbsp;&nbsp;$it-&gt;seek(1);&nbsp;//&nbsp;从position&nbsp;=&nbsp;1开始
&nbsp;&nbsp;&nbsp;&nbsp;while($it-&gt;valid()){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$it-&gt;key().$it-&gt;current();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$it-&gt;next();
&nbsp;&nbsp;&nbsp;&nbsp;}
}
/*&nbsp;ksort方式使得遍历结果按照key的字典序排序，如果想要value按照字典序排序，则使用asort。&nbsp;*/
$it-&gt;ksort();
foreach($it&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$value){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$key.$value;
}</pre><blockquote><p>AppendIterator</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$array_a&nbsp;=&nbsp;new&nbsp;ArrayIterator([&#39;a&#39;,&nbsp;&#39;b&#39;,&nbsp;&#39;c&#39;]);
$array_b&nbsp;=&nbsp;new&nbsp;ArrayIterator([&#39;d&#39;,&nbsp;&#39;e&#39;,&nbsp;&#39;f&#39;]);
$it-&gt;append($array_a);
$it-&gt;append($array_b);
//&nbsp;通过append方法把迭代器对象添加到AppendIterator对象中
foreach($it&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$value){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$value;
}
//&nbsp;只用一个foreach就可以实现多次遍历</pre><blockquote><p>MultipleIterator用于把多个Iterator里面的数据组合成为一个整体来访问</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$idIter&nbsp;=&nbsp;new&nbsp;ArrayIterator([&#39;01&#39;,&nbsp;&#39;02&#39;,&nbsp;&#39;03&#39;]);
$nameIter&nbsp;=&nbsp;new&nbsp;ArrayIterator([&#39;张三&#39;,&nbsp;&#39;李四&#39;,&nbsp;&#39;王五&#39;]);
$ageIter&nbsp;=&nbsp;new&nbsp;ArrayIterator([&#39;22&#39;,&nbsp;&#39;23&#39;,&nbsp;&#39;25&#39;]);
$mit&nbsp;=&nbsp;new&nbsp;MultipleIterator(MultipleIterator::MIT_KETS_ASSOC);
$mit-&gt;attachIterator($idIter,&nbsp;&quot;ID&quot;);
$mit-&gt;attachIterator($nameIter,&nbsp;&quot;NAME&quot;);
$mit-&gt;attachIterator($ageIter,&nbsp;&quot;AGE&quot;);
foreach&nbsp;($mit&nbsp;as&nbsp;$value)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;print_r($value);
}</pre><blockquote><p>FilesystemIterator能遍历文件系统</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$it&nbsp;=&nbsp;new&nbsp;FileSystemIterator(&#39;.&#39;);
foreach&nbsp;($it&nbsp;as&nbsp;$finfo)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s\t%s\t%8s\t%s\n&quot;,date(&quot;Y-m-d&nbsp;H:i:s&quot;,&nbsp;$finfo-&gt;getMTime()),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$finfo-&gt;isDIr()&nbsp;?&nbsp;&quot;&lt;DIR&gt;&quot;&nbsp;:&nbsp;&quot;&quot;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number_format($finfo-&gt;getSize()),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$finfo-&gt;getFileName()
&nbsp;&nbsp;&nbsp;&nbsp;);
}</pre><p><strong>SPL基础接口</strong></p><blockquote><p>SPL的基础接口里面定义了最常用的接口</p><p>-Countable</p><p>--继承了接口的类可以直接调用count()得到元素个数</p><p>OuterIterator</p><p>--如果想对迭代器进行一定的处理之后再返回，可以用这个接口</p><p>RecursiveIterator</p><p>可以对多层结构的迭代器进行迭代，比如遍历一棵树</p><p>SeekableIteraor</p><p>可以通过seek方法定位到集合里面的某个特定元素</p></blockquote><p>Countable，在代码里面经常可以直接用count($obj)方法获得对象里面的元素的个数，对于自定义的类可以implements</p><pre class="prism-highlight prism-language-php">&lt;?php
$array&nbsp;=&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;[1,&nbsp;2],
&nbsp;&nbsp;&nbsp;&nbsp;[3,&nbsp;4],
&nbsp;&nbsp;&nbsp;&nbsp;[5,&nbsp;6]
];
echo&nbsp;count($array);
echo&nbsp;count($array[1]);

&lt;?php
class&nbsp;CountMe&nbsp;implements&nbsp;Countable&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$_myCount&nbsp;=&nbsp;3;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;count(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;_myCount;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
$obj&nbsp;=&nbsp;new&nbsp;CountMe();
echo&nbsp;count($obj);</pre><blockquote><p>OuterIterator</p></blockquote><p>&nbsp; &nbsp; &nbsp; &nbsp;如果想对迭代器进行一定的处理之后再返回，可以用这个接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IteratorIterator类是OuterIterator的实现，扩展的时候可以直接继承IteratorIterator</p><pre class="prism-highlight prism-language-php">&lt;?php
$array&nbsp;=&nbsp;[&#39;1&#39;,&nbsp;&#39;2&#39;,&nbsp;&#39;3&#39;,&nbsp;&#39;4&#39;];
$outerObj&nbsp;=&nbsp;new&nbsp;OuterImpl(new&nbsp;ArrayIterator($array));
foreach&nbsp;($outerObj&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$value)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$key.$value;
}

class&nbsp;OuterImpl&nbsp;extends&nbsp;Iterator&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;current()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;parent::current().&quot;_tail&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;key()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&quot;Pre_&quot;.parent::key();
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote><p>RecursiveIterator</p></blockquote><p>-可以对多层结构的迭代器进行迭代，比如遍历一棵树</p><p>-所有具有层次结构特点的数据都可以用这个接口遍历，如文件夹</p><p>关键方法</p><p>-hasChildren方法用于判断当前节点是否存在子节点</p><p>-getChildren方法用于得到当前节点子节点的迭代器</p><p>SPL实现该接口的类</p><p>-RecursiveArrayIterator，RecursiveCachingIterator等以Recursive开头的类都能够进行多层次结构化的遍历</p><blockquote><p>SeekableIterator</p></blockquote><p>-可以通过seek方法定位到集合里面的某个元素</p><p>-seek方法的参数是元素的位置，以0开始计算</p><p><strong>SPL函数的使用</strong></p><pre class="prism-highlight prism-language-php">&lt;?php
spl_autoload_extensions(&#39;.class.php&#39;,&nbsp;&#39;.php&#39;);
//&nbsp;设置autoload寻找php定义的类文件的扩展名，多个扩展名用逗号分隔，前面的扩展名优先被匹配
set_include_path(get_include_path().PATH_SEPARATOR.&quot;libs/&quot;);
//&nbsp;设置sutoload寻找php定义的类文件的目录，多个目录用PATH_SEPARATOR进行分隔
spl_sutoload_register();
//&nbsp;提示php使用Autoload机制查找类定义
new&nbsp;ClassName();</pre><p>改进</p><pre class="prism-highlight prism-language-php">&lt;?php
function&nbsp;__autoload($class_name){&nbsp;//&nbsp;定义__autoload函数，可以不调用spl_autoload_register函数的情况下完成类的装载
&nbsp;&nbsp;&nbsp;&nbsp;require_once(&quot;libs/&quot;.$class_name.&quot;.php&quot;);&nbsp;//&nbsp;装载类
}
new&nbsp;ClassName();</pre><p>自定义装载</p><pre class="prism-highlight prism-language-php">&lt;?php
function&nbsp;classLoader($class_name){&nbsp;//&nbsp;定义一个替换__autoload函数的类文件装载函数
&nbsp;&nbsp;&nbsp;&nbsp;require_once(&quot;libs/&quot;.$class_name.&quot;.php&quot;);&nbsp;//&nbsp;装载类
}
spl_autoload_register(&#39;classLoader&#39;);&nbsp;//传入定义好的装载类的函数的名称替换__autoload函数
new&nbsp;ClassName();</pre><p><br/></p><p>The End.</p>]]></description>
      <pubDate>Fri, 16 Jun 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>今天二十岁</title>
      <link>http://old-blog.smallyu.net/indexa9e4.html?id=55</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=55</guid>
      <description><![CDATA[<p>莫名想哭，偶尔想笑</p>]]></description>
      <pubDate>Tue, 13 Jun 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>比起努力，我实在太喜欢睡觉了</title>
      <link>http://old-blog.smallyu.net/index1e85.html?id=54</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=54</guid>
      <description><![CDATA[<p>尤其是面对电脑不知所措的时候。<br/></p><p>B站排行榜的视频刷完了。老友记越看越没劲了。知乎怎么看都看不完了。头条推送的内容没什么新鲜的了。优酷的UI越来越反人类了。虎绿林和zz是早该放弃的社区了。<br/></p><p>慕课网上的学习时长增长进度远远低于期望值，去年的日志<a href="http://old-blog.smallyu.net/2016/08/13/index.html" target="_blank" se_prerender_url="complete">（一万小时定律实践计划）Duang~任务进度到1%啦！</a>post时间到现在将近一年减两个月，也就是十个月，学习时长的统计时间还不到1W小时的5%。然后PHP分类下的视频几乎全是对号。</p><p>IM工具，QQ空间，朋友圈，好友动态的更新频率可能比这个博客还要慢。<br/></p><p>所以总的来说，就是无聊。无聊的时候，就睡一会儿。睡不着的时候，就再无聊一会儿。</p><p><br/></p><p>听说无聊是对欲望的欲望。没有欲望，才对欲望有欲望。人怎么会没有欲望呢，也就是另一种情况，对欲望无能为力的时候，对欲望的欲望。</p><p>这个意思感觉就像，要理解递归，首先要理解递归。</p><p><br/></p><p>最近没什么事情，但又想post点内容，最后可选的标题（和内容）有三个：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>利用WebView开发一个简单的安卓APP</p></li><li><p>五月乱象：总有几个莫名奇妙的总结</p></li><li><p>超星泛雅《创业管理实战》、《大学语文》答案分享</p></li></ol><p>然后都放弃了。<br/></p><p><br/></p><p>第一个先留着，可能有心情再折腾一下安卓开发的时候再总结。之前没怎么接触过APP开发，有一个比赛的时候试着封装了一个用WebView加载指定页面的很简单的应用。也是踩了一点可能不少新手都会踩的坑。<br/></p><p>第二个是一些看视频的笔记。单个拿出来太少，一起放出来有点乱。有这么几部分：<br/></p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>Java IO流 -&gt; 字节流（概念）</p></li><li><p>Java工厂模式（简单案例）</p></li><li><p>PHP SPL常用迭代器（部分）</p></li><li><p>测试用例（概念）</p></li></ol><p>设计模式和SPL在之前的日志中提到过，只是很不全。Java IO流的概念和测试用例的概念也就是一些文字。就贴在后面。（刚发现SPL的内容比较多，也先留着）</p><p>第三个是最近刷视频课用到的答案。网上重复内容太多，搜索引擎应该不会收录。即使收录了权重也应该低的吓人。而且不能复制粘贴，内容太多了，影响页面加载，只能附件doc。不过那样更没戏，搜索引擎认都不认。</p><p><br/></p><p><strong>Java IO 流</strong>（输入流、输出流）</p><blockquote><p>1.字节流</p><p>&nbsp; &nbsp; 1) InputStream、OutputStream</p><p>&nbsp; &nbsp; &nbsp; &nbsp;InputStream抽象了应用程序读取数据的方式</p><p>&nbsp; &nbsp; &nbsp; &nbsp;OutputStream抽象了应用程序写出数据的方式</p><p>&nbsp; &nbsp; 2) EOF = End 读到-1就读到结尾</p><p>&nbsp; &nbsp; 3) 输入流基本方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp;int b = in.read(); 读取一个字节无符号填充到int低八位，-1是EOF</p><p>&nbsp; &nbsp; &nbsp; &nbsp;in.read(byte[] buf) 速去数据填充到字节数组buf</p><p>&nbsp; &nbsp; &nbsp; &nbsp;in.read(byte[] buf, int start, int size) 读取数据到字节数组buf，从buf的start位置开始存放size长度的数据</p><p>&nbsp; &nbsp; 4) 输出流基本方法</p><p>&nbsp; &nbsp; &nbsp; &nbsp;out.write(int b) 写出一个byte到流，b的低8位</p><p>&nbsp; &nbsp; &nbsp; &nbsp;out.write(byte[] buf) 将buf字节数组都写入到流</p><p>&nbsp; &nbsp; &nbsp; &nbsp;out.write(byte[] buf, int start, int size)</p><p>&nbsp; &nbsp; 5) FileInputStream ---&gt; 具体实现了在文件上读取数据</p></blockquote><p>其实有字节流和字符流两部分，只看了字节流。内容很少，一些流操作用到的方法。</p><p><strong><br/></strong></p><p><strong>Java工厂模式</strong><br/></p><p>使用工厂模式简单实现一下理发店的逻辑。</p><blockquote><p>HairInterface.java</p></blockquote><pre class="prism-highlight prism-language-java">/**
&nbsp;*&nbsp;发型接口
&nbsp;*/
public&nbsp;interface&nbsp;HairInterface&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;实现了发型
&nbsp;&nbsp;&nbsp;&nbsp;pubic&nbsp;void&nbsp;draw();
}</pre><blockquote><p>LeftHair.java</p></blockquote><pre class="prism-highlight prism-language-java">/**
&nbsp;*&nbsp;左偏分发型
&nbsp;*/
public&nbsp;class&nbsp;LeftHair&nbsp;implements&nbsp;HairInterface&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;画了一个左偏分发型
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;draw()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;左偏分发型&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote><p>RightHair.java</p></blockquote><pre class="prism-highlight prism-language-java">/**
&nbsp;*&nbsp;右偏分发型
&nbsp;*/
public&nbsp;class&nbsp;RightHair&nbsp;implements&nbsp;HairInterface&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;画了一个左偏分发型
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;draw()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;右偏分发型&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>发型工厂是实现工厂模式的核心类。<br/></p><blockquote><p>HairFactory.java</p></blockquote><pre class="prism-highlight prism-language-java">/**
&nbsp;*&nbsp;发型工厂
&nbsp;*/
public&nbsp;class&nbsp;hairFactory&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;根据类型来创建对象
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;HairInterface&nbsp;getHair(Strign&nbsp;key)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&quot;left&quot;.equals(key))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;LeftHair();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if(&quot;right&quot;.equals)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;RightHair();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;根据类的名称生成对象
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;HairInterface&nbsp;getHairByClass(String&nbsp;className)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HairInterface&nbsp;hair&nbsp;=&nbsp;Class.forName(className).newInstance();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;hair;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>最后模拟客户端实现。<br/></p><blockquote><p>SunntTest.java</p></blockquote><pre class="prism-highlight prism-language-java">/**
&nbsp;*&nbsp;模拟客户端实现
&nbsp;*/
public&nbsp;class&nbsp;SunnyTest&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;原生方法
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HairInterface&nbsp;left&nbsp;=&nbsp;new&nbsp;LeftHair();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left.draw();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;工厂方法
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HairFactory&nbsp;factory&nbsp;=&nbsp;new&nbsp;HairFactory();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HairInterface&nbsp;left&nbsp;=&nbsp;factory.getHair(&quot;left&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left.draw();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;优化后的工厂方法，根据类名获取对象
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HairInterface&nbsp;left&nbsp;=&nbsp;factory.getHairByClass(&quot;com.package.LeftHair&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left.draw();
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>模拟客户端的类在运行时会调用工厂方法，工厂类根据传入的参数返回对应的对象。</p><p><strong><br/></strong></p><p><strong>测试用例</strong></p><blockquote><p>测试用例是什么</p><p>&nbsp; &nbsp; 测试工作的核心</p><p>&nbsp; &nbsp; 一组在测试时输入输出的标准</p><p>&nbsp; &nbsp; 软件需求的具体对照</p><p><br/></p><p>测试用例有什么作用</p><p>&nbsp; &nbsp; 检验软件是否满足客户需求</p><p>&nbsp; &nbsp; 体现一个测试人员的工作量</p><p>&nbsp; &nbsp; 展现测试用例的设计思路</p><p><br/></p><p>测试用例包含哪些内容</p><p>&nbsp; &nbsp; 用例编号</p><p>&nbsp; &nbsp; 用例名臣</p><p>&nbsp; &nbsp; 测试背景</p><p>&nbsp; &nbsp; 前置条件</p><p>&nbsp; &nbsp; 优先级</p><p>&nbsp; &nbsp; 重要级</p><p>&nbsp; &nbsp; 测试数据</p><p>&nbsp; &nbsp; 测试步骤</p><p>&nbsp; &nbsp; 预期结果</p><p>&nbsp; &nbsp; 实际结果</p><p>&nbsp; &nbsp; 备注</p><p><br/></p><p>测试用例编写流程</p><p>&nbsp; &nbsp; 需求分析</p><p>&nbsp; &nbsp; 提取测试点</p><p>&nbsp; &nbsp; 测试用例编写</p><p>&nbsp; &nbsp; 测试用例评审</p><p><br/></p><p>需求分析</p><p>&nbsp; &nbsp; 业务需求，关注系统是否满足业务</p><p>&nbsp; &nbsp; 用户需求，关注系统是否满足用户习惯</p><p>&nbsp; &nbsp; 功能需求，关注系统是否满足功能要求</p></blockquote><p><br/></p><p><strong>超星泛雅《创业管理实战》、《大学语文》答案分享</strong></p><p style="line-height: 16px;"><a style="font-size:12px; color:#0066cc;" href="http://old-blog.smallyu.net/zb_users/upload/2017/06/201706041496570504105531.zip" title="大学语文.zip">大学语文.zip</a></p><p style="line-height: 16px;"><a style="font-size:12px; color:#0066cc;" href="http://old-blog.smallyu.net/zb_users/upload/2017/06/201706041496570507726577.zip" title="创业管理实战.zip">创业管理实战.zip</a></p><p><br/></p><p>一入侯门深似海，从此萧郎是路人。</p>]]></description>
      <pubDate>Sun, 04 Jun 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>大误：被人嫌弃的感觉是这样的</title>
      <link>http://old-blog.smallyu.net/index3ca5.html?id=53</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=53</guid>
      <description><![CDATA[<p>遇到过自己讨厌的人，也遇到过讨厌自己的人。如果一个人不怎么搭理你，应该不再自找没趣。即使自找没趣了，接下来，不应该在内心里潜意识地抵触它才对么？原本以为我会那样。</p><blockquote><p>事件1：我发“作业借我抄一下”，没回。（IM）</p><p>事件2：我说“Hi”，立回“你走吧”。（现实）</p><p>事件3：我说“Hi”，没回。（IM）</p></blockquote><p>事件1和事件3是在IM工具上，事件2是现实世界中。这三件事情，让我好多种感觉交集。不但没有想要远远躲开它，保持距离，反倒感觉事情有点意思。人也是。毕竟没遇到过。</p><p><br/></p><p>这些都基于事件之间以及直到目前为止还没有过任何其他联系的基础上。</p><p><span style="text-decoration: none; font-size: 14px;"><strong>时间顺序</strong></span></p><p>事件1分析。</p><p>是故意还是无意？那个时候完全不清楚什么情况。</p><p>如果是故意的，问题就可怕了。此前完全没有意识到它对我的排斥，所以有可能是一直对我心存不满，瞬间爆发了？（其实这个也挺有意思的，什么事情效果这么明显。坏笑脸。后补）</p><p>如果是瞬间爆发，那我到底做了什么事情，或者身上有哪些让它讨厌的地方，才会造成这样的情况？</p><p>如果不是瞬间爆发，说明它一直都有表现出对我的不满。为什么我没有发觉？是我愚钝了？</p><p>如果是我愚钝了，那我就好好想想愚钝在何处。</p><p>如果不是我愚钝，那就是它对我的不满表现的不够充分和合理。它为什么没能将不满表现好？</p><p>如果不是故意的，又为什么不回？是因为当时没看到，觉得过去一点时间了，没必要再回了？</p><pre class="prism-highlight prism-language-c">事件1分析函数&nbsp;()&nbsp;
{
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(故意的)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(瞬间爆发)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对我不满在什么地方？
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(不是瞬间爆发)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(是我愚钝了)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;愚钝在何处？
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(不是我愚钝)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;它为什么没能很好表现出不满？
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(不是故意的)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(觉的不需要回了)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不需要回心态分析函数();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;事件1超越了我的智商。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>事件2分析。</p><p>事件2是在现实生活中。我在说出“Hi”的0.5s后，它不假思索的立即说出了“你走吧”。</p><p>？？？</p><p>即使没遇到它，我停在那里也不是没有理由啊。</p><p>从礼貌的角度讲，不管是否、多么不待见我，都不应该这么说话。不然以后还怎么混社会，走向人生巅峰？</p><p>同时，对我不满在什么地方？</p><p>或者其实本来想要表达的是其他意思。</p><pre class="prism-highlight prism-language-c">事件2分析函数&nbsp;()
{
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(故意的)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我要教它做人。
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(不是故意的)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不需要回心态分析函数();
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>事件3分析。</p><p>事件1的分析忽略了事件1的不回是因为抄作业本身的原因。因为事件3没说是抄作业。虽然事件3本来确实就是想抄作业。</p><p>内容和事件1类似。事件3的存在，就是为了从侧面证实事件1，是故意的，还是无意的？</p><p>事件1和事件3相隔时间10天左右。事件3之后，感觉终于放心了。不需要再有疑问，是故意的还是无意的？不回是事实，是故意的。但也有可能进入事件1分析不是故意的流程里的觉得不需要回函数。</p><p>如果是故意的，就是真的厌恶我到打招呼都不想回的程度。那么问题，我到底做了什么我自己没有意识到但却别人看起来惊世骇俗的厌恶至极的事情？</p><p>如果不是故意的，嗯。</p><pre class="prism-highlight prism-language-c">事件3分析函数&nbsp;()
{
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(故意的)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对我不满在什么地方？
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(不是故意的)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(觉的不需要回了)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不需要回心态分析函数();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;事件3超越了我的智商。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>不需要回心态分析。</p><p>我以前有过不回别人消息的经历，但没有过第一句话就不回的，也没有过连续两次不回的。</p><p>以前没有过被别人不回的经历，可能也就是对这点事情和对那个人感兴趣的原因。</p><p>因为并不熟悉它的性格和行事态度，先从我自己的角度分析一下。</p><p>我不回别人的情况。</p><p>按人，比较熟的人，和相当不熟的人。</p><p>我和它，不生不熟。</p><p>如果是因为觉得熟，没话说。</p><p>如果是因为觉得不熟，好伤。</p><p>如果是因为半生不熟，接前，怎么也应该回的才对，从礼貌的角度，从做人的角度。</p><p>按事，不想做的。</p><p>它不想给我抄作业。</p><p>这是一个很扯的分支。</p><pre class="prism-highlight prism-language-c">不需要回心态分析函数&nbsp;()
{
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(针对人)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(熟)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不理解。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(半生不熟)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我要教它做人。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(不熟)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不理解。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(针对事)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不需要回心态超越了我的智商。
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p><strong>逻辑顺序</strong><br/></p><p>逻辑顺序本是按照针对人、针对事的角度。突然不想写了。该写的都写了。</p><p><br/></p><p>综上，感觉是否有趣并没有取决于它的态度。也许其他感觉也是。</p><p>当然，上面的所有内容全都忽略了最后一种可能：想多了。</p><p><br/></p><p>切莫交浅言深。 ——共勉</p>]]></description>
      <pubDate>Sat, 20 May 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>HTML5音乐可视化</title>
      <link>http://old-blog.smallyu.net/indexfddb.html?id=52</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=52</guid>
      <description><![CDATA[<p>在线demo：<a href="http://old-blog.smallyu.net/web/passionate/index.html" _src="http://oldblog.smallyu.net/web/passionate/" target="_blank">http://oldblog.smallyu.net/web/passionate/</a></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/05/201705141494765899218386.png" title="搜狗截图20170514204448.png" alt="搜狗截图20170514204448.png" width="547" height="277" style="width: 592px; height: 312px;"/></p><p><strong><br/></strong></p><p>下面梳理一下HTML5实现音乐可视化的流程。</p><p><strong>搭建静态页面</strong></p><p>静态页面的结构分三部分，header，left，right。header为语义化标签，left和right都用div来实现。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/05/201705141494770946657494.png" title="搜狗截图20170514220851.png" alt="搜狗截图20170514220851.png" width="361" height="250" style="width: 361px; height: 250px;"/></p><p>类似这样，然后把背景颜色改为黑色，字体改成白色，加上或不加边框线，给一定padding或margin，静态页面就搭建好啦。</p><p>不过重点不是页面布局。可以在左侧栏有一个曲目列表，点击切歌。这里就不那么麻烦，直接后台加载指定的歌曲。歌曲是许嵩的烟花笑，左侧栏显示部分歌词。</p><p><strong>创建音频文件对象</strong></p><p>AudioContext对象用于获取音频文件源。</p><blockquote><p>（节点）AudioContext：包含各个AudioNode对象以及它们的联系的对象，可以理解为上下文对象。绝大多数情况下，一个document中只有一个AudioContext。</p><p>（方法）createBufferSource()：创建audioBufferSourceNode对象。</p></blockquote><p>可以这样写：</p><pre class="prism-highlight prism-language-javascript">var&nbsp;ac&nbsp;=&nbsp;new&nbsp;window.AudioContext();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;实例化ac为一个音频对象
var&nbsp;bs&nbsp;=&nbsp;ac.createBufferSource();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;用bs来保存音频文件资源</pre><p>有了音频资源，是否就可以播放音频了呢？当然不可以，因为还没有指定文件，告诉对象播放哪一个音频文件。</p><p><strong>获取音频数据</strong></p><p>创建bufferSource后，到了AudioBufferSourceNode这个节点。这个节点有一个属性值buffer，用来指定文件资源。这个属性值需要一个buffer类型的数据。</p><blockquote><p>（节点）<span style="text-decoration: underline;">AudioBufferSourceNode</span>：表示内存中的一段音频资源，其音频数据存在于AudioBuffer中（其buffer属性）。</p><p>（属性）<span style="text-decoration: underline;">buffer</span>：AudioBuffer对象，表示要播放的音频资源数据。</p></blockquote><p>获取buffer有两种方式，一种是ajax设置返回值类型为arraybuffer，然后解码，一种是用FileReader读取文件，获得blob值。后一种方式多用input上传文件后获得文件，再进行解析。前面一种好用一点。（留坑）<br/></p><p>ajax的原生写法：</p><pre class="prism-highlight prism-language-javascript">var&nbsp;url=&quot;...&quot;;
var&nbsp;xhr&nbsp;=&nbsp;new&nbsp;XMLHttpRequest();
xhr.abort();
xhr.open(&quot;GET&quot;,&nbsp;url);
xhr.responseType&nbsp;=&nbsp;&quot;arraybuffer&quot;;
xhr.onload&nbsp;=&nbsp;function(){
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;xhr.response;
}
xhr.send();</pre><p>onload触发的函数中xhr.response就是我们想要的值。</p><blockquote><p>（方法）<span style="text-decoration: underline;">decodeAudioData(arrayBuffer, succ(buffer), err)&nbsp;</span>：异步解码包含在arrayBuffer中的音频数据。</p></blockquote><p>将arraybuffer解码：</p><pre class="prism-highlight prism-language-javascript">ac.decodeAudioData(arraybuffer,&nbsp;function(buffer){&nbsp;...&nbsp;},function(err){&nbsp;...&nbsp;});
bs.buffer&nbsp;=&nbsp;buffer;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;回调函数中的buffer就是想要的buffer</pre><p><strong>播放音乐</strong><br/></p><blockquote><p>（方法）<span style="text-decoration: underline;">start</span>：开始播放音频</p></blockquote><p>这个时候调用start方法：</p><pre class="prism-highlight prism-language-javascript">bs.start(0);</pre><p>打开页面，音乐开始播放。</p><p><strong>音量控制</strong></p><blockquote><p>（节点）<span style="text-decoration: underline;">GainNode</span>：改变音频音量的对象，会改变通过它的音频数据所有的sample frame的信号强度。</p><p>（方法）<span style="text-decoration: underline;">createGain()</span>：创建GainNode对象。</p><p>（属性）<span style="text-decoration: underline;">value</span>：可以改变音频信号的强弱，默认为1，最小值为0。</p></blockquote><p>音乐播放还不行，要添加一个音量控制控件，音量控制用GainNode节点：</p><pre class="prism-highlight prism-language-javascript">var&nbsp;gainNode&nbsp;=&nbsp;accreateGain();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建GainNode对象
gainNode.connect(ac.destination);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;将gainNode连接到AudioDestinationNode节点</pre><p>这样就有了一个音量控制的对象。</p><pre class="prism-highlight prism-language-javascript">gainNode.gain.value=&nbsp;...&nbsp;;</pre><p>gain.value用于控制输入信号的强弱，也就是音量的大小。HTML中用type为range的input，把值传递给对象，就可以实时控制音量了。<br/></p><p><strong>得到音频解析数据</strong></p><blockquote><p>（节点）<span style="text-decoration: underline;">AnalyserNode</span>：音频分析对象，他能实时的分析音频资源的频域和时域信息，但不会对音频流做任何处理。</p><p>（方法）<span style="text-decoration: underline;">createAnalyser()</span>：创建AnalyserNode对象。</p></blockquote><blockquote><p>（属性）<span style="text-decoration: underline;">fftsize</span>：设置FFT（是离散傅里叶变换的快速算法，用于将一个信号变换到频域）值的大小，用于分析得到频域，为32 ~ 2048之间2的整数次倍，默认为2048，实时得到的音频频域的数据个数为fftSize的一半。</p><p>（属性）<span style="text-decoration: underline;">frequencyBinCount</span>，FFT值的一半，即实时得到的音频频域的数据个数</p></blockquote><blockquote><p>（方法）<span style="text-decoration: underline;">getByteFrequencyData(Uint8Array)</span>，复制音频当前的频域数据（数量是frequencyBinCount）到Uint8Array（8位无符号整型类型化数组）中。</p></blockquote><p>先创建AnalyserNode对象，然后设置fftsize的值。FFT用于数字信号的处理，会把音频文件流输入的信号变换到频域，用getByteFrequencyData()方法得到经系统处理之后的频域数据。</p><pre class="prism-highlight prism-language-javascript">var&nbsp;analyser&nbsp;=&nbsp;ac.createAnalyser();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;实例化对象
analyser.fftSize&nbsp;=&nbsp;32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置fftsize
var&nbsp;arr&nbsp;=&nbsp;new&nbsp;Uint8Array(analyser.frequencyBinCount);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;getByteFrequencyData()方法要求参数为8位无符号整型类型化数组
analyser.getByteFrequencyData(arr);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;arr为所需频域数据</pre><p>这样得到的数组arr就是用于可视化效果绘制的数据。</p><blockquote><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">（方法）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline;">window.requestAnimationFrame()</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">：</span>告诉浏览器您希望执行动画，并请求浏览器调用指定的函数在下一次重绘之前更新动画。该方法将在重绘之前调<span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">用的回</span>调作为参数。</p></blockquote><p>一次解析只能得到一组数据，所以需要<span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">requestAnimationFrame不断解析，不断得到arr。</span></p><p><strong>前端界面绘制</strong></p><p>前端界面使用canvas绘制，实现音乐可视化的效果。</p><pre class="prism-highlight prism-language-javascript">var&nbsp;box&nbsp;=&nbsp;document.getElementById(&quot;right&quot;);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;获取right区域的dom
box.appendChild(canvas);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建canvas节点
var&nbsp;ctx&nbsp;=&nbsp;canvas.getContext(&quot;2d&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;实例化canvas画笔</pre><p>接下来就是使用for循环和ctx画矩形、圆圈，填充渐变的操作了。（留坑吧，估计不填了）<br/></p><p><br/></p><p>案例用到web Audio API的关系：</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/05/201705141494773947635812.png" title="搜狗截图20170514203204.png" alt="搜狗截图20170514203204.png" width="777" height="557" style="width: 777px; height: 557px;"/></p><p>虚线是可以跳过的节点，直接播放音频文件。好吧有错。</p>]]></description>
      <pubDate>Wed, 17 May 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>活着那么累，和我一起去死吧</title>
      <link>http://old-blog.smallyu.net/index7d36.html?id=51</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=51</guid>
      <description><![CDATA[<p style="text-align: left;">明天又要回家了。</p><p>这个月最后一次post内容。</p><p>真的，这样就好。</p><p><br/></p><p>······················内容分割线···················</p><p><br/></p><p>参加那什么什么比赛很开心。</p><p><br/></p><p>没想过会有这么一天。</p><p>没想到会有这么一个比赛。</p><p>想不到以后会怎样……</p><p><br/></p><p>这样就好，就这样就好。</p><p>不快不慢。</p><p>这样就好。</p><p><br/></p><p>······················内容分割线···················</p><p><br/></p><p>论bootstrap党参赛。</p><p>中国“软件杯”软件设计大赛和互联网+创新创业大赛，在4.8之后开始准备，4.15报名了校内选拔赛。</p><p>原先准备软件设计大赛，有一个题目是无微不至的阅读，做一个基于微信的图书借阅平台。</p><p>后来组队了。</p><p>队伍人数超出规则，就选择了创新创业大赛。</p><p>互联网+餐饮。</p><p>如果要真的实现，项目难度大于软件设计赛的题目。</p><p>比赛要求创意组只需要提交项目说明书和商业策划书就好了。</p><p>嗯。</p><p>首页：<a href="http://old-blog.smallyu.net/g2025/index.html" _src="g2025/index.html">http://oldblog.smallyu.net/g2025/index.html</a>&nbsp; &nbsp;（主移动）</p><p>后台：<a href="http://old-blog.smallyu.net/g2025/admin.html" _src="g2025/admin.html">http://oldblog.smallyu.net/g2025/admin.html</a>&nbsp;</p><p>登录：<a href="http://old-blog.smallyu.net/g2025/bis_log.html" _src="g2025/bis_log.html">http://oldblog.smallyu.net/g2025/bis_log.html</a>&nbsp;</p><p>安卓APP：<a href="http://old-blog.smallyu.net/g2025/g2025.html" _src="g2025/g2025.html">http://oldblog.smallyu.net/g2025/g2025.apk</a>&nbsp;</p><p>是不是有点拿不出手？</p><p>嗯。</p><p>反正大赛不要求做。</p><p><br/></p><p>······················内容分割线···················</p><p><br/></p><p>《全职高手》出动画了！</p><p>它承载着，我的童年啊。</p><p><br/></p><p>······················内容分割线···················</p><p><br/></p><p>清明来后，情绪还算消极，想写点东西，这是大纲：</p><p><br/></p><p>```Quote</p><p>大学回家，邻座路人</p><p>高中回家，出租车司机</p><p><br/></p><p>1.想做就去做</p><p>清明节回家</p><p>评论说说</p><p><br/></p><p>2.学会堕落</p><p>玩整天游戏</p><p><br/></p><p>3.偶尔沉默</p><p>终有一天会释然</p><p><br/></p><p>4.为自己而活</p><p>晚上跑步</p><p><br/></p><p>为什么要迷茫</p><p>```</p><p><br/></p><p>过去一段时间，当时想要表达什么内容已经，差不多忘了。</p><p><br/></p><p>························时间分割线（4.9）······················</p><p><br/></p><p>每到放假都不知所措，清明小假也一样。纠结半天，回家了。</p><p>大巴邻座是一位大叔。</p><p>一开始沉默不语，后来突然问了一句，“你回哪儿？”</p><p>接着又问我在什么学校读书，什么专业，就业前景怎么样。</p><p>他的儿子高考复读一年，超过二本线个位数，现在进了一所理所当然的学学校读书，文科，历史。</p><p>地球人都知道，大学生工作不好找，普通二本的工作更不好找，文科专业地理、生物、历史、政治，除了师范，研究生都不好找。</p><p>所以大叔很担心他儿子。</p><p><br/></p><p>想起来高中有一次拼车回家，开出租车的师傅也问过类似的问题。</p><p>他的孩子那年要考高中了，你们学校的分数是多少，你当时多少分考进的。</p><p>我问，害怕考不上吗？</p><p>他说，当然怕，要不然进去得花钱（五位数）。</p><p>然后我当时想，为什么一定要读书？</p>]]></description>
      <pubDate>Wed, 26 Apr 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>Friends.S09E17</title>
      <link>http://old-blog.smallyu.net/index0c98.html?id=50</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=50</guid>
      <description><![CDATA[<p>You ready to go?</p><p>Let me just finish this.</p><p>Hey, Ross. Check this out. Yeah, I can&#39;t do that.</p><p>What are you doing?</p><p>Have you seen this? It&#39;s our new alumni website for college. You can post messages for people let everyone know what you&#39;re up to.</p><p>Oh, great. A faster way to tell people that I&#39;m unemployed and childless.</p><p>It&#39;s actually interesting to find out what people are doing. Remember Andrea Rich?</p><p>That tall girl that wouldn&#39;t sleep with you?</p><p>Well, her Internet company went under, and she lost an ear in a oating accident.</p><p>Bet she&#39;d sleep with you now.</p><p>No, I already e-mailed her.</p><p>Let me see what you wrote about yourself. Doctor of paleontology,two kids. Wait a second. You split with Carol because you had different interests? I think you split with Carol because you had one very similar interest.</p><p>I&#39;m gonna finish this later, okay? Let me just grab my coat.</p><p>Okay!</p><p>What, did you think you learned how to do it in the two minutes?</p><p>Maybe we finish this for him. Also, I cloned a dinosaur in my lab. She is now my girlfriend. I don&#39;t care what society says, it&#39;s the best sex I&#39;ve ever had. And send.</p><p>No, no-- You can&#39;t do that to him.</p><p>All right, let&#39;s go.</p><p>Dude!</p><p>I think you made it clear you can&#39;t be trusted with the ball inside the house.</p><p>And send.</p><p>Hey. How was basketball?</p><p>It was fun. Right up until Chandler got a finger in the eye.</p><p>Oh, no! Who did that?</p><p>Chandler. Yeah.</p><p>Hey!</p><p>Rach?</p><p>Yeah?</p><p>What&#39;s Huggsy doing in the crib with Emma?</p><p>She was just crawling around and found him, so I just let her sleep with him.</p><p>That&#39;s all right, isn&#39;t it?</p><p>Of course. Yeah.</p><p>It&#39;s a stuffed animal, you know? It&#39;s for kids. Not for adults. I know that.</p><p>Joey, you&#39;re sure? I mean, I knew how much you love him.</p><p>Rachel, let&#39;s be clear on this, okay?</p><p>I do not love Huggsy. I like him a normal amount.</p><p>All right. Well, Emma loves him.</p><p>Yeah. Well, why wouldn&#39;t she? He&#39;s a wonderful person!</p><p>Hi.</p><p>Hey, Phoebe.</p><p>How you doing?</p><p>You felling better?</p><p>Breaking up sucks.</p><p>Oh, I really miss Mike.</p><p>Oh, I&#39;m so sorry.</p><p>I&#39;ve tried everything to feel better. I even tried writing a song about it... but I can&#39;t think of anything that rhymes with:</p><p>Oh, I so know how you feel. Breaking up with Richard was the hardest thing I&#39;ve ever done in my life. All right, fine, I&#39;ll put another dollar in the Richard jar.&nbsp;</p><p>Hey, Monica, I&#39;m gonna need your help getting through this.</p><p>You&#39;re saying you&#39;re not gonna need my help?</p><p>No. When I get to the point where I&#39;m ready... to hear cruel, mocking jokes about Mike, I&#39;m gonna come to you.</p><p>Oh, good, because I&#39;ve already thought of three. Four! I just throught of a fourth!</p><p>Okay. I mean, I know I did the right thing. Mike never wants to get married... and I shouldn&#39;t be a relationship that has no future. But pretty soon, I&#39;m gonna miss him so much... I&#39;m gonna want to see him again, and you have to stop me.</p><p>Okay, you got it.</p><p>Unless... Am I being too crazy about this? All right, so there&#39;s no future. But that doesn&#39;t mean we still can&#39;t have fun. You know what? Forget what I said.</p><p>Really? All right, if that&#39;s what you want.</p><p>That was a test, and you just failed.</p><p>Damn it! Rookie mistake!</p><p>I have sex with dinosaurs?</p><p>I believe I read that somewhere.</p><p>Not only is it not funny, it&#39;s physically impossible! Okay? Depending on the species, I&#39;d have to have a 6-foot-long-- It&#39;s not funny!</p><p>I respectfully disagree.</p><p>I can&#39;t believe you put that on my alumni page.</p><p>Who cares? Nobody reads those.</p><p>You better hope not... because I just read what you put on your page today.</p><p>I don&#39;t have a page.</p><p>Oh, I respectfully disagree!</p><p>Huggsy?</p><p>Huggsy?</p><p>Huggsy.</p><p>I want my penguin.</p><p>Look at you. All sweet and innocent, sleeping like an angel.</p><p>With Emma&#39;s chubby little hands wrapped around you.</p><p>It&#39;s okay, Emma. You stay asleep.</p><p>Step away from the crib! I have a weapon!</p><p>It&#39;s okay! It&#39;s okay, Rach! It&#39;s me! Put down the scrunchie.</p><p>What are you doing?</p><p>Well, I heard Emma strring... so I came in to make sure she could reach Huggsy.</p><p>Oh, thanks. All right, well, now that I&#39;m up, I&#39;m gonna go to the bathroom.</p><p>Okay, there you go, sweetie.</p><p>This isn&#39;t over!</p><p>Wait a second. Why would Ross tell everyone on your class that you are &quot;as gay as the day is long&quot;?</p><p>Because I told everyone he alept with dinosaurs.</p><p>Well, that&#39;s clearly a joke.</p><p>This could easily be true.</p><p>Would you get that, please?</p><p>People have been calling to congratulate me all day.</p><p>Hello?</p><p>No, he&#39;s not here. Yeah, this is his wife.</p><p>Yeah. Well, it came as quite a shock to me too!</p><p>Well, I guess I should&#39;ve known. He just kept making me watch Molin Rouge.</p><p>Hang up! Hang up! And that was a great movie.</p><p>I&#39;m so gonna get back at Ross.</p><p>Oh, yeah, this&#39;ll show him. Here we go.</p><p>What are you doing?</p><p>Oh, you&#39;ll see, my friend!</p><p>I&#39;m dead?</p><p>And so young.</p><p>Posting that I died? That really isn&#39;t funny.</p><p>Well, how you died was funny.</p><p>Oh, please. Hit by a blimp?</p><p>It kills over one Americans every year.</p><p>Unbelievable. My classmates are gonna think I&#39;m dead. My professors. My parents are gonna get phone calls! You&#39;re messing with people&#39;s fellings here.</p><p>You wanna talk about people&#39;s fellings? You should have heard how hurt Prodessor Stern was when I told him I wouldn&#39;t be to go to Key West!</p><p>You&#39;v really crossed a line here. But that&#39;s okay. Because I&#39;m on my way to buy some Photoshop software...and a stack of gay porn. That&#39;s right. Your coming- out is about to get real graphic!</p><p>God, I wish Mike were here.</p><p>Okay, if Mike were here, what should the two of you be doing?</p><p>What are you, animates? It&#39;s 4:00 in the afternoon.</p><p>I gotta call him. Just talk to him. There&#39;s no harm in that.</p><p>That&#39;s how it starts. &quot;I don&#39;t need to eat the cake, I&#39;ll just smell the icing. Why not just a little sliver?&quot; Or, &quot;Okay, just a slice or two.&quot; The next thing you know, you&#39;re 210 pounds... and you get wedged in going down the tunnel slide!</p><p>That&#39;s not true, is it?</p><p>They had to cut me out... With the Jaws of Life.</p><p>Phoebe, honey, I know this is hard. But look, if you talk to him, then you&#39;re gonna want to see him. And if you see him, you&#39;re gonna wanna get back together. And I konw that&#39;s not what you want.</p><p>All right, so give me your phone.</p><p>Here.</p><p>- And now your cell. - Okay.</p><p>There you go.</p><p>- This is your cell phone? - Yes.</p><p>This is your current cell phone?</p><p>Yes. It reminds me of a simpler time.</p><p>Phoebe? Where&#39;s your purse?</p><p>- Hey! No! - No!</p><p>- Give it to me! - You can&#39;t have it!</p><p>- Give it to me! - No！</p><p>- I&#39;ll go in there! - Oh, yeah.</p><p>- Phoebe, come here! - No!</p><p>- Give it to me! - You&#39;re crazy!</p><p>Damn you, Monica Geller hyphen Bing!</p><p>Don&#39;t even think of sneaing out and using a pay phone... bacause I am everywhere, baby!</p><p>Hey, look who&#39;s here.</p><p>It&#39;s Joey. And he brought home a friend.</p><p>Joey! Emma&#39;s right here.</p><p>You promised not to bring girls home in the middle of the day!</p><p>No, no, no, it&#39;s not a girl. It&#39;s... a brand-new Huggsy!</p><p>Oh! Oh, that&#39;s so great! Now Emma has two Huggsies!</p><p>No, no. Oh, no. No, Emma has one Huggsy. The new Huggsy. The other Huggsy, I don&#39;t know, I guess I&#39;ll just take him back.</p><p>You know what? When I was a little girl, I had a little pink pony named Cotton. Oh, I loved her so much. I took her everywhere. I would braid her tail--</p><p>Make the transfer!</p><p>Should I be concerned that a button fell off the old Huggsy and I can&#39;t find it?</p><p>No, don&#39;t worry about it. I swallowed that years ago. Hey!</p><p>Oh, what? I don&#39;t think she likes the new Huggsy.</p><p>But he&#39;s the same.</p><p>I think she wants the old one back.</p><p>Yeah, but he&#39;s the same.</p><p>Joey, come on.</p><p>But he&#39;s the same!</p><p>You&#39;re not the same.</p><p>You know, it&#39;s a lot less surprising to do that after I&#39;ve buzzed you into the building.</p><p>So, Phoebe, why are there men&#39;s shoes by the door?</p><p>Those are my shoes.</p><p>Well, when you get over this breakup, we need to go shopping.</p><p>Look, Monica, I really appricate you checking in on me. But I&#39;m actually felling a lot better.</p><p>You are?</p><p>Yeah, I just kind of want to be alone right now.</p><p>- Who&#39;s that? - I ordered Chinese food.</p><p>What are the chances?! One billion Chinese people, and they send Mike!</p><p>What are you doing here?</p><p>Phoebe called me.</p><p>- Phoebe1 - I&#39;m sorry. I broke down.</p><p>I wanted to see him.</p><p>Well, not on my watch.</p><p>Damn it, Phoebe, how did you even call him?</p><p>Theres&#39;s a speakerphone on the base unit.</p><p>Base unit. Think, Monica, think!</p><p>- Can I come in? - No! No.&nbsp;</p><p>Phoebe, isn&#39;t seeing Mike exactly what you wanted me to stop you from doing?</p><p>Look, if I want to see Phoebe, and she--</p><p>This doesn&#39;t concern you!</p><p>Sorry. I guess I was thrown off by the mention of my name.</p><p>Look, guys, you can&#39;t do this.</p><p>It&#39;s gonna make getting over each other harder.</p><p>Not if nothing happens. Why can&#39;t we just hang out as friends?</p><p>Sure. If you&#39;re just gonna hang out as friends, then maybe I&#39;ll join you. You know, I&#39;m your friend and Mike&#39;s friend.</p><p>Sit down.</p><p>Make room for your friend.</p><p>So how have you been?</p><p>I&#39;ve been pretty good.</p><p>You look really beautiful.</p><p>Thinks. You look good too.</p><p>No, no, no. This is dangerous territory. Keep it clean.</p><p>So how&#39;s the piano playing going?</p><p>Actually, I&#39;ve been playing a lot of love songs lately. I&#39;ve missed you.</p><p>I&#39;ve missed you too.</p><p>You know, on the way over here, I saw this drunk guy throw up. And then a pigeon ate it.</p><p>Hey. Ross.</p><p>Look, I just wanted to apologize. Don&#39;t tell me you actually made those gay pictures of me.</p><p>Check this out.</p><p>So that&#39;s what I&#39;d look like if I worked out. And was being serviced by a policeman.</p><p>You&#39;re not gonna actually send these out, are you?</p><p>Actually, I don&#39;t need to, because your little &quot;Ross is dead&quot; joke didn&#39;t work. Okay? There were no responses. Nobody posted anything on the website, nobody called my parents, so the joke is on you. Nobody called, nobody wrote anything, nobody cares that I&#39;m dead.</p><p>Oh, my God. Nobody cares that I&#39;m dead?</p><p>Oh, come on, you know that&#39;s not true.</p><p>What are you talking about? You get 60 responses... just for coming out of the closet. I didn&#39;t get one response, and I&#39;m dead!</p><p>Well, the gay community is a lot more vocal than the dead community.</p><p>I can&#39;t believe this. Not even my geology lab partner. And I carried that guy!</p><p>Look, let&#39;s think about this, okay?</p><p>You think people are gonna disturb your family as this tragic time? That people are gonna post condolences on a website? This isn&#39;t about people not caring. This is about people not having a decent outlet for their grief.</p><p>You&#39;re right. There isn&#39;t a decent outlet.</p><p>Right. I&#39;m sure if you had a funeral or memorial service, tons of people would come.</p><p>Exactly!</p><p>Ross, what are you doing?</p><p>You&#39;re having a memorial service for yourself?</p><p>No, that would be stupid. You&#39;re having it for me.</p><p>Ross, don&#39;t press send. Dont&#39;t press--</p><p>No, too late. Too late. It&#39;s sent. Sorry, so is that picture of you and the policeman.</p><p>That&#39;s all right. I&#39;m tan, limber... And it looks like I talked my way out of that ticket.</p><p>The surgery was not a success. And then you say: &quot;What are we gonna do, Drake?&quot;</p><p>Come in.</p><p>I&#39;m trying to put Emma down for a nap. Have you seen Huggsy?</p><p>Original or crappy?</p><p>Original.</p><p>No.Sorry. Haven&#39;t seen him.</p><p>Then what&#39;s that big lump under your covers?</p><p>It&#39;s Monica, okay?</p><p>That&#39;s not Monical!</p><p>All right, fine! It&#39;s orignal Huggsy! I know Emma wants him, but he&#39;s mine and I need him. She&#39;s being unreasonable.</p><p>Joey, there is a reason that Emma loves that stuid penguin so much! Oh, don&#39;t cover its ears! It&#39;s because it reminds her of her Uncle Joey.</p><p>- It does? - Yeah.</p><p>And I think she really likes him because he smells like you. And she-- She loves that. Go figure. And she&#39;s comforted by him necause she loves her Uncle Joey so much.</p><p>- Really? She loves me? -Oh, yeah.</p><p>But you know what? If you need Huggsy, don&#39;t worry. Emma will totally understand. I won&#39;t, but whatever/</p><p>Okay, wait a minute, Rach. I mean, if... If Huggsy means that much to Emma, then... Well, she can have him.</p><p>Oh, sweet, I knew Uncle Joey would step up. Look, Emma. Look who&#39;s back.</p><p>No, forget it! Forget it! I can&#39;t do it!</p><p>Are you--? You&#39;re gonna take Huggsy away from a little child?</p><p>How do you think I got him in the first place?</p><p>And then it just gobbled up that puke. I mean... That was one gross pigeon.</p><p>Oh, man. Why didn&#39;t I ask Joey to keep us apart? You throw a meatball in the hallway, we&#39;d be doing it like rabbits right now.</p><p>All right, you two. I&#39;m gonna go to the bathroom. I don&#39;t want anything going on while I&#39;m gone. Here&#39;s a few things you can discuss: Mucus, fungus, and the idea of me and Ross doing it.</p><p>I&#39;ve missed you so much. I won&#39;t ask you to get back together. I know we want different things, but... Just to be with you one more night.</p><p>I want that too. But is that gonna make it too hard?</p><p>It can&#39;t be any harder than this. I mean, if had known the last time I saw you would be the last time, I-- I would have stopped to memorize your face, the way you moved. Everything about you. If I had known the last time I kissed you would be the last time... I never would have stopped.</p><p>Kiss him, you fool!</p><p>What?</p><p>Didn&#39;t you hear that speech? If you don&#39;t kiss him, then I will.</p><p>I missed you so much.</p><p>I knew you&#39;d be here!&nbsp;</p><p>Crap.</p><p>Who is this?</p><p>My friend Manny.</p><p>I asked him to keep me away from you.</p><p>Hey, that&#39;s what I&#39;m doing for Phoebe.</p><p>Well, you&#39;re not doing a very good job.</p><p>Excuse me?</p><p>What&#39;s with the kissing?</p><p>Hey, at least I knew where my guy was.</p><p>Yeah, think God you were here to oversee all the kissing.</p><p>You didn&#39;t hear the speech.</p><p>I&#39;ve heard the speech. If he know it was gonna be the last time--</p><p>Hey, it was vary moving. You&#39;re just heartless!</p><p>You&#39;re weak!&nbsp;</p><p>You&#39;re weird!</p><p>Your pants are undone.</p><p>Where&#39;d they go?</p><p>Damn it.</p><p>Well, we blew it. I blame myself.</p><p>And I blame you too.</p><p>It&#39;s been an hour, and not one of my classmates has shown up? I tell you, when I actually die, some people are gonna get seriously haunted.</p><p>There you go. Someone came.</p><p>Okay. Okay. I&#39;m gonna go hide. This is so exciting. My first mourner!</p><p>Hi. Glad you could come.</p><p>Please come in.</p><p>HI. You&#39;re Chandler Bing, right? I&#39;m Tom Gordon. I was in your class.</p><p>Oh, yes, let me take your coat.</p><p>Thanks. I&#39;m so sorry about Ross, it&#39;s...</p><p>No, at least he died doing what he loved. Watching blimps.</p><p>Who is it?</p><p>You know some guy, Tom Gordon?</p><p>I don&#39;t remember him. But then again, I touched so may lives.</p><p>So did you know Ross well?</p><p>Actually, I barely knew him. I came because I heard Chandler&#39;s news. Do you know if he&#39;s seeing anyone?</p><p>Yes, he is. Me.</p><p>What? You mean--?</p><p>Can I ask you a personal question? How do you shave your beard so close?</p><p>Okay, Tommy! That&#39;s enough mourning for you. Here we go. Bye-bye. All right.</p><p>Hey, listen. Call me.</p><p>Okay.</p><p>I&#39;m dead and no one cares?</p><p>I look like a man?</p><p>Please, one ridiculous problem at a time. This isn&#39;t ridiculous. Look around, no one&#39;s here.</p><p>You gave them one day&#39;s notice. Not everyone checks the website every day. And Monica, it&#39;s probably the way you stand!</p><p>I guess you&#39;re right. Still, somebody must have seen it. I went to that school for four years and I didn&#39;t have an impact on anyone?</p><p>Well, that&#39;s not true. You had an impact on me. I mean, it&#39;s 15 years later and we&#39;re still best friends. Doesn&#39;t that count for something?</p><p>Oh, great, more party bosy for Chandler.</p><p>I&#39;m sure it&#39;s somebody for you. Now go hide.</p><p>Hi. I&#39;m here for Ross Geller&#39;s memorial service.</p><p>Kori? Kori Weston?</p><p>Yeah.</p><p>You look amazing.</p><p>And you are?</p><p>Chandler. Chandler Bing. And I&#39;m not gay. I&#39;m not gay at all.</p><p>You are married, though.</p><p>Don&#39;t listen to him. He&#39;s in a really bad mood.</p><p>I can&#39;t believe that Ross is gone. It is just so sad.</p><p>I didn&#39;t know Ross and you were so close.</p><p>Oh, we weren&#39;t. But we had one class together. He was such a great guy. And he talked so passionately about science. I always remembered him.</p><p>I&#39;m sure that would mean a lot to him. And if heaven has a door... I&#39;m sure he&#39;s pressing his ear up against it and listening intently.</p><p>I thought so many times about calling him and asking him out. I guess I really missed my chance.</p><p>No, you didn&#39;t! I&#39;m still alive!</p><p>Who did we bury?</p><p>Kori, I know this is a big surprise for you. It&#39;s a long story. But the things you just said really made my day. The fact that you&#39;re here means more to me... than if this room were filled with people.</p><p>You sick freak! Who does that? I can&#39;t believe I had a crush on you.</p><p>Did you hear that? Kori Weston had a crush on me!</p><p>No, Mom, I am not dead. I know it&#39;s not something to kid about. It was just a practical joke between Chandler and me, but it&#39;s over, okay? Actually, no. Even if I had died, you would not be left childless. Monica?</p><p><br/></p><p>====2017.6.8补==========</p><p>浑浑噩噩的当时，想要借助这样的方式来让英语不要淡出自己的视野，就把这一集的台词全打了一遍。2个小时+，很用时间。</p>]]></description>
      <pubDate>Sat, 15 Apr 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>风决定要走，云怎么挽留</title>
      <link>http://old-blog.smallyu.net/index2568.html?id=49</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=49</guid>
      <description><![CDATA[<p>昨天晚上，一位大学同学精神错乱（意识紊乱），没有清醒的自主意识，做出种种奇怪的行为。直到今天上午，在N多人熬夜的陪同下，等来了他的家人，短暂了解情况后，带走，休学。</p><p>&nbsp;</p><p>这是一位奇怪又不奇怪的同学，这是一件可怕又不可怕的事情。</p><p>有生以来第一次亲眼见到精神错乱的人，可怕的不是他现在什么状态，而是他以前，再正常不过的一个普通人。</p><p>“普通人”只是我对他的定位，可能他自己并不这么认为。昨天晚上，事情刚刚发生但还没有完全发生的时候，他很大声地说（吼）了一句话：“宿舍楼里没有睡觉的人都听我指挥，我是宿舍部副部长！”。</p><p>他行为异常早有体现。他舍友说，最近几天，就在补考结束之后，他的动作变得奇怪起来。听歌，只单曲循环同一首歌；上课，只坐最后一排；上课的时候，唱歌；晚上，不睡觉；中午喝水，站在阳台，喝一口，咳一下，喝一口，咳一下，喝完一杯，再来一杯，喝完这杯，还有三杯……最奇怪的就是最近两三天尤其是昨天，不停到各个宿舍串门。</p><p>说奇怪是因为他的这些行为，都超过了该有的“度”。</p><ul class=" list-paddingleft-2" style="list-style-type: disc;"><li><p>听歌单曲循环不算是异常行为，但如果循环到让你发毛。你可以打开网易云设置单曲循环，然后打王者荣耀，写作业，聊天，做事情，或者这首歌真的让你喜欢到欲罢不能。好像他听的是，《没有你陪伴真的好孤单》。</p></li><li><p>上课坐最后一排是很多同学的惯例，他不是。以前积极进取，严谨认真，两次班里选积极分子都有他的份。两次积极分子是因为，第一次积极分子考试的时候，就是那种关于党，爱党信党忠党之类内容的考试，他被认为是作弊。现在进考场不能带通讯设备（手机）是惯例也是常识。也许他担心考试过不了。</p></li><li><p>上课的时候，唱歌。想象如果一个真正的精神病人坐在教室里面，旁若无人的“小”声唱《成都》。已经违反公共场合礼仪规范了，不是对不对，而是合不合适。他是一个大学生。据说其实离开宿舍后在上课期间还是很正常的。</p></li><li><p>晚上，好几天没睡觉了，可能这个和意识紊乱的关系会比较大。而且每天早上6点就会起床并把其他人叫醒。</p></li><li><p>中午喝水，没亲眼见过，被同寝室的人认为不正常。</p></li><li><p>逛宿舍，整个事件的始作俑者。昨天中午宿舍挨着逛一遍，中午睡觉醒来准备去上课的时候发现他就在我们宿舍。当时我们宿舍没有醒着的人，都在睡觉，并没有人和他聊天。然后他就那样坐在我（二级）床下的凳子上。舍友和他打招呼，没感觉到异常。</p></li></ul><p>直到昨天晚上，他待在了我们一个兄弟班的宿舍。11点熄灯，人家要睡觉了，他赖着不走。并且之前，他在人家宿舍随便把别人的东西搬来搬去，之前，在逛我们班的某一个宿舍的时候，不声不响的喝掉了某位同学三瓶牛奶。</p><p>赖在别人宿舍不走，说他要玩个游戏。进去一个人，他就会让那个人陪他玩个游戏，发布“关上门”，“面对着门”，“把凳子搬到这里”，“把桌子收拾一下”，等等之类的“命令”。</p><p>然后只能惊动宿管楼姨、班主任、系辅导员、父母。担心他当时的精神状态会有什么危险，男生四个宿舍30个人几乎一晚上没睡（当然也有例外，我就睡得可好了）轮流值班看着他，不让他到阳台，不让他拿什么太锋利尖锐的东西。</p><p>&nbsp;</p><p>综合来看，他突然间意识紊乱的客观因素大概有：</p><ul class=" list-paddingleft-2" style="list-style-type: disc;"><li><p>挂科</p></li><li><p>人际关系差</p></li></ul><p>主观因素大概有：</p><ul class=" list-paddingleft-2" style="list-style-type: disc;"><li><p>现实与梦想的落差</p></li><li><p>迷茫</p></li></ul><p>&nbsp;</p><p>客观因素第一个是挂科，这是一个很重要的原因。前两个学期他都没有挂科并且成绩还不错。上个学期考试之前，他还来我们宿舍并不炫耀的问我们有什么题不会（毕竟我也是考的了前几名的好不好），充分说明了他当时的自信程度。事与愿违，上个学期的成绩下来后，他挂科了，总成绩排名倒数。</p><p>挂科对应的就是主观因素中现实与梦想的落差。原先他是一个成绩并不差的好学生，是一个被选为入党积极分子，马上就可以成为党员的优秀学生，是班里的常委，是宿舍部副部长。他有多重视在学校中的职位从那一句“宿舍楼里没有睡觉的人都听我指挥，我是宿舍部副部长！”就看得出来。也许他的梦想是当官，做一个有权的人。</p><p>对这种梦想挂科带来的是毁灭性的打击。挂一门课总成绩一落千丈，同时只要挂科就不能入党。学生会那边的事情没人清楚，据我所知我们这种三流学校的学生会，部长和副部长差的就很多，如果他在学生会那边受点打击也很惨。</p><p>第二个客观因素的人际关系差。</p><p>有一次他舍友在商店借他一块钱，他舍友正好没有零钱。他说，我不借一块钱，只借十块钱。然后借给了他舍友十块钱。潜台词就是借一块钱我不好意思找你要！那是舍友啊舍友。像我们宿舍不管关系好不好什么时候计较过几块钱？这不是家庭经济情况好不好的原因好么。</p><p>有一次，我们三个人一组打扫教室。我和另外一个人给忘了，他打电话叫我们，当时已经晚了一会儿。然后我们去了之后，看见了啥？他坐在教室里，的椅子上，坐着，玩手机。当时心里一万头草泥马呼啸奔腾而过。我们没来你特喵就不能自己先开始么。后来查教室卫生打扫情况的人还打着官腔说我们不该迟到怎么怎么地。</p><p>还听说，他和他们宿舍的人打过架。他嫌他的下铺打游戏影响他睡觉，就直接睡在了他的下铺的床上。当时是夏天，他经常在外面打球，没有洗澡，就直接睡在了人家的床上。两个人看着不爽，就打了起来。可能他只是没有合理的办法表达出自己的需求。</p><p>人际关系差不是我的判断，是他的舍友们总结出来的，因为他的舍友们并不是很友好的看待他。</p><p>学业崩溃加上人际关系无望。上课上的很不爽，自己平时的努力毁于一旦，学习都会挂科那还学它干吗？（重要的是同学们会不会小看我？）人际关系不是很好，回到宿舍连个说话的人都没有，在宿舍待着岂不是很郁闷？然而对于我们这种业余生活不丰富的学校和生活风气，整天的行程就两个地方，教室，宿舍。于是导致整个人会迷茫，不知所措，看不到希望，压力大，紧张。（迷茫只是我的判断，毕竟漫无目的的逛宿舍不就是迷茫的体现？）</p><p>&nbsp;</p><p>以上是对那位同学仅有的一些了解和目前已知的一些情况。</p><p>我和他的关系没有多好，也并没有在他情绪最并不稳定的时候和他接触过，只是今天早上起床后到他的宿舍看了几分钟。他喘着粗气，偶尔会有一下不寻常的动静，那种只会在电影里看到的不寻常的动静。离得很远就能感受到屋子里面咄咄逼人和不寒而栗的气氛，尽管同在的还有好几个人。</p><p>问题是<span style="font-size: 16px;"><strong><span style="text-decoration: none;">我能确切的想象到他的感受</span></strong></span>。</p><p>我不会说上个学期放寒假回家我差点没哭。</p><p>我想象不到复习一个月考5名开外是什么体验。</p><p>我不明白做很多题CET4不到400分是什么感受。</p><p>我不知道Hello World能给我带来什么。</p><p>我不知道我还要单身多久。</p><p>难道我离那样也不远了？</p>]]></description>
      <pubDate>Sat, 11 Mar 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>站在巨人的肩膀上写代码——Spl中的三种数据结构解析</title>
      <link>http://old-blog.smallyu.net/index4944.html?id=48</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=48</guid>
      <description><![CDATA[<p>今天身体莫名get trouble，心情莫名bad。想说什么又没有什么要说的。I want to get a new object?（她不喜欢我怎么办？）嗯？%e9%9d%b3%e8%8d%a3</p><p><br/></p><p>来简单说说Spl中三种数据结构的基本操作，这三种数据结构分别为双向链表（SplDoubleLinkedList）、堆栈（SplStack）和队列（SplQueue）。</p><p><span style="font-size: 16px;"><strong>双向链表（SplDoubleLinkedList）</strong></span></p><p><span style="font-size: 16px;"><span style="font-size: 14px;">首先实例化对象为$obj</span><strong><br/></strong></span></p><pre class="prism-highlight prism-language-php">$obj&nbsp;=&nbsp;new&nbsp;SplDoublyLinkedList();</pre><p><span style="font-size: 16px;"><span style="font-size: 14px;"></span></span>然后我们添加三条数据到双向链表中<br/></p><pre class="prism-highlight prism-language-php">$obj-&gt;push(1);
$obj-&gt;push(2);
$obj-&gt;push(3);</pre><p>再来添加一条这样的数据</p><pre class="prism-highlight prism-language-php">$obj-&gt;unshift(10);</pre><p>这个时候打印一下$obj</p><pre class="prism-highlight prism-language-php">print_r($obj);</pre><p>输出的结果会是这样</p><blockquote><pre>SplDoublyLinkedList&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;10
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&gt;&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[3]&nbsp;=&gt;&nbsp;3
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre></blockquote><p>对我们看到，1、2和3分别按照次序被添加进了链表对象的数组中，而底部（Bottom）位置的数据则是10，即使用unshift方法添加的数据，这里得知unshift的作用就是添加数据到链表底部。</p><p>再调用这个方法</p><pre class="prism-highlight prism-language-php">$obj-&gt;rewind();&nbsp;//&nbsp;10</pre><p>输出一下当前指针指向的节点</p><pre class="prism-highlight prism-language-php">echo&nbsp;&#39;current:&nbsp;&#39;&nbsp;.&nbsp;$obj-&gt;current();</pre><p>输出的是这个节点<br/></p><blockquote><p><span style="font-family: Simsun; font-size: medium;">current: 10</span></p></blockquote><p>说明双向链表的rewind会将指针移动到底部。<br/></p><p>我们再试试next方法</p><pre class="prism-highlight prism-language-php">$obj-&gt;next();&nbsp;&nbsp;&nbsp;//&nbsp;1</pre><p>输出当前指针指向的节点</p><pre class="prism-highlight prism-language-php">echo&nbsp;&#39;next&nbsp;node:&nbsp;&#39;&nbsp;.&nbsp;$obj-&gt;current();</pre><p>结果是</p><blockquote><p><span style="font-family: Simsun; font-size: medium;">next node: 1</span></p></blockquote><p>结果明了，会将current向顶部移动一个位置。<br/></p><p>再来几个测试</p><pre class="prism-highlight prism-language-php">$obj-&gt;next();&nbsp;&nbsp;&nbsp;//&nbsp;2
$obj-&gt;next();&nbsp;&nbsp;&nbsp;//&nbsp;3
$obj-&gt;prev();&nbsp;&nbsp;&nbsp;//&nbsp;2
echo&nbsp;&#39;next&nbsp;node:&nbsp;&#39;&nbsp;.&nbsp;$obj-&gt;current();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;2
$obj-&gt;next();&nbsp;&nbsp;&nbsp;//&nbsp;3
$obj-&gt;next();&nbsp;&nbsp;&nbsp;//&nbsp;
echo&nbsp;&#39;next&nbsp;node:&nbsp;&#39;&nbsp;.&nbsp;$obj-&gt;current();&nbsp;&nbsp;&nbsp;&nbsp;//</pre><p>代码中反复使用了next方法和prev方法，每次指针指向的节点在代码中都有注释，并输出了两次来验证正确性，输出结果是正确的</p><blockquote><p><span style="font-family: Simsun; font-size: medium;">next node: 2</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">next node:&nbsp;</span></p></blockquote><p>并且我们知道指针超出链表的范围后会返回空值，因此接下来我们可以判断一下当前节点是否有效</p><pre class="prism-highlight prism-language-php">if($obj-&gt;current()){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;Current&nbsp;node&nbsp;valid&nbsp;&lt;br&nbsp;/&gt;&quot;;
}else{
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;Current&nbsp;node&nbsp;invalid&nbsp;&lt;br&nbsp;/&gt;&quot;;
}</pre><p>返回值为</p><blockquote><p><span style="font-family: Simsun; font-size: medium;">Current node invalid&nbsp;</span></p></blockquote><p>或者可以用这样的方式来验证当前节点是否可用</p><pre class="prism-highlight prism-language-php">if($obj-&gt;valid()){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;valid&nbsp;list&nbsp;&lt;br&nbsp;/&gt;&quot;;
}else{
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;invalid&nbsp;list&nbsp;&lt;br&nbsp;/&gt;&quot;;
}</pre><p>返回内容为<br/></p><blockquote><p><span style="font-family: Simsun; font-size: medium;">valid list&nbsp;</span></p></blockquote><p><span style="font-family: Simsun; font-size: medium;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">接下来是删除节点的操作，pop方法用于删除当前指针指向的节点，并返回该节点的内容</span><br/></span></p><pre class="prism-highlight prism-language-php">$obj-&gt;rewind();

echo&nbsp;&quot;&lt;hr&nbsp;/&gt;&nbsp;Pop&nbsp;value:&nbsp;&quot;&nbsp;.&nbsp;$obj-&gt;pop();

print_r($obj);

echo&nbsp;&#39;current:&nbsp;&#39;&nbsp;.&nbsp;$obj-&gt;current();</pre><p>输出的内容为<br/></p><blockquote><p><span style="font-family: Simsun; font-size: medium;">Pop value: 3</span></p><pre>SplDoublyLinkedList&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;10
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&gt;&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre><p><span style="font-family: Simsun; font-size: medium;">current: 10</span></p></blockquote><p><span style="font-family: Simsun; font-size: medium;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">删除节点之前使用rewind重置了指针的位置到Bottom，同时pop删除了Top位置的节点。那么如果current正好指向Top位置会怎样？<br/></span></span></p><pre class="prism-highlight prism-language-php">$obj-&gt;next();&nbsp;&nbsp;&nbsp;//&nbsp;1
$obj-&gt;next();&nbsp;&nbsp;&nbsp;//&nbsp;2

//&nbsp;把Top位置的节点从链表中删除，并返回
echo&nbsp;&quot;&lt;hr&nbsp;/&gt;&nbsp;Pop&nbsp;value:&nbsp;&quot;&nbsp;.&nbsp;$obj-&gt;pop()&nbsp;.&nbsp;&quot;&lt;br&nbsp;/&gt;&quot;;
echo&nbsp;&#39;current:&nbsp;&#39;&nbsp;.&nbsp;$obj-&gt;current()&nbsp;.&nbsp;&#39;&lt;br&nbsp;/&gt;&#39;;&nbsp;&nbsp;//&nbsp;10

print_r($obj);</pre><p>输出</p><blockquote><p><span style="font-family: Simsun; font-size: medium;">Pop value: 2</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">current:&nbsp;</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/></p><pre>SplDoublyLinkedList&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;10
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre></blockquote><p><span style="font-family: Simsun; font-size: medium;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">如果current正好指向Top位置，那么调用pop之后current会失效。</span></span></p><p><span style="font-family:微软雅黑, Microsoft YaHei">最后一个要试的方法是shift，用于把Bottom位置的节点从链表中删除，并返回，执行</span></p><pre class="prism-highlight prism-language-php">$obj-&gt;shift();
print_r($obj);</pre><p><span style="font-family:微软雅黑, Microsoft YaHei"></span>会只输出</p><blockquote><pre>SplDoublyLinkedList&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre></blockquote><p><span style="font-family:微软雅黑, Microsoft YaHei">另外两种数据结构的操作类似，啊，好懒，直接贴一下，要不然得很长时间。<br/></span></p><p><span style="font-size: 16px;"><strong><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">堆栈（SplStack）</span></strong></span></p><p><span style="font-family:微软雅黑, Microsoft YaHei">测试代码为</span></p><pre class="prism-highlight prism-language-php">&lt;?php

$stack&nbsp;=&nbsp;new&nbsp;SplStack();

$stack-&gt;push(&#39;a&#39;);&nbsp;&nbsp;//&nbsp;push操作箱堆栈里面放入一个节点到tio位置
$stack-&gt;push(&#39;b&#39;);
$stack-&gt;push(&#39;c&#39;);

echo&nbsp;&#39;&lt;pre&gt;&#39;;
print_r($stack);
echo&nbsp;&#39;&lt;/pre&gt;&#39;;

echo&nbsp;&quot;Bottom:&nbsp;&quot;&nbsp;.&nbsp;$stack-&gt;bottom()&nbsp;.&nbsp;&quot;&lt;br&nbsp;/&gt;&quot;;
echo&nbsp;&quot;Top:&nbsp;&quot;&nbsp;.&nbsp;$stack-&gt;top()&nbsp;.&nbsp;&quot;&lt;br&nbsp;/&gt;&quot;;

$stack-&gt;offsetSet(0,&#39;C&#39;);&nbsp;&nbsp;&nbsp;//&nbsp;堆栈的offset=0是Top所在的位置，offset=1是top位置节点靠近bottom位置的相邻节点，以此类推

echo&nbsp;&#39;&lt;pre&gt;&#39;;
print_r($stack);
echo&nbsp;&#39;&lt;/pre&gt;&#39;;

$stack-&gt;rewind();&nbsp;&nbsp;&nbsp;//&nbsp;双向链表的rewind和堆栈的rewind相反，堆栈的rewind是的当前指针指向Top所在的位置，而双向链表调用之后指向bottom所在位置
echo&nbsp;&#39;current:&nbsp;&#39;&nbsp;.&nbsp;$stack-&gt;current()&nbsp;.&nbsp;&#39;&lt;br&nbsp;/&gt;&#39;;

$stack-&gt;next();&nbsp;//&nbsp;堆栈的next操作使指针靠近Bottom位置的下一个节点，而双向链表是靠近top的下一个节点
echo&nbsp;&#39;current:&nbsp;&#39;&nbsp;.&nbsp;$stack-&gt;current()&nbsp;.&nbsp;&#39;&lt;br&nbsp;/&gt;&#39;;

echo&nbsp;&#39;&lt;hr&nbsp;/&gt;&#39;;

//&nbsp;遍历堆栈
$stack-&gt;rewind();
while($stack-&gt;valid()){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$stack-&gt;key().&quot;=&gt;&quot;.$stack-&gt;current()&nbsp;.&nbsp;&quot;&lt;br&nbsp;/&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$stack-&gt;next();&nbsp;//&nbsp;next操作不从链表中删除元素
}

//&nbsp;删除堆栈数据
$popObj&nbsp;=&nbsp;$stack-&gt;pop();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;pop操作从堆栈里面提取出最后一个元素（top位置），同时在堆栈里面删除该节点
echo&nbsp;&quot;Poped&nbsp;object:&nbsp;&quot;&nbsp;.&nbsp;$popObj&nbsp;.&nbsp;&quot;&lt;br&nbsp;/&gt;&quot;;

echo&nbsp;&#39;&lt;pre&gt;&#39;;
print_r($stack);
echo&nbsp;&#39;&lt;/pre&gt;&#39;;</pre><p><span style="font-family:微软雅黑, Microsoft YaHei"></span>打印内容为</p><blockquote><pre>SplStack&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;6
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;a
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;b
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&gt;&nbsp;c
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre><p><span style="font-family: Simsun; font-size: medium;">Bottom: a</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">Top: c</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/></p><pre>SplStack&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;6
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;a
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;b
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&gt;&nbsp;C
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre><p><span style="font-family: Simsun; font-size: medium;">current: C</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">current: b</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/></p><hr style="font-family: Simsun; font-size: medium; white-space: normal;"/><p><span style="font-family: Simsun; font-size: medium;">2=&gt;C</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">1=&gt;b</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">0=&gt;a</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">Poped object: C</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/></p><pre>SplStack&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;6
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;a
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;b
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre></blockquote><p><strong><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 16px;">队列（SplQueue）</span></strong></p><p><span style="font-family:微软雅黑, Microsoft YaHei"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">测试代码为</span></span></p><pre class="prism-highlight prism-language-php">&lt;?php

$obj&nbsp;=&nbsp;new&nbsp;SplQueue();

$obj-&gt;enqueue(&#39;a&#39;);&nbsp;//&nbsp;插入一个节点到队列里面的Top位置
$obj-&gt;enqueue(&#39;b&#39;);
$obj-&gt;enqueue(&#39;c&#39;);

echo&nbsp;&#39;&lt;pre&gt;&#39;;
print_r($obj);
echo&nbsp;&#39;&lt;/pre&gt;&#39;;

echo&nbsp;&quot;Bottom:&nbsp;&quot;&nbsp;.&nbsp;$obj-&gt;bottom()&nbsp;.&nbsp;&quot;&lt;br&nbsp;/&gt;&quot;;
echo&nbsp;&quot;Top:&nbsp;&quot;&nbsp;.&nbsp;$obj-&gt;top()&nbsp;.&nbsp;&quot;&lt;br&nbsp;/&gt;&quot;;

$obj-&gt;offsetSet(0,&#39;A&#39;);&nbsp;//&nbsp;队列里面offset=0Bottom所在位置，offset=1是Top所在位置，以此类推

echo&nbsp;&#39;&lt;pre&gt;&#39;;
print_r($obj);
echo&nbsp;&#39;&lt;/pre&gt;&#39;;

$obj-&gt;rewind();&nbsp;//&nbsp;队列里面rewind操作是的指针指向Bottom所在位置的节点
echo&nbsp;&#39;current:&nbsp;&#39;&nbsp;.&nbsp;$obj-&gt;current()&nbsp;.&nbsp;&#39;&lt;br&nbsp;/&gt;&#39;;

$obj-&gt;rewind();
while($obj-&gt;valid()){
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$obj-&gt;key().&quot;=&gt;&quot;.$obj-&gt;current()&nbsp;.&nbsp;&quot;&lt;br&nbsp;/&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$obj-&gt;next();&nbsp;//&nbsp;next操作是的当前指针指向top方向的下一个节点
}

echo&nbsp;&quot;dequeue&nbsp;obj:&nbsp;&quot;.$obj-&gt;dequeue().&quot;\n&quot;;&nbsp;&nbsp;//&nbsp;dequeue操作从队列中提取bottom位置的节点，并返回，同时从队列里面删除该元素

echo&nbsp;&#39;&lt;pre&gt;&#39;;
print_r($obj);
echo&nbsp;&#39;&lt;/pre&gt;&#39;;</pre><p><span style="font-family:微软雅黑, Microsoft YaHei"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;"></span></span>打印内容为</p><blockquote><pre>SplQueue&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;4
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;a
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;b
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&gt;&nbsp;c
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre><p><span style="font-family: Simsun; font-size: medium;">Bottom: a</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">Top: c</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/></p><pre>SplQueue&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;4
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;A
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;b
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=&gt;&nbsp;c
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre><p><span style="font-family: Simsun; font-size: medium;">current: A</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">0=&gt;A</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">1=&gt;b</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">2=&gt;c</span><br style="font-family: Simsun; font-size: medium; white-space: normal;"/><span style="font-family: Simsun; font-size: medium;">dequeue obj: A</span></p><pre>SplQueue&nbsp;Object
(
&nbsp;&nbsp;&nbsp;&nbsp;[flags:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;4
&nbsp;&nbsp;&nbsp;&nbsp;[dllist:SplDoublyLinkedList:private]&nbsp;=&gt;&nbsp;Array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=&gt;&nbsp;b
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;c
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)

)</pre></blockquote><p><span style="font-family:微软雅黑, Microsoft YaHei"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">The End.</span></span></p>]]></description>
      <pubDate>Sun, 05 Mar 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>一个简单的对于Mysql的PDO操作类（PHP）</title>
      <link>http://old-blog.smallyu.net/indexbb33.html?id=47</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=47</guid>
      <description><![CDATA[<p>类结构本身稍微混乱，方法没有规章，这是缺点。<br/></p><blockquote><p>PDOMysql.class.php<br/></p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

define(&quot;DB_HOST&quot;,&nbsp;&quot;localhost&quot;);
define(&quot;DB_USER&quot;,&nbsp;&#39;root&#39;);
define(&quot;DB_PWD&quot;,&nbsp;&#39;root&#39;);
define(&quot;DB_NAME&quot;,&nbsp;&#39;minyy&#39;);
define(&quot;DB_PORT&quot;,&nbsp;&#39;3306&#39;);
define(&quot;DB_TYPE&quot;,&nbsp;&#39;mysql&#39;);
define(&quot;DB_CHARSET&quot;,&nbsp;&#39;utf8&#39;);

class&nbsp;PDOMySQL{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$config&nbsp;=&nbsp;array();&nbsp;&nbsp;//&nbsp;设置连接参数&nbsp;配置信息
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$link&nbsp;=&nbsp;null;&nbsp;//&nbsp;保存连接标志符
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$pconnect&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;//&nbsp;是否开启长连接
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$dbVersion&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;保存数据库版本
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$connected&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;//&nbsp;是否连接成功
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$PDOStatement&nbsp;=&nbsp;null;&nbsp;//&nbsp;保存PDOStatement对象
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$queryStr&nbsp;=&nbsp;null;&nbsp;//&nbsp;保存最后执行的操作
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$error&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;报错错误信息
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$lastInsertId&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;保存上一步插入操作产生AUTO_INSREMENT
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$numRows&nbsp;=&nbsp;0;&nbsp;//&nbsp;上一步操作产生受影响的记录条数

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造函数实现连接数据库
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;array&nbsp;$dbConfig&nbsp;配置项参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__construct($dbConfig&nbsp;=&nbsp;&#39;&#39;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!class_exists(&quot;PDO&quot;)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::throw_exception(&#39;不支持PDO，请先开启&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$dbConfig&nbsp;||&nbsp;!is_array($dbConfig)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dbConfig&nbsp;=&nbsp;array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;hostname&#39;&nbsp;=&gt;&nbsp;DB_HOST,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;username&#39;&nbsp;=&gt;&nbsp;DB_USER,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;password&#39;&nbsp;=&gt;&nbsp;DB_PWD,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;database&#39;&nbsp;=&gt;&nbsp;DB_NAME,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;hostport&#39;&nbsp;=&gt;&nbsp;DB_PORT,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;dbms&#39;&nbsp;=&gt;&nbsp;DB_TYPE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;dsn&#39;&nbsp;=&gt;&nbsp;DB_TYPE.&quot;:host=&quot;.DB_HOST.&quot;;dbname=&quot;.DB_NAME,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(empty($dbConfig[&#39;hostname&#39;]))&nbsp;self::throw_exception(&#39;没有定义数据库配置&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$config&nbsp;=&nbsp;$dbConfig;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(empty(self::$config[&#39;params&#39;]))&nbsp;self::$config[&#39;params&#39;]&nbsp;=&nbsp;array();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!isset(self::$link)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$configs&nbsp;=&nbsp;self::$config;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(self::$pconnect){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;开启长连接，添加到配置数组中
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$configs[&#39;params&#39;][constant(&quot;PDO::ATTR_PERSISTENT&quot;)]&nbsp;=&nbsp;true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$link&nbsp;=&nbsp;new&nbsp;PDO($configs[&#39;dsn&#39;],&nbsp;$configs[&#39;username&#39;],&nbsp;$configs[&#39;password&#39;],&nbsp;$configs[&#39;params&#39;]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(PDOException&nbsp;$e){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::throw_exception($e-&gt;getMessage());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!self::$link){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::throw_exception(&#39;PDO连接错误&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$link-&gt;exec(&#39;SET&nbsp;NAMES&nbsp;&#39;.DB_CHARSET);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$dbVersion&nbsp;=&nbsp;self::$link-&gt;getAttribute(constant(&quot;PDO::ATTR_SERVER_VERSION&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$connected&nbsp;=&nbsp;true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($configs);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到所有记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$sql&nbsp;SQL语句
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;array&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;得到所有数据
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getAll($sql&nbsp;=&nbsp;null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($sql){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::query($sql);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;self::$PDOStatement-&gt;fetchAll(constant(&quot;PDO::FETCH_ASSOC&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到结果集中的一条记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$sql&nbsp;sql语句
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;array&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回一条数据
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getRow($sql&nbsp;=&nbsp;null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($sql&nbsp;!=&nbsp;null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::query($sql);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;self::$PDOStatement-&gt;fetch(constant(&quot;PDO::FETCH_ASSOC&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;根据主键查找记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$tabName&nbsp;表名
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$priId&nbsp;&nbsp;&nbsp;主键id
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$field&nbsp;&nbsp;&nbsp;查询项
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;array&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一条记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;findById($tabName,&nbsp;$priId,&nbsp;$field=&#39;*&#39;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;&quot;SELECT&nbsp;%s&nbsp;FROM&nbsp;%s&nbsp;WHERE&nbsp;id=%d&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::getRow(sprintf($sql,&nbsp;self::parseField($field),&nbsp;$tabName,&nbsp;$priId));
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;执行普通查询
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$tables&nbsp;查询表名
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$where&nbsp;&nbsp;where
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$fields&nbsp;要查询字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$group&nbsp;&nbsp;group&nbsp;by
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$having&nbsp;having
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$order&nbsp;&nbsp;order
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$limit&nbsp;&nbsp;limit
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;array&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[description]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;find($tables,&nbsp;$where&nbsp;=&nbsp;null,&nbsp;$fields&nbsp;=&nbsp;&#39;*&#39;,&nbsp;$group&nbsp;=&nbsp;null,&nbsp;$having&nbsp;=&nbsp;null,&nbsp;$order&nbsp;=&nbsp;null,&nbsp;$limit&nbsp;=&nbsp;null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;&#39;SELECT&nbsp;&#39;.self::parseField($fields).&#39;&nbsp;FROM&nbsp;&#39;.$tables
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.self::parseWhere($where)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.self::parseGroup($group)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.self::parseHaving($having)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.self::parseOrder($order)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.self::parseLimit($limit);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dataAll&nbsp;=&nbsp;self::getAll($sql);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;count($dataAll)==1&nbsp;?&nbsp;$dataAll[0]&nbsp;:&nbsp;$dataAll;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;添加记录的操作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;array&nbsp;$data&nbsp;&nbsp;要添加的内容
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;int&nbsp;$table&nbsp;受影响的条数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;add($data,&nbsp;$table){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$keys&nbsp;=&nbsp;array_keys($data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_walk($keys,array(&#39;PDOMySQL&#39;,&#39;addSpecilChar&#39;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fieldsStr=join(&#39;,&#39;,$keys);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$values=&quot;&#39;&quot;.join(&quot;&#39;,&#39;&quot;,array_values($data)).&quot;&#39;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;&quot;INSERT&nbsp;{$table}({$fieldsStr})&nbsp;VALUES({$values})&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::execute($sql);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;更新记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;array&nbsp;$data&nbsp;&nbsp;要更新内容
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$table&nbsp;表名
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$where&nbsp;条件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$order&nbsp;排序
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$limit&nbsp;限制
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;受影响条数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;update($data,&nbsp;$table,&nbsp;$where&nbsp;=&nbsp;null,&nbsp;$order&nbsp;=&nbsp;null,&nbsp;$limit&nbsp;=&nbsp;null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sets&nbsp;=&nbsp;&#39;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($data&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$val)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sets&nbsp;.=&nbsp;$key.&quot;=&#39;&quot;.$val.&quot;&#39;,&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sets&nbsp;=&nbsp;rtrim($sets,&#39;,&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;&quot;UPDATE&nbsp;{$table}&nbsp;SET&nbsp;{$sets}&nbsp;&quot;.self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::execute($sql);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$fields&nbsp;字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解析后的字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;parseField($fields){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_array($fields)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_walk($fields,&nbsp;array(&#39;PDOMySQL&#39;,&nbsp;&#39;addSpecilChar&#39;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fieldsStr&nbsp;=&nbsp;implode(&#39;,&#39;,$fields);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}elseif(is_string($fields)&nbsp;&amp;&amp;&nbsp;!empty($fields)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(strpos($fields,&nbsp;&#39;`&#39;)&nbsp;===&nbsp;false){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fields&nbsp;=&nbsp;explode(&#39;,&#39;,&nbsp;$fields);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_walk($fields,&nbsp;array(&#39;PDOMySQL&#39;,&nbsp;&#39;addSpecilChar&#39;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fieldsStr&nbsp;=&nbsp;implode(&#39;,&#39;,$fields);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fieldsStr&nbsp;=&nbsp;$fields;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fieldsStr&nbsp;=&nbsp;&#39;*&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$fieldsStr;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;删除操作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;&nbsp;$table&nbsp;表名
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;&nbsp;$where&nbsp;条件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;&nbsp;$order&nbsp;排序
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;integer&nbsp;$limit&nbsp;限制
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;受影响条数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;delete($table,&nbsp;$where=null,&nbsp;$order=null,&nbsp;$limit=0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;&quot;DELETE&nbsp;FROM&nbsp;{$table}&nbsp;&quot;.self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::execute($sql);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到最后执行的sql语句
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;sql语句
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getLastSql(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$link=self::$link;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$link)&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::$queryStr;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到插入操作产生的AUTO_INCREMENT
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;int&nbsp;被操作id
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getLastInsertId(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$link=self::$link;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$link)&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::$lastInsertId;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到数据库的版本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;float&nbsp;数据库版本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getDbVersion(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$link=self::$link;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$link)&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::$dbVersion;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到数据库中的数据表
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;array&nbsp;所有数据表
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;showTbales(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tables&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(self::query(&quot;SHOW&nbsp;TABLES&quot;)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;self::getAll();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($result&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$value)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tables[$key]=current($value);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$tables;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析where字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$where&nbsp;字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解析后的字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;parseWhere($where){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$whereStr&nbsp;=&nbsp;&#39;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_string($where)&nbsp;&amp;&amp;&nbsp;!empty($where)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$whereStr&nbsp;=&nbsp;$where;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;empty($whereStr)&nbsp;?&nbsp;&#39;&#39;&nbsp;:&nbsp;&#39;&nbsp;WHERE&nbsp;&#39;.$whereStr;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析分组字段group&nbsp;by
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$group&nbsp;字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解析后的字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;parseGroup($group){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$groupStr&nbsp;=&nbsp;&#39;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_array($group)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$groupStr&nbsp;.=&nbsp;&#39;&nbsp;GROUP&nbsp;BY&nbsp;&#39;.implode(&#39;,&#39;,&nbsp;$group);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}elseif(is_string($group)&nbsp;&amp;&amp;&nbsp;!empty($group)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$groupStr&nbsp;.=&nbsp;&#39;&nbsp;GROUP&nbsp;BY&nbsp;&#39;.$group;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;empty($groupStr)&nbsp;?&nbsp;&#39;&#39;&nbsp;:&nbsp;$groupStr;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;对分组进行二次筛选
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$having&nbsp;字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解析后的字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;parseHaving($having){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$havingStr&nbsp;=&nbsp;&#39;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_string($having)&nbsp;&amp;&amp;&nbsp;!empty($having)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$havingStr&nbsp;=&nbsp;&#39;&nbsp;HAVING&nbsp;&#39;.$having;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$havingStr;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析order&nbsp;by
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$order&nbsp;字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解析后的字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;parseOrder($order){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$orderStr&nbsp;=&nbsp;&#39;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_array($order)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$orderStr&nbsp;.=&nbsp;&#39;&nbsp;ORDER&nbsp;BY&nbsp;&#39;.join(&#39;,&#39;,$order);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}elseif(is_string($order)&nbsp;&amp;&amp;&nbsp;!empty($order)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$orderStr&nbsp;.=&nbsp;&#39;&nbsp;ORDER&nbsp;BY&nbsp;&#39;.$order;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$orderStr;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析limit
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;strign&nbsp;$limit&nbsp;字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;strign&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解析后的字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;parseLimit($limit){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$limitStr&nbsp;=&nbsp;&#39;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_array($limit)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(count($limit)&nbsp;&gt;&nbsp;1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$limitStr&nbsp;=&nbsp;&#39;&nbsp;LIMIT&nbsp;&#39;.$limit[0].&#39;,&#39;.$limit[1];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$limitStr&nbsp;=&nbsp;&#39;&nbsp;LIMIT&nbsp;&#39;.$limit[0];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}elseif(!empty($limit)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$limitStr&nbsp;.=&nbsp;&#39;&nbsp;LIMIT&nbsp;&#39;.$limit;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$limitStr;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;通过反引号引用字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;&amp;$value&nbsp;不同类型字段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;addSpecilChar(&amp;$value){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($value&nbsp;===&nbsp;&#39;*&#39;&nbsp;||&nbsp;strpos($value,&nbsp;&#39;.&#39;)&nbsp;!=&nbsp;false&nbsp;||&nbsp;strpos($value,&nbsp;&#39;`&#39;)&nbsp;!=&nbsp;false){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;不做处理
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}elseif(strpos($value,&nbsp;&#39;`&#39;)&nbsp;===&nbsp;false){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$value&nbsp;=&nbsp;&#39;`&#39;.trim($value).&#39;`&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$value;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;执行增删改操作，返回受影响的记录条数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$sql&nbsp;sql语句
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;受影响条数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;execute($sql&nbsp;=&nbsp;null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$link&nbsp;=&nbsp;self::$link;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$link)&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$queryStr&nbsp;=&nbsp;$sql;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!empty(self::$PDOStatement))&nbsp;self::free();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;$link-&gt;exec(self::$queryStr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::haveErrorThrowException();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($result){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$lastInsertId&nbsp;=&nbsp;$link-&gt;lastInsertId();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$numRows&nbsp;=&nbsp;$result;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::$numRows;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;释放结果集
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;null&nbsp;null
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;free(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$PDOStatement&nbsp;=&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;query($sql&nbsp;=&nbsp;&#39;&#39;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$link&nbsp;=&nbsp;self::$link;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$link)&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;判断之前是否有结果集，如果有，释放结果集
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!empty(self::$PDOStatement))&nbsp;self::free();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$queryStr&nbsp;=&nbsp;$sql;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$PDOStatement&nbsp;=&nbsp;$link-&gt;prepare(self::$queryStr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;self::$PDOStatement-&gt;execute();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::haveErrorThrowException();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$res;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;haveErrorThrowException(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$obj&nbsp;=&nbsp;empty(self::$PDOStatement)&nbsp;?&nbsp;self::$link&nbsp;:&nbsp;self::$PDOStatement;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arrError&nbsp;=&nbsp;$obj-&gt;errorInfo();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($arrError[0]&nbsp;!=&nbsp;&#39;00000&#39;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$error&nbsp;=&nbsp;&#39;SQLStatus:&nbsp;&#39;.$arrError[0].&#39;&lt;br&nbsp;/&gt;SQLError:&nbsp;&#39;.$arrError[2].&#39;&lt;br&nbsp;/&gt;Error&nbsp;SQL:&nbsp;&#39;.self::$queryStr;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::throw_exception(self::$error);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(self::$queryStr&nbsp;==&nbsp;&#39;&#39;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::throw_exception(&#39;没有执行的SQL语句&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;自定义错误处理
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;$errMsg&nbsp;错误信息
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;null&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;null
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;throw_exception($errMsg){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$errMsg;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;销毁连接对象，关闭数据库
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;null&nbsp;null
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;close(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$link&nbsp;=&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>在场景中这样来使用，注释后的内容分别用来测试不同方法：</p><blockquote><p>index.php<br/></p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

$PDOMySQL&nbsp;=&nbsp;new&nbsp;PDOMySQL();

//&nbsp;查询全部记录
$sql&nbsp;=&nbsp;&#39;SELECT&nbsp;*&nbsp;FROM&nbsp;cheat_exam&#39;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;getAll($sql);

//&nbsp;查询一条记录
$sql&nbsp;=&nbsp;&#39;SELECT&nbsp;*&nbsp;FROM&nbsp;cheat_exam&nbsp;WHERE&nbsp;id=1&#39;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;getRow($sql);

//&nbsp;插入一条记录
$sql&nbsp;=&nbsp;&#39;INSERT&nbsp;cheat_exam(name)&nbsp;VALUES&nbsp;(1)&#39;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;execute($sql);
echo&nbsp;$PDOMySQL::$lastInsertId;

//&nbsp;删除一条记录
$sql&nbsp;=&nbsp;&#39;DELETE&nbsp;FROM&nbsp;cheat_exam&nbsp;WHERE&nbsp;id=115&#39;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;execute($sql);

//&nbsp;更新一条记录
$sql&nbsp;=&nbsp;&#39;UPDATE&nbsp;arr&nbsp;SET&nbsp;name=&quot;1&quot;&nbsp;WHERE&nbsp;id=1&#39;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;execute($sql);

//&nbsp;根据主键查询一条记录
$tabName&nbsp;=&nbsp;&#39;cheat_exam&#39;;
$priId&nbsp;=&nbsp;1;
$fields=&#39;subject,name&#39;;
$fields&nbsp;=&nbsp;array(&#39;subject&#39;,&#39;name&#39;);
$res&nbsp;=&nbsp;$PDOMySQL-&gt;findById($tabName,&nbsp;$priId,&nbsp;$fields);

//&nbsp;执行普通查询
$tables&nbsp;=&nbsp;&#39;cheat_exam&#39;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;find($tables);
$res&nbsp;=&nbsp;$PDOMySQL-&gt;find($tables,&nbsp;&#39;id&gt;=30&#39;);
$res&nbsp;=&nbsp;$PDOMySQL-&gt;find($tables,&nbsp;&#39;id&gt;=30&#39;,&nbsp;&#39;subject,name&#39;);
$res&nbsp;=&nbsp;$PDOMySQL-&gt;find($tables,&nbsp;&#39;id&gt;=30&#39;,&nbsp;&#39;*&#39;,&nbsp;&#39;subject&#39;);
$res&nbsp;=&nbsp;$PDOMySQL-&gt;find($tables,&nbsp;&#39;id&gt;=30&#39;,&nbsp;&#39;*&#39;,&nbsp;&#39;subject&#39;,&nbsp;&#39;count(*)&gt;=8&#39;);
$res&nbsp;=&nbsp;$PDOMySQL-&gt;find($tables,&nbsp;&#39;id&gt;=30&#39;,&nbsp;&#39;*&#39;,&nbsp;&#39;&#39;,&nbsp;&#39;&#39;,&nbsp;&#39;id&nbsp;desc&#39;);
$res&nbsp;=&nbsp;$PDOMySQL-&gt;find($tables,&nbsp;&#39;id&gt;=30&#39;,&nbsp;&#39;*&#39;,&nbsp;&#39;&#39;,&nbsp;&#39;&#39;,&nbsp;&#39;id&nbsp;desc&#39;,&nbsp;5);

//&nbsp;更新一条记录
$data&nbsp;=&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&#39;subject&#39;&nbsp;=&gt;&nbsp;&#39;imooc&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&#39;name&#39;&nbsp;=&gt;&nbsp;&#39;name&#39;
&nbsp;&nbsp;&nbsp;&nbsp;];
$table&nbsp;=&nbsp;&quot;cheat_exam&quot;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;add($data,&nbsp;$table);
//&nbsp;也是更新操作
$data&nbsp;=&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&#39;subject&#39;&nbsp;=&gt;&nbsp;&#39;imooc&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&#39;name&#39;&nbsp;=&gt;&nbsp;&#39;name&#39;
&nbsp;&nbsp;&nbsp;&nbsp;];
$table&nbsp;=&nbsp;&quot;cheat_exam&quot;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;update($data,&nbsp;$table,&nbsp;&#39;id&lt;=3&#39;,&nbsp;&#39;id&nbsp;desc&#39;,&nbsp;5);

//&nbsp;删除操作
$table&nbsp;=&nbsp;&quot;cheat_exam&quot;;
$res&nbsp;=&nbsp;$PDOMySQL-&gt;delete($table,&nbsp;&#39;id&lt;3&#39;);

//&nbsp;得到数据表
$res&nbsp;=&nbsp;$PDOMySQL-&gt;showTbales();

print_r($res);</pre><p>会打印出不同结果。<br/></p><p>The End.</p>]]></description>
      <pubDate>Fri, 03 Mar 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>PHP-GTK初体验：用最简单的方式运行环境，并实现Hello World</title>
      <link>http://old-blog.smallyu.net/index084d.html?id=46</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=46</guid>
      <description><![CDATA[<p>首先用最简单的方式把php-gtk运行起来，在gtk扩展官网（<a href="http://gtk.php.net/" _src="http://gtk.php.net/">http://gtk.php.net/</a>&nbsp;）下载Binaries版本：</p><p>点击链接直接下载：<a href="http://gtk.php.net/distributions/PHP55-GTK2.zip" _src="http://gtk.php.net/distributions/PHP55-GTK2.zip">http://gtk.php.net/distributions/PHP55-GTK2.zip</a>&nbsp;（PHP-GTK-2.0.1 PHP 5.5）</p><p>官方文档提供了三种安装扩展的方式，<br/></p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>使用Gnope</p></li><li><p>手动安装</p></li><li><p>使用CVS编译</p></li></ol><p>事实上我们在下载.zip压缩包后解压到任意文件夹下，不需要任何配置或者编译行为。（如果只是先体验一下GTK实现的GUI窗口）</p><p><span style="font-size: 14px;"><strong>一段简单的Hello World脚本</strong></span></p><p>在任意目录下新建一个文件，后缀名为.phpw，比如hello.phpw，编辑文件，写入以下代码：</p><pre class="prism-highlight prism-language-php">&lt;?php
if&nbsp;(!class_exists(&#39;gtk&#39;))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;die(&quot;Please&nbsp;load&nbsp;the&nbsp;php-gtk2&nbsp;module&nbsp;in&nbsp;your&nbsp;php.ini\r\n&quot;);
}

$wnd&nbsp;=&nbsp;new&nbsp;GtkWindow();
$wnd-&gt;set_title(&#39;Hello&nbsp;world&#39;);
$wnd-&gt;connect_simple(&#39;destroy&#39;,&nbsp;array(&#39;gtk&#39;,&nbsp;&#39;main_quit&#39;));

$lblHello&nbsp;=&nbsp;new&nbsp;GtkLabel(&quot;Just&nbsp;wanted&nbsp;to&nbsp;say\r\n&#39;Hello&nbsp;world!&#39;&quot;);
$wnd-&gt;add($lblHello);

$wnd-&gt;show_all();
Gtk::main();
?&gt;</pre><p>保存后，<span style="text-decoration: underline;">右击文件&gt;选择打开方式&gt;其它应用&gt;在这台电脑上浏览应用</span><span style="text-decoration: none;">，选择我们下载并解压好的文件夹下的php-win.exe来执行文件</span>，</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702221487764340907853.png" title="14.png" alt="14.png"/></p><p>就可以得到这样的运行结果：<br/></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702221487764357819986.png" title="2.png" alt="2.png"/></p><p><span style="font-size: 14px;"><strong>检查PHP-GTK是否可用</strong></span></p><pre class="prism-highlight prism-language-php">if&nbsp;(!class_exists(&#39;gtk&#39;))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;die(&quot;Please&nbsp;load&nbsp;the&nbsp;php-gtk2&nbsp;module&nbsp;in&nbsp;your&nbsp;php.ini\r\n&quot;);
}</pre><p><span style="font-size: 14px;">这里我们通过检查gtk类是否存在来确定PHP-GTK是否可用。不像PHP 4和PHP-GTK 1，你不应该通过d1()尝试加载PHP-GTK模块，因为这在PHP 5中是过时的，不应该用于新代码的编写。所以我们打印一个信息，如果模块不可用，就由用户来启用它。</span></p><p><span style="font-size: 14px;"><strong>创建一个窗口</strong></span></p><pre class="prism-highlight prism-language-php">$wnd&nbsp;=&nbsp;new&nbsp;GtkWindow();</pre><p>创建一个窗口就像实例化一个新的对象一样简单：变量$wnd得到了新对象的引用。如果你已经使用PHP 4和PHP-GTK 1，你可以在关键词new之前不使用&amp;符号，因为在PHP 5中它会被自动创建。</p><p><span style="font-size: 14px;"><strong>设置窗口标题</strong></span></p><pre class="prism-highlight prism-language-php">$wnd-&gt;set_title(&#39;Hello&nbsp;world&#39;);</pre><p>为了使窗口在任务栏中更容易被认出，我们设置了标题，仅仅调用了对象的一个方法。</p><p><span style="font-size: 14px;"><strong>使关闭（操作）变得干净</strong></span></p><pre class="prism-highlight prism-language-php">$wnd-&gt;connect_simple(&#39;destroy&#39;,&nbsp;array(&#39;gtk&#39;,&nbsp;&#39;main_quit&#39;));</pre><p>这是代码中第一段稍有意思的部分：参数&#39;destory&#39;传递到了静态方法Gtk::main_quit中。它告诉GTK当窗口被关闭或者销毁的时候退出主循环。（后面会提到关于主循环的内容）</p><p><strong>创建一个展示文本的标签</strong><br/></p><pre class="prism-highlight prism-language-php">$lblHello&nbsp;=&nbsp;new&nbsp;GtkLabel(&quot;Just&nbsp;wanted&nbsp;to&nbsp;say\r\n&#39;Hello&nbsp;world!&#39;&quot;);</pre><p>和上面一样，我们创建了一个新的部件。这次我们想要展示一小段文本，GtkLabel类可以完美的实现这个任务。</p><p><strong>添加标签到窗口</strong></p><pre class="prism-highlight prism-language-php">$wnd-&gt;add($lblHello);</pre><p>我们直接把标签添加到了窗口。<br/></p><p><strong>设置窗口为可见的</strong></p><pre class="prism-highlight prism-language-php">$wnd-&gt;show_all();</pre><p>到现在，我们在屏幕上看不见任何内容。为了使窗口可见，必须调用show()方法，它将会使窗口可见，但不是标签——我们在标签之上（也就是窗口对象上）调用show()。如果你有多个控件比如按钮、复选框或者其它窗口部件不方便一一调用，可以使用show_all()方法来显示所有可见的部件。</p><p><strong>开启主循环</strong></p><pre class="prism-highlight prism-language-php">Gtk::main();</pre><p>在设置完所有配置项之后，我们需要确定窗口停留在打开状态并且会对用户的行为进行反馈。一段普通的PHP脚本在文件执行结束后会停止，因此需要启动GTK主循环。它会保持应用处于运行状态并且会回应用户事件。如果事件发生，它会执行相应的回调。</p><p>（原内容：<a href="http://gtk.php.net/manual/en/html/tutorials/tutorials.helloworld.html" _src="http://gtk.php.net/manual/en/html/tutorials/tutorials.helloworld.html">http://gtk.php.net/manual/en/html/tutorials/tutorials.helloworld.html</a>&nbsp;）<br/></p><p><br/></p><p><strong>更加先进的Hello World脚本</strong></p><p>下面的参考内容会比上面的hello world脚本实现更多的功能。这里我们创建了一个登陆框，可以由用户来输入用户名和密码。当用户点击登陆，如果用户名或者密码为空，文本域可以检查错误并显示。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702221487764374675166.png" title="helloadvanced.png" alt="helloadvanced.png"/></p><p>首先我们先创建一个窗口，设置标题并设置当窗口销毁停止主循环（上面已经实现过）：<br/></p><pre class="prism-highlight prism-language-php">$wnd&nbsp;=&nbsp;new&nbsp;GtkWindow();
$wnd-&gt;set_title(&#39;Login&#39;);
$wnd-&gt;connect_simple(&#39;destroy&#39;,&nbsp;array(&#39;gtk&#39;,&nbsp;&#39;main_quit&#39;));</pre><p>接下来我们的任务是创建所有要显示的部件，先是两个文本域用户名和密码：</p><pre class="prism-highlight prism-language-php">$txtUsername&nbsp;=&nbsp;new&nbsp;GtkEntry();
$txtPassword&nbsp;=&nbsp;new&nbsp;GtkEntry();</pre><p>我们要分别给两个文本域一个描述的标签：</p><pre class="prism-highlight prism-language-php">//&nbsp;第二个参数意思是把下划线解析为下划线
$lblUsername&nbsp;=&nbsp;new&nbsp;GtkLabel(&#39;_Username&#39;,&nbsp;true);
$lblPassword&nbsp;=&nbsp;new&nbsp;GtkLabel(&#39;_Password&#39;,&nbsp;true);</pre><p>最后我们需要两个按钮，登录和取消：<br/></p><pre class="prism-highlight prism-language-php">$btnLogin&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;new&nbsp;GtkButton(&#39;_Login&#39;);
$btnCancel&nbsp;&nbsp;&nbsp;=&nbsp;new&nbsp;GtkButton(&#39;_Cancel&#39;);</pre><p>你可能注意到GtkLable类的构造函数中通过第二个参数设置解析下划线_为一个字符，但是GtkButton类中并没有，因为它会自动设置，这一点是需要记忆的。<br/></p><p>现在标签需要知道哪个行为被激活时使用哪个相应的内容，这样来做：</p><pre class="prism-highlight prism-language-php">$lblUsername-&gt;set_mnemonic_widget($txtUsername);
$lblPassword-&gt;set_mnemonic_widget($txtPassword);</pre><p>然后我们要决定哪个按钮被点击对应哪个事件。取消按钮会关闭窗口，结束程序，登录按钮会检查文本域是否为空等一系列操作：</p><pre class="prism-highlight prism-language-php">$btnCancel-&gt;connect_simple(&#39;clicked&#39;,&nbsp;array($wnd,&nbsp;&#39;destroy&#39;));
$btnLogin&nbsp;-&gt;connect_simple(&#39;clicked&#39;,&nbsp;&#39;login&#39;,&nbsp;$wnd,&nbsp;$txtUsername,&nbsp;$txtPassword);</pre><p>我们把三个参数$wnd、$txtUsername和$txtPassword传递给了登录函数，接下来的操作会用它们从文本域获取值，并且在所有工作结束后关闭窗口。</p><p>现在我们创建了我们需要的所有按钮，它们被添加到了窗口。GtkWindow库是功能容器，它可以捆绑为一个单独的部件，所以我们需要这个容器来更好的展示我们的其它元素。这里决定使用GtkTabel，它可以保持标签在一列，紧随其后的是确定域：<br/></p><pre class="prism-highlight prism-language-php">$tbl&nbsp;=&nbsp;new&nbsp;GtkTable(3,&nbsp;2);
$tbl-&gt;attach($lblCredit,&nbsp;0,&nbsp;2,&nbsp;0,&nbsp;1);
$tbl-&gt;attach($lblUsername,&nbsp;0,&nbsp;1,&nbsp;1,&nbsp;2);
$tbl-&gt;attach($txtUsername,&nbsp;1,&nbsp;2,&nbsp;1,&nbsp;2);
$tbl-&gt;attach($lblPassword,&nbsp;0,&nbsp;1,&nbsp;2,&nbsp;3);
$tbl-&gt;attach($txtPassword,&nbsp;1,&nbsp;2,&nbsp;2,&nbsp;3);</pre><p>（$lblCredit仅仅是一个消息标签），按钮有它们自己的GtkHButtonBox类，因为这个允许它们更美观的布局多个按钮：</p><pre class="prism-highlight prism-language-php">$bbox&nbsp;=&nbsp;new&nbsp;GtkHButtonBox();
$bbox-&gt;set_layout(Gtk::BUTTONBOX_EDGE);
$bbox-&gt;add($btnCancel);
$bbox-&gt;add($btnLogin);</pre><p>对于布局最后要做的事情是把表格和按钮添加到窗口。没有直接的方法，因为GtkWindow是一个GtkBin（类库？），只能包含一个部件。所以我们需要另外的容器，这次用GtkVBox：<br/></p><pre class="prism-highlight prism-language-php">$vbox&nbsp;=&nbsp;new&nbsp;GtkVBox();
$vbox-&gt;pack_start($tbl);
$vbox-&gt;pack_start($bbox);</pre><p>它们所有都需要显示：</p><pre class="prism-highlight prism-language-php">$wnd-&gt;add($vbox);
$wnd-&gt;show_all();
Gtk::main();</pre><p>最后要做的事情，是当用户点击登陆按钮时候的回调事件。它需要检查用户名和密码是否为空，如果它们长度为0，则显示错误信息。如果一切ok，窗口将会关闭并且程序会继续运行来加载主窗口。<br/></p><p>从部件获取文本很简单，我们用GtkEntry的get_text()方法就能实现：</p><pre class="prism-highlight prism-language-php">$strUsername&nbsp;=&nbsp;$txtUsername-&gt;get_text();
$strPassword&nbsp;=&nbsp;$txtPassword-&gt;get_text();</pre><p>检查工作可以用平常的php函数。如果发生错误就显示一个带有错误消息的信息。GtkMessageDialog来完成这些工作是理想的，它可以自动创建图标和按钮（确认，是或否）：<br/></p><pre class="prism-highlight prism-language-php">$dialog&nbsp;=&nbsp;new&nbsp;GtkMessageDialog($wnd,&nbsp;Gtk::DIALOG_MODAL,&nbsp;Gtk::MESSAGE_ERROR,&nbsp;Gtk::BUTTONS_OK,&nbsp;$errors);
$dialog-&gt;set_markup(&quot;The&nbsp;following&nbsp;errors&nbsp;occured:\r\n&lt;span&nbsp;foreground=&#39;red&#39;&gt;&quot;&nbsp;.&nbsp;$errors&nbsp;.&nbsp;&quot;&lt;/span&gt;&quot;);
$dialog-&gt;run();
$dialog-&gt;destroy();</pre><p>现在可以确定你把登录功能函数放到了主循环中并使其运行。<br/></p><p><strong>完整代码</strong><br/></p><pre class="prism-highlight prism-language-php">&lt;?php
/**
*&nbsp;&nbsp;&nbsp;Here&nbsp;we&nbsp;create&nbsp;a&nbsp;login&nbsp;window.
*&nbsp;&nbsp;&nbsp;It&nbsp;has&nbsp;a&nbsp;username&nbsp;and&nbsp;a&nbsp;password&nbsp;field,&nbsp;and&nbsp;a
*&nbsp;&nbsp;&nbsp;Cancel&nbsp;and&nbsp;Login&nbsp;button.&nbsp;Some&nbsp;error&nbsp;checking
*&nbsp;&nbsp;&nbsp;is&nbsp;being&nbsp;done&nbsp;when&nbsp;the&nbsp;user&nbsp;clicks&nbsp;&quot;Login&quot;.
*/

if&nbsp;(!class_exists(&#39;gtk&#39;))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;die(&quot;Please&nbsp;load&nbsp;the&nbsp;php-gtk2&nbsp;module&nbsp;in&nbsp;your&nbsp;php.ini\r\n&quot;);
}

/**
*&nbsp;&nbsp;&nbsp;This&nbsp;function&nbsp;gets&nbsp;called&nbsp;as&nbsp;soon&nbsp;as&nbsp;the&nbsp;user&nbsp;
*&nbsp;&nbsp;&nbsp;clicks&nbsp;on&nbsp;the&nbsp;Login&nbsp;button.
*
*&nbsp;&nbsp;&nbsp;@param&nbsp;GtkWindow&nbsp;$wnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;login&nbsp;window,&nbsp;needed&nbsp;to&nbsp;close&nbsp;it
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;all&nbsp;is&nbsp;ok
*&nbsp;&nbsp;&nbsp;@param&nbsp;GtkEntry&nbsp;$txtUsername&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;username&nbsp;text&nbsp;field,&nbsp;used&nbsp;to&nbsp;get
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;username
*&nbsp;&nbsp;&nbsp;@param&nbsp;GtkEntry&nbsp;$txtPassword&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;password&nbsp;widget&nbsp;to&nbsp;retrieve&nbsp;the
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password
*/
function&nbsp;login(GtkWindow&nbsp;$wnd,&nbsp;GtkEntry&nbsp;$txtUsername,&nbsp;GtkEntry&nbsp;$txtPassword)
{
&nbsp;&nbsp;&nbsp;&nbsp;//fetch&nbsp;the&nbsp;values&nbsp;from&nbsp;the&nbsp;widgets&nbsp;into&nbsp;variables
&nbsp;&nbsp;&nbsp;&nbsp;$strUsername&nbsp;=&nbsp;$txtUsername-&gt;get_text();
&nbsp;&nbsp;&nbsp;&nbsp;$strPassword&nbsp;=&nbsp;$txtPassword-&gt;get_text();

&nbsp;&nbsp;&nbsp;&nbsp;//Do&nbsp;some&nbsp;error&nbsp;checking
&nbsp;&nbsp;&nbsp;&nbsp;$errors&nbsp;=&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strlen($strUsername)&nbsp;==&nbsp;0)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$errors&nbsp;.=&nbsp;&quot;Username&nbsp;is&nbsp;missing.\r\n&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strlen($strPassword)&nbsp;==&nbsp;0)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$errors&nbsp;.=&nbsp;&quot;No&nbsp;password&nbsp;given.\r\n&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($errors&nbsp;!==&nbsp;null)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//There&nbsp;was&nbsp;at&nbsp;least&nbsp;one&nbsp;error.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//We&nbsp;show&nbsp;a&nbsp;message&nbsp;box&nbsp;with&nbsp;the&nbsp;errors
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dialog&nbsp;=&nbsp;new&nbsp;GtkMessageDialog($wnd,&nbsp;Gtk::DIALOG_MODAL,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Gtk::MESSAGE_ERROR,&nbsp;Gtk::BUTTONS_OK,&nbsp;$errors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dialog-&gt;set_markup(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;The&nbsp;following&nbsp;errors&nbsp;occured:\r\n&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;&quot;&lt;span&nbsp;foreground=&#39;red&#39;&gt;&quot;&nbsp;.&nbsp;$errors&nbsp;.&nbsp;&quot;&lt;/span&gt;&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dialog-&gt;run();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dialog-&gt;destroy();
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//No&nbsp;error.&nbsp;You&nbsp;would&nbsp;need&nbsp;to&nbsp;hide&nbsp;the&nbsp;dialog&nbsp;now
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//instead&nbsp;of&nbsp;destroying&nbsp;it&nbsp;(because&nbsp;when&nbsp;you&nbsp;destroy&nbsp;it,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Gtk::main_quit()&nbsp;gets&nbsp;called)&nbsp;and&nbsp;show&nbsp;the&nbsp;main&nbsp;window
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wnd-&gt;destroy();
&nbsp;&nbsp;&nbsp;&nbsp;}
}

//Create&nbsp;the&nbsp;login&nbsp;window
$wnd&nbsp;=&nbsp;new&nbsp;GtkWindow();
$wnd-&gt;set_title(&#39;Login&#39;);
//Close&nbsp;the&nbsp;main&nbsp;loop&nbsp;when&nbsp;the&nbsp;window&nbsp;is&nbsp;destroyed
$wnd-&gt;connect_simple(&#39;destroy&#39;,&nbsp;array(&#39;gtk&#39;,&nbsp;&#39;main_quit&#39;));


//Set&nbsp;up&nbsp;all&nbsp;the&nbsp;widgets&nbsp;we&nbsp;need
$lblCredit&nbsp;&nbsp;&nbsp;=&nbsp;new&nbsp;GtkLabel(&#39;Please&nbsp;provide&nbsp;your&nbsp;data&#39;);
//The&nbsp;second&nbsp;parameter&nbsp;says&nbsp;that&nbsp;the&nbsp;underscore&nbsp;should&nbsp;be&nbsp;parsed&nbsp;as&nbsp;underline
$lblUsername&nbsp;=&nbsp;new&nbsp;GtkLabel(&#39;_Username&#39;,&nbsp;true);
$lblPassword&nbsp;=&nbsp;new&nbsp;GtkLabel(&#39;_Password&#39;,&nbsp;true);
$txtUsername&nbsp;=&nbsp;new&nbsp;GtkEntry();
$txtPassword&nbsp;=&nbsp;new&nbsp;GtkEntry();
$btnLogin&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;new&nbsp;GtkButton(&#39;_Login&#39;);
$btnCancel&nbsp;&nbsp;&nbsp;=&nbsp;new&nbsp;GtkButton(&#39;_Cancel&#39;);


//Which&nbsp;widget&nbsp;should&nbsp;be&nbsp;activated&nbsp;when&nbsp;the&nbsp;
//&nbsp;mnemonic&nbsp;(Alt+U&nbsp;or&nbsp;Alt+P)&nbsp;is&nbsp;pressed?
$lblUsername-&gt;set_mnemonic_widget($txtUsername);
$lblPassword-&gt;set_mnemonic_widget($txtPassword);
//Hide&nbsp;the&nbsp;password
//$txtPassword-&gt;set_invisible_char(&#39;*&#39;);

//Destroy&nbsp;the&nbsp;window&nbsp;when&nbsp;the&nbsp;user&nbsp;clicks&nbsp;Cancel
$btnCancel-&gt;connect_simple(&#39;clicked&#39;,&nbsp;array($wnd,&nbsp;&#39;destroy&#39;));
//Call&nbsp;the&nbsp;login&nbsp;function&nbsp;when&nbsp;the&nbsp;user&nbsp;clicks&nbsp;on&nbsp;Login
$btnLogin-&gt;connect_simple(&#39;clicked&#39;,&nbsp;&#39;login&#39;,&nbsp;$wnd,&nbsp;$txtUsername,&nbsp;$txtPassword);


//Lay&nbsp;out&nbsp;all&nbsp;the&nbsp;widgets&nbsp;in&nbsp;the&nbsp;table
$tbl&nbsp;=&nbsp;new&nbsp;GtkTable(3,&nbsp;2);
$tbl-&gt;attach($lblCredit,&nbsp;0,&nbsp;2,&nbsp;0,&nbsp;1);
$tbl-&gt;attach($lblUsername,&nbsp;0,&nbsp;1,&nbsp;1,&nbsp;2);
$tbl-&gt;attach($txtUsername,&nbsp;1,&nbsp;2,&nbsp;1,&nbsp;2);
$tbl-&gt;attach($lblPassword,&nbsp;0,&nbsp;1,&nbsp;2,&nbsp;3);
$tbl-&gt;attach($txtPassword,&nbsp;1,&nbsp;2,&nbsp;2,&nbsp;3);


//Add&nbsp;the&nbsp;buttons&nbsp;to&nbsp;a&nbsp;button&nbsp;box
$bbox&nbsp;=&nbsp;new&nbsp;GtkHButtonBox();
$bbox-&gt;set_layout(Gtk::BUTTONBOX_EDGE);
$bbox-&gt;add($btnCancel);
$bbox-&gt;add($btnLogin);


//Add&nbsp;the&nbsp;table&nbsp;and&nbsp;the&nbsp;button&nbsp;box&nbsp;to&nbsp;a&nbsp;vbox
$vbox&nbsp;=&nbsp;new&nbsp;GtkVBox();
$vbox-&gt;pack_start($tbl);
$vbox-&gt;pack_start($bbox);

//Add&nbsp;the&nbsp;vbox&nbsp;to&nbsp;the&nbsp;window
$wnd-&gt;add($vbox);
//Show&nbsp;all&nbsp;widgets
$wnd-&gt;show_all();
//Start&nbsp;the&nbsp;main&nbsp;loop
Gtk::main();
?&gt;</pre><p>（原内容：<a href="http://gtk.php.net/manual/en/html/tutorials/tutorials.helloadvanced.html" _src="http://gtk.php.net/manual/en/html/tutorials/tutorials.helloadvanced.html">http://gtk.php.net/manual/en/html/tutorials/tutorials.helloadvanced.html</a>）</p><p>The End.<br/></p>]]></description>
      <pubDate>Wed, 22 Feb 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>PHP写简单爬虫抓取太工教务处通告中的，考试作弊学生名单</title>
      <link>http://old-blog.smallyu.net/index98dc.html?id=45</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=45</guid>
      <description><![CDATA[<p>目标是太原工业学院（tit）教务处（<a href="http://jwc.tit.edu.xn--cn-s13az65kkib0wa40pbqbupg10d5njl9d8u6a1z5b9meg59b185b6bquj11c/" _src="http://jwc.tit.edu.cn）通告栏信息中考试作弊学生的名单。">http://jwc.tit.edu.cn</a>）&nbsp;通告栏信息中考试作弊学生的名单。</p><p>过程中涉及到的内容有：</p><ul class=" list-paddingleft-2" style="list-style-type: disc;"><li><p>curl获取页面内容</p></li><li><p>正则表达式匹配目标内容</p></li><li><p>相关字符串处理函数整理数据</p></li><li><p>mysql数据库基本操作</p></li></ul><p>首先打开教务处最新一条考试作弊通告，查看页面源代码，内容类似于：</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702191487511072510789.png" title="1.png" alt="1.png" width="705" height="299" style="width: 705px; height: 299px;"/></p><p>可以获取到两个信息：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>通告地址为：<a href="http://jwc.tit.edu.cn/info/news/content/3013.htm" _src="http://jwc.tit.edu.cn/info/news/content/3013.htm">http://jwc.tit.edu.cn/info/news/content/3013.htm</a>&nbsp;，有很明显的规律</p></li><li><p>页面内容太乱了。</p></li></ol><p>因为页面链接太有规律，我们可以用简单粗暴的方式来循环爬取各个页面，而不用分析页面中的链接然后执行另外的curl请求。</p><p>第二个信息是页面内容比较乱，主要是太多html标签+样式覆盖了内容。（吐槽一下教务处系统的开发者？）可以在得到页面内容后先过滤掉每个标签。</p><p>接下来开始写代码了。<br/></p><p>一、curl请求一共需要四个步骤：</p><blockquote><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>初始化会话请求</p></li><li><p>设置请求选项，包括具体的url</p></li><li><p>执行一个curl会话并且获得相关回复</p></li><li><p>释放curl句柄，关闭一个curl会话<br/></p></li></ol></blockquote><p>涉及到的四个函数分别为：</p><pre class="prism-highlight prism-language-php">curl_init();
curl_setopt();
curl_exec();
curl_close();</pre><p>略过一些内容后就可以拿到以字符串形式返回的包含页面内容的变量$response。<br/></p><p>二、然后写正则表达式结合一些函数来分离出所需信息，涉及到的函数有：<br/></p><pre class="prism-highlight prism-language-php">preg_replace();</pre><p>好像就这一个，功能很强大。关于正则表达式可以用这个在线工具：<a href="http://regexpal.isbadguy.com/" _src="http://regexpal.isbadguy.com/">http://regexpal.isbadguy.com/</a> </p><p>三、再然后整理数据，也就使用这个函数：</p><pre class="prism-highlight prism-language-php">substr();</pre><p>以数组形式返回整齐的数据。</p><p>四、最后就要把数据储存到mysql，表的结构是：（资源小浪费）</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702201487567639455976.png" title="搜狗截图20170220130805.png" alt="搜狗截图20170220130805.png"/></p><p>基本步骤之后可以拿到包含一个页面所需数据的数组。最终执行需要重复执行这些基本步骤很多（3013）次。</p><p>过程中用ob缓存来实时输出内容反馈到浏览器：<br/></p><pre class="prism-highlight prism-language-php">ob_flush();
flush();</pre><p><strong>完整代码</strong><br/></p><pre class="prism-highlight prism-language-php">&lt;?php

set_time_limit(0);&nbsp;&nbsp;//&nbsp;设置PHP最长执行时间

$times&nbsp;=&nbsp;3013;
while($times&nbsp;&gt;&nbsp;0){
&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;&quot;http://jwc.tit.edu.cn/info/news/content/&quot;.$times.&quot;.htm&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$url.&quot;&lt;br&nbsp;/&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;curl($url);
&nbsp;&nbsp;&nbsp;&nbsp;if($res){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;getData($res);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($data){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;infoArr($data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saveData($data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$times++;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;ob_flush();&nbsp;//&nbsp;从缓存中输出内容
&nbsp;&nbsp;&nbsp;&nbsp;flush();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;刷出缓存内容到浏览器
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);&nbsp;&nbsp;&nbsp;//&nbsp;延时1s执行
&nbsp;&nbsp;&nbsp;&nbsp;$times--;
}

function&nbsp;curl($url&nbsp;=&nbsp;&quot;http://www.baidu.com&quot;){
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1.初始化会话请求
&nbsp;&nbsp;&nbsp;&nbsp;$ch&nbsp;=&nbsp;curl_init();
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;2.设置请求选项，包括具体的url
&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_URL,&nbsp;$url);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;需要获取的&nbsp;URL&nbsp;地址，也可以在curl_init()初始化会话的时候
&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_RETURNTRANSFER,&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TRUE&nbsp;将curl_exec()获取的信息以字符串返回，而不是直接输出
&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_HEADER,&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;启用时会将头文件的信息作为数据流输出（到页面）
&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_CONNECTTIMEOUT,&nbsp;30);&nbsp;&nbsp;&nbsp;//&nbsp;连接超时时长
&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_TIMEOUT,&nbsp;30);&nbsp;&nbsp;//&nbsp;执行超时时长
&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_HTTP_VERSION,&nbsp;CURL_HTTP_VERSION_1_0);&nbsp;//强制协议为1.0
&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_HTTPHEADER,&nbsp;array(&quot;Expect:&nbsp;&quot;));&nbsp;//头部要送出&#39;Expect:&nbsp;&#39;
&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_IPRESOLVE,&nbsp;CURL_IPRESOLVE_V4&nbsp;);&nbsp;//强制使用IPV4协议解析域名
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;3.执行一个curl会话并且获得相关回复
&nbsp;&nbsp;&nbsp;&nbsp;$response&nbsp;=&nbsp;curl_exec($ch);
&nbsp;&nbsp;&nbsp;&nbsp;if($response&nbsp;===&nbsp;false){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;4.释放curl句柄，关闭一个curl会话
&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$response;
}

function&nbsp;getData($response&nbsp;=&nbsp;&#39;&#39;){

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;过滤html标签
&nbsp;&nbsp;&nbsp;&nbsp;$replace_pattern&nbsp;=&nbsp;&#39;/&lt;[^&gt;]*&gt;/x&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;$str_replace&nbsp;=&nbsp;preg_replace($replace_pattern,&nbsp;&#39;&#39;,&nbsp;$response);

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;获取日期
&nbsp;&nbsp;&nbsp;&nbsp;$dates&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;$date_pattern&nbsp;=&nbsp;&#39;/\d{1,4}年\d{1,2}月\d{1,2}日/u&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;preg_match_all($date_pattern,&nbsp;$str_replace,&nbsp;$dates);

&nbsp;&nbsp;&nbsp;&nbsp;if(empty($dates[0])){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($dates&nbsp;as&nbsp;$value)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($value&nbsp;as&nbsp;$v)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$v&nbsp;=&nbsp;str_replace(array(&#39;年&#39;,&#39;月&#39;,&#39;日&#39;),&nbsp;array(&#39;-&#39;,&nbsp;&#39;-&#39;,&nbsp;&#39;&#39;),&nbsp;$v);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$date[]&nbsp;=&nbsp;$v;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;获取科目
&nbsp;&nbsp;&nbsp;&nbsp;$subjects&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;$subject_pattern&nbsp;=&nbsp;&#39;/《[^(》|太)]*》/u&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;preg_match_all($subject_pattern,&nbsp;$str_replace,&nbsp;$subjects);

&nbsp;&nbsp;&nbsp;&nbsp;if(empty($subjects[0])){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($subjects&nbsp;as&nbsp;$value)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($value&nbsp;as&nbsp;$v)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$subject[]&nbsp;=&nbsp;$v;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;获取学号姓名
&nbsp;&nbsp;&nbsp;&nbsp;$students&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;$students_pattern&nbsp;=&nbsp;&#39;/\d{7,9}(班)?\d{0,2}(号)?[^(\d\w\s,)]{6,9}/x&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;preg_match_all($students_pattern,&nbsp;$str_replace,&nbsp;$students);

&nbsp;&nbsp;&nbsp;&nbsp;if(empty($students[0])){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;$students=$students[0];

&nbsp;&nbsp;&nbsp;&nbsp;foreach($students&nbsp;as&nbsp;$info){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$info&nbsp;=&nbsp;str_replace(array(&#39;班&#39;,&#39;号&#39;,&#39;在&#39;,&#39;、&#39;),&nbsp;&#39;&#39;,&nbsp;$info);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stuId[]&nbsp;=&nbsp;substr($info,&nbsp;0,&nbsp;9);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$name[]&nbsp;=&nbsp;substr($info,&nbsp;9,&nbsp;11);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;date&#39;]&nbsp;=&nbsp;$date;
&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;subject&#39;]&nbsp;=&nbsp;$subject;
&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;stuId&#39;]&nbsp;=&nbsp;$stuId;
&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;name&#39;]&nbsp;=&nbsp;$name;

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$data;
}

function&nbsp;infoArr($data&nbsp;=&nbsp;[]){
&nbsp;&nbsp;&nbsp;&nbsp;$dateNum&nbsp;=&nbsp;count($data[&#39;date&#39;]);
&nbsp;&nbsp;&nbsp;&nbsp;$subNum&nbsp;=&nbsp;count($data[&#39;subject&#39;]);
&nbsp;&nbsp;&nbsp;&nbsp;$idNum&nbsp;=&nbsp;count($data[&#39;stuId&#39;]);
&nbsp;&nbsp;&nbsp;&nbsp;$nameNum&nbsp;=&nbsp;count($data[&#39;name&#39;]);
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果日期数目为1，其它不为1
&nbsp;&nbsp;&nbsp;&nbsp;if($dateNum&nbsp;==&nbsp;1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i&nbsp;=&nbsp;0;&nbsp;$i&nbsp;&lt;&nbsp;$idNum&nbsp;-&nbsp;1;&nbsp;$i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;date&#39;][$i+1]&nbsp;=&nbsp;$data[&#39;date&#39;][$i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果课程数为1，人数不为1
&nbsp;&nbsp;&nbsp;&nbsp;if($subNum&nbsp;==&nbsp;1&nbsp;&amp;&amp;&nbsp;$idNum&nbsp;!=&nbsp;1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i&nbsp;=&nbsp;0;&nbsp;$i&nbsp;&lt;&nbsp;$idNum&nbsp;-&nbsp;1;&nbsp;$i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;date&#39;][$i+1]&nbsp;=&nbsp;$data[&#39;date&#39;][$i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;subject&#39;][$i+1]&nbsp;=&nbsp;$data[&#39;subject&#39;][$i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果课程数大于1，人数大于课程数
&nbsp;&nbsp;&nbsp;&nbsp;if($subNum&nbsp;&gt;&nbsp;1&nbsp;&amp;&amp;&nbsp;$idNum&nbsp;&gt;&nbsp;$subNum){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i&nbsp;=&nbsp;0;&nbsp;$i&nbsp;&lt;&nbsp;$idNum-1;&nbsp;$i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(substr($data[&#39;stuId&#39;][$i],&nbsp;0,&nbsp;5)&nbsp;==&nbsp;substr($data[&#39;stuId&#39;][$i+1],&nbsp;0,&nbsp;5)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($j&nbsp;=&nbsp;$idNum-1;&nbsp;$j&nbsp;&gt;&nbsp;$i;&nbsp;$j--){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;subject&#39;][$j]&nbsp;=&nbsp;$data[&#39;subject&#39;][$j-1];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#39;date&#39;][$j]&nbsp;=&nbsp;$data[&#39;date&#39;][$j-1];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;暂时忽略其它情况
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$data;
}

function&nbsp;saveData($data&nbsp;=&nbsp;[]){

&nbsp;&nbsp;&nbsp;&nbsp;$mysql_host&nbsp;=&nbsp;&#39;localhost&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_username&nbsp;=&nbsp;&#39;root&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_password&nbsp;=&nbsp;&#39;root&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_db&nbsp;=&nbsp;&#39;minyy&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_table&nbsp;=&nbsp;&#39;cheat_exam&#39;;

&nbsp;&nbsp;&nbsp;&nbsp;$link&nbsp;=&nbsp;mysql_connect($mysql_host,&nbsp;$mysql_username,&nbsp;$mysql_password);
&nbsp;&nbsp;&nbsp;&nbsp;mysql_select_db($mysql_db,&nbsp;$link);
&nbsp;&nbsp;&nbsp;&nbsp;mysql_query(&quot;set&nbsp;names&nbsp;utf8&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;&quot;CREATE&nbsp;TABLE&nbsp;IF&nbsp;NOT&nbsp;EXISTS&nbsp;$mysql_table(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;int(6)&nbsp;unsigned&nbsp;NOT&nbsp;NULL&nbsp;AUTO_INCREMENT,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY(id),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stuId&nbsp;int(11),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date&nbsp;date,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subject&nbsp;tinytext,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;tinytext
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;ENGINE=MyISAM&nbsp;&nbsp;DEFAULT&nbsp;CHARSET=utf8&nbsp;AUTO_INCREMENT=1&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;mysql_query($sql);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;$times&nbsp;=&nbsp;count($data[&#39;stuId&#39;]);

&nbsp;&nbsp;&nbsp;&nbsp;for($i&nbsp;=&nbsp;0;&nbsp;$i&nbsp;&lt;&nbsp;1;&nbsp;$i++){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stuId&nbsp;=&nbsp;$data[&#39;stuId&#39;][$i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$date&nbsp;=&nbsp;&#39;&quot;&#39;.$data[&#39;date&#39;][$i].&#39;&quot;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$subject&nbsp;=&nbsp;&#39;&quot;&#39;.$data[&#39;subject&#39;][$i].&#39;&quot;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$name&nbsp;=&nbsp;&#39;&quot;&#39;.$data[&#39;name&#39;][$i].&#39;&quot;&#39;;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;&quot;SELECT&nbsp;*&nbsp;FROM&nbsp;$mysql_table&nbsp;WHERE&nbsp;stuId={$data[&#39;stuId&#39;][$i]}&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;mysql_fetch_array(mysql_query($sql));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$res){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;&quot;INSERT&nbsp;INTO&nbsp;$mysql_table&nbsp;(stuId,&nbsp;date,&nbsp;subject,&nbsp;name)&nbsp;VALUES&nbsp;($stuId,&nbsp;$date,&nbsp;$subject,&nbsp;$name)&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_query($sql);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;
}</pre><p>事实上是比较简单的一段小程序。</p><p>执行后的页面会不断显示出一个一个网址。（忘了截图）</p><p>（由于网速慢）程序跑了很多（10？）个小时。</p><p>一共抓到106条数据，手工删掉几条非法数据后还剩98条。数据样本有点小啊。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702191487511119176721.png" title="2.png" alt="2.png" width="693" height="469" style="width: 693px; height: 469px;"/></p><p>唯一（三）能得到的结果图：</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702191487513020390196.png" title="5553.png" alt="5553.png" width="696" height="471" style="width: 696px; height: 471px;"/></p><p>不同系部的人数分布如上。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702191487511152333623.png" title="3.png" alt="3.png" width="691" height="458" style="width: 691px; height: 458px;"/></p><p>不同入学年份的学生人数分布如上。<br/></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/02/201702191487511179190399.png" title="搜狗截图20170219204308.png" alt="搜狗截图20170219204308.png" width="701" height="454" style="width: 701px; height: 454px;"/></p><p>不同年份考试的学生人数如上。（O__O &quot;…）</p><p>程序比较简单懒得详细写了，注释很全。不具有普遍性也就不封装成类了，得加很多判断好麻烦。</p><p>The End.<br/></p>]]></description>
      <pubDate>Sun, 19 Feb 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>JAVA中的几种设计模式</title>
      <link>http://old-blog.smallyu.net/indexa916.html?id=44</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=44</guid>
      <description><![CDATA[<p><span style="font-size: 16px;"><strong>单例模式</strong></span></p><p>饿汉模式</p><blockquote><p>Singleton.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc
public&nbsp;class&nbsp;Singleton&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1.将构造方法私有化，不允许外部直接创建对象
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Singleton()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;2.创建类的唯一示例,使用private&nbsp;static修饰
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;Singleton&nbsp;instance&nbsp;=&nbsp;new&nbsp;Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;3.提供一个用于获取示例的方法
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Singleton&nbsp;getInstance()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;instance;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>饿汉模式指第二步时，加载类的同时生成了实例化的对象。特点是加载类时比较慢，但运行时获取对象的速度比较快，线程安全。</p><blockquote><p>Test.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc;
public&nbsp;class&nbsp;Test&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Singleton&nbsp;s1&nbsp;=&nbsp;Singleton.getInstance;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Singleton&nbsp;s2&nbsp;=&nbsp;Singleton.getInstance;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>懒汉模式</p><blockquote><p>Singleton2.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc

public&nbsp;class&nbsp;Singleton2&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1.将构造方法私有化，不允许外部直接创建对象
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Singleton2()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;2.创建类的唯一示例,使用private&nbsp;static修饰
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;Singleton2&nbsp;instance;

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;3.提供一个用于获取示例的方法
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Singleton2&nbsp;getInstance()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(install==null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;=&nbsp;new&nbsp;Singleton2();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;instance;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>懒汉模式指第二步没有实例化对象，而是在第三步，当调用方法，才会判断并进行实例化，特点是加载类时比较快，但运行时获取对象的速度比较慢，线程不安全。</p><p><span style="font-size: 16px;"><strong>模板方法模式</strong></span><br/></p><p>应用场景为模拟制备饮料。制备饮料一共有四个步骤，即为RefreshBeverage.java中注释中写到的四步。泡制饮料和加入调味料在抽象基类中没有提供具体的实现方法，只是定义接口方法，在子类中应用模板方法模式分别实现具体内容。<strong><br/></strong></p><p>第四步加入调味料用到了钩子方法，可以提高代码灵活性，判断子类要泡制的饮料中要不要加入调味料。</p><blockquote><p>RefreshBeverage.java<strong><br/></strong></p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.template;

/**
&nbsp;*&nbsp;抽象基类，为所有子类提供一个算法框架
&nbsp;*&nbsp;
&nbsp;*&nbsp;提神饮料
&nbsp;*/
public&nbsp;abstract&nbsp;class&nbsp;RefreshBeverage&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;制备饮料的模板方法
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;封装了所有子类共同遵循的算法框架
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;final&nbsp;void&nbsp;prepareBeverageTemplate()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;步骤1&nbsp;将水煮沸
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boilWater();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;步骤2&nbsp;泡制饮料
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;brew();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;步骤3&nbsp;将饮料倒入杯中
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pourInCup();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isCustomerWantsCondiments()){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;步骤4&nbsp;加入调味料
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addCondiments();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Hook，钩子函数，提供一个默认或空的实现
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;具体的子类可以自行决定是否挂钩或者如何挂钩
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;询问用户是否加入调料
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;boolean&nbsp;isCustomerWantsCondiments()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;基本方法，将水煮沸
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;boilWater()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;将水煮沸&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;抽象的基本方法，泡制饮料
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;abstract&nbsp;void&nbsp;brew();

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;基本方法，将饮料倒入杯中
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;pourInCup()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;将饮料倒入杯中&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;抽象的基本方法，加入调味料
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;abstract&nbsp;void&nbsp;addCondiments();
}</pre><blockquote><p>Coffee.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.template;

/**
&nbsp;*&nbsp;具体子类，提供了咖啡制备的具体实现
&nbsp;*/
public&nbsp;class&nbsp;Coffee&nbsp;extends&nbsp;RefreshBeverage&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;brew()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;用沸水冲泡咖啡&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;addCondiments()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;加入糖和牛奶&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote><p>Tea.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.template;

/**
&nbsp;*&nbsp;具体子类，提供了制备茶的具体实现
&nbsp;*/
public&nbsp;class&nbsp;Tea&nbsp;extends&nbsp;RefreshBeverage&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;brew()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;用80度的热水浸泡茶叶5分钟&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;addCondiments()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;加入柠檬&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;子类通过覆盖的方式选择挂载钩子函数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;boolean&nbsp;isCustomerWantsCondiments(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>RefreshBeverageTest.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.template;

public&nbsp;class&nbsp;RefreshBeverageTest&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;制备咖啡...&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefreshBeverage&nbsp;b1&nbsp;=&nbsp;new&nbsp;Coffee();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b1.prepareBeverageTemplate();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;咖啡好了！&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;**********************************&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;制备茶...&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefreshBeverage&nbsp;b2&nbsp;=&nbsp;new&nbsp;Tea();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b2.prepareBeverageTemplate();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;茶好了！&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><p>运行结果：<br/></p><pre class="prism-highlight prism-language-java">制备咖啡...
将水煮沸
用沸水冲泡咖啡
将饮料倒入杯中
加入糖和牛奶
咖啡好了！
**********************************
制备茶...
将水煮沸
用80度的热水浸泡茶叶5分钟
将饮料倒入杯中
茶好了！</pre><p>其中用到的钩子方法会使子类更加灵活。</p><p><span style="font-size: 16px;"><strong>适配器模式</strong></span></p><p>应用场景为模拟二相转三相插座适配器，NoteBook需要三相电流供电，但只有二相电流插座，TwoPlugAdapter.java中适配了二相电流。</p><blockquote><p>ThreePlugIf.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.apttern.adapter;
/**
&nbsp;*&nbsp;三相插座接口
&nbsp;*/
public&nbsp;interface&nbsp;ThreePlugIf&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使用三相电流供电
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;powerWithThree(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote><p>GBTwoPlug.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.apttern.adapter;

public&nbsp;class&nbsp;GBTwoPlug&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使用二相电流供电
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;powerWithTwo(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;使用二相电流供电&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote><p>NoteBook.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.apttern.adapter;

public&nbsp;class&nbsp;NoteBook&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;ThreePlugIf&nbsp;plug;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;NoteBook(ThreePlugIf&nbsp;plug){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.plug&nbsp;=&nbsp;plug;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使用插座充电
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;change(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plug.powerWithThree();
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GBTwoPlug&nbsp;two&nbsp;=&nbsp;new&nbsp;GBTwoPlug();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreePlugIf&nbsp;three&nbsp;=&nbsp;new&nbsp;TwoPlugAdapter(two);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoteBook&nbsp;nb&nbsp;=&nbsp;new&nbsp;NoteBook(three);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nb.change();
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote><p>TwoPlugAdapter.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.apttern.adapter;

/**
&nbsp;*&nbsp;二相转三相的插座适配器
&nbsp;*/
public&nbsp;class&nbsp;TwoPlugAdapter&nbsp;implements&nbsp;ThreePlugIf&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;GBTwoPlug&nbsp;plug;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;TwoPlugAdapter(GBTwoPlug&nbsp;plug){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.plug&nbsp;=&nbsp;plug;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;powerWithThree()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;通过转化&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plug.powerWithTwo();
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><p>运行结果：<br/></p><pre class="prism-highlight prism-language-java">通过转化
使用二相电流供电</pre><p><span style="font-size: 16px;"><strong>策略模式</strong></span></p><p>策略模式将可变部分从程序中抽象分离成算法接口，在该接口下分别封装一系列算法实现</p><p>What is composition ?</p><p>在类中增加一个私有域，引用另一个已有的类的实例，通过调用引用实例的方法从而获得新的功能，这种设计被称作组合（复合）。</p><p>策略模式的优点：</p><blockquote><p>1.使用了组合，是架构更加灵活</p><p>2.富有弹性，可以较好的应对变化（开——闭原则）</p><p>3.更好的代码复用性（相对于继承）</p><p>4.消除大量的条件语句</p></blockquote><p>策略模式的缺点：</p><blockquote><p>1.客户代码需要了解每个策略的细节</p><p>2.增加了对象的数目</p></blockquote><p>策略模式的应用场景：</p><blockquote><p>1.许多相关的类仅仅是行为差异</p><p>2.运行时选取不同的算法变体</p><p>3.通过条件语句在多个分支中选取一</p></blockquote><p>代码的应用场景模拟了鸭子的生产过程，鸭子一共有三个行为：展示、鸣叫、飞行。不同的鸭子有不同的飞行行为，使用到了策略模式。<br/></p><blockquote><p>Duck.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.strategy;

/**
&nbsp;*&nbsp;超类，所有的鸭子都要继承此类
&nbsp;*抽象了鸭子的行为：显示和鸣叫
&nbsp;*/
public&nbsp;abstract&nbsp;class&nbsp;Duck&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;鸭子发出叫声
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;通用行为，由超类实现
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;quack(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;嘎嘎嘎&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;显示鸭子的外观
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;鸭子的外观不相同，声明为abstract，由子类实现
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;abstract&nbsp;void&nbsp;display();
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;FlyingStrategy&nbsp;flyingStrategy;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setFlyingStrategy(FlyingStrategy&nbsp;flyingStrategy){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.flyingStrategy&nbsp;=&nbsp;flyingStrategy;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;fly(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flyingStrategy.performFly();
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote><p>FlyingStrategy.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.strategy;

/**
&nbsp;*&nbsp;策略接口，实现鸭子的飞行行为
&nbsp;*/
public&nbsp;interface&nbsp;FlyingStrategy&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;performFly();
}</pre><blockquote><p>MallardDuck.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.strategy;

import&nbsp;com.imooc.pattern.strategy.impl.FlyWithWin;

//&nbsp;绿脖鸭
public&nbsp;class&nbsp;MallardDuck&nbsp;extends&nbsp;Duck&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MallardDuck(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.setFlyingStrategy(new&nbsp;FlyWithWin());
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;display()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;我的脖子是绿色的&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>RedheadDuck.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.strategy;

import&nbsp;com.imooc.pattern.strategy.impl.FlyWithWin;

//&nbsp;红头鸭
public&nbsp;class&nbsp;RedheadDuck&nbsp;extends&nbsp;Duck&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RedheadDuck(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.setFlyingStrategy(new&nbsp;FlyWithWin());
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;display()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;我的头是红色的&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>RubberDuck.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.strategy;

import&nbsp;com.imooc.pattern.strategy.impl.FlyNoWay;

//&nbsp;橡胶鸭
public&nbsp;class&nbsp;RubberDuck&nbsp;extends&nbsp;Duck&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RubberDuck(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.setFlyingStrategy(new&nbsp;FlyNoWay());
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;display()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;我全身发黄，嘴巴很红&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;quack(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;叫声稍有不同，复写了父类方法
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;嘎~嘎~嘎~&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>不同的飞行策略类：</p><blockquote><p>FlyWithWin.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.strategy.impl;

import&nbsp;com.imooc.pattern.strategy.FlyingStrategy;

public&nbsp;class&nbsp;FlyWithWin&nbsp;implements&nbsp;FlyingStrategy&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;performFly()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;振翅高飞&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>FlyNoWay.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.strategy.impl;

import&nbsp;com.imooc.pattern.strategy.FlyingStrategy;

public&nbsp;class&nbsp;FlyNoWay&nbsp;implements&nbsp;FlyingStrategy&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;performFly()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;我不会飞行！&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><p>最后测试生产出的鸭子：<br/></p><blockquote><p>DuckTest.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.pattern.strategy;

public&nbsp;class&nbsp;DuckTest&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;测试鸭子程序&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Duck&nbsp;duck&nbsp;=&nbsp;null;
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck&nbsp;=&nbsp;new&nbsp;MallardDuck();
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck&nbsp;=&nbsp;new&nbsp;RedheadDuck();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck&nbsp;=&nbsp;new&nbsp;RubberDuck();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck.display();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck.quack();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck.fly();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;测试完毕&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>运行结果:</p><pre class="prism-highlight prism-language-java">测试鸭子程序
我全身发黄，嘴巴很红
嘎~嘎~嘎~
我不会飞行！
测试完毕</pre><p>这样就用JAVA实现了策略模式。</p><p><span style="font-size: 16px;"><strong>代理模式</strong></span></p><blockquote><p>远程代理：为不同地理的对象提供局域网代表对象</p><p>虚拟代理：根据需要将资源消耗很大的对象进行延迟，真正需要的时候进行创建</p><p>保护代理：控制用户的访问权限</p><p>智能引用代理：提供对目标对象额外服务</p></blockquote><p><span style="font-size: 14px;">应用场景模拟了汽车行驶时间的显示和日志记录两个功能。</span><br/></p><blockquote><p><span style="font-size: 14px;">Moveable.java</span></p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.proxy;

//&nbsp;接口文件
public&nbsp;interface&nbsp;Moveable&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;move();
}</pre><blockquote><p><span style="font-size: 14px;"></span>Car.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.proxy;

import&nbsp;java.util.Random;

public&nbsp;class&nbsp;Car&nbsp;implements&nbsp;Moveable&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;move()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;实现开车
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(new&nbsp;Random().nextInt(1000));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;汽车行驶中……&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(InterruptedException&nbsp;e){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
}</pre><blockquote><p>Car2.java<span style="font-size: 14px;"></span><br/></p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.proxy;

//&nbsp;实现汽车行驶时间
public&nbsp;class&nbsp;Car2&nbsp;extends&nbsp;Car&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;move(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;strattime&nbsp;=&nbsp;System.currentTimeMillis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;汽车开始行驶……&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.move();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endtime&nbsp;=&nbsp;System.currentTimeMillis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;汽车结束行驶中……&nbsp;汽车行驶时间：&quot;+(endtime-strattime)+&quot;毫秒！&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote><p><span style="font-size: 14px;"></span></p><p>Car3.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.proxy;

//&nbsp;时间代理实现汽车行驶时间
public&nbsp;class&nbsp;Car3&nbsp;implements&nbsp;Moveable&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Car3(Car&nbsp;car)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.car&nbsp;=&nbsp;car;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Car&nbsp;car;

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;move(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;strattime&nbsp;=&nbsp;System.currentTimeMillis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;汽车开始行驶……&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;car.move();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endtime&nbsp;=&nbsp;System.currentTimeMillis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;汽车结束行驶中……&nbsp;汽车行驶时间：&quot;+(endtime-strattime)+&quot;毫秒！&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>Car4.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.proxy;

//&nbsp;增加log记录代理
public&nbsp;class&nbsp;Car4&nbsp;implements&nbsp;Moveable&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Car4(Moveable&nbsp;m)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.m&nbsp;=&nbsp;m;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Moveable&nbsp;m;

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;move(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;日志开始……&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.move();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;日志结束……&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>Client.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.proxy;

/**
&nbsp;*&nbsp;测试类
&nbsp;*/
public&nbsp;class&nbsp;Client&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;直接
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car&nbsp;car&nbsp;=&nbsp;new&nbsp;Car();
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;car.move();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使用集成方法
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Moveable&nbsp;m&nbsp;=&nbsp;new&nbsp;Car2();
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.move();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使用聚合方法
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car&nbsp;car&nbsp;=&nbsp;new&nbsp;Car();
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Moveable&nbsp;m&nbsp;=&nbsp;new&nbsp;Car3(car);
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.move();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;增加日志记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car&nbsp;car&nbsp;=&nbsp;new&nbsp;Car();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car3&nbsp;ctp&nbsp;=&nbsp;new&nbsp;Car3(car);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car4&nbsp;clp&nbsp;=&nbsp;new&nbsp;Car4(ctp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clp.move();
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>运行结果像这样：<br/></p><pre class="prism-highlight prism-language-java">日志开始……
汽车开始行驶……
汽车行驶中……
汽车结束行驶中……&nbsp;汽车行驶时间：497毫秒！
日志结束……</pre><p>下面使用动态代理来是代码更灵活（<strong>有错误</strong>）。</p><blockquote><p>TimeHandler.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.jdkproxy;

import&nbsp;java.lang.reflect.InvocationHandler;
import&nbsp;java.lang.reflect.Method;

import&nbsp;com.imooc.proxy.Car;

/**
&nbsp;*&nbsp;JDK动态代理
&nbsp;*&nbsp;只能代理实现了接口的类
&nbsp;*&nbsp;没有实现接口的类不能实现JDK的动态代理
&nbsp;*/
public&nbsp;class&nbsp;TimeHandler&nbsp;implements&nbsp;InvocationHandler&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;TimeHandler(Object&nbsp;target){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.target&nbsp;=&nbsp;target;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Object&nbsp;target;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;proxy&nbsp;被代理对象
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;method&nbsp;被代理的方法
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;args&nbsp;方法的参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;返回值
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Object&nbsp;方法的返回值
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;@Override
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Object&nbsp;invoke(Object&nbsp;arg0,&nbsp;Method&nbsp;arg1,&nbsp;Object[]&nbsp;arg2)&nbsp;throws&nbsp;Throwable&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;strattime&nbsp;=&nbsp;System.currentTimeMillis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;汽车开始行驶……&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(target);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endtime&nbsp;=&nbsp;System.currentTimeMillis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;汽车结束行驶中……&nbsp;汽车行驶时间：&quot;+(endtime-strattime)+&quot;毫秒！&quot;);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;
&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>Test.java</p></blockquote><pre class="prism-highlight prism-language-java">package&nbsp;com.imooc.jdkproxy;

import&nbsp;java.lang.reflect.InvocationHandler;
import&nbsp;java.lang.reflect.Proxy;

import&nbsp;com.imooc.proxy.Car;
import&nbsp;com.imooc.proxy.Moveable;

/**
&nbsp;*&nbsp;JDK动态代理测试类
&nbsp;*/
public&nbsp;class&nbsp;Test&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car&nbsp;car&nbsp;=&nbsp;new&nbsp;Car();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvocationHandler&nbsp;h&nbsp;=&nbsp;new&nbsp;TimeHandler(car);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;?&gt;&nbsp;cls&nbsp;=&nbsp;car.getClass();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;loader&nbsp;类加载器
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;interface&nbsp;实现节后
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;h&nbsp;InvocationHander
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Moveable&nbsp;m&nbsp;=&nbsp;(Moveable)Proxy.newProxyInstance(cls.getClassLoader(),&nbsp;cls.getInterfaces(),&nbsp;h);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.move();
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p><span style="font-size: 14px;">etc.<br/></span></p>]]></description>
      <pubDate>Sat, 11 Feb 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>PHP中多种常用的设计模式举例</title>
      <link>http://old-blog.smallyu.net/index2580.html?id=43</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=43</guid>
      <description><![CDATA[<div style="border: 1px solid #968A8A;padding: 5px;z-index: 2;background: rgba(245, 242, 240, 0.50);position:fixed;right:0;bottom:0;"><a href="#1">适配器模式</a><br/><a href="#2">策略模式</a><br/><a href="#3">数据对象映射模式</a><br/><a href="#4">观察者模式</a><br/><a href="#5">原型模式</a><br/><a href="#6">装饰器模式</a><br/><a href="#7">迭代器模式</a><br/><a href="#8">代理模式</a></div><p><strong><a name="1"></a>适配器模式</strong><br/></p><blockquote style="white-space: normal;"><p>1.适配器模式，可以将截然不同的函数接口封装成统一的API</p><p>2.实际应用举例，PHP的数据库操作有mysql,musqli,pdo三种，可以用适配器模式统一成一致。类似的场景还有cache适配器，将memcache，redis，file，apc等不同的缓存函数，统一成一致</p></blockquote><blockquote style="white-space: normal;"><p>Database.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
interdace&nbsp;IDatabase{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname);
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;query($sql);
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;close();
}</pre><p style="white-space: normal;">在Database.php中定义了数据库操作的接口，接下来将MySQL、MySQLi、PDO三种数据库操作适配为接口中定义的方法。</p><blockquote style="white-space: normal;"><p>MySQL.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
namespace&nbsp;Database;
class&nbsp;MySQL&nbsp;implements&nbsp;IDatabase{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$conn&nbsp;=&nbsp;mysql_connect($host,&nbsp;$user,&nbsp;$passwd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_select_db($dbname,&nbsp;$conn);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;conn&nbsp;=&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;query($sql){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;mysql_query($sql,&nbsp;$this-&gt;conn);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$res;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;close(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_close($this-&gt;conn);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote style="white-space: normal;"><p>MySQLi.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
namespace&nbsp;Database;
class&nbsp;MySQLi&nbsp;implements&nbsp;IDatabase{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$conn&nbsp;=&nbsp;mysqli_connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;conn&nbsp;=&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;query($sql){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;mysqli_query($this-&gt;conn,&nbsp;$sql);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$res;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;close(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysqli_close($this-&gt;conn);
&nbsp;&nbsp;&nbsp;&nbsp;}</pre><blockquote style="white-space: normal;"><p>PDO.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
namespace&nbsp;Database;
class&nbsp;PDO&nbsp;implements&nbsp;IDatabase{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;\PDO(&quot;mysql:host=$host;dbname=$dbname&quot;,&nbsp;$user,&nbsp;$passwd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;conn&nbsp;=&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;query($sql){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;conn-&gt;query($sql);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;close(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($this-&gt;conn);
&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p style="white-space: normal;">然后在应用中可以这样使用：</p><blockquote style="white-space: normal;"><p>index.php<br/></p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$db&nbsp;=&nbsp;new&nbsp;Database\MySQL();
$db-&gt;connect(&#39;localhost&#39;,&nbsp;&#39;root&#39;,&nbsp;&#39;root&#39;,&nbsp;&#39;test&#39;);
$db-&gt;query(&#39;show&nbsp;database&#39;);
$db-&gt;close();</pre><p style="white-space: normal;">或者实例化其他类型的数据库，只需要使用同一种标准。</p><p style="white-space: normal;"><strong><a name="2"></a>策略模式</strong></p><blockquote style="white-space: normal;"><p>1.策略模式，将一组特定行为和算法封装成类，以适应某些特定的上下文环境，这种模式就是策略模式</p><p>2.实际应用举例，假如一个电商网站系统，针对男性女性用户要各自跳转到不同的商品类目，并且所有广告位展示不同的广告</p><p>3.使用策略模式可以实现Ioc，依赖倒置、控制反转</p></blockquote><blockquote style="white-space: normal;"><p>UserStrategy.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
interface&nbsp;UserStrategy&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;showAd();
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;showCategory();
}</pre><p style="white-space: normal;">UserStrategy.php文件定义了用户策略的接口，面对不同的用户将分别实现相应的内容。</p><blockquote style="white-space: normal;"><p>FemaleUserStrategy.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;FemaleUserStrategy&nbsp;implements&nbsp;UserStrategy&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;showAd()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;2017新款女装&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;showCategory()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;女装&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote style="white-space: normal;"><p>MaleUserStrategy.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;MaleUserStrategy&nbsp;implements&nbsp;UserStrategy&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;showAd()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;IPhone7&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;showCategory()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;电子产品&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p style="white-space: normal;">在index.php中这样做就可以实现从硬编码到实现解耦，即不需要修改Page类的内容，只需要传递不同的参数。</p><blockquote style="white-space: normal;"><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Page&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;index()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;AD:&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;strategy-&gt;showAd();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;Category:&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;strategy-&gt;showCategory();
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;setStrategy(UserStrategy&nbsp;$strategy)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;strategy&nbsp;=&nbsp;$strategy;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
$page&nbsp;=&nbsp;new&nbsp;Page();
if&nbsp;(isset($_GET[&#39;female&#39;]))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;$strategy&nbsp;=&nbsp;new&nbsp;FemaleUserStrategy();
}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;$strategy&nbsp;=&nbsp;new&nbsp;MaleUserStrategy();
}
$page-&gt;setStrategy($strategy);
$page-&gt;index();</pre><p><strong><a name="3"></a>数据对象映射模式</strong><br/></p><p style="white-space: normal;">数据对象映射模式，是将对象和数据存储映射起来，对一个对象的操作会映射为对数据存储的操作。</p><p style="white-space: normal;">在下面的代码中实现数据对象映射模式，我们将实现一个ORM类，将复杂的SQL语句映射成对象属性的操作。</p><blockquote style="white-space: normal;"><p>User.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;User&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;$id;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;$mobile;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;$regtime;

&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$db;

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;__construct($id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据库查询操作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;db&nbsp;=&nbsp;new&nbsp;MySQLi();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;db-&gt;connect(&#39;localhost&#39;,&nbsp;&#39;root&#39;,&nbsp;&#39;root&#39;,&nbsp;&#39;test1&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;$this-&gt;db-&gt;query(&quot;select&nbsp;*&nbsp;from&nbsp;user&nbsp;where&nbsp;id={$this-&gt;id}&nbsp;limit&nbsp;1&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;$res-&gt;fetch_assoc();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;id&nbsp;=&nbsp;$data[&#39;id&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;name&nbsp;=&nbsp;$data[&#39;name&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;mobile&nbsp;=&nbsp;$data[&#39;imobile];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;regtime&nbsp;=&nbsp;$data[regtimed&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;__destruct()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据库写入操作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;db-&gt;query(&quot;update&nbsp;user&nbsp;set&nbsp;name&nbsp;=&nbsp;&#39;{$this-&gt;name}&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mobile=&#39;{$this-&gt;mobile}&#39;,&nbsp;regtime=&#39;{$this-&gt;regtime}&#39;&nbsp;where&nbsp;id&nbsp;=&nbsp;{$this-&gt;id}&nbsp;limit&nbsp;1&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p style="white-space: normal;">这样来使用：</p><blockquote style="white-space: normal;"><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$user&nbsp;=&nbsp;new&nbsp;User(1);
$user-&gt;mobile&nbsp;=&nbsp;&#39;18812345678&#39;;
$user-&gt;name&nbsp;=&nbsp;&#39;test&#39;;
$user-&gt;regtime&nbsp;=&nbsp;date(&#39;Y-m-d&nbsp;H:i:s&#39;);</pre><p style="white-space: normal;">下面结合使用数据对象映射模式，工厂模式，注册器模式：</p><blockquote style="white-space: normal;"><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Page&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;index()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user&nbsp;=&nbsp;Factory::getUser(1);&nbsp;//&nbsp;工厂模式的实现
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user-&gt;name&nbsp;=&nbsp;&#39;rango&#39;;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;test();
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;test()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user&nbsp;=&nbsp;Factory::getUser(1);&nbsp;//&nbsp;工厂模式的实现
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user-&gt;mobile&nbsp;=&nbsp;&#39;18844448888&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
$page&nbsp;=&nbsp;new&nbsp;Page();</pre><blockquote style="white-space: normal;"><p>Factory.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Factory&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;function&nbsp;getUser($id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;注册器模式的实现
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;&#39;user_&#39;.$id;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user&nbsp;=&nbsp;Register::get($key);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!user)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user&nbsp;=&nbsp;new&nbsp;User($id);&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Register::set($key,$user);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$user;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p style="white-space: normal;"><strong><a name="4"></a>观察者模式</strong></p><blockquote><p>1.观察者模式（Observer），当一个对象状态发生改变时，依赖它的对象全部会收到通知，并自动更新</p><p>2.场景：一个事件发生后，要执行一连串更新操作，传统的编程方式，就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后，代码会变得难以维护。这种方式是耦合的，侵入式的，增加新的逻辑需要修改事件主体的代码</p><p>3.观察者模式实现了低耦合，非侵入式的通知与更新机制</p></blockquote><blockquote style="white-space: normal;"><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Event&nbsp;extends&nbsp;EventGenerator&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;trigger()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;Event&lt;br&nbsp;/&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;notify();
&nbsp;&nbsp;&nbsp;&nbsp;}
}

class&nbsp;Observer1&nbsp;implements&nbsp;Obsrver&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;update($event_info&nbsp;=&nbsp;null)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;逻辑1&lt;br&nbsp;/&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
}

class&nbsp;Observer2&nbsp;implements&nbsp;Obsrver&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;update($event_info&nbsp;=&nbsp;null)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;逻辑2&lt;br&nbsp;/&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
}

$event&nbsp;=&nbsp;new&nbsp;Event;
$event-&gt;addObserver(new&nbsp;Observer1);&nbsp;//&nbsp;观察者模式的实现
$event-&gt;addObserver(new&nbsp;Observer2);&nbsp;//&nbsp;观察者模式的实现
$event-&gt;trigger();</pre><blockquote style="white-space: normal;"><p>EventGenerator.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
abstract&nbsp;class&nbsp;EventGenerator&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$observers&nbsp;=&nbsp;array();

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;addObserver(Observer&nbsp;$observer)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;observers[]&nbsp;=&nbsp;$observer;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;notify()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach($this-&gt;observers&nbsp;as&nbsp;$ovserver)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$observer-&gt;update();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote style="white-space: normal;"><p>Observer.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
interface&nbsp;Observer&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;update($event_info&nbsp;=&nbsp;null);
}</pre><p style="white-space: normal;"><strong><a name="5"></a>原型模式</strong></p><blockquote><p>1.与工厂模式作用类似，都是用来创建对象</p><p>2.与工厂模式的实现不同，原型模式是先创建好一个原型对象，然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作</p><p>3.原型模式适用于大对象的创建。创建一个大对象需要很大的开销，如果每次new就会消耗很大，原型模式内存拷贝即可</p></blockquote><blockquote style="white-space: normal;"><p>Canvas.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Canvas&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;...
}</pre><p style="white-space: normal;">index.php将实例化Canvas类以实现图像绘制，并使用关键字clone实现原型模式：<br/></p><blockquote style="white-space: normal;"><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$prototype&nbsp;=&nbsp;new&nbsp;Canvas();
$prototype-&gt;init();

//&nbsp;原型模式的实现
$canvas1&nbsp;=&nbsp;clone&nbsp;$prototype;
$canvas2&nbsp;=&nbsp;clone&nbsp;$prototype;

$canvas1-&gt;rect(1,2,3,4);
$canvas1-&gt;draw();
$canvas2-&gt;rect(5,6,7,8);
$canvas2-&gt;draw();</pre><p style="white-space: normal;"><strong><a name="6"></a>装饰器模式</strong></p><blockquote><p>1.装饰器模式（Decorator），可以动态地添加修改类的功能</p><p>2.一个类提供了一项功能，如果要在修改并添加额外的功能，传统的编程模式，需要写一个子类继承它，并重新实现类的方法</p><p>3.使用装饰器模式，仅需要在运行时添加一个装饰器对象即可实现，可以实现最大的灵活性</p></blockquote><blockquote><p>DrawDecorator.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
interface&nbsp;DrawDecorator&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;beforeDraw();
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;afterDraw();
}</pre><p style="white-space: normal;">DrawDecorator.php定义了装饰器的接口，将会在装饰器类中用到。</p><blockquote style="white-space: normal;"><p>Canvas.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Canvas&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$decorator&nbsp;=&nbsp;array();

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;draw()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;装饰器模式实现点
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;beforeDraw();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;afterDraw();
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;addDecorator(DrawDecorator&nbsp;$decorator)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;decorators[]&nbsp;=&nbsp;$decorator;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;beforeDraw()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach($this-&gt;decorators&nbsp;as&nbsp;$decorator)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$decorator-&gt;beforeDraw();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;fucntion&nbsp;afterDraw()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$decorators&nbsp;=&nbsp;array_reverse($this-&gt;decorators);&nbsp;//&nbsp;反转，后进先出
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach($decorators&nbsp;as&nbsp;$decorator)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$decorator-&gt;afterDraw();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote style="white-space: normal;"><p>ColorDrawDecorator.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
//&nbsp;第一个装饰器：颜色装饰器
class&nbsp;ColorDrawDecortor&nbsp;implements&nbsp;DrawDecorator&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;beforeDraw()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;afterDraw()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p style="white-space: normal;"><strong><a name="7"></a>迭代器模式</strong></p><blockquote><p>1.迭代器模式，在不需要了解内部实现的前提下，遍历一个聚合对象的内部元素</p><p>2.相比于传统的编程模式，迭代器模式可以隐藏遍历元素所需的操作</p></blockquote><blockquote style="white-space: normal;"><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$users&nbsp;=&nbsp;new&nbsp;AllUser();
foreach($users&nbsp;as&nbsp;$user)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;var_dump($user);
}</pre><p style="white-space: normal;">迭代器的实现：</p><blockquote style="white-space: normal;"><p>AllUser.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$canvas1&nbsp;=&nbsp;new&nbsp;Canvas();
$canvas1-&gt;init();
$canvas1-&gt;addDecorator(new&nbsp;ColorDrawDecortor());&nbsp;//&nbsp;添加装饰器
$canvas1-&gt;draw();</pre><p style="white-space: normal;">这样来使用：</p><blockquote style="white-space: normal;"><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;AllUser&nbsp;implements&nbsp;\Iterator&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$ids;
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$data&nbsp;=&nbsp;array();
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$index;

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;__construct()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$db&nbsp;=&nbsp;Factory::getDatabase();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;$db-&gt;query(&#39;select&nbsp;id&nbsp;from&nbsp;user&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;ids&nbsp;=&nbsp;$result-&gt;fetch_all(MUSQLI_ASSOC);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;current()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$id&nbsp;=&nbsp;$this-&gt;ids[$this-&gt;index][&#39;id&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Factory::getUser($id);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;next()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;index&nbsp;++;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;valid()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;id&nbsp;&lt;&nbsp;count($this-&gt;ids);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;rewind()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;index&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;key()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;index;
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
}</pre><p style="white-space: normal;"><strong><a name="8"></a>代理模式</strong></p><blockquote><p style="white-space: normal;">1.在客户端与实体之间建立一个代理对象（proxy），客户端对实体进行操作全部委派给代理对象，隐藏实体的具体实现细节</p><p>2.Proxy还可以与业务代码分离，部署到另外的服务器，业务代码中通过RPC来委派任务</p></blockquote><blockquote style="white-space: normal;"><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">$proxy&nbsp;=&nbsp;new&nbsp;Proxy();
$proxy-&gt;getUserName();
$proxy-&gt;setUserName($id,&nbsp;$proxy);</pre><blockquote style="white-space: normal;"><p>Proxy.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Procy&nbsp;implemets&nbsp;IUserProxy&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;getUserName($id)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$db&nbsp;=&nbsp;Factory::getDatabase(&#39;slave&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$db-&gt;query(&#39;select&nbsp;name&nbsp;from&nbsp;user&nbsp;where&nbsp;id&nbsp;=&nbsp;1&nbsp;limit&nbsp;1&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;setUserName($id,&nbsp;$name)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$db1&nbsp;=&nbsp;Factory::getDatabase(&#39;master&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$db-&gt;query(&#39;update&nbsp;user&nbsp;name&nbsp;=&nbsp;$name&nbsp;from&nbsp;user&nbsp;where&nbsp;id&nbsp;=&nbsp;1&nbsp;limit&nbsp;1&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote style="white-space: normal;"><p>IUserProxy.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
interface&nbsp;IUserName&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;getUserName($id);
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;setUserName($id,&nbsp;$name);
}</pre>]]></description>
      <pubDate>Wed, 25 Jan 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>PHP面向对象编程的基本原则，以及三种基本设计模式</title>
      <link>http://old-blog.smallyu.net/index7df0.html?id=41</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=41</guid>
      <description><![CDATA[<p><strong>面向对象编程的基本原则</strong><br/></p><blockquote style="white-space: normal;"><p>1.单一职责：一个类，只需要做好一件事情</p><p>2.开放封闭：一个类，应该是可扩展的，而不可修改的</p><p>3.依赖倒置：一个类，不应该强依赖另一个类。每个类对于另外一个类都是可替换的</p><p>4.配置化：尽可能地使用配置，而不是硬编码</p><p>5.面向接口编程：只需要关心接口，不需要关心实现</p></blockquote><p style="white-space: normal;"><strong>PSR-0命名规范</strong></p><blockquote><p style="white-space: normal;">1. 命名空间必须与绝对路径一致</p><p style="white-space: normal;">2. 类名首字母必须大写<br/>3. 除入口文件外，其他“.php”必须只有一个类</p></blockquote><p style="white-space: normal;"><strong>开发符合PSR-0规范的基础框架</strong></p><blockquote><p style="white-space: normal;">1. 全部使用明明空间<br/>2. 所有PHP文件必须自动载入，不能有include/require<br/>3. 单一入口</p></blockquote><p><strong>类的自动载入</strong></p><blockquote><p>Test1.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

class&nbsp;Test1{

&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;function&nbsp;test(){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;__METHOD__;

&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>Test2.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

class&nbsp;Test2{

&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;function&nbsp;test(){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;__METHOD__;

&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><blockquote><p>test.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

spl_autoload_register(&#39;autoload1&#39;);

spl_autoload_register(&#39;autoload2&#39;);

function&nbsp;autoload1($class){

&nbsp;&nbsp;&nbsp;&nbsp;require&nbsp;__DIR__.&#39;/&#39;.$class.&#39;.php&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;
}

function&nbsp;autoload2($class){

&nbsp;&nbsp;&nbsp;&nbsp;require&nbsp;__DIR__.&#39;/&#39;.$class.&#39;.php&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;
}

Test1::test();

Test2::test();</pre><p>&nbsp;运行test.php会得到这样的结果：</p><pre class="prism-highlight prism-language-php">Test1::testTest2::test</pre><p>__autoload()函数只可以存在一个，如果重复定义会报致命错误，所以目前一般使用spl_autoload_regisiter()来实现类的自动加载。</p><p><strong>PHP链式调用的实现</strong></p><blockquote><p>Database.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

class&nbsp;Database{

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;where($where){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;order($order){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;limit($limit){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...

&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><p>如果Database.php是这样，那么在index.php中就需要这样来写以实现sql查询：</p><blockquote><p>index.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

$db=new&nbsp;Database();

$db-&gt;where(&quot;id=2&quot;);

$db-&gt;where(&quot;name=2&quot;);

$db-&gt;order(&quot;id&nbsp;desc&quot;);

$db-&gt;limit(10);</pre><p>&nbsp;要实现链式调用只需要这样做：</p><blockquote><p>Database.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

class&nbsp;Database{

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;where($where){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;order($order){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;limit($limit){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this;

&nbsp;&nbsp;&nbsp;&nbsp;}

}</pre><p>在每个方法的末尾加上&#39;return $this;&#39;，然后就可以：</p><blockquote><p>Data</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php

$db-&gt;where(&quot;id=1&quot;)-&gt;where(&quot;name=2&quot;)-&gt;order(&quot;id&nbsp;desc&quot;)-&gt;limit(10);</pre><p>三种基础的设计模式包括工厂模式、单例模式和注册器模式。</p><p style="white-space: normal;"><strong>工厂模式</strong></p><blockquote style="white-space: normal;"><p>Factory.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Factory{
&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;function&nbsp;createDatabase(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$db&nbsp;=&nbsp;new&nbsp;Database();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$db;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
$db&nbsp;=&nbsp;Factory::createDatabase();</pre><p style="white-space: normal;">工厂模式的作用在于不在类外实例化对象。</p><p style="white-space: normal;"><strong>单例模式</strong></p><blockquote style="white-space: normal;"><p>Database.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Database{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$db;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;第一步
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;__construct(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;private可以屏蔽外部new这个类
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;第二步
&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;function&nbsp;getInstance(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(self::$db){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::$db;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$db&nbsp;=&nbsp;new&nbsp;self();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::$db;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}
$db&nbsp;=&nbsp;Database::getInstance();</pre><p style="white-space: normal;">单例模式用于数据库连接等只需要一个对象的场景，避免资源的浪费。</p><p style="white-space: normal;"><strong>注册器模式</strong></p><blockquote style="white-space: normal;"><p>Register.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
class&nbsp;Register{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;static&nbsp;$objects;
&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;function&nbsp;set($name,&nbsp;$object){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::objects[$name]&nbsp;=&nbsp;$object;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;function&nbsp;get($name){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self::objects[$name];
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;function&nbsp;_unset($name){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset(self::objects[$name]);
&nbsp;&nbsp;&nbsp;&nbsp;}
}
Register::set(&#39;db1&#39;,$db);
$db&nbsp;=&nbsp;Register::get(&#39;$db1&#39;);</pre><p style="white-space: normal;"><strong>适配器模式</strong></p><blockquote><p style="white-space: normal;">1.适配器模式，可以将截然不同的函数接口封装成统一的API</p><p style="white-space: normal;">2.实际应用举例，PHP的数据库操作有mysql,musqli,pdo三种，可以用适配器模式统一成一致。类似的场景还有cache适配器，将memcache，redis，file，apc等不同的缓存函数，统一成一致</p></blockquote><blockquote style="white-space: normal;"><p>Database.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
interdace&nbsp;IDatabase{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname);
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;query($sql);
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;close();
}</pre><p style="white-space: normal;">在Database.php中定义了数据库操作的接口，接下来将MySQL、MySQLi、PDO三种数据库操作适配为接口中定义的方法。</p><blockquote style="white-space: normal;"><p>MySQL.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
namespace&nbsp;Database;
class&nbsp;MySQL&nbsp;implements&nbsp;IDatabase{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$conn&nbsp;=&nbsp;mysql_connect($host,&nbsp;$user,&nbsp;$passwd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_select_db($dbname,&nbsp;$conn);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;conn&nbsp;=&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;query($sql){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;mysql_query($sql,&nbsp;$this-&gt;conn);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$res;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;close(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_close($this-&gt;conn);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><blockquote style="white-space: normal;"><p>MySQLi.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
namespace&nbsp;Database;
class&nbsp;MySQLi&nbsp;implements&nbsp;IDatabase{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$conn&nbsp;=&nbsp;mysqli_connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;conn&nbsp;=&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;query($sql){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;mysqli_query($this-&gt;conn,&nbsp;$sql);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$res;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;close(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysqli_close($this-&gt;conn);
&nbsp;&nbsp;&nbsp;&nbsp;}</pre><blockquote style="white-space: normal;"><p>PDO.php</p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
namespace&nbsp;Database;
class&nbsp;PDO&nbsp;implements&nbsp;IDatabase{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$passwd,&nbsp;$dbname){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;\PDO(&quot;mysql:host=$host;dbname=$dbname&quot;,&nbsp;$user,&nbsp;$passwd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;conn&nbsp;=&nbsp;$conn;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;query($sql){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;conn-&gt;query($sql);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;close(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($this-&gt;conn);
&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p style="white-space: normal;">然后在应用中可以这样使用：</p><blockquote style="white-space: normal;"><p>index.php<br/></p></blockquote><pre class="prism-highlight prism-language-php">&lt;?php
$db&nbsp;=&nbsp;new&nbsp;Database\MySQL();
$db-&gt;connect(&#39;localhost&#39;,&nbsp;&#39;root&#39;,&nbsp;&#39;root&#39;,&nbsp;&#39;test&#39;);
$db-&gt;query(&#39;show&nbsp;database&#39;);
$db-&gt;close();</pre><p style="white-space: normal;">或者实例化其他类型的数据库，只需要使用同一种标准。</p>]]></description>
      <pubDate>Tue, 24 Jan 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>一个简单的验证码生成类（PHP）</title>
      <link>http://old-blog.smallyu.net/indexab5e.html?id=40</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=40</guid>
      <description><![CDATA[<p>可配置项：<br/></p><pre class="prism-highlight prism-language-php">/**
&nbsp;*&nbsp;$_fontfile=&#39;&#39;;&nbsp;//&nbsp;字体文件
&nbsp;*&nbsp;$_size=20;&nbsp;//&nbsp;字体大小
&nbsp;*&nbsp;$_width=120;&nbsp;//&nbsp;画布宽度
&nbsp;*&nbsp;$_height=40;&nbsp;//&nbsp;画布高度
&nbsp;*&nbsp;$_length=4;&nbsp;//&nbsp;验证码长度
&nbsp;*&nbsp;$_image=null;&nbsp;//&nbsp;画布资源
&nbsp;*&nbsp;//&nbsp;干扰元素&nbsp;
&nbsp;*&nbsp;$_snow=0;&nbsp;//&nbsp;雪花个数
&nbsp;*&nbsp;$_pixel=0;&nbsp;//&nbsp;像素个数
&nbsp;*&nbsp;$_line=0;&nbsp;//&nbsp;线段个数
&nbsp;*/</pre><p>其中字体文件路径必须配置。</p><blockquote><p><span style="text-decoration: underline;">Captcha.class.php</span><br/></p></blockquote><pre class="prism-highlight prism-language-php">Class&nbsp;Captcha{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;字体文件
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_fontfile=&#39;&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;字体大小
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_size=20;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;画布宽度
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_width=120;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;画布高度
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_height=40;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;验证码长度
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_length=4;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;画布资源
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_image=null;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;干扰元素&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;雪花个数
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_snow=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;像素个数
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_pixel=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;线段个数
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_line=0;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;初始化数据
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;array&nbsp;$config&nbsp;[description]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__construct($config=array()){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_array($config)&amp;&amp;count($config)&gt;0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;检测字体文件是否存在并且可读
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($config[&#39;fontfile&#39;])&amp;&amp;is_file($config[&#39;fontfile&#39;])&amp;&amp;is_readable($config[&#39;fontfile&#39;])){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_fontfile=$config[&#39;fontfile&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;检测是否设置字体大小
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($config[&#39;size&#39;])&amp;&amp;$config[&#39;size&#39;]&gt;0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_size=(int)$config[&#39;size&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;检测是否设置画布宽和高
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($config[&#39;width&#39;])&amp;&amp;$config[&#39;width&#39;]&gt;0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_width=(int)$config[&#39;width&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($config[&#39;height&#39;])&amp;&amp;$config[&#39;height&#39;]&gt;0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_height=(int)$config[&#39;height&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;检测是否设置验证码长度
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($config[&#39;length&#39;])&amp;&amp;$config[&#39;length&#39;]&gt;0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_length=(int)$config[&#39;length&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;配置干扰元素
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($config[&#39;snow&#39;])&amp;&amp;$config[&#39;snow&#39;]&gt;0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_snow=(int)$config[&#39;snow&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($config[&#39;pixel&#39;])&amp;&amp;$config[&#39;pixel&#39;]&gt;0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_pixel=(int)$config[&#39;pixel&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($config[&#39;line&#39;])&amp;&amp;$config[&#39;line&#39;]&gt;0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_line=(int)$config[&#39;line&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_image=imagecreatetruecolor($this-&gt;_width,&nbsp;$this-&gt;_height);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;_image;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到验证码
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;[type]&nbsp;[description]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;getCaptcha(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$white=imagecolorallocate($this-&gt;_image,&nbsp;255,&nbsp;255,&nbsp;255);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;填充矩形
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagefilledrectangle($this-&gt;_image,&nbsp;0,&nbsp;0,&nbsp;$this-&gt;_width,&nbsp;$this-&gt;_height,&nbsp;$white);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;生成验证码
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$str=$this-&gt;_generateStr($this-&gt;_length);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(false==$str){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fontfile=$this-&gt;_fontfile;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;绘制验证码
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i=0;$i&lt;$this-&gt;_length;$i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$size=$this-&gt;_size;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$angle=mt_rand(-30,30);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$x=ceil($this-&gt;_width/$this-&gt;_length)*$i+mt_rand(5,10);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$y=ceil($this-&gt;_height/1.5);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$color=$this-&gt;_getRandColor();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;$text=mb_substr($str,$i,1,&#39;utf-8&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$text=$str{$i};
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagettftext($this-&gt;_image,&nbsp;$size,&nbsp;$angle,&nbsp;$x,&nbsp;$y,&nbsp;$color,&nbsp;$fontfile,&nbsp;$text);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($this-&gt;_snow){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使用雪花当做干扰元素
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_getSnow();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($this-&gt;_pixel){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_getPixel();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($this-&gt;_line){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_getLine();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;输出图像
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ob_clean();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;header(&#39;content-type:image/png&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagepng($this-&gt;_image);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagedestroy($this-&gt;_image);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;strtolower($str);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;产生雪花
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;[type]&nbsp;[description]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;_getSnow(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i=1;$i&lt;=$this-&gt;_snow;$i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagestring($this-&gt;_image,&nbsp;mt_rand(1,5),&nbsp;mt_rand(0,$this-&gt;_width),&nbsp;mt_rand(0,$this-&gt;_height),&nbsp;&#39;*&#39;,&nbsp;$this-&gt;_getRandColor());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;绘制像素
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;[type]&nbsp;[description]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;_getPixel(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i=1;$i&lt;=$this-&gt;_pixel;$i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagesetpixel($this-&gt;_image,&nbsp;mt_rand(0,$this-&gt;_width),&nbsp;mt_rand(0,$this-&gt;_height),&nbsp;$this-&gt;_getRandColor());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;绘制线段
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;[type]&nbsp;[description]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;_getLine(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i=1;$i&lt;=$this-&gt;_line;$i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageline($this-&gt;_image,&nbsp;mt_rand(0,$this-&gt;_width),&nbsp;mt_rand(0,$this-&gt;_height),&nbsp;mt_rand(0,$this-&gt;_width),&nbsp;mt_rand(0,$this-&gt;_height),&nbsp;$this-&gt;_getRandColor());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;产生验证码字符
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;integer&nbsp;$length&nbsp;验证码长度
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;随机字符
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;_generateStr($length=4){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($length&lt;1||$length&gt;30){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$chars=array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;,&#39;f&#39;,&#39;g&#39;,&#39;h&#39;,&#39;k&#39;,&#39;m&#39;,&#39;n&#39;,&#39;p&#39;,&#39;x&#39;,&#39;y&#39;,&#39;z&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;,&#39;F&#39;,&#39;G&#39;,&#39;H&#39;,&#39;K&#39;,&#39;M&#39;,&#39;N&#39;,&#39;P&#39;,&#39;X&#39;,&#39;Y&#39;,&#39;Z&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;,&#39;6&#39;,&#39;7&#39;,&#39;8&#39;,&#39;9&#39;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$str=join(&#39;&#39;,array_rand(array_flip($chars),$length));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$str;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;_getRandColor(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;imagecolorallocate($this-&gt;_image,&nbsp;mt_rand(0,255),&nbsp;mt_rand(0,255),&nbsp;mt_rand(0,255));
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>然后在应用中使用这个类：</p><blockquote><p>captcha.php</p></blockquote><pre class="prism-highlight prism-language-php">require&nbsp;&#39;Captcha.class.php&#39;;
ob_clean();
$config=array(
&nbsp;&nbsp;&nbsp;&nbsp;&#39;fontfile&#39;=&gt;&#39;INFROMAN.TTF&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&#39;snow&#39;=&gt;10,
&nbsp;&nbsp;&nbsp;&nbsp;&#39;pixel&#39;=&gt;100,
&nbsp;&nbsp;&nbsp;&nbsp;&#39;line&#39;=&gt;5
&nbsp;&nbsp;&nbsp;&nbsp;);
$captcha=new&nbsp;Captcha($config);
$captcha-&gt;getCaptcha();</pre><p>就可以生成类似这样的验证码：<br/></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/01/201701171484646995847698.png" style="" title="2.png"/></p><p>或者：</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2017/01/201701171484646997834282.png" style="" title="1.png"/></p><p>getCaptcha()会以字符串的形式返回验证码的值。</p><p>比较简单的一种验证码，用了PHP的扩展GD库。</p>]]></description>
      <pubDate>Tue, 17 Jan 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>2016下半年年度总结，2017上半年年度展望</title>
      <link>http://old-blog.smallyu.net/index1e35.html?id=39</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=39</guid>
      <description><![CDATA[<p>为什么面朝大海，就站成了大海？因为有人在心里面浮沉啊。<br/></p><p><br/></p><p>2016下半年年度总结：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;（某个人的名字）<br/></p><p>&nbsp;&nbsp;&nbsp;&nbsp;（某个人的名字）<br/></p><p>&nbsp; &nbsp; （某个人的名字）</p><p>&nbsp;&nbsp;&nbsp;&nbsp;……<br/></p><p>好吧总结可以结束了。</p><p><br/></p><p>2017上半年年度展望：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;注定平凡。<br/></p><p>&nbsp;&nbsp;&nbsp;&nbsp;……<br/></p><p>好吧展望可以结束了。</p><p><br/></p><p><em>&lt;&lt;&lt;(2017.1.17)</em></p><p>水了好久都有点开始怀疑人生了。</p><p>2016年确实过得一塌糊涂。上半年过去都不知道过去了。下半年，四级四级考不过，期末期末没考好。我都干了些什么？</p><p><em>(2017.1.17);</em></p><p><em><br/></em></p><p><em><em style="white-space: normal;">&lt;&lt;&lt;(2017.2.10)</em></em></p><p>明天是正月十五了，什么节日来着？</p><p>啊，最近在写singcms。</p><p><em><em style="white-space: normal;"><em style="white-space: normal;">(2017.1.20);</em></em></em></p><p><br/></p><p><em style="white-space: normal;">&lt;&lt;&lt;(2017.3.3)</em></p><p>时过境迁。</p><p><em style="white-space: normal;"><em style="white-space: normal;">(2017.1.3.3);</em></em></p>]]></description>
      <pubDate>Sun, 08 Jan 2017 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>春宵苦短日高起，不来</title>
      <link>http://old-blog.smallyu.net/indexcdef.html?id=38</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=38</guid>
      <description><![CDATA[<p>标题来自知乎。</p><p>这个东西，折磨了我几个月。</p><p style="text-align:center"><img src="http://old-blog.smallyu.net/zb_users/upload/2016/12/201612171481983159491799.png" title="搜狗截图20161217215720.png" alt="搜狗截图20161217215720.png" width="219" height="311" style="width: 219px; height: 311px;"/></p><p>刷完，大概粗略算了一下正确率：</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/12/201612171481982785428410.jpg" title="IMG_20161214_102021.jpg" width="536" height="315" border="0" vspace="0" alt="IMG_20161214_102021.jpg" style="width: 536px; height: 315px;"/><br/></p><p>拍照环境不好，也没必要对图片做什么高大上的处理。这种黑乎乎的照片，放在洁白的网页上真的真的会影响美观，但真的真的就不处理了，也可能我不会。图片就是事实，而已。</p><p>图片不清楚，并不影响看到图片上写着的大大的最终结果：<strong>39.52%</strong></p><p>图片本身不小，有1M。确实像素低可能看不清。上面的所有数字都表示选择题的个数，除了旧型听力最后一题的十个听力填空。分母表示总数，分子表示正确的数量。总之，按照平均数的算法，正确率就是，残酷的39.52%。<br/></p><p>其实用平均数来表示正确率是有问题的，万一一不小心就有了那么一点点的进步呢？事实证明我想多了。</p><p>数据分析的话，拍照来的总归感觉不是很好，于是，就真的无聊地统计了一下，一共有三部分，第一部分是十套真题，除掉写作和翻译的，第二部分是长篇阅读专项，第三部分是新型听力专项。</p><p>这个是十套真题的统计：</p><table height="228"><colgroup><col width="72"/><col width="111"/><col width="109"/><col width="126"/><col width="125"/><col width="72"/></colgroup><tbody><tr height="19" class="firstRow"><td class="et2" colspan="6" x:str="" height="22" width="461" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">四级套题/10</span></td></tr><tr height="19"><td class="et2" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><br/></td><td class="et2" x:str="" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">听力/35</span></td><td class="et2" x:str="" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">选词填空/10</span></td><td class="et2" x:str="" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">长篇阅读/10</span></td><td class="et2" x:str="" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">仔细阅读/10</span></td><td class="et2" x:str="" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">总数</span></td></tr><tr height="19"><td class="et2" x:num="1" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">1</span></td><td class="et2" x:num="8" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">8</span></td><td class="et2" x:num="1" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">1</span></td><td class="et2" x:num="5" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">5</span></td><td class="et2" x:num="3" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">3</span></td><td class="et2" x:num="17" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">17</span></td></tr><tr height="19"><td class="et2" x:num="2" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">2</span></td><td class="et2" x:num="9" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">9</span></td><td class="et2" x:num="6" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">6</span></td><td class="et2" x:num="5" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">5</span></td><td class="et2" x:num="3" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">3</span></td><td class="et2" x:num="23" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">23</span></td></tr><tr height="19"><td class="et2" x:num="3" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">3</span></td><td class="et2" x:num="10" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">10</span></td><td class="et2" x:num="5" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">5</span></td><td class="et2" x:num="6" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">6</span></td><td class="et2" x:num="7" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">7</span></td><td class="et2" x:num="28" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">28</span></td></tr><tr height="19"><td class="et2" x:num="4" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">4</span></td><td class="et2" x:num="15" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">15</span></td><td class="et2" x:num="4" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">4</span></td><td class="et2" x:num="7" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">7</span></td><td class="et2" x:num="5" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">5</span></td><td class="et2" x:num="31" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">31</span></td></tr><tr height="19"><td class="et2" x:num="5" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">5</span></td><td class="et2" x:num="10" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">10</span></td><td class="et2" x:num="7" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">7</span></td><td class="et2" x:num="5" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">5</span></td><td class="et2" x:num="5" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">5</span></td><td class="et2" x:num="27" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">27</span></td></tr><tr height="19"><td class="et2" x:num="6" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">6</span></td><td class="et2" x:num="10" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">10</span></td><td class="et2" x:num="1" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">1</span></td><td class="et2" x:num="1" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">1</span></td><td class="et2" x:num="8" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">8</span></td><td class="et2" x:num="20" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">20</span></td></tr><tr height="19"><td class="et2" x:num="7" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">7</span></td><td class="et2" x:num="9" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">9</span></td><td class="et2" x:num="4" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">4</span></td><td class="et2" x:num="6" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">6</span></td><td class="et2" x:num="7" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">7</span></td><td class="et2" x:num="26" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">26</span></td></tr><tr height="19"><td class="et2" x:num="8" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">8</span></td><td class="et2" x:num="10" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">10</span></td><td class="et2" x:num="6" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">6</span></td><td class="et2" x:num="4" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">4</span></td><td class="et2" x:num="6" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">6</span></td><td class="et2" x:num="26" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">26</span></td></tr><tr height="19"><td class="et2" x:num="9" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">9</span></td><td class="et2" x:num="10" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">10</span></td><td class="et2" x:num="4" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">4</span></td><td class="et2" x:num="3" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">3</span></td><td class="et2" x:num="4" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">4</span></td><td class="et2" x:num="21" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle; word-break: break-all;"><span style="font-size: 14px;">21</span></td></tr><tr height="19"><td class="et2" x:num="10" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">10</span></td><td class="et2" x:num="12" height="14" width="83" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">12</span></td><td class="et2" x:num="1" height="14" width="81" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">1</span></td><td class="et2" x:num="4" height="14" width="69" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">4</span></td><td class="et2" x:num="6" height="14" width="120" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">6</span></td><td class="et2" x:num="23" height="14" width="63" style="font-size: 11pt; text-align: center; vertical-align: middle;"><span style="font-size: 14px;">23</span></td></tr></tbody></table><p>这个是长篇阅读专项的统计：</p><table height="57"><colgroup><col width="72"/><col width="72"/><col width="72"/><col width="72"/><col width="72"/><col width="72"/></colgroup><tbody><tr height="19" class="firstRow"><td class="et2" colspan="6" x:str="" height="14" width="324" style="font-size: 11pt; text-align: center; vertical-align: middle;">长篇阅读专项</td></tr><tr height="19"><td class="et2" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;"><br/></td><td class="et2" x:num="1" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">1</td><td class="et2" x:num="2" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">2</td><td class="et2" x:num="3" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">3</td><td class="et2" x:num="4" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">4</td><td class="et2" x:num="5" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">5</td></tr><tr height="19"><td class="et2" x:str="" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">数值/10</td><td class="et2" x:num="7" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">7</td><td class="et2" x:num="8" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">8</td><td class="et2" x:num="7" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">7</td><td class="et2" x:num="7" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">7</td><td class="et2" x:num="6" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">6</td></tr></tbody></table><p>这个是新型听力的专项：</p><table height="57"><colgroup><col width="72"/><col width="72"/><col width="72"/><col width="72"/><col width="72"/><col width="72"/></colgroup><tbody><tr height="19" class="firstRow"><td class="et2" colspan="6" x:str="" height="14" width="324" style="font-size: 11pt; text-align: center; vertical-align: middle;">新型听力专项</td></tr><tr height="19"><td class="et2" height="14" width="59" style="font-size: 11pt; text-align: center; vertical-align: middle;"><br/></td><td class="et2" x:num="1" height="14" width="49" style="font-size: 11pt; text-align: center; vertical-align: middle;">1</td><td class="et2" x:num="2" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">2</td><td class="et2" x:num="3" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">3</td><td class="et2" x:num="4" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">4</td><td class="et2" x:num="5" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">5</td></tr><tr height="19"><td class="et2" x:str="" height="14" width="59" style="font-size: 11pt; text-align: center; vertical-align: middle;">数值/25</td><td class="et2" x:num="10" height="14" width="49" style="font-size: 11pt; text-align: center; vertical-align: middle;">10</td><td class="et2" x:num="9" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">9</td><td class="et2" x:num="9" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">9</td><td class="et2" x:num="12" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">12</td><td class="et2" x:num="8" height="14" width="54" style="font-size: 11pt; text-align: center; vertical-align: middle;">8</td></tr></tbody></table><p>只看表格好像没什么感觉，那就把它变成折线图。两个专项是在四级考前的后半段时间做的，时间上和套题的后半段比较接近。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/12/201612171481985096527211.png" title="图片10.png" style="white-space: normal;"/></p><p>先是听力。默认没有图表标题，因为有两条线，就懒得手动改了。新型听力比旧型听力少十道题，所以可以看到，有没有那十道题正确的总量是差不多的，说明那十道题本来就几乎对不了几个啊。</p><p><br/></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/12/201612171481984076134040.png" style="" title="图片2.png"/></p><p>然后是选词填空，就是十五选十，波动比较大，应该是看懂了就对得多，看不懂就对的少。所以这个图表没有任何价值。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/12/201612171481985096850007.png" style="" title="图片9.png"/></p><p>这个也没有图表标题，这个是长篇阅读。可以看到，专项的正确率远超套题的，然而做它们的时间差不多，说明，我没认真做啊。专项用的时间比较多一点。还有可能专项的题简单一点，毕竟不是真题。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/12/201612171481984076688729.png" style="" title="图片4.png"/></p><p>仔细阅读，精读，总体来说还是稍微有那么一点点进步的看样子。</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/12/201612171481984076488149.png" style="" title="图片5.png"/></p><p>最后这个是正确量的总数。整体来看，最后一次做的和第一次做的没什么差别。没有有体现出上升或者下降。也就是说，这两个半月来，我只是简单地做到了没有退步……</p><p>至于四级考试。</p><p>对啊，今天刚考的，上午9点。考前心情异常沉重。估计有生以来还没有哪次考试是明知道自己不会过但还必须得认真复习认真考试的。</p><p>然后就炸了。<br/></p><p>按39.52%的正确率来算，710 * 0.3952 = 280.592.</p><p>严肃地说，根据我多年考试的经验以及对我自己的了解，按照最好的情况来算，710的总分，我会考差不多400分。详情如下：</p><blockquote><p>短文写作 &nbsp; &nbsp;106.5 * 0.5 = 53.25</p><p>听力 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 248.5 * 0.5 = 124.25</p><p>选词填空 &nbsp; &nbsp;35.5 * 0.8 &nbsp; = 28.4</p><p>长篇阅读 &nbsp; &nbsp;71 * 0.6 &nbsp; &nbsp; &nbsp;= 42.6</p><p>仔细阅读 &nbsp; &nbsp;142 * 0.7 &nbsp; &nbsp;= 99.4</p><p>翻译 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 106.5 * 0.5 = 53.25</p><p>53.25 + 124.25 + 28.4 + 42.6 + 99.4 + 53.25 = 401.15</p></blockquote><p>401.15，差不多400。但是，这估计已经是最最好的情况下的数字。当然，425才会pass，差一大截。</p><p>计算的时候的比例都要超过平时练习时候真确率的比例，一方面因为考试会比较认真，另一方面。</p><p>实在不能接受不到300分的英语四级成绩啊。</p><p>嗯，过的希望是很渺茫的。</p><p>嗯。</p><p>一个月以后，看我估计的对不对。</p><p>然后对四级想说的也真的不只是这些啊。</p><p><br/></p><p><em>&lt;&lt;&lt;(2016.2.21)</em></p><p>cet4成绩明天出，等待一个会令人失望但仍然抱有一丝丝点侥幸希望的心情，还是不要不要的~</p><p><em><span style="text-decoration: none;">(2016.2.21);</span></em></p><p><em><span style="text-decoration: none;"><br/></span></em></p><p><em><span style="text-decoration: none;">&lt;&lt;&lt;(<em style="white-space: normal;">2016.2.22</em>)</span></em></p><p><span style="text-decoration: none;">估的，高了……</span><em><span style="text-decoration: none;"><br/></span></em></p><p><em><span style="text-decoration: none;">(<em style="white-space: normal;">2016.2.22</em>);</span></em></p>]]></description>
      <pubDate>Sat, 17 Dec 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>生命不息，折腾不止——hexo并不好玩</title>
      <link>http://old-blog.smallyu.net/index4411.html?id=37</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=37</guid>
      <description><![CDATA[<p>双十一妥妥地过去了。</p><p>对于一只无聊的野生单身汪来说，这样的节日确实，无聊。于是尝试了一下看起来13格很高的github+hexo博客。</p><p>可能时间隔得稍微有点长，双十一不是早就过去了么。。。<br/></p><p>阮一峰在博客里这么写：<br/></p><blockquote><p>喜欢写Blog的人，会经历三个阶段。</p><p>　　第一阶段，刚接触Blog，觉得很新鲜，试着选择一个免费空间来写。</p><p>　　第二阶段，发现免费空间限制太多，就自己购买域名和空间，搭建独立博客。</p><p>　　第三阶段，觉得独立博客的管理太麻烦，最好在保留控制权的前提下，让别人来管，自己只负责写文章。</p></blockquote><p>我就高高兴兴地奔着第三个阶段去了。</p><p>后面留坑，如果可能的话就分享一下在用github搭建博客过程中遇到的问题以及解决方法。</p><p><em>&lt;&lt;&lt;(2016.11.19)-1</em></p><p>hexo是用node.js写的，github要用到git，所以首先要在电脑上安装这两样东西。</p><p>node.js: <a href="https://nodejs.org/" _src="https://nodejs.org/">https://nodejs.org/</a> </p><p>git:&nbsp;<a href="https://git-scm.com/" _src="https://git-scm.com/">https://git-scm.com/</a> </p><p>装好之后，多半需要配置环境变量</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/11/201611191479570009725656.png" title="搜狗截图20161119233943.png" alt="搜狗截图20161119233943.png"/></p><p>差不多这样，要配置git的和hexo的。<br/></p><p>应用的安装顺序是：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>安装node.js</p></li><li><p>安装git</p></li><li><p>在git命令行中安装hexo</p></li></ol><p>环境变量的配置顺序是：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>git的bin和git-core</p></li><li><p>（安装hexo）<br/></p></li><li><p>hexo<br/></p></li></ol><p>hexo是全局安装的，git命令行要用到的npm工具其实是node.js的，所以可以在node.js或者git的CMD中执行hexo的安装命令，都行（建议在node.js中，因为能成功）</p><pre class="prism-highlight prism-language-actionscript">npm&nbsp;install&nbsp;-g&nbsp;hexo-cli</pre><p>这里的意思是，node.js安装成功后就有CMD了，在这个CMD中始终可以使用npm。如果环境变量配置有问题，会发生git的CMD里npm出错的情况。<br/></p><p>安装hexo后要配置hexo的环境变量，所以说上面环境变量的配置不是一步完成的。</p><p>然后，，，</p><p>坑还是留着吧。</p><p>hexo: <a href="https://hexo.io/" _src="https://hexo.io/">https://hexo.io/</a>&nbsp;有完整的文档，英文的</p><p><em>(2016.11.19)-1;</em></p><p>后来发现对于在github上部署的博客，git的使用难于站点的搭建。<br/></p><p>因为hexo要配置域名才能正常使用，图方便前几天就把blog.how.gs这个域名解析过去了。不过最终，现在还是回来了。</p><p>同样原因，留坑……</p><p><em>&lt;&lt;&lt;(2016.11.19)-2</em></p><p>gthub搭建博客的缺点：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>每次发布文章都需要重新部署站点</p></li><li><p>本地文件备份难</p></li><li><p>百度不收录</p></li><li><p>MarkDown真的好用？</p></li><li><p>附件管理</p></li></ol><p>第一个，我们常用的博客，每次发布文章只需要添加一条新的记录到数据库就好了。就像web开发中的Ajax。hexo是静态的博客框架。每一次新建文章，都需要执行clean命令清空数据库、缓存，然后执行g命令重新编译文件，生成博客内容，最后将public目录中的内容推到gtithub上。</p><p>这个过程稍微繁琐。如果拿ajax作类比，有异步数据交互的方法不用，非要每次都完全刷（部）新（署）网（网）页（站）吗？</p><p>如果博客内容非常多。百兆以下还将就，如果以上，每发布一篇文章都需要推那么数据上去呢。</p><p style="text-align:center"><em><img src="http://old-blog.smallyu.net/zb_users/upload/2016/11/201611191479556719301099.png" title="10无语wy.png" alt="10无语wy.png" width="133" height="144" style="width: 133px; height: 144px;"/></em></p><p>所以每次发布文章都需要部署站点是缺点。</p><p>第二个是是本地文件备份难。</p><p>比如多云转晴hower用的zblog，需要备份的数据有两部分，mysql中的配置数据和文件中的附件。</p><p>hexo的话需要备份的是当时选定的本地目录。这里的问题是原作者本意希望将hexo目录下的文件也都推送到git上面。可以前几天在尝试的时候，（由于能力不足）遇到一些不好解决的问题。在hexo推送文件的过程中会在本地生成隐藏的.git目录，包含一些git信息。然后在github提交hexo模板目录时，会因为git已经被管理提交失败。</p><p>每次都手动删掉？（麻烦。。）</p><p>或许可以尝试用onedrive把目录挂载到网盘上。</p><p>第三个，百度不收录。知乎上可以找到很好的解决办法，于是，我还是觉得独立博客好用。<br/></p><p>第四个，MarkDown会将内容解析成HTML，目的是提高可读性。这本身没什么问题，可猿们很多用sublime，换行不是像段落一样换行，是折行。当然这不是什么大问题。</p><p>第五个有点和第一个重了，好吧其实本来就三个。hexo的附件管理需要像管理网页资源一样放到sources文件夹。怎么用都感觉不如zblog。</p><p>gthub搭建博客的优点：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>速度理想，流量无限，空间很大</p></li><li><p>13格高</p></li></ol><p>hexo自然是有优点的，很多人都是冲着github的可靠性去的。</p><p>不过我相信大多数人更倾向于第二点。</p><p><em>(2016.11.19)-2;</em></p>]]></description>
      <pubDate>Fri, 18 Nov 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>CET4 · 不屈的Writing路（2016.12.8）</title>
      <link>http://old-blog.smallyu.net/indexf62c.html?id=36</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=36</guid>
      <description><![CDATA[<p style="white-space: normal;">(2016.12.8)</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;英语老师并不给口语不好的人机会。<img src="http://old-blog.smallyu.net/zb_users/emotion/default/unhappy.png"/></p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;原本有 Unit 1 ~ Unit 6 一共六个单元的内容需要背。是的这里列出了两篇，默写的。</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;时间隔了好久，从1.9的最后一篇四级作文到12.7的第一篇课文翻译。英语确实很难啊！</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;四级作文记了两篇坚持不下去，就搁置了。当时两篇作文用了两个星期的时间。然后就到最近，老师要求被课文翻译，一共六个单元。反正快考四级了，英语怎么学都是学，就决定背一下，期末还会考课文，背了也不亏。两天时间背了两篇。课文翻译比四级作文要简单很多，句子大多是简单句，虽然也有生词，不过还不算是问题。</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;问题是老师说只能背，不能背写。平时成绩的问题。</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;这种要求真的可以完全把我难住。如果可以背写的话还能试一下，但是背，嗯，挂科无憾。</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;所以就决定可以放心地旷课了，几乎没有故意旷课过，感谢英语课给了我旷课的勇气。<img src="http://old-blog.smallyu.net/zb_users/emotion/default/neutral.png"/></p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;有的人英语本来就好，不用做任何准备裸考就能过。然而有的人T_T。</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;以我三个月断断续续的复习、做了很多篇模拟题以及很多份真题的经验来看，我敢很肯定的说，今年的四级考试，肯定过不了。。。</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;难不成为了听好听力，就从小学的字母发音开始恶补基础吗，应该为了写好作文，就从小学的遣词造句开始学习语法吗。你努力，拼命在追赶的，是别人的起点。为什么非要走这条路？如果可以在其它路上超越别人，可以凭借其它技能找到工作，挣到钱，还有必要依靠这个吗？</p><p style="white-space: normal;">&nbsp;&nbsp;&nbsp;&nbsp;可是连这个都搞不定，不甘心啊。</p><p style="white-space: normal;">(Unit 2) Realizing the great national rejuvenation, which we define as the Chinese Dream, has been the greatest Chinese expectation since modern times. It basically means achieving prosperity for the country, renewal of the nation and happiness for the people, thus ensuring that every enterprising Chinese carries, generation after generation, the firm conviction that a better life is accomplished through persistent effort. People should achieve their prosperity through diligence, courage, creativity and determination instead of aid from society or other people. Each individual is a participant and a designer in the casue of realizing the Chinese Dream, it is a dream not only for the entire nation, but also for every Chinese.</p><p style="white-space: normal;"><br/></p><p style="white-space: normal;">(2016.12.7)</p><p>(Unit 1) Nowedays, many young people no longer choose “stable”&nbsp;jobs. Instead, they prefer to start their own businesses and realize their self-value through their own wisdom and efforts. Young entrepreneurship is the source of national economic vitality in the future. The success of entrepreneurs not only creates fortune, increases job opportunities, improves people’s life, but it is also good for the country in long term. Entrepreneurs are a driving force in upgrading China’s economy. Especially for the time being, our country is encouraging people to start their own businesses and make innovations and giving pocily support for medium and small businesses. This further arouses young people’s enthusiasm to start their own businesses.</p><p><br/></p><p style="white-space: normal;">(2016.11.9)</p><p style="white-space: normal;">Many cultural and sporting events are held on our campus each year, and I often participate actively in them. I find it beneficial to be involved in various campus activities. The speech contest held last month has benefited me most.</p><p style="white-space: normal;">The speech contest was held by the Students Union. The moment I was informed I would compete with more than 100 competitors, I became exceedingly nervous. But my roommates encouraged me and cheered me on. They are all willing to be my audience whenever I wanted to practice speaking, giving me much courage. They also offered me constructive advice to help me imporve my presentaion skills. Thanks to their support, I ranked third in this speech contest. The speech contest not only gave me a opportunity to practice eloquence and strengthen my confidence, but also deepened the friendship between my roommates and me.</p><p style="white-space: normal;">I will take part in such campus activities as a speech contest. I would contend they should be organized regularly to make our college life more colorful and meaningful.</p><p><br/></p><p>(2016.11.2)</p><p>If a foreign friend is coming to visit our campus, the most intersting place I&#39;d like to take him/her to see is the school art gallery. There are many exhibitions held here periodically, including calligraphy, painting, photograpy and sculpture, etc. Most of exhibits are created by our university students, but somtimes, there are some authentic works of well-known artists, like the famous painting Shrimp by Qi Baishi.</p><p>The reason why I take him/her to the school art gallery is that I hope he/she can known more about the campus life of Chinese university students. I&#39;d like him/her to known that our campus life is not defined to study; on the contrary, our campus life is rich and colorful. In addition, compared with other places, the school art gallery is more representative, because it collects excellent works of our university students and it shows our intelligence and wisdom intensively.</p><p>I&#39;m glad that our school has this art galley and I believe that everyone comes to see it will like it.</p>]]></description>
      <pubDate>Wed, 02 Nov 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>课程手记 · Hello，移动web</title>
      <link>http://old-blog.smallyu.net/index40ac.html?id=35</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=35</guid>
      <description><![CDATA[<p>内容来自慕课网WebApp开发课程的内容，看完之后回想起来，确实有必要记录一下，便于温故</p><p>课程地址：<a href="http://www.imooc.com/learn/494" _src="http://www.imooc.com/learn/494">http://www.imooc.com/learn/494</a></p><p><strong><span style="font-size: 16px;">Pixel移动开发像素基础</span></strong><br/></p><p><span style="text-decoration: underline;">px</span>: CSS pixels 逻辑像素，浏览器使用的抽象单位</p><p><span style="text-decoration: underline;">dp,pt</span>: device independent pixels 设备无关像素</p><p><span style="text-decoration: underline;">dpr</span>: devicePixelRatio 设备像素缩放比</p><p>计算公式：<span style="text-decoration: underline;">1px = (dpr)^2 * dp</span></p><p><span style="text-decoration: underline;">DPI</span>: 打印机每英寸可以喷的墨汁点（印刷行业）</p><p><span style="text-decoration: underline;">PPI</span>: 屏幕每英寸的像素数量，即单位英寸内的像素密度</p><p>目前，在计算机显示设备参数描述上，二者意思表达的是一样的（单位为硬件像素，非px）</p><p>PPI越高，像素数越高，图像越清晰，但可视度越低（小），系统默认设置缩放比越大</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610181476787434192242.png" style="white-space: normal; width: 535px; height: 104px;" width="535" height="104"/></p><p>Retina屏（高清屏）dpr都是大于等于2</p><p><strong><span style="font-size: 16px;">Viewport视图</span></strong><br/></p><p>思考下面一个问题：</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610181476787435437480.png" style="white-space: normal; width: 535px; height: 211px;" width="535" height="211"/></p><p><span style="text-decoration: underline;">手机浏览器默认为我们做了两件事情</span>：</p><p>一：页面渲染在移动设备分辨率大小的viewport</p><p>二：缩放</p><p><span style="text-decoration: underline;">为什么渲染时，要有Viewport</span><span style="text-decoration: none;">？</span></p><p>为了排版正确。</p><p>viewport有两个，visual viewport和layout viewport</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610181476787434971290.png" style="width: 533px; height: 204px;" width="533" height="204"/><br/></p><p><span style="text-decoration: underline;">Viewport Meta标签</span></p><p>&lt;meta name=&quot;viewport&quot; content=&quot;name1=value1,name2=value2&quot;&gt;</p><p>width: 设置布局viewport的特定值（&quot;device-width&quot;）</p><p>initial-scale: 设置页面的初始缩放</p><p>minimum-scale: 最少缩放</p><p>maximum-scale: 最大缩放</p><p>user-scalable: 用户能否缩放</p><p><span style="text-decoration: underline;">常用写法</span>：</p><p>&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,inital-scale=1,user-scalable=no&quot;&gt;</p><p><strong><span style="font-size: 16px;">Flex弹性盒子布局</span></strong><br/></p><p>.nav{display:-webkit-flex;}/*父元素*/</p><p>.item{flex:1}/*子元素*/</p><p>display:-webkit-flex 标示使用弹性布局</p><p>flex:num 占容器的比例</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610181476787435453961.png" style="width: 190px; height: 184px;" width="190" height="184"/></p><p><span style="text-decoration: underline;">Flex不定宽高的水平垂直居中</span></p><p>.parent{</p><p>&nbsp; &nbsp; justify-content:center;/*子元素水平居中*/</p><p>&nbsp; &nbsp; align-items:center;/*子元素垂直居中*/</p><p>&nbsp; &nbsp; display:-webkit-flex;</p><p>}</p><p><strong><span style="font-size: 16px;">Web的Flex弹性盒模型</span></strong><br/></p><p><a href="http://old-blog.smallyu.net/web/web_flex.html" _src="web/web_flex.html">http://oldblog.smallyu.net/web/web_flex.html</a></p><p>访问这个链接查看flex的所有属性案例</p><p><strong><span style="font-size: 16px;">响应式设计</span></strong><br/></p><p><span style="text-decoration: underline;">兼容性</span></p><p>·iOS可以使用最新的flex布局</p><p>·android4.4以下，只能兼容旧版的flexbox布局</p><p>·android4.4及以上，可以使用最新的flex布局</p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610181476787435416462.png" style="width: 711px; height: 151px;" width="711" height="151"/></p><p><span style="text-decoration: underline;">媒体类型</span></p><p>screen（屏幕）</p><p>print（打印机）</p><p>handheld（手持设备）</p><p>all（通用）</p><p><span style="text-decoration: underline;">常用该媒体查询参数</span>：</p><p>width—视口宽高</p><p>height——视口宽高</p><p>device-width——设备的宽度</p><p>device-height——设备的高度</p><p>orientation：检查设备处于横向（landscape）还是竖屏（portrait）</p><p><strong><span style="text-decoration: underline;">设计点一：百分比布局</span></strong></p><p>仅仅使用媒体查询来适应不同的固定宽高设计，只会从一组css到另一组css的切换。两种之间没有任何平滑渐变。当没有命中媒体查询时，表现就会变得不可控制（滚动，换行）。</p><p><strong><span style="text-decoration: underline;">设计点二：弹性图片</span></strong></p><p>很简单，如同多一点布局使用百分比，图片也使用百分比。其背后的思路是：无论何时，都全包在图片的元素宽度范围内，以最大的宽度同比完整的显示图片。</p><p><strong><span style="text-decoration: underline;">设计点三：重新布局，显示与隐藏</span></strong></p><p>当页面达到屏幕手机宽度的时候，很多时候就要放弃一些传统的页面设计思想。力求页面简单，简介。所以我们必须要做出以下处理：</p><p>1.同比例缩减元素尺寸</p><p>2.调整页面结构布局</p><p>3.隐藏冗余的元素</p><p><strong style="font-size: 16px;">移动web特别样式处理</strong><br/></p><p><span style="text-decoration: underline;">高清图片</span></p><p>在移动web也页面上渲染图片，为了避免图片产生模糊，图片的宽高应该用物理像素单位渲染，即是100*100的图片，应该使用100dp*100dp</p><p>width:(w_value/dpr)px;</p><p>height:(h_value/dpr)px;</p><p><span style="text-decoration: underline;">一像素边框</span></p><p>同样是retina屏幕下的问题，根本原因：1px使用2dp渲染</p><p>border:0.5px (FALSE) 仅仅ios8可以用</p><p>sacleY(.5)</p><p><span style="text-decoration: underline;">相对单位rem</span></p><p>为了是一个各大屏幕的手机，px略显固定，不能根据尺寸的大小而改变，使用相对单位更能体验页面兼容性</p><p>em：根据父节点的font-size为相对单位</p><p>rem：是根据html的font-size为相对单位</p><p>em在多层嵌套下，变得非常难以为何</p><p>rem更加能作为全局统一设置的度量</p><p>rem的基值设置为多少好？</p><p>为了使用各大手机屏幕，rem=screen.width/20</p><p>不使用rem的情况：font-size</p><p><span style="text-decoration: underline;">多行文本溢出</span></p><p>单行文本溢出，对title类的使用非常多，而多行文本溢出，在详情介绍则使用的比较多</p><p><span style="text-decoration: underline;">终端交互优化</span></p><p><span style="font-size: 16px;"><strong>Tap基础事件</strong></span><br/></p><p><span style="text-decoration: underline;">300毫秒的故事</span></p><p>移动web页面上的click时间响应都要慢上300毫秒。移动设备访问的web页面都是pc上的页面。在默认的viewport（980px）的页面往往都是需要“双击”或“捏开”放大页面，来看高清页面。而正是为了确认用户是“双击”还是“单击”，safari需要300ms的延迟来判断。</p><p><span style="text-decoration: underline;">300ms延迟怎么破？</span></p><p>使用Tap时间来代替click事件</p><p><span style="text-decoration: underline;">自定义Tap事件原理</span>：</p><p>在touchstart、touchend时记录时间、手指位置，在touchend时进行比较，如果手指位置为同一位置（或允许移动一个非常小的位移值）且时间间隔比较短（一般认为是200ms），且过程中未曾触发过touchmove，即可认为触发了手持设备上的“click”，一般称它为“tap”。(移动框架库Zepto.js)</p><p><span style="text-decoration: underline;">Tap“点透”的bug</span></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610181476787436121082.png" style="white-space: normal; width: 708px; height: 182px;" width="708" height="182"/></p><p>看过这个过程应该可以秒懂“点透”</p><p><span style="text-decoration: underline;">Tap透传的解决方案</span></p><p>1.使用缓动动画，过度300ms的延迟</p><p>2.中间层dom元素的假如，让中间层接受这个“穿透”</p><p>3.“上下”都使用tap时间，原理上解决tap透传事件（但不可避免原生标签click事件）</p><p>4.改用Fastclick的库（听过最新的zepto已经fixed掉这个bug）</p><p><strong style="font-size: 16px;">触摸Touch</strong><br/></p><p><span style="text-decoration: underline;">Touch基础事件</span></p><p>触摸才是移动设备的交互的核心事件</p><p>touchstart：手指触摸屏幕触发（已经有手指放屏幕上不会触发）</p><p>touchmove：手指在屏幕滑动，连续触发</p><p>touchend：手指离开屏幕时触发</p><p>touchcancel：系统取消touch时候触发（不常用）</p><p>除常见的事件属性外，触摸事件包含专有的触摸属性</p><p>touches：跟踪触摸操作的touch对象数组</p><p>targetTouches：特定时间目标的touch对象数组</p><p>changeTouches：上次触摸改变的touch对象数组</p><p><span style="text-decoration: underline;">每个touch对象包含属性</span>：</p><p>clientX：触摸目标在视口中的x坐标</p><p>clientY：触摸目标在视口中的y坐标</p><p>identifier：表示触摸的唯一ID。</p><p>pageX：触摸目标在页面中的x坐标（包含滚动）。</p><p>pageY：触摸目标在页面中的y坐标（包含滚动）。</p><p>screenX：触摸目标在屏幕中的x坐标。</p><p>screenY：触摸目标在屏幕中的y坐标。</p><p>target：触摸的DOM节点目标。</p><p>根据touch对象跟踪触摸具体位置，从而判断触摸交互或手势事件。</p><p><span style="text-decoration: underline;">BUG</span></p><p>Android只会触发一次touchstart，一次touchmove，touchend不触发</p><p><span style="text-decoration: underline;">解决方案</span></p><p>在touchmove中加入：enevt.preventDefault()。</p><p><span style="text-decoration: underline;">但注意</span></p><p>enevt.preventDefault()会导致默认行为不发生，如scroll，导致页面不滚动。</p><p><span style="text-decoration: underline;">弹性滚动</span></p><p>当客户端的页面滚动到顶部或底部的时候，滚动条会收缩并让我们多滑动一定距离。通过缓冲反弹的效果，带给用户良好的体验。</p><p><span style="text-decoration: underline;">移动web页面也是拥有这样能力的，但滚动有几种情况需要考虑</span>：</p><p>body层滚动：（系统特殊化处理）</p><p>再带弹性滚动，overflow：hidden失效，GIF和定时器暂停</p><p><span style="text-decoration: underline;">局部滚动开启弹性滚动</span>：</p><p>body{</p><p>&nbsp; &nbsp; overflow:scroll;</p><p>&nbsp; &nbsp; -webkit-over-scrolling:touch;</p><p>}</p><p>注意Android不支持原生的弹性滚动！但可以借助三方库iScroll来实现</p><p><span style="text-decoration: underline;">下拉刷新</span></p><p>顶端下拉一小点距离，页面弹性滚动向下</p><p><span style="text-decoration: underline;">上拉加载</span></p><p>使用scroll事件而不是touch时间（android有bug）</p><p><strong><span style="font-size: 16px;">总结</span></strong></p><p><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610181476787436203666.png" style="width: 709px; height: 361px;" width="709" height="361"/></p>]]></description>
      <pubDate>Tue, 18 Oct 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>实习报告 · 软件实验：Protel99（Altium designer 6.9）</title>
      <link>http://old-blog.smallyu.net/indexd5e8.html?id=34</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=34</guid>
      <description><![CDATA[<p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 16px;"><strong>一、实验目的</strong></span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">1.掌握电路原理图的设计步骤</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">2.掌握原理图报表文件的生成方法与作用</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">3.熟悉元器件库编辑器及其原理</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">4.学会使用印制电路板编辑器，达到自动布线画电路板比较熟悉的程度</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 16px;"><strong>二、实验内容</strong></span></p><p><span style="font-size: 14px;"><strong><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none;">1.电路原理图的绘制</span></strong></span><span style="font-size: 16px;"><strong><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none; font-size: 16px;"></span></strong><strong><span style="font-size: 16px; font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none;"></span></strong></span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">实验在仿真软件Altium designer 6.9上进行。绘制电路原理图大体分为四个步骤，新建原理图文件、放置元件、设置元件参数、画线。</span></p><p style="text-indent:28px"><span style="font-size: 14px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none; font-size: 14px;">1）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline; font-size: 14px;">新建原理图文件</span></span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">进入AD主界面，点击菜单栏File选项，在出现的菜单选项中选择New&gt;Schematic，软件自动生成的Free Documents工程以及Source Document文件夹和Sheet1.SchDoc原理图文件均会出现在左侧File View操作面板中。</span></p><p style="text-indent:28px"><span style="font-size: 14px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none; font-size: 14px;">2）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline; font-size: 14px;">放置元件</span></span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">明确并在元件库中寻找电路中需要放置的元件。寻找元件有两条思路。</span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">1&gt;点击菜单栏Design选项，在出现的菜单选项中选择Browes Library...，主界面右侧会弹出Libraries面板。点击Libraries...按钮，出现Available Libraries窗口，点击Insatll...按钮加载常用的两个杂项集成库Miscellaneous Connectors.IntLib和Miscellaneous Devices.IntLib，然后点击close按钮关闭窗口。</span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">加载元件库后就可以在元件库操作面板的下拉选项中选择相应的库，并用上下键选择、预览元件，逐个寻找所需元件。</span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">2&gt;点击search...按钮，出现Libraries Search窗口，在输入框中输入想要搜索的元件名，选择Libraries on path选项并设置Path的值就可以在遍历本地目录下的所有元件库搜索所需元件。</span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">如果出现元件库中没有所需元件，可以点击File，选择New&gt;Library&gt;Schemtic Library，左侧File View面板中会出现Schlib1.SchLib文件，单击选定，菜单栏中选择Tool的New Component，就可以自定义元件，之后保存，直接作为库加载就可以用了。</span></p><p style="text-indent:28px"><span style="font-size: 14px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none; font-size: 14px;">3）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline; font-size: 14px;">设置元件参数</span></span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">元件需要设置的参数一般有三个，Designator（元件名）、Comment（元件注释）、Footprint（元件封装）。按照需要分别设置就可以了。</span></p><p style="text-indent:28px"><span style="font-size: 14px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none; font-size: 14px;">4）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline; font-size: 14px;">画线</span></span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">原理图操作界面中，点击菜单栏中Place，选择Wire，鼠标光标会变成十字形，然后就可以根据需求按照网格放置线条了。</span></p><p style="text-indent: 28px; text-align: center;"><span style="font-size: 16px; font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;"><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610161476601683976607.png" alt="搜狗截图20161016110703.png" width="645" height="301" style="width: 645px; height: 301px;"/>&nbsp;</span></p><p><span style="font-size: 14px;"><strong><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">2.网络表的生成与作用</span></strong></span></p><p style="text-indent:28px"><span style="font-size: 14px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none;">1）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline;">网络表的生成</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">：画好原理图后，点击菜单栏中的Design，选择Netlist for document&gt;Protel，在原理图同目录就会生成Sheet1.NET文件。</span></span></p><p style="text-indent:28px"><span style="font-size: 14px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: none; font-size: 14px;">2）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline; font-size: 14px;">网络表的作用</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">：网络表包含了原理图中的所有元件以及元件参数，包括值的大小和封装信息等，用于在PCB电路的设计中导入元件以及校验元件信息。</span></span></p><p><span style="font-size: 14px;"><strong><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">3.PCB（印制电路板）的绘制</span></strong></span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">绘制PCB可以分为两个步骤，导入元件和布线。</span></p><p style="text-indent:28px"><span style="font-size: 14px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">1）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline; font-size: 14px;">导入元件</span></span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">点击菜单栏中的Project，选择Show Differences...，会弹出Choose Docuents To Compare窗口，在下角勾选Advanced Mode选项，窗口会变成两栏。左边一栏选中已经保存过的PCB文件，右边一栏选择刚才生成的网络表文件，点击OK，就会出现工程差异的一个比对窗口，右击任一列表中的文件，选择Update All &gt;&gt; PCB Document [PCB1.PcbDoc]选项，然后点击窗口左下角Create Engineering Change Order...按钮，就出现了Engineering Charge Order窗口。</span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">在出现的窗口中点击左下角的Execte Charges执行更改，之后就会出现一个执行情况统计的窗口。如果窗口中有错误项，就需要关闭窗口，根据错误提示更改、调整出现问题的元件。如果没有错误项，那么所有元件就成功地导入PCB文件中了。</span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">自定义放置元件的位置，然后点击Place，选择Line，画置印刷版的边界，限制电路板的大小，不然在自动布线的时候软件会卡死。</span></p><p style="text-indent:28px"><span style="font-size: 14px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">2）</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline; font-size: 14px;">布线</span></span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">点击菜单栏的Auto Route，选择All，弹出窗口中保持默认选项选择OK，软件就可以在5秒之内自动为PCB印制板布线。</span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">AD在自动布线的时候不需要切换到Keep-Out Layer画布也可以实现双面板的布线，因为在弹出窗口中会选择布线格式。</span></p><p style="text-indent:28px"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">最后检查PCB是否有错误。</span></p><p style="text-indent: 28px; text-align: center;"><span style="font-size: 16px; font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;"><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610161476581086624422.png" alt="搜狗截图20161016010218.png" width="536" height="299" style="width: 536px; height: 299px;"/></span></p><p style="text-indent: 28px;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">应付作业的内容，先在电脑上写的，就顺手发上来。对软件的学习没有借鉴意义</span><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; font-size: 14px;">。&nbsp;</span></p>]]></description>
      <pubDate>Sun, 16 Oct 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>博观而约取，厚积而薄发</title>
      <link>http://old-blog.smallyu.net/indexef73.html?id=33</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=33</guid>
      <description><![CDATA[<p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">博观而约取，厚积而薄发。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">可能在说这句话的时候，我也不知道自己想要表达什么。（真的想写个技术类的，分享一下自己的知识，顺便提升一下自己的格调。想想而已。）听着陈旧的许嵩的歌，在图书馆信息阅览室里，用着极不舒服的键盘，在XP系统的word上，写这篇日志（的时候心情是沉重的）。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">许嵩的歌不新，却异常喜欢。可能仅仅是耳朵适应了他的歌的节奏和频率，不想再猎新奇。虽然我还年轻。天下雨了，打开窗户就可以感受到雨水带来的降温，和寒意。博观而约取，厚积而薄发，是刚才在意林杂志上看到的一句话。我们不止一次看到过类似这样的话，“我们总是对博学能够侃侃而谈的人感到敬佩，可谁又看到他们十年寒窗门前苦读的光景。”不鸣则已，一鸣惊人？我不屑一笑。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">总是希望自己以后可以变成厉害的人，希望现在没有做的一些事情，不会给自己留下遗憾，希望自己不要一无是处，然而。国庆节的假期，回家的回家，旅游的旅游。我不想回家，也没人和我一起旅游，所以，只剩下宅。但是又不甘愿浪费时间。所以，就有一段时间呆在图书馆了。短短几天时间，根本不足够我学习到多少东西。正是有这样的想法，让我对未来倍感迷茫。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">我知道自己可以不在乎游玩，没兴趣聚会。可以像暑假一样一下子呆在电脑前两个月。可是每当看到朋友圈的各种动态，就稍微有点按耐不住了。是羡慕吗？是羡慕吧？或者是攀比心理？或者是担心被别人“小看”的心理？（看，我们的生活丰富多彩，你呢？）</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">看到NCRE三级网络技术的教材，才接触到线程、分页、作业、UPS等概念。看到软考的网络工程师考题，才亲身接触到，有那么多我连名字都看不懂的东西。网上N多人说，NCRE完全没用，软考除了评职称也没什么用。可为什么我却觉得，那些考试的内容都不简单？着实不是突击就可以把证书考下来的程度。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">在这个博客网站，不知道可以写些什么内容。写这句话的同时，发现自己终究还是怕出丑。是的，担心博客文章的质量太低，像其他独立博客一样，发发牢骚，写写XXX的配置，贴点福利内容，科学上网方法等。每当看到那样的文章内容，总会觉得一下子就可以知道站长的水平了。什么样的文章，由什么样水平的作者来写。（所以你也应该知道多云转晴hower是个彻头彻尾的萌新小白了吧？）网络上的大牛很多，牛到难以想象。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">这段时间，一直以学习web开发自居。学到了什么？每当想，“自己写个小东西出来吧”的时候，会有一个始终回答不了的问题，写什么？入门容易学精难也就这么回事吧，高不成低不就的。想到写一个在线文件管理器，那么，写出来的东西给谁用呢？现在已经不是几年前独立网站的概念盛行，文件管理器还会用爱特的年代了。vps越来越流行，也许未来的某一天都装windows系统了，阿里云现在不就有这样的主机在卖吗。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">程序方面，目前就有很多优秀的在线文件管理系统，不管是中文的还是英文的。这些程序有什么功能不完善的地方需要自己改进吗？完全没有。那么，如果自己开始写这样一个程序，除了基本的copy、rename、unzip，都是PHP内置函数的使用，难以扩展它的功能了。界面方面，有好用的jquery插件，配置上就可以用。说的轻描淡写了一点。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">站点功能的话，还是按需开发比较好，有时候我们不需要乱七八糟的功能。</span><a href="http://old-blog.smallyu.net/demo/uplaod.html" style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; text-decoration: underline;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">http://oldblog.smallyu.net/demo/uplaod</span></a><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">只有简单的上传功能，不上KB的代码，却够我用用了。（没有安全措施，牛们不要黑我。）其他类型的内容也差不多是这样，在没有实施之前想法就被自己推翻了。</span></p><p style="text-align: center;"><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">&nbsp;<img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610061475749162970932.jpg" alt="u=3109424556,3539797443&amp;fm=11&amp;gp=0.jpg"/></span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">最近迷上一款游戏，王者荣耀。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">和LOL比起来，节奏快，打一场时间短，也算是变相的节省时间了。和英魂之刃比起来，画面好，技能炫。当然，王者荣耀是手游，不过我一般在电脑上用模拟器玩。为什么说是迷上呢？以前是不玩网游的。玩过，一点兴趣都没有。（如果保卫萝卜不算网游）后来和一个朋友一起玩王者荣耀。5V5种类的游戏很多。玩了一段时间后，发现这种竞技游戏确实有不少吸引人的地方。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;"><span style="text-decoration: underline; font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">自由度非常高。</span>单机游戏和RGP网游是没法比的。队友和对方分别有5个英雄，一队间不可重复。假如荣耀有50个可选英雄，那么用排列来算，一队间可能的情况有:</span></p><p style="text-align: center;"><img src="http://old-blog.smallyu.net/zb_users/upload/2016/10/201610081475937735554125.png" alt="搜狗截图20161008224137.png" style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;; width: 200px; height: 36px;" width="200" height="36"/><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;"></span><br/></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">这个数是多少？懒得算了。实际上不会有这么多种情况，不可能每个人都有这么多英雄可选，但有这么多种可能的队伍组合。那么，自己一队，对方一队，对战的组合就要二次方了。玩一款游戏，常常因为“玩腻了”不想再玩，单机游戏会找秘籍输命令尽可能看看这个游戏到底“有什么”。但是这个……</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;"><span style="text-decoration: underline; font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">合作的精神。</span>个人技术可以秀一时，秀不了一场。合作的好能虐杀对方，不懂合作各打各的人家一个一个也能团死你。那么，其实我还是比较喜欢辅助。不用带兵线，不用打野，工作也就是在队友身边放放技能就好了，还可以心安理得的全场乱跑，辅助队友嘛！被人杀了，我是辅助，血薄！杀的人少？我是辅助！只是排位就不敢那么随便了。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;"><span style="text-decoration: underline; font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">竞技的精神。</span>这本身就是竞技游戏。排位。赢了，还想再赢。输了，不服，想赢回来。感觉和赌博差不多。最怕的也就是挂机了。只要有人挂机，那基本就是输了。暂时没输也就垂死挣扎，只要对方不菜。于是，每当因为有人挂机输了的时候，总觉得特别不爽，不行，还得再来！总不会一直有人挂机吧？对了，还真遇到连3场有人挂机的。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">亚瑟是小短手，攻击距离近，除了第三个技能能跳一下，跑路是硬伤，一般带个闪现就挺好。最怕狄仁杰，远距攻击还带减速，见了就跑吧。如果有三技能见了后羿还是能拼一拼的。妲己的减速也厉害，不过战士不应该怕她。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">孙悟空据说最强。定位属于刺客和战士。血薄，靠暴击，死得快，打一下就跑的那种。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">后羿是热门英雄，经常看见他的身影。身为射手主要输出，远远地打就行了，三技能用处不详，什么时候都可以放，但不知道什么时候能够发挥好作用。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">蔡文姬比较讨人喜欢，（我单身久了？）因为可爱。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">孙斌看样子是S4的主角了。（现在是正S4呢吧？）辅助很强，一技能眩晕，二技能是2s的加速，三技能就挺酷的，时光炸弹，到后期冷却也不长，伤害不高，减速能力很强，团的时候丢对位置能把对方*死。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">……</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">另一款也不错的游戏，贪吃蛇大作战。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">这要不是单机游戏，估计它的火爆程度不会低于荣耀。规则很简单，生存。不是长大，是生存。前几天玩slither.io的时候，不断有一个想法冒出来：“蛇蛇大作战杀气太重了，我不敢再玩。”暴走蛇蛇也好，supersnake.io也好，总会有人不断想要杀掉你，你自己在玩的时候也会不断想要杀掉其它的蛇，尤其是大的，因为长得快嘛，积分很容易就上去。如果抢银行变成一种合法的行为，谁不愿意去抢？</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">&nbsp;</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">就这么乱乱地写写吧，没毛病。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">前几天杂志上看到一篇文章，论题是“你相信男女之间有纯洁的友谊吗？”我不信。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">我不只不相信男女之间没有友谊，还有男男之间，女女之间，所以说，我不相信友谊。没有永恒的友谊，只有永恒的利益，不是空穴来风。同时，我还看到一篇文章，论题是，“世界上的感情，都是一种仪式。”大概意思是说，仪式其实很重要。有仪式不一定有感情，但要有感情就应该有仪式，以表达，“我在乎你，我需要你”这类的含义。因为对方需要这样的仪式来相信你。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">看到这样的文章，会引起我一些思考，也会让我想起一些事情，所以有时候需要看看杂志。比如，上面的话题，我不得不想起一个大学同学。</span></p><p><span style="font-family: 微软雅黑, &#39;Microsoft YaHei&#39;;">我很喜欢的一个朋友。</span></p>]]></description>
      <pubDate>Thu, 06 Oct 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>叙述一次不愉快的拼车</title>
      <link>http://old-blog.smallyu.net/index6fb5.html?id=31</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=31</guid>
      <description><![CDATA[<p style="text-align: center;"><img src="http://old-blog.smallyu.net/zb_users/upload/2016/09/201609161474014361322020.jpg" alt="u=4177088956,1854946446&amp;fm=21&amp;gp=0.jpg"/></p><p>过去几天时间了，总是心有不甘。就当一次教训。事情很简单。</p><p>家里有事，正好周末，就在周六早上早早地回家了。周日整整一天在处理该处理的事情。周一早上，出发回到了这座城市。</p><p>坐大巴来的，停在了汽车站。差不多十点半。汽车站离目的地还有一段不短的距离，挤公交车得两个小时。其实本来两站路就能到，最多也就一个半小时，因为万恶的修路，修了老长时间了，公交车不能过。一般到断路部分是坐摩的过去的，不太熟悉路。</p><p>于是有点嫌麻烦，天正热，还要奔波两个小时，就想到了拼车。上次拼车正赶上开学，人多，三十块钱不到一个小时就到了。原想快十一点了，最好能尽快去，下午还有事，而且三十块钱就当用来买时间了，不算太亏，还图个省心省事，就搭了一个汽车站出口附近拉人的出租车，说拼车。</p><p>上次是开学季，所以三十就能搞定，这次没什么人，我也知道路不近，司机要五十，随口对付了几句，就答应了。当时车里只有我一个人，在等。先付了钱的。</p><p>等啊等。</p><p>特喵的，想想都来气。等了一个小时。是的，硬是到了十一点半，那个司机没拉到人。</p><p>怎么办？</p><p>等了这么长时间，难不成中途放弃？可是时间都出去了，又快到中午，比刚来更热了。这时候，出租车司机回来了，说要我稍等，让另一一辆车拉我去吧。以前也遇到过这样的情况，反正我给钱了，剩下的应该交给他处理，不管坐哪个车只要我能去就行。我是这么想的。</p><p>另一辆车来了之后，他在找人。</p><p>我又等了二十分钟。同时，接到了朋友的电话，说中午稍微有点事。手机信号不好，正好那天我的手机欠费了，只能接电话，不能打电话，没太听清楚说的是什么。总之能早点就早点吧。心想。</p><p>人找到了，还没完。上车后，还要去接两个人。打车的另外一个人的同伴。让人抓狂的是，没找到，找了半个小时。重点是那个人的同伴第一次来这个城市，不知道他们自己现在身处哪儿。问他们在哪条路？他们看了看路标后就说了。对，指示哪个方向是哪条路的那种，导向路标。</p><p>快十二点半了。</p><p>如果我当时坐公交车，省好多钱不说，现在也就到了。可是现在？难不成弃车？去得更晚。</p><p>于是我耐了一下心。半个小时后，拼车的人到目的地，下车了。他们给了司机七十。本来说好的五十，因为他的同伴耽误了，加了点钱。一点了。</p><p>再然后，司机问我去哪儿？我说了。</p><p>再一次特喵的。原来他本来不知道我去的那是个什么地方，是我原先拼的那个车得司机忽悠了他。他拿出手机导航，一查，十几公里。于是，你猜他会干嘛？</p><p>加钱。</p><p>我说那是你和前一辆车那个司机的事。钱我已经付过了，说好了的。</p><p><span style="text-decoration: underline;">他说，要么加钱，要么你下车，自己坐公交车回去。</span></p><p>当时是在有点偏远的地方，我的目的地本来就是郊区，哪有那么多方便的公交车让你坐。问题是就算有车，我也不清楚该坐哪路车，手机没网想查也查不了，同时万一要是还遇上修路那段，不还得折腾一下么，修路那段好点十块，差点十五。</p><p>我加钱了。</p><p>人在汽车里，不得不低头。</p><p>火大，没办法。</p><p>加了二十。</p><p>二十分钟后，到达目的地。</p><p>他说，小兄弟，真不是想坑你钱，你自己看导航，真挺远的，要是两三公里我肯定就顺你了。看嘛，一共走了三十二公里。</p><p>我也不知道三十二公里是什么概念。</p><p>百度地图提示，单就我的路程，按驾车的最短路程算，38元。</p><p><br/></p><p>其实还好，也没什么，以后注意点，小心点。面对这种事情，暂时想不出什么好的解决办法。毕竟回家也是真的有事。</p><p>我回家干嘛去呢，当孝子。</p><p style="text-align: center;"><img src="http://old-blog.smallyu.net/zb_users/upload/2016/09/201609161474014380133297.jpg" alt="u=2163755914,2001027881&amp;fm=21&amp;gp=0.jpg"/></p><p>祭奠我已故的伯父。</p>]]></description>
      <pubDate>Fri, 16 Sep 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>（失败2016.9.16）（程序猿养成计划）PHP参考手册实例遍历计划</title>
      <link>http://old-blog.smallyu.net/index6258.html?id=21</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=21</guid>
      <description><![CDATA[<p>就是把参考手册里面的实例代码打一遍。<br/></p><p>参考手册涵盖了该语言的任何内容（用法不包括理解）。不要笑我做无用的事情，这就是我的学习方法。</p><p>决定一个小节就用一篇文章来承载。有的小节内容会很短，但多云转晴hower的文章列表里面不会跳票。虽然这样做有可能会拉低站点文章的质量（本来就不高），但有的很长，如果采用另外的处理方法，比如把短的小节整合，文章名就不好取了，和PHP参考手册上面的内容也难以对应。</p><p>同时，会建立Python参考手册和PHP参考手册的分类。</p><p>Just do it!</p><p>PS:参考手册就是目前PHP官方文档最新的版本<br/></p><p>参考手册在线版：<a href="https://php.net/manual/zh/" _src="http://php.net/manual/zh/">http://php.net/manual/zh/</a> </p><p>参考手册下载地址：<a href="http://cn2.php.net/distributions/manual/php_manual_zh.chm" _src="http://cn2.php.net/distributions/manual/php_manual_zh.chm">http://cn2.php.net/distributions/manual/php_manual_zh.chm</a></p><p><br/></p><p>（失败2016.9.16）</p><p>这样做确实没有意义。</p><p>发布文章后的几天我翻出文章再看时，看不懂。</p><p>（同时）</p><p>删除实例文章。</p><p>撤销分类。</p>]]></description>
      <pubDate>Mon, 29 Aug 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>（失败2016.9.16）（程序猿养成计划）Python参考手册翻译计划</title>
      <link>http://old-blog.smallyu.net/index190a.html?id=17</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=17</guid>
      <description><![CDATA[<p>这可能是无稽之谈。<br/></p><p><br/></p><p>为什么目前流传的高质量的Python中文参考手册少之又少呢？</p><p>1.热度。不论。</p><p>2.难度。篇幅比PHP的长很多。</p><p><br/></p><p>目的？</p><p>学习。</p><p><br/></p><p>能坚持多久？</p><p>谁知道。</p><p><br/></p><p>质量？</p><p>比机器翻译差一点。</p><p><br/></p><p>翻译目标：</p><p>Python版本：2.7.12</p><p>原版手册：<img style="VERTICAL-ALIGN: middle; MARGIN-RIGHT: 2px" src="http://old-blog.smallyu.net/zb_users/plugin/UEditor/dialogs/attachment/fileTypeImages/icon_rar.html"/><a style="COLOR: rgb(0,102,204); FONT-SIZE: 12px" title="Python Manuals.zip" href="http://old-blog.smallyu.net/zb_users/upload/2016/08/201608241472050096171713.zip">Python Manuals.zip</a></p><p><br/></p><p>翻译计划？</p><p>应该会是个漫长的过程。篇幅真的很长。</p><p>不断修改。</p><p>不讲废话。</p><p><br/></p><p>还有没有什么要说的？</p><p>不足之处，敬请指点。</p><p><br/></p><p>（失败2016.9.16）</p><p>好难。</p><p>（同时）</p><p>删除文章。</p><p>撤销分类。</p><p><br/></p><hr/><p><br/></p><p>(2016.12.8) 偶然翻出以前的文件，看到了这些。</p><p><span style="text-decoration: underline;">Python2.7.12参考手册.txt</span><br/></p><blockquote><p>Python2.7.12参考手册</p><p><br/></p><p>欢迎你！这是Python2.7.12版本的中文参考手册，（原版本）最后的更新时间是2016年7月27日。</p><p><br/></p><p>参考手册目录：</p><p>&nbsp; &nbsp; Python2.7有什么新内容？ 或者说所有2.0版本以来所有的新内容</p><p>&nbsp; &nbsp; 使用说明 在这儿开始</p><p>&nbsp; &nbsp; 库参考 把这个放到你的枕头下</p><p>&nbsp; &nbsp; 语言参考 描述语法和语言描述</p><p>&nbsp; &nbsp; Python的配置和用法 如何在不同的平台使用Python</p><p>&nbsp; &nbsp; Python用户手册 具体主题的深入描述</p><p>&nbsp; &nbsp; 安装Python模块 从Python的包索引或者其他来源安装</p><p>&nbsp; &nbsp; Python的模块分类 用于安装的其他模块</p><p>&nbsp; &nbsp; 继承和植入 对C/C++程序员的教程</p><p>&nbsp; &nbsp; Python对C语言的API 给C/C++程序员的参考</p><p>&nbsp; &nbsp; 常见问题解答 经常被问到的问题及其答案</p><p><br/></p><p>索引和表：</p><p>&nbsp; &nbsp; 全局模块索引 快速进入所有的模块</p><p>&nbsp; &nbsp; 总索引 所有的函数、类、条款</p><p>&nbsp; &nbsp; 词汇表 最重要的条款解释</p><p>&nbsp; &nbsp; 搜索页面 搜索这个文档</p><p>&nbsp; &nbsp; 完整的内容表 列出所有的章节和小小节</p><p><br/></p><p>元信息：</p><p>&nbsp; &nbsp; 错误报告</p><p>&nbsp; &nbsp; 关于文档</p><p>&nbsp; &nbsp; 历史许可</p><p>&nbsp; &nbsp; 版权</p></blockquote><p><span style="text-decoration: underline;">Python模块索引.txt</span></p><blockquote><p><br/></p><p>Python模块索引</p><p><br/></p><p>_|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z</p><p><br/></p><p>_</p><p>&nbsp; &nbsp; __builtin__ 提供了内置命名空间的模块</p><p>&nbsp; &nbsp; __future__ 本声明的定义</p><p>&nbsp; &nbsp; __main__ 顶层脚本运行的环境</p><p>&nbsp; &nbsp; _winreg (Windows) 操作Windows注册表的程序和对象</p><p><br/></p><p>a</p><p>&nbsp; &nbsp; abc 基于PEP 3119的抽象基类</p><p>&nbsp; &nbsp; aepack (Mac) 不赞同的：Python和苹果事件之间会话的容器</p><p>&nbsp; &nbsp; aetools (Mac) 不赞同的：对发送苹果事件的基础支持</p><p>&nbsp; &nbsp; aetypes (Mac) 不赞同的：Python显示苹果的事件对象模型。读和写AIFF和AIFC格式的音频文件</p><p>&nbsp; &nbsp; aifc 读和写AIFF或AIFC格式的音频</p><p>&nbsp; &nbsp; al (IRIX) 不赞同的：SGI上的音频功能</p><p>&nbsp; &nbsp; AL (IRIX) 不赞同的：与al模块结合使用的常量</p><p>&nbsp; &nbsp; anydbm DBM型数据库模块的通用接口</p><p>&nbsp; &nbsp; applesingle (Mac) AppleSingle格式文件基本的解码器</p><p>&nbsp; &nbsp; argparse 命令行选项和参数解析库</p><p>&nbsp; &nbsp; array 节省空间的类型一致的数字阵列</p><p>&nbsp; &nbsp; ast 抽象语法树的类和操作。</p><p>&nbsp; &nbsp; asynchat 对异步命令/响应协议的支持</p><p>&nbsp; &nbsp; asyncore 一个异步套接字处理服务的基类</p><p>&nbsp; &nbsp; atexit 注册和执行清楚功能</p><p>&nbsp; &nbsp; audioop 操作未经加工的音频数据</p><p>&nbsp; &nbsp; autoGIL (Mac) 不赞同的：在时间循环中的全局解释器锁处理</p><p><br/></p><p>b</p><p>&nbsp; &nbsp; base64 标准6548：Base16,Base32,Base64 Data Encodings</p><p>&nbsp; &nbsp; BaseHTTPServer 基础的HTTP服务（对SimpleHTTPServer and CGIHTTPServer）</p><p>&nbsp; &nbsp; Bastion &nbsp;不赞同的：提供受限制的对象访问</p><p>&nbsp; &nbsp; bdb 调试器框架</p><p>&nbsp; &nbsp; binascii 二进制码和ASCII二进制编码之间转换的工具</p><p>&nbsp; &nbsp; binhex 加解密binhex4格式的文件</p><p>&nbsp; &nbsp; bisect 对二进制搜索的数组分割算法</p><p>&nbsp; &nbsp; bsddb 对Berkrlry DB数据库的接口</p><p>&nbsp; &nbsp; buildtools (Mac) 不赞同的：对BuildApplet,BuildApplication和macfreeze的辅助模块</p><p>&nbsp; &nbsp; bz2 兼容bizp2的压缩和解压缩程序接口</p><p><br/></p><p>c</p><p>&nbsp; &nbsp; calendar 日历工作的功能，包含一些Unix计算的仿真程序</p><p>&nbsp; &nbsp; Carbon</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.AE (Mac) 不赞同的：苹果事件工具盒的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.AH (Mac) 不赞同的：苹果帮助管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.App (Mac) 不赞同的：外观管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Appearance (Mac) 不赞同的：外观管理器定义常量的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.CarbonEvents (Mac) 不赞同的：Carbon事件管理器接口的常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.CarbonEvt (Mac) 不赞同的：Carbon事件管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.CF (Mac) 不赞同的：核心基础的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.CG (Mac) 不赞同的：绘图核心的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Cm (Mac) 不赞同的：组件管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Components (Mac) 不赞同的：组件管理器的界面常数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.ControlAccessor (Mac) 不赞同的：控制器接口的访问函数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Controls (Mac) 不赞同的：控制器界面常数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.CoreGraphics (Mac) 不赞同的：核心绘图界面常数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Ctl (Mac) 不赞同的：控制器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Dialogs (Mac) 不赞同的：对话框管理器界面常数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Dlg (Mac) 不赞同的：对话框管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Drag (Mac) 不赞同的：拖放管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Dragconst (Mac) 不赞同的：拖放管理器的界面常数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Events (Mac) 不赞同的：经典事件管理器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Evt (Mac) 不赞同的：经典事件管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.File (Mac) 不赞同的：文件管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Files (Mac) 不赞同的：文件管理器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Fm (Mac) 不赞同的：字体管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Folder (Mac) 不赞同的：文件夹管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Folders (Mac) 不赞同的：文件夹管理器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Fonts (Mac) 不赞同的：字体管理器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Help (Mac) 不赞同的：Carbon帮助管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.IBCarbon (Mac) 不赞同的：Carbon接口建立支持库的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.IBCarbonRuntime (Mac) 不赞同的：Carbon接口建立支持库的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Icns (Mac) 不赞同的：Carbon图标管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Icons (Mac) 不赞同的：Carbon图标管理器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Launch (Mac) 不赞同的：Carbon运行服务的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.LaunchServices (Mac) 不赞同的：Carbon运行服务的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.List (Mac) 不赞同的：列表管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Lists (Mac) 不赞同的：列表管理器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.MacHelp (Mac) 不赞同的：Carbon帮助管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.MediaDescr (Mac) 不赞同的：QuickTime媒体描述符解析器和发生器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Menu (Mac) 不赞同的：菜单管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Menus (Mac) 不赞同的：菜单管理器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Mlte (Mac) 不赞同的：多语言文本编辑器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.OSA (Mac) 不赞同的：Carbon OSA库的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.OSAconst (Mac) 不赞同的：Carbon OSA库的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Qd (Mac) 不赞同的：QuickDraw工具盒的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Qdoffs (Mac) 不赞同的：QuickTime工具盒的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.QDOffscreen (Mac) 不赞同的：QuickDraw Offscreen APIs的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Qt (Mac) 不赞同的：QuickTime工具盒的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.QuickDraw (Mac) 不赞同的：QuickDraw工具盒的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.QuickTime (Mac) 不赞同的：QuickTime工具盒的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Res (Mac) 不赞同的：资源管理器和句柄的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Resources (Mac) 不赞同的：资源管理器和句柄的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Scrap (Mac) 不赞同的：Scrap管理器提供了剪切、粘贴和剪贴板的操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Snd (Mac) 不赞同的：声音管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Sound (Mac) 不赞同的：声音管理器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.TE (Mac) 不赞同的：文本编辑器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.TextEdit (Mac) 不赞同的：文本编辑器的界面常量</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Win (Mac) 不赞同的：窗口管理器的接口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; Carbon.Windows (Mac) 不赞同的：敞口管理器的界面常量</p><p>&nbsp; &nbsp; cd (IRIX) Silicon图形系统上光盘的接口</p><p>&nbsp; &nbsp; cfmfile (Mac) 不赞同的：代码片段资源模块</p><p>&nbsp; &nbsp; cgi 不赞同的：运行Python脚本通过公共网关接口的助手</p><p>&nbsp; &nbsp; CGIHTTPServer 这个模块提供了当运行CGI脚本的时候HTTP服务的处理程序</p><p>&nbsp; &nbsp; cgitb CGI脚本配置的追踪处理</p><p>&nbsp; &nbsp; chunk 读取IFF块的模块</p><p>&nbsp; &nbsp; cmath 对于复杂数学运算的功能</p><p>&nbsp; &nbsp; cmd 构建面向行的命令解释器</p><p>&nbsp; &nbsp; code 实行读-执行循环的工具</p><p>&nbsp; &nbsp; codecs 编码和解码数据和流</p><p>&nbsp; &nbsp; codeop 编译（可能不完全）的Python代码</p><p>&nbsp; &nbsp; collections 高性能的数据类型</p><p>&nbsp; &nbsp; ColorPicker (Mac) 不赞同的：标准颜色编辑对话框的接口</p><p>&nbsp; &nbsp; colorsys RGB和其它颜色系统的绘画功能</p><p>&nbsp; &nbsp; commands (Unix) 不赞同的：运行外部命令的实用功能</p><p>&nbsp; &nbsp; compileall 字节编译目录树中所有的Python源文件的工具</p><p>&nbsp; &nbsp; compiler 不赞同的：写在Python里的Python代码编译</p><p>&nbsp; &nbsp; &nbsp; &nbsp; compiler.ast</p><p>&nbsp; &nbsp; &nbsp; &nbsp; compiler.visitor</p><p>&nbsp; &nbsp; ConfigParser 配置文件分析器</p><p>&nbsp; &nbsp; contextlib 实用的声明上下文</p><p>&nbsp; &nbsp; Cookie HTTP数据(cookie)管理的支持</p><p>&nbsp; &nbsp; cookielib 对于HTTP cookies的自动处理类</p><p>&nbsp; &nbsp; copy 浅层和深部复制操作</p><p>&nbsp; &nbsp; copy_reg 寄存器pickle支持功能</p><p>&nbsp; &nbsp; cPickle 快捷版本的pickle，但不能产生子类</p><p>&nbsp; &nbsp; cProfile</p><p>&nbsp; &nbsp; crypt (Unix) crypt()功能用来检查Unix密码</p><p>&nbsp; &nbsp; csv 从分隔的文件中写入和读取表格数据</p><p>&nbsp; &nbsp; ctypes Python中一个外部的库</p><p>&nbsp; &nbsp; curses (Unix) 一个curses库的接口，支持便携式终端处理</p><p>&nbsp; &nbsp; &nbsp; &nbsp; curses.ascii 对ASCII字符的常量和关系函数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; curses.panel 一个面板堆栈的扩展，对curse窗口增加了深度</p><p>&nbsp; &nbsp; &nbsp; &nbsp; curses.textpad Emacs一样在curse窗口输入和编辑</p><p><br/></p><p>d</p><p>&nbsp; &nbsp; datetime 基本日期和时间类型</p><p>&nbsp; &nbsp; dbhash BSD数据库DBM风格的接口</p><p>&nbsp; &nbsp; dbm (Unix) 基于ndbm的标准的数据库接口</p><p>&nbsp; &nbsp; decimal 通用十进制算术规范的实现</p><p>&nbsp; &nbsp; DEVICE (IRIX) 不赞同的：和gl模块的常量一起使用</p><p>&nbsp; &nbsp; difflib 辅助计算对象之间差异</p><p>&nbsp; &nbsp; dircache 不赞同的：返回目录列表，具有缓存机制</p><p>&nbsp; &nbsp; dis Python字节码反汇编程序</p><p>&nbsp; &nbsp; distutils 对组建和安装Python的支持</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.archive_util 对创建归档文件是有用的功能（如原始码文件或zip文件等等）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.bcppcompiler</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.ccompiler CCompiler类的摘要</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.cmd &nbsp;这个模块提供了基类命令的摘要。这个类是distutils命令包模块的子类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command 这个包包含了一个模块，涵盖每一条标准Distutils命令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.bdist 为程序组建一个二进制安装包</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.bdist_dumb 组建一个“dumb”安装包——一个简单的存档文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.bdist_msi 组建二进制程序为一个Windows MSI文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.bdist_packager 包的基类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.bdist_rpm 组建一个二进制程序为一个Redhat的RPM和SRPM</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.bdist_wininst 组建一个Windows安装包</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.build 组件所有文件为一个包</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.build_clib 组建所有C函数库在一个包里</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.build_ext 组建任何扩展程序在一个包里</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.build_py 组建一个包中的.py和.pyc文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.build_scripts 组建一个包中的脚本文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.check 检查一个包中的测试数据</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.config 执行包的配置</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.insatll 安装一个包</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.install_data 从一个包中安装数据文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.install_headers 从一个包中安装C或C++头文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.install_lib 从一个包中安装数据库文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.instal_scripts 从一个包中安装脚本文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.register 注册一个有Python包索引的模块</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.command.sdist 资源分配</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.core Distutils功能核心</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.cygwinccompiler&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.debug 支持distutils错误标记</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.dep_util 有用的功能对于简单的从属检查</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.dir_util 有用的功能对于目录和目录树的操作</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.dist 提供了配置类，可以代替该模块组建、安装、设置</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.emxcconpiler 对OS/2 EMX编译器的支持</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.errors 提供标准的distutils异常</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.extension 提供了扩展类，被用于在脚本中描述C和C++扩展模块</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.fancy_getopt 额外的getopt功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.file_util 对单个文件操作是有用的功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.filelist 这个FileList类被用于解除关于文件系统和组建文件列表</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.log 一个简单的记录机制，282风格</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.msvccompiler 微软软件编译器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.spawn 提供spawn()函数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.sysconfig Python解释器配置信息低等级的入口</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.text_file 一个简单的文件系统接口，提供文本文件类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.unixccomiler Unix系统下的C语言编译器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.util 混杂着其他工具功能</p><p>&nbsp; &nbsp; &nbsp; &nbsp; distutils.version 表示模板版本数字的工具类</p><p>&nbsp; &nbsp; dl (Unix) 不赞同的：在一个共享的对象中调用C语言的函数</p><p>&nbsp; &nbsp; doctest 文档中测试部分的代码</p><p>&nbsp; &nbsp; DocXMLRPCServer 文档自身的XML-RPC服务工具</p><p>&nbsp; &nbsp; dumdbbm DBM接口的一个便携工具</p><p>&nbsp; &nbsp; dummy_thread 进入代替交织的模块</p><p>&nbsp; &nbsp; dummy_threading 进入代替正在交织的模块</p><p><br/></p><p>e</p><p>&nbsp; &nbsp; EasyDialogs (Mac) 不赞同的：基本的Macintosh对话框</p><p>&nbsp; &nbsp; email 一个提供了解析、操作和生成email信息功能的包，包括MIME文档</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.charset 字符设置</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.encoders email信息酬载编码器</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.errors 使用email包的异常类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.generator 从一个email结构中生成单调的email文本消息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.header 描述非正规的ASCII头部</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.iterators 对一个信息对象树的迭代</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.message 描述email信息的基类</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.mime 组建MIME消息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.parser 解析浅显的eamil文本信息去生成一个消息模板</p><p>&nbsp; &nbsp; &nbsp; &nbsp; email.utils 混杂着email包工具</p><p>&nbsp; &nbsp; encodings</p><p>&nbsp; &nbsp; &nbsp; &nbsp; encodings.idna 国际化域名绑定</p><p>&nbsp; &nbsp; &nbsp; &nbsp; ecodings.utf_8_sig UTF-8编码无BOM格式</p><p>&nbsp; &nbsp; ensurepip pip安装助手的引导程序对于已存在的Python的安装或程序环境</p><p>&nbsp; &nbsp; errno 标准的errno系统符号</p><p>&nbsp; &nbsp; exceptions 标准的异常类</p><p><br/></p><p>f</p><p>&nbsp; &nbsp; fcntl (Unix) fcnt()和ioctl()系统响应</p><p>&nbsp; &nbsp; filecmp 有效地比较文件</p><p>&nbsp; &nbsp; fileinput 标准的输入或文件列表循环</p><p>&nbsp; &nbsp; findertools (Mac) 探测苹果事件接口周围的包装</p><p>&nbsp; &nbsp; FL (IRIX) 不赞同的：和fl模块一起使用的常量</p><p>&nbsp; &nbsp; fl (IRIX) 不赞同的：表单函数库，生动的用户接口应用</p><p>&nbsp; &nbsp; flp (IRIX) 不赞同的：加载储存的表单设计功能</p><p>&nbsp; &nbsp; fm (IRIX) 不赞同的：SGI终端智能的字体管理器接口</p><p>&nbsp; &nbsp; fnmatch Unix shell风格文件名样式匹配</p><p>&nbsp; &nbsp; formatter 普通输出格式化程序和配置接口</p><p>&nbsp; &nbsp; fpformat 不赞同的：普通的浮点数格式化功能</p><p>&nbsp; &nbsp; fractions 合理的数字</p><p>&nbsp; &nbsp; FrameWork (Mac) 不赞同的：交互式的应用框架</p><p>&nbsp; &nbsp; ftplib FTP协议客户端（需要sockets）</p><p>&nbsp; &nbsp; functools 更高的处理和操作功能在可响应的对象中</p><p>&nbsp; &nbsp; future_builtins</p><p><br/></p><p>g</p><p>&nbsp; &nbsp; gc 循环检测垃圾回收的接口</p><p>&nbsp; &nbsp; gdbm (Unix) dbm下GNU的重新编译</p><p>&nbsp; &nbsp; gensuitemodule (Mac) 从一个OSA字典中创建一个存根包</p><p>&nbsp; &nbsp; getopt 便携的命令行选择分析工具，提供了长短两种选择</p><p>&nbsp; &nbsp; getpass 便携的用户名和密码检索工具</p><p>&nbsp; &nbsp; gl (IRIX) 不赞同的：绘图功能</p><p>&nbsp; &nbsp; GL (IRIX) 不赞同的：和gl模块一起使用的常量</p><p>&nbsp; &nbsp; glob Unix shall风格的路径名样式扩展</p><p>&nbsp; &nbsp; grp (Unix) 数据库组（getgrnam()和friends）</p><p>&nbsp; &nbsp; gzip 压缩和解压文件对象的接口</p><p><br/></p><p>h</p><p>&nbsp; &nbsp; hashlib 安全散列和消息摘要算法</p><p>&nbsp; &nbsp; heapq 堆排序的算法（即优先级队列）</p><p>&nbsp; &nbsp; hmac 散列消息鉴别码（HMAC）的实现</p><p>&nbsp; &nbsp; hotshot 高性能日志分析器，主要是用C语言编写的</p></blockquote><p><br/></p>]]></description>
      <pubDate>Wed, 24 Aug 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>换主题啦！告别Metro，迎来百度efe</title>
      <link>http://old-blog.smallyu.net/index7429.html?id=15</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=15</guid>
      <description><![CDATA[<p>免不了灌水。刚刚发了牢骚，咋么P大点事也要发一篇文章？</p><p>此话有理。不过转念一想，谁看呐！况且独立个人博客的意义何在？</p><p><br/></p><p><strong>博客标题。</strong></p><p>一开始是“多云转晴hower”，后来是“Hower&#39;s Blog”，现在又改回了“多云转晴hower”。</p><p>Hower只有多云转晴hower一个人是事实。</p><p>Hower称呼何来？how.gs这个域名作怪。这确实是一个不错的域名，但又是一个有风险的域名，因为它是国别域名，谁都无法保证它有多长时间的可用性，以及续费价格是否可以稳定。指不定哪天，就不存在了。聊以情怀。</p><p>索引问题。不精通SEO，但是如果用“Hower&#39; Blog”这么一个全英文的标题，是不会受本土居民以及搜索引擎待见的。</p><p>友情链接。不必要更名。</p><p><br/></p><p><strong>博客主题</strong>。</p><p>由原先系统自带的“新鲜人”的“Metro”主题，换成“老白”的“ydefe”仿百度<a href="http://efe.baidu.com/">http://efe.baidu.com</a>主题。</p><p>Metro确实有很多难以容忍的缺点。固定的像素布局感觉老套落后于潮流，颜色搭配也很难调剂，包括背景图，虽然它也有优点。</p><p>efe既然是仿百度的，从某些审美角度就可以忽略N多问题，并且实现一开始没有实现的响应式。虽然它也有缺点。</p><p><br/></p><p><strong>内容展示。</strong></p><p>由主题更改带来一些展示内容的更改。</p><p>目前没有文章阅读量、评论数目和网站访问量统计，因为模板本身没有。Metro模板文章相关的统计是自带的，站点访问量是后加的。至于现在的efe，没有添加这些功能的打算。没有辣眼睛的数据统计何尝不是一件好事？</p><p>后来：保留了网站页面加载数目统计，在每个页面的最下面一行。因为我喜欢大数据。至于单个文章阅读量，还在考虑。</p><p>后来：稍微折腾了一下下Font awesome，把该有的统计都加上了。虽然辣眼睛，不过把数据明明白白摆出来，总好过什么都不知道，想看看不上。</p><p>efe的列表展示效果不尽人意，没有Metro条理、清晰。暂时忽略。还在考虑以前的文章要不要重新排版？</p><p><br/></p><p>1313这么些，说什么优点缺点？</p><p>并没有褒贬的成份在里面。谁又能说PHP不是世界上最好的语言？</p><p><br/></p><p>那你怎么不自己开发个模板？</p><p>不会。</p><p><br/></p><p><strong>主题版权。</strong></p><p>可能“不道德”地去除了版权。个人观点，影响版面内容。不是版面问题，多这么一句外部内容总感觉不放心。也看的出来作者对于这句版权稍上心，文件里面用了不少缩进。原版权内容：</p><blockquote><p><span style="font: 12px/normal &quot;Avenir Next&quot;, Helvetica, Arial, &quot;Lantinghei SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; color: #AAAAAA; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: #FFFFFF; -webkit-text-stroke-width: 0px;">Powered By<span class="Apple-converted-space">&nbsp;</span></span><a style="font: 12px/normal &quot;Avenir Next&quot;, Helvetica, Arial, &quot;Lantinghei SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; color: rgb(170, 170, 170); text-transform: none; text-indent: 0px; letter-spacing: normal; text-decoration: underline; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;" href="http://www.zblogcn.com/" target="_blank" rel="nofollow" se_prerender_url="complete">Z-BlogPHP</a><span style="font: 12px/normal &quot;Avenir Next&quot;, Helvetica, Arial, &quot;Lantinghei SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; color: #AAAAAA; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: #FFFFFF; -webkit-text-stroke-width: 0px;">. theme by<span class="Apple-converted-space">&nbsp;</span></span><a style="font: 12px/normal &quot;Avenir Next&quot;, Helvetica, Arial, &quot;Lantinghei SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; color: rgb(170, 170, 170); text-transform: none; text-indent: 0px; letter-spacing: normal; text-decoration: underline; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;" href="http://www.b5b6.com/" target="_blank">letterpress</a></p></blockquote><p>如果侵权（应该没那么严重），留言，即刻更改。<br/></p><p style="text-align: center;"><img alt="qb.gif" src="http://old-blog.smallyu.net/zb_users/upload/2016/08/201608241472022486856113.gif" width="310" height="342" style="width: 310px; height: 342px;"/></p>]]></description>
      <pubDate>Wed, 24 Aug 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>没有尼禄的本事还想泡茱莉亚一样的妞？</title>
      <link>http://old-blog.smallyu.net/index87f1.html?id=14</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=14</guid>
      <description><![CDATA[<p>知道我写这个东西用的是什么编辑器吗？对，sublime</p><p>不善言辞，不喜表达，却又不想无趣。博客应该有什么内容？在这个博客早已落寞的年代。现在互联网上最热门的是什么内容？只知道贴吧人多，天涯、猫扑有人灌水，头条访问量高，慕课的人气也经久不衰。还有呢？互联网辣么庞大，除去所谓的暗网，也有数以万计的站点散布在网络上，我们能够看到的网站入口却寥寥无几。<br/>优酷？爱奇艺？还是英雄联盟？人生似乎有点boring。网络世界很繁华，却不止一次感受到它的冷漠。</p><p><span style="font-size: 14px; text-decoration: none;"><strong>敲键盘的手承载不起按吉他和弦的强度。</strong></span><br/>这段时间唯一的长进也就打字速度稍微能看了一点，却在打这段汉字的时候，发现根本毫无暖用。也就一两个月没怎么碰吉他，十分钟就开始手疼了。sublime不折不扣是一个灰常给力的编辑器，小巧轻便，功能丰富，界面上也可以甩notepad几条街，边角圆滑，还有平滑的过度动画。可惜是用Python开发的。<br/>为什么可惜呢？因为不会啊！有人比喻，Java是重剑，PHP是轻剑，Python是匕首。要怎么用，看用来干什么。java除了完全面向对象，语法上和js还是稍微有点像的，都用+作为连接符。也就是说，能看得懂。不熟练，但也不能说生疏。就像在学过C之后看了看C++的基础课程，发现并没有多么变态。可Python的dict和map就有点无解了，想学，就要花时间去弄清楚一些新概念。<br/>对于新生猿来说，花点时间确实没啥？是的。曾经以为echo和include就可以做很多事情，直到后来用了GD库，听到了tpl，还有MVC构架，和smarty模板、tp框架、yii框架，7.0的新特性、mysqli，设计模式，微信开发，等等等等N多内容需要学习甚至精通。Python？我真的还想再活五百年。（H5和CSS3呢？Js呢？提都不提，你多伤它们的心）</p><p style="text-align: center;"><img alt="48865d8f196515f559ffae9f9cdc577f.png" src="http://old-blog.smallyu.net/zb_users/upload/2016/08/201608221471864759129687.png" width="377" height="205" style="width: 377px; height: 205px;"/></p><p><span style="font-size: 14px;"><strong>人生就像保卫萝卜，没钱，你的萝卜就会被怪吃掉。</strong></span>不管是跑得飞快体积娇小的小黄怪，还是身高体宽，虎背熊腰的大黑怪，都能咬你几口。<br/>就萝卜本身而言，3的难度比2高了不止一个难度。高难度的情况下有哪些方法可以通关呢？<br/>1.<span style="text-decoration: underline;">提高自身实力</span>。萝卜的生命也好，技能也好，炮塔也好，肯定越厉害就真的越厉害。如果一个人就是一根萝卜，炮塔就是萝卜的各项技能，炮塔越多，炮塔等级越高，怪就越渺小。多，指知识范围广，等级高，指学术精。只多不行，伤害低人家怪防得住。只有一个炮塔也不行，攻击再高人家躲过那一段就没事。单个炮塔放满屏幕？一招吃遍天下的伎俩，够你一时猖狂，不够你一生保命。<br/>2.<span style="text-decoration: underline;">换装</span><span style="text-decoration: none;">。</span>萝卜也是有等级的，也是有服装的。等级？就是身价咯，得用角色碎片来进阶，不止是金钱就可以买到的。服装？就是装13呗。装的好，就能把小怪给唬住喽。<br/>3.<span style="text-decoration: underline;">好友助阵</span>。可以提高炮塔的攻击力，不同等级的好友增益不同，不言而喻，看你朋友的身价。不过当然，次数多了就要花金币才能让人家帮助你，等级高的还得用钻石。<br/>4.<span style="text-decoration: underline;">没了</span>，就这么没了。真的没有其他方法了吗？你还有颠覆你人生更好的方法吗？</p><p>&lt;&lt;&lt;（2016.9.8）</p><p><span style="color: #666666; font-family: &#39;Avenir Next&#39;, Helvetica, Arial, &#39;Lantinghei SC&#39;, &#39;Microsoft YaHei&#39;, sans-serif; line-height: 20px; background-color: #FFFFFF;">保卫萝卜告诉我们，</span><br style="color: rgb(102, 102, 102); font-family: &#39;Avenir Next&#39;, Helvetica, Arial, &#39;Lantinghei SC&#39;, &#39;Microsoft YaHei&#39;, sans-serif; line-height: 20px; white-space: normal; background-color: rgb(255, 255, 255);"/><span style="color: #666666; font-family: &#39;Avenir Next&#39;, Helvetica, Arial, &#39;Lantinghei SC&#39;, &#39;Microsoft YaHei&#39;, sans-serif; line-height: 20px; background-color: #FFFFFF;">1.不要怕输，输了可以再来，怕输连开始都难。面对不进则退的晋升关卡，勇敢地打。</span><br style="color: rgb(102, 102, 102); font-family: &#39;Avenir Next&#39;, Helvetica, Arial, &#39;Lantinghei SC&#39;, &#39;Microsoft YaHei&#39;, sans-serif; line-height: 20px; white-space: normal; background-color: rgb(255, 255, 255);"/><span style="color: #666666; font-family: &#39;Avenir Next&#39;, Helvetica, Arial, &#39;Lantinghei SC&#39;, &#39;Microsoft YaHei&#39;, sans-serif; line-height: 20px; background-color: #FFFFFF;">2.后期新出的炮塔不一定就越好，集市主题第一关的船锚炸弹也就如此，用起来可能还不如飞机，所以告诉我什么是爱情？</span><br style="color: rgb(102, 102, 102); font-family: &#39;Avenir Next&#39;, Helvetica, Arial, &#39;Lantinghei SC&#39;, &#39;Microsoft YaHei&#39;, sans-serif; line-height: 20px; white-space: normal; background-color: rgb(255, 255, 255);"/><span style="color: #666666; font-family: &#39;Avenir Next&#39;, Helvetica, Arial, &#39;Lantinghei SC&#39;, &#39;Microsoft YaHei&#39;, sans-serif; line-height: 20px; background-color: #FFFFFF;">3.顶级炮塔的攻击速度和攻击力远超降一级的炮塔，性价比更高。学艺要学精？低级炮塔多不见得比少数几个顶级炮塔有气场。不过在糖果赛中炮塔等级高，损失的也就多。学PHP再精通，人家企业就要Python的，奈何？此题无解。</span></p><p>（2016.9.8）;</p><p style="text-align: center;"><img width="400" height="210" style="width: 400px; height: 210px;" alt="7170ae91aa44f193046b0e11e8b27356.jpg" src="http://old-blog.smallyu.net/zb_users/upload/2016/08/201608221471864772427867.jpg"/></p><p>想写博客不容易。毕竟看多了水到发慌的数不胜数的个人博客，或者为盈利而生的商业博客。</p><p>技术博客？啥也不会啊！技术圈有大波大波的大神在写博客，技术到什么程度？到很多人看不懂的程度。甚至出现的名词都没听过。<br/>生活博客？生活比看时间简史还要枯燥。<br/><strong>没有尼禄的本事还想泡茱莉亚一样的妞？</strong>是不是稍微有点跳。对，Devil May Cry 4，就是鬼泣4...<br/>是我老了吗？接受不了新鲜事物了吗？玩的游戏还是08年的鬼泣4，和孢子，听的歌，也是前几年，很多年前的歌，筷子兄弟的你一定会成功算不算？<br/>不会写小说，写不下去，时间成本大。其实我还想再活六百年。</p><p style="text-align: center;"><img width="145" height="144" style="width: 145px; height: 144px;" alt="dacd54dc847817e7edc7e70868cb2d8a.jpg" src="http://old-blog.smallyu.net/zb_users/upload/2016/08/201608221471865266872281.jpg"/></p><p>单纯闲的发发牢骚。你想不想再多活几年？</p>]]></description>
      <pubDate>Mon, 22 Aug 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>（一万小时定律实践计划）Duang~任务进度到1%啦！</title>
      <link>http://old-blog.smallyu.net/index6e03.html?id=13</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=13</guid>
      <description><![CDATA[<blockquote><div label-module="para">作家格拉德威尔在《异类》一书中指出：</div><div label-module="para">&nbsp;“人们眼中的天才之所以卓越非凡，并非天资超人一等，而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。“</div><p>他将此称为“一万小时定律”。要成为某个领域的专家，需要10000小时，按比例计算就是：如果每天工作八个小时，一周工作五天，那么成为一个领域的专家至少需要五年。这就是一万小时定律。</p></blockquote><p>那么这一万小时按照什么标准算呢？我也不知道O_O<br/></p><p style="text-align: center;"><img width="517" height="263" style="width: 517px; height: 263px;" alt="搜狗截图20160802195426.png" src="http://old-blog.smallyu.net/zb_users/upload/2016/08/201608021470139349319124.png"/>&nbsp;</p><p>就当做里程碑式的纪念，100个小时，1%！<br/></p>]]></description>
      <pubDate>Tue, 02 Aug 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>（程序猿养成计划）Linux手记（I）</title>
      <link>http://old-blog.smallyu.net/index4ef9.html?id=12</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=12</guid>
      <description><![CDATA[<p>跳了好多内容呢，所以手记内容并不全，真是一段艰辛的历程，然而还没有结束。<br/></p><p>课程来源：<a href="http://www.imooc.com/learn/175" _src="http://www.imooc.com/learn/175">http://www.imooc.com/learn/175</a></p><blockquote><p>Linux基本操作</p><p><br/></p><p>&nbsp; &nbsp; 查询目录中内容: ls</p><p>&nbsp; &nbsp; ls [选项] [文件或目录]</p><p>&nbsp; &nbsp; 选项：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -a 显示所有文件，包括隐藏文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -l 显示详细信息</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -d 查看目录属性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -h 人性化显示文件大小</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -i 显示inode</p><p>&nbsp; &nbsp; 举例：ls -lh</p><p><br/></p><p>&nbsp; &nbsp; 建立目录(make directories)：mkdir&nbsp;</p><p>&nbsp; &nbsp; mkdir -p [目录名]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -p 递归创建</p><p><br/></p><p>&nbsp; &nbsp; 切换所在目录(change directory)：cd</p><p>&nbsp; &nbsp; 简化操作</p><p>&nbsp; &nbsp; cd 进入当前用户的家目录</p><p>&nbsp; &nbsp; cd ~ 进入当前用户的家目录</p><p>&nbsp; &nbsp; cd - 进入上次所在目录</p><p>&nbsp; &nbsp; cd .. 进入上一级目录</p><p>&nbsp; &nbsp; cd cd. 进入当前目录</p><p><br/></p><p>&nbsp; &nbsp; 查询所在目录位置(print working directory)：pwd</p><p>&nbsp; &nbsp; pwd</p><p><br/></p><p>&nbsp; &nbsp; 删除空目录(remove empty directors): rmdir</p><p>&nbsp; &nbsp; rmdir[目录名]</p><p><br/></p><p>&nbsp; &nbsp; 复制命令(copy)：cp</p><p>&nbsp; &nbsp; cp [选项] [原文件或目录] [目标目录]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -r 复制目录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -p 连带文件属性复制</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -d 若原文件是链接文件，则复制链接属性</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -a 相当于 -pdr</p><p><br/></p><p>&nbsp; &nbsp; 剪切或改名命令(move): mv</p><p>&nbsp; &nbsp; mv [原文件或目录] [目标目录]</p><p><br/></p><p>&nbsp; &nbsp; 删除目录或文件(remove)：rm</p><p>&nbsp; &nbsp; rm -rf [文件或目录]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -r 删除目录</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -f 强制</p><p><br/></p><p>&nbsp; &nbsp; 链接命令(link): ln</p><p>&nbsp; &nbsp; ln -s [原文件] [目标文件]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -s 创建软链接</p><p><br/></p><p>&nbsp; &nbsp; #文件搜索命令locate</p><p>&nbsp; &nbsp; #命令搜索命令whereis与which</p><p>&nbsp; &nbsp; #文件搜索命令find</p><p>&nbsp; &nbsp; #字符串搜索命令grep</p><p><br/></p><p>&nbsp; &nbsp; locate命令格式</p><p>&nbsp; &nbsp; locate 文件名 #在后台数据库中按文件名搜索，搜索速度更快</p><p>&nbsp; &nbsp; /var/lib/mlocate #locate命令所搜索的后台数据库</p><p>&nbsp; &nbsp; updatedb #更新数据库</p><p><br/></p><p>&nbsp; &nbsp; 搜索命令的命令whereis</p><p>&nbsp; &nbsp; whereis 命令名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -b 只查找可执行文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -m 只查找帮助文件</p><p><br/></p><p>&nbsp; &nbsp; find命令</p><p>&nbsp; &nbsp; find [搜索范围] [搜索命令]</p><p>&nbsp; &nbsp; #find / -name install.log #按文件名查找</p><p>&nbsp; &nbsp; #find /root -iname install.log #不区分大小写</p><p>&nbsp; &nbsp; #find /root -user root #按照所有者搜索</p><p>&nbsp; &nbsp; #find /root -nouser #查找没有所有者的文件</p><p>&nbsp; &nbsp; #find /var/log/ -mtime +10 #查找10天前修改的文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -10 10天内修改的文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 10 10天当天修改的文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; +10 10天前修改的文件</p><p>&nbsp; &nbsp; atime 文件访问时间</p><p>&nbsp; &nbsp; ctime 改变文件属性</p><p>&nbsp; &nbsp; mtime 修改文件内容</p><p>&nbsp; &nbsp; #find /etc -size +20k -a -size -50k #查找/etc/目录下，大于20KB并且小于50KB的文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -a and 逻辑与</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -o or 逻辑或</p><p>&nbsp; &nbsp; #find /etc -size +20k -a -size -50k -exec ls -lh {} \; #查找/etc/目录下，大于20KB并且小于50KB的文件，并且显示详细信息</p><p>&nbsp; &nbsp; #-exec/ok 命令 {} \; 对搜索结果执行操作</p><p><br/></p><p>&nbsp; &nbsp; 搜搜字符串命令grep</p><p>&nbsp; &nbsp; grep [选项] 字符集 文件名</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -i 忽略大小写</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -v 排除指定字符集</p><p><br/></p><p>&nbsp; &nbsp; 帮助命令man</p><p>&nbsp; &nbsp; man 命令 #获取指定命令的帮助</p><p>&nbsp; &nbsp; man ls #查看ls的帮助</p><p>&nbsp; &nbsp; man -f 命令 #相当于 whatis 命令</p><p>&nbsp; &nbsp; 举例：man -5 password</p><p>&nbsp; &nbsp; 按q键退出man命令</p><p><br/></p><p>&nbsp; &nbsp; 选项帮助 --help</p><p>&nbsp; &nbsp; 举例：ls --help</p><p><br/></p><p>&nbsp; &nbsp; shell内部命令帮助</p><p>&nbsp; &nbsp; help shell内部命令</p><p>&nbsp; &nbsp; 举例：whereis cd #确定是否是shell内部命令&nbsp;</p><p>&nbsp; &nbsp; 举例：help cd #获取内部命令帮助</p><p><br/></p><p>&nbsp; &nbsp; 详细命令帮助info</p><p>&nbsp; &nbsp; info 命令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -回车：进入子帮助页面（带有*号标记）</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -u: 进入上层页面</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -n: 进入下一个帮助小节</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -p: 进入上一个帮助小节</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -q: 退出</p><p><br/></p><p>&nbsp; &nbsp; .zip格式压缩</p><p>&nbsp; &nbsp; zip 压缩文件名 原文件 #压缩文件</p><p>&nbsp; &nbsp; zip -r 压缩文件名 源目录 #压缩目录</p><p><br/></p><p>&nbsp; &nbsp; .zip格式解压缩</p><p>&nbsp; &nbsp; unzip 压缩文件 #解压缩文件</p><p><br/></p><p>&nbsp; &nbsp; .gz格式压缩</p><p>&nbsp; &nbsp; gzip 源文件 #压缩为.gz格式的压缩文件，源文件会消失</p><p>&nbsp; &nbsp; gzip -c 源文件 &gt; 压缩文件 #压缩为.gz格式，源文件保留</p><p>&nbsp; &nbsp; 例如：gzip -c cangls &gt; cangls.gz</p><p>&nbsp; &nbsp; gzip -r 目录 #压缩目录下所有的子文件，但是不能压缩目录</p><p><br/></p><p>&nbsp; &nbsp; gzip -d 压缩文件 #解压缩文件</p><p>&nbsp; &nbsp; gunzip 压缩文件 #解压缩文件</p><p><br/></p><p>&nbsp; &nbsp; .bz2格式压缩</p><p>&nbsp; &nbsp; bzip2 源文件 #压缩文件.bz2格式，不保留源文件</p><p>&nbsp; &nbsp; bzip2 -k 源文件 #压缩之后保留源文件</p><p>&nbsp; &nbsp; 注意：bzip2命令不能压缩目录</p><p><br/></p><p>&nbsp; &nbsp; 打包命令tar</p><p>&nbsp; &nbsp; tar -cvf 打包文件名 源文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -c 打包</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -v 显示过程</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -f 指定打包后的文件名</p><p>&nbsp; &nbsp; 例如 tar -cvf longzls.tar longzls</p><p><br/></p><p>&nbsp; &nbsp; .tar.gz压缩格式</p><p>&nbsp; &nbsp; tar -zcvf 压缩包名.tar.gz 源文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -z 压缩为.tar.gz格式</p><p>&nbsp; &nbsp; tar -zxvf 压缩包名.tar.gz</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -x 解压缩.tar.gz格式</p><p><br/></p><p>&nbsp; &nbsp; .tar .bz2压缩格式</p><p>&nbsp; &nbsp; tar -jcvf 压缩包名.tar.bz2 源文件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -z 压缩为.tar.bz2格式</p><p>&nbsp; &nbsp; tar -jxvf 压缩包名.tar.bz2</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -x 解压缩.tar.bz2格式</p><p><br/></p><p>&nbsp; &nbsp; 关机 shutdown命令</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="d8aab7b7ac98b4b7bbb9b4b0b7abac">[email&#160;protected]</a> ~]# shutdown [选项]时间</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -c 取消前一个关机命令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -h 关机</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -r 重启</p><p><br/></p><p>&nbsp; &nbsp; 其他关机命令</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="691b06061d2905060a080501061a1d">[email&#160;protected]</a> ~]# halt</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="44362b2b3004282b2725282c2b3730">[email&#160;protected]</a> ~]# poweroff</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="cdbfa2a2b98da1a2aeaca1a5a2beb9">[email&#160;protected]</a> ~]# init 0</p><p><br/></p><p>&nbsp; &nbsp; 其他重启命令</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="5b2934342f1b3734383a373334282f">[email&#160;protected]</a> ~]# reboot</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="ddafb2b2a99db1b2bebcb1b5b2aea9">[email&#160;protected]</a> ~]# init 6</p><p><br/></p><p>&nbsp; &nbsp; 系统运行级别</p><p>&nbsp; &nbsp; 0 关机</p><p>&nbsp; &nbsp; 1 单用户</p><p>&nbsp; &nbsp; 2 不完全多用户，不含NFS服务</p><p>&nbsp; &nbsp; 3 完全多用户</p><p>&nbsp; &nbsp; 4 未分配</p><p>&nbsp; &nbsp; 5 图形界面</p><p>&nbsp; &nbsp; 6 重启</p><p><br/></p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="23514c4c57634f4c40424f4b4c5057">[email&#160;protected]</a> ~]# cat/etc/inittab</p><p>&nbsp; &nbsp; #修改系统默认运行级别</p><p>&nbsp; &nbsp; id:3:initdafault:</p><p><br/></p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="f5879a9a81b5999a9694999d9a8681">[email&#160;protected]</a> ~]# runlevel</p><p>&nbsp; &nbsp; #查询系统运行级别</p><p><br/></p><p>&nbsp; &nbsp; 退出登录命令</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="4b3924243f0b2724282a272324383f">[email&#160;protected]</a> ~]# logout</p><p><br/></p><p>&nbsp; &nbsp; 1.查询与自动挂载</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="55273a3a2115393a3634393d3a2621">[email&#160;protected]</a> ~]# mount</p><p>&nbsp; &nbsp; #查询系统中已经挂载的设备</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="582a37372c1834373b393430372b2c">[email&#160;protected]</a> ~]# mount -a</p><p>&nbsp; &nbsp; #依据配置文件/etc/fstab的内容，自动挂载</p><p><br/></p><p>&nbsp; &nbsp; 2.挂载命令格式</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="5d2f3232291d31323e3c3135322e29">[email&#160;protected]</a> ~]# mount [-t 文件系统] [-o 特殊选项] 设备 文件名 挂载点</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -t 文件系统：指定挂载类型，可以ext3、ext4、iso9660等</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -o 特殊选项：可以指定挂载的额外选项</p><p><br/></p><p>&nbsp; &nbsp; 3.挂载光盘</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="1765787863577b7874767b7f786463">[email&#160;protected]</a> ~]# mkdir /mnt/cdrom</p><p>&nbsp; &nbsp; #建立挂载点</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="55273a3a2115393a3634393d3a2621">[email&#160;protected]</a> ~]# mount -t iso9660 /dev/cdrom/mnt/cdrom</p><p>&nbsp; &nbsp; #挂载光盘</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="1765787863577b7874767b7f786463">[email&#160;protected]</a> ~]# mont /dev/sr0/mnt/cdrom</p><p><br/></p><p>&nbsp; &nbsp; 4.卸载命令</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="d6a4b9b9a296bab9b5b7babeb9a5a2">[email&#160;protected]</a> ~]# umount 设备文件名或挂载点</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="c3b1acacb783afaca0a2afabacb0b7">[email&#160;protected]</a> ~]# umount /mnt/cdrom</p><p><br/></p><p>&nbsp; &nbsp; 5.挂载U盘</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="0d7f6262794d61626e6c6165627e79">[email&#160;protected]</a> ~]# fdisk -l</p><p>&nbsp; &nbsp; #查看U盘设备文件名</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="73011c1c07331f1c10121f1b1c0007">[email&#160;protected]</a> ~]# mount -t vfat /dev/sdb1/mnt/usb/</p><p>&nbsp; &nbsp; 注意：Linux默认不支持NTFS文件系统</p><p><br/></p><p>&nbsp; &nbsp; 查看登录用户信息</p><p>&nbsp; &nbsp; w 用户名</p><p>&nbsp; &nbsp; 命令输出：登录的用户名</p><p>&nbsp; &nbsp; USER: 登录终端</p><p>&nbsp; &nbsp; TTY: 从哪个IP地址登录</p><p>&nbsp; &nbsp; FROM: 登录时间</p><p>&nbsp; &nbsp; <a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="c985868e808789">[email&#160;protected]</a>: 用户闲置时间</p><p>&nbsp; &nbsp; IDLE: 用户限制时间</p><p>&nbsp; &nbsp; JCPU: 连接所有进程占用时间</p><p>&nbsp; &nbsp; PCPU: 当前进程占用时间</p><p>&nbsp; &nbsp; WHAT: 当前正在运行的命令</p><p><br/></p><p>&nbsp; &nbsp; Linux中的通配符</p><p>&nbsp; &nbsp; * 匹配任意内容</p><p>&nbsp; &nbsp; ? 匹配任意一个字符</p><p>&nbsp; &nbsp; [] 匹配任意一个中括号内的字符</p><p><br/></p><p>&nbsp; &nbsp; 文件类型显示</p><p>&nbsp; &nbsp; 第一位：-文件 d目录 l软链接</p><p>&nbsp; &nbsp; 后三位：u所有者</p><p>&nbsp; &nbsp; 后三位：g所属组</p><p>&nbsp; &nbsp; 后三位：o其他人</p><p>&nbsp; &nbsp; 共十位：r读 w写 x执行</p><p><br/></p><p>&nbsp; &nbsp; 常用目录作用</p><p>&nbsp; &nbsp; / 根目录</p><p>&nbsp; &nbsp; /bin 命令保存目录（普通用户就可以读取的命令）</p><p>&nbsp; &nbsp; /boot 启动目录，启动相关文件</p><p>&nbsp; &nbsp; /dev设备文件保存目录</p><p>&nbsp; &nbsp; /etc 配置文件保存目录</p><p>&nbsp; &nbsp; /home 普通用户的家目录</p><p>&nbsp; &nbsp; /lib 系统库保存目录</p><p>&nbsp; &nbsp; /mnt 系统挂载目录</p><p>&nbsp; &nbsp; /media 挂载目录</p><p><br/></p><p>Shall基础</p><p><br/></p><p>&nbsp; &nbsp; 1.echo输出命令</p><p>&nbsp; &nbsp; echo [选项] [输出命令]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -e 支持反斜杠控制的字符转换</p><p><br/></p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="abd9c4c4dfebc7c4c8cac7c3c4d8df">[email&#160;protected]</a> ~]# echo -e &quot;hell\bo&quot;</p><p>&nbsp; &nbsp; #删除左侧字符</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="abd9c4c4dfebc7c4c8cac7c3c4d8df">[email&#160;protected]</a> ~]# echo -e &quot;h\te\tl\nl\to&quot;</p><p>&nbsp; &nbsp; #制表符与换行符</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="5f2d30302b1f33303c3e3337302c2b">[email&#160;protected]</a> ~]# echo -e \ &quot;x68\t\x65\t\x6c\n\x6c\t\x6f\t&quot;</p><p>&nbsp; &nbsp; #按照十六进制ASCII码也同样可以输出</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="43312c2c37032f2c20222f2b2c3037">[email&#160;protected]</a> ~]# echo -e &quot;\e[1;31m 嫁人就要嫁凤姐 \e[0m&quot;</p><p>&nbsp; &nbsp; #输出颜色</p><p><br/></p><p>&nbsp; &nbsp; 2.第一个脚本</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="01736e6e75416d6e62606d696e7275">[email&#160;protected]</a> sh]# vi hello.sh</p><p>&nbsp; &nbsp; #!/bin/bash</p><p>&nbsp; &nbsp; #The first program</p><p><br/></p><p>&nbsp; &nbsp; echo -e &quot;\e[1;34m 天上掉下个林妹妹！ \e[0m&quot;</p><p><br/></p><p>&nbsp; &nbsp; 3.脚本执行</p><p>&nbsp; &nbsp; 赋予执行权限，直接运行</p><p>&nbsp; &nbsp; chmod 755 hello.sh</p><p>&nbsp; &nbsp; ./hello.sh</p><p>&nbsp; &nbsp; 通过Bash调用执行脚本</p><p>&nbsp; &nbsp; bash hello.sh</p><p>&nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; 1.查看与设定别名</p><p>&nbsp; &nbsp; alias #查看系统中所有的命令别名</p><p>&nbsp; &nbsp; alias 别名=&#39;原命令&#39; #设定命令别名</p><p><br/></p><p>&nbsp; &nbsp; 别名永久生效与删除别名</p><p>&nbsp; &nbsp; vi ~/.bashrec #写入环境变量配置文件</p><p>&nbsp; &nbsp; unalias 别名 #删除别名</p><p><br/></p><p>&nbsp; &nbsp; 命令生效顺序</p><p>&nbsp; &nbsp; ...</p><p><br/></p><p>&nbsp; &nbsp; 常用快捷键</p><p>&nbsp; &nbsp; ctrl + c &nbsp;强制终止当前命令</p><p>&nbsp; &nbsp; ctrl + l &nbsp;清屏</p><p>&nbsp; &nbsp; ctrl + a &nbsp;光标移动到命令行首</p><p>&nbsp; &nbsp; ctrl + e &nbsp;光标移动到命令行尾</p><p>&nbsp; &nbsp; ctrl + u &nbsp;从光标所在位置删除到行首</p><p>&nbsp; &nbsp; ctrl + z &nbsp;把命令放入后台</p><p>&nbsp; &nbsp; ctrl + r &nbsp;在历史命令中搜索</p><p><br/></p><p>&nbsp; &nbsp; 2.历史命令</p><p>&nbsp; &nbsp; history [历史命令] [历史命令保存文件]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -c: 清空历史命令</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -w: 把缓存中的命令写入历史命令保存文件~/.bash_history</p><p>&nbsp; &nbsp; 历史命令默认保存1000条，可以在环境变量配置文件/etc/profile中进行修改</p><p><br/></p><p>&nbsp; &nbsp; 历史命令的调用</p><p>&nbsp; &nbsp; 使用上下箭头调用以前的历史命令</p><p>&nbsp; &nbsp; 使用&quot;!n&quot;重复执行第n条命令</p><p>&nbsp; &nbsp; 使用&quot;!!&quot;重复执行上一条命令</p><p>&nbsp; &nbsp; 使用&quot;!字串&quot;重复执行最后一条以该字串开头的命令</p><p><br/></p><p>&nbsp; &nbsp; 命令与文件补全</p><p>&nbsp; &nbsp; 在Bash中，Tab自动补全</p><p>&nbsp; &nbsp; ...</p><p>&nbsp; &nbsp; 输入命令后 + 两次Tab &nbsp; 路径补全、命令补全</p><p>&nbsp; &nbsp; ... &nbsp; &nbsp;&nbsp;</p><p>&nbsp; &nbsp; ll == ls -l</p><p><br/></p><p>&nbsp; &nbsp; 1.标准输入输出</p><p>&nbsp; &nbsp; 设备 &nbsp; 设备文件名 &nbsp;文件描述符 类型</p><p>&nbsp; &nbsp; 键盘 &nbsp; /dev/stdin &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;标准输入</p><p>&nbsp; &nbsp; 显示器 /dev/sdtout 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;标准输入</p><p>&nbsp; &nbsp; 显示器 /dev/sdterr 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;标准错误输出</p><p><br/></p><p>&nbsp; &nbsp; 2.输出重定向</p><p>&nbsp; &nbsp; ...</p><p><br/></p><p>&nbsp; &nbsp; 3.输入重定向</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="acdec3c3d8ecc0c3cfcdc0c4c3dfd8">[email&#160;protected]</a> ~]# wc [选项] [文件名]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -c 统计字节数</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -w 统计单词书</p><p>&nbsp; &nbsp; &nbsp; &nbsp; -l 统计行数</p><p><br/></p><p>&nbsp; &nbsp; 1.度命令顺序执行</p><p>&nbsp; &nbsp; ...</p><p><br/></p><p>&nbsp; &nbsp; 2.管道符</p><p>&nbsp; &nbsp; [<a href="http://old-blog.smallyu.net/cdn-cgi/l/email-protection.html" class="__cf_email__" data-cfemail="4b3924243f0b2724282a272324383f">[email&#160;protected]</a> ~]# 命令1 | 命令2</p><p>&nbsp; &nbsp; #命令1的正确输出作为命令2的操作对象</p><p><br/></p><p>&nbsp; &nbsp; 1.通配符</p><p>&nbsp; &nbsp; ...</p><p><br/></p><p>&nbsp; &nbsp; 2.bash中其他特殊符号</p></blockquote><p>虽然用了引用格式，但内容并不是真的引用，只是为了排版舒服一点。<br/></p><p>课程的主讲老师是@Tony老师，Tony老师不仅是一位Linux大神，还是一个灵魂画手哦！上图：</p><p style="text-align: center;"><img src="http://old-blog.smallyu.net/zb_users/upload/2016/08/201608021470123813396008.png" alt="搜狗截图20160728143439_副本.png" width="489" height="273" style="width: 489px; height: 273px;"/></p><p>最后由衷感谢这位坏坏的老师！</p><p>PS:<span style="line-height: 16px;">参考手册：</span><a href="http://old-blog.smallyu.net/zb_users/upload/2016/08/201608021470150110146059.chm" title="Linux常用命令大全.chm" se_prerender_url="loading" style="line-height: 16px; font-size: 12px; color: rgb(0, 102, 204);">Linux常用命令大全.chm</a></p><p><br/></p>]]></description>
      <pubDate>Tue, 02 Aug 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>写代码过程中几个无足轻重的小习惯</title>
      <link>http://old-blog.smallyu.net/index0055.html?id=11</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=11</guid>
      <description><![CDATA[<p>想哪写哪。<br/><strong>1、$,&quot;$&quot;和&#39;&#39;？</strong><br/>C语言里&quot;&quot;表示字符串，&#39;&#39;表示字符，规则，乱了就会报错，PHP作为“松散”的语言，都能用来表示字符串。<br/></p><pre class="prism-highlight prism-language-php">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$str&nbsp;=&nbsp;&quot;aaa&quot;;&nbsp;&nbsp;&nbsp;//定义变量为字符串
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$str;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出aaa
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;$str&quot;;&nbsp;&nbsp;&nbsp;&nbsp;//输出aaa
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&#39;$str&#39;;&nbsp;&nbsp;&nbsp;&nbsp;//输入$str</pre><p><br/>这就能看出&quot;&quot;和&#39;&#39;的区别了，当然，这是基础。那么在使用的时候，是直接使用变量还是&quot;&quot;?<br/>效率：当然是少打个&quot;&quot;了。<br/>不过在Mysql里就有点问题，如果定义column1 varchar(arbitrary value)，然后执行<br/></p><pre class="prism-highlight prism-language-php">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$str&nbsp;=&nbsp;$_POST[&#39;name&#39;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql_query(&quot;INSERT&nbsp;INTO&nbsp;table_name&nbsp;(column1)&nbsp;VALUES&nbsp;($str)&quot;);</pre><p><br/>程序会报错（一般人会记住错误内容吗），因为$str是不带&quot;&quot;的字符串，PHP认识，Mysql不认识...<br/>解决办法是，$str = &quot;\&quot;&quot; . $str . &quot;\&quot;&quot;; 是不是有点无聊，哈哈。<br/><strong>2、空格还是Tab？</strong><br/>老生常谈的问题，这种问题的答案我怎么会知道T_T</p><p>习惯用四个空格，常用的文本开发工具会支持Tab转空格的，可以转写好的，也可以直接转Tab键输入的，比如Notepad++，缩进也方便，因为有快捷键，重点是网页显示友善。</p><p>补充：空格可以解决这种样式的排版问题,tab是做不到的：</p><pre class="prism-highlight prism-language-php">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$abc&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$abcdef&nbsp;=&nbsp;2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&gt;</pre><p><strong>3、{$}</strong><br/></p><pre class="prism-highlight prism-language-php">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$link&nbsp;=&nbsp;abc.xyz;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;&lt;a&nbsp;href=&#39;http://{$link}&#39;&gt;google&lt;/a&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&gt;</pre><p><br/>挺有用的一种用法，可能是个人都知道、、然而我后来才知道，后来，我终于学会了，如何……<br/><strong>4、紧凑、空格还是换行？</strong><br/>比如function abc(){}，大括号怎么安排位置？<br/>CSS里，可以<br/></p><pre class="prism-highlight prism-language-css">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p><br/>PHP里，可以<br/></p><pre class="prism-highlight prism-language-php">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p>毕竟if后面的条件可能会很长，css选择器一般很短，话说function也换行比较醒目，嗯，还是换行好。（补充：不提倡）</p><p>补充：</p><pre class="prism-highlight prism-language-php">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;AClass&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</pre><p><strong>5、格式化</strong><br/></p><p>在一些代码编辑工具中，比如Visual Studio，会自动在运算符&quot;=&quot;、&quot;&gt;&quot;、&quot;&lt;&quot;等两边加上空格，以及在多参数的&quot;,&quot;后边加上空格，原先是</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a=3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a(int,int){}</pre><p>格式化之后</p><pre class="prism-highlight prism-language-c">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a&nbsp;=&nbsp;3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;(int,&nbsp;int)&nbsp;{}</pre><p>有的工具其中一个选项就是“格式化代码”，做的就是这样的事情，在写好的代码上进行这些操作。</p><p>习惯在写的时候就加上这些空格。</p><p>无伤大雅，哈，要不然怎么说是“无足轻重”的小习惯呢。</p><p><strong>6、elseif还是else if?</strong></p><p>都差不多，凑合用吧。</p><p><strong>7、没了。</strong></p><p style="text-align: center;"><img width="337" height="335" style="width: 332px; height: 317px;" alt="322a1aa5ccd4acd2ba0c4a4fb8541a27_b.jpg" src="http://old-blog.smallyu.net/zb_users/upload/2016/07/201607121468330477423171.jpg"/></p>]]></description>
      <pubDate>Wed, 13 Jul 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>不得不说的科学上网浏览器：Tor Browser（洋葱浏览器）</title>
      <link>http://old-blog.smallyu.net/indexf41b.html?id=10</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=10</guid>
      <description><![CDATA[<p style="text-align: center;"><br/></p><p style="text-align: center;"><img width="422" height="246" style="width: 422px; height: 246px;" alt="搜狗截图20160618222051.png" src="http://old-blog.smallyu.net/zb_users/upload/2016/06/201606191466339972946769.png"/></p><p><span style="font-size: 16px; text-decoration: none;"><strong>可以访问</strong><strong>大</strong><strong>陆屏蔽了的国外网站</strong></span></p><p><span style="font-size: 14px;"><span style="text-decoration: none;">Tro本是通过多层代理节点用于实现匿名访问网络的浏览器，被更多用于访问暗网，在实现多节点代理的同时，也就使得大陆网络用户可以访问国外的网站，因为Tro用的代理节点全是国外的：</span></span></p><p style="text-align: center;"><img width="330" height="170" style="width: 330px; height: 170px;" alt="搜狗截图20160619203514.png" src="http://old-blog.smallyu.net/zb_users/upload/2016/06/201606191466340247222347.png"/></p><p><span style="text-decoration: none;"><strong><span style="font-size: 16px; text-decoration: none;">Tro并不好用</span></strong></span></p><p><span style="font-size: 14px;"><span style="text-decoration: none;">Tro和VPN相比天壤之别，Tro网络的链接速度非常非常慢（可能由于使用多层代理节点需要足够的服务器响应时间），并且Tro并不稳定，以前出现过一直无法连接网络的情况（现在好转）。</span></span></p><p><span style="font-size: 14px;"><span style="text-decoration: none;">不过，当ISP封锁了Tro网络连接的时候，用户可以通过建立网桥来连接互联网，&nbsp;还可以在Tro官网获得专属的网桥。</span></span></p><p><span style="font-size: 14px;"><span style="text-decoration: none;">在大陆的网络环境下，可用的免费科学上网方法有限，Tro并不理想，但是喜欢折腾的友友可以试一试来玩，毕竟它是少有的匿名浏览器，黑客难以从用它浏览的站点上追踪到用户的访问信息。</span></span></p><p style="text-align: center;"><span style="font-size: 14px;"><span style="text-decoration: none;"><img width="382" height="264" style="width: 382px; height: 264px;" alt="搜狗截图20160618223615.png" src="http://old-blog.smallyu.net/zb_users/upload/2016/06/201606191466341047746978.png"/></span></span></p><p><span style="font-size: 14px;"><span style="text-decoration: none;">Tro无法直接从官网下载（无法访问），只能从国内的软件下载站下载。</span></span></p><p><span style="font-size: 14px;"><span style="text-decoration: none;">PS1</span></span><strong><span style="font-size: 14px;"><span style="text-decoration: none;">：</span></span></strong>每天免费一小时的vpn赤兔（号称不限免费时长）：<a href="http://www.getchitu.cc/">http://www.getchitu.cc</a></p><p><span style="text-decoration: line-through;"><span style="font-size: 14px; text-decoration: line-through;">PS2</span><strong><span style="font-size: 14px; text-decoration: line-through;">：</span></strong>可用的可选择线路Chrome扩展：</span><a title="Jumbo Proxy Switcher.zip" href="http://old-blog.smallyu.net/zb_users/upload/2016/07/201607131468413496189482.zip" style="color: rgb(0, 102, 204); font-size: 12px; text-decoration: line-through;">Jumbo Proxy Switcher.zip</a></p><p>PS3：二师兄（免费）VPN：<a href="http://2-vpn5.com/home.action" _src="http://2-vpn5.com/home.action">http://2-vpn5.com/home.action</a>（每三天登录激活）</p>]]></description>
      <pubDate>Sun, 19 Jun 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>这些常用的Windows10快捷键，你都会用了吗？</title>
      <link>http://old-blog.smallyu.net/index5255.html?id=9</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=9</guid>
      <description><![CDATA[<p>快捷键这种东西，可以不会，但适度掌握一些还是有必要的，尤其是想要把计算机玩6的小伙伴们。下面引用了一些常用的win10快捷键：</p><blockquote><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Win键+Tab：激活多任务视图</p><p>　　Win键+A：激活操作中心</p><p>　　Win键+C：通过语音激活Cortana</p><p>　　Win键+D：显示桌面</p><p>　　Win键+E：打开文件管理器</p><p>　　Win键+G：打开Xbox游戏录制工具栏，供用户录制游戏视频或截屏</p><p>　　Win键+H：激活Windows&nbsp;10应用的分享功能</p><p>　　Win键+I：打开Windows&nbsp;10设置</p><p>　　Win键+K：激活无线显示器连接或音频设备连接</p><p>　　Win键+L：锁定屏幕</p><p>　　Win键+P：投影屏幕</p><p>　　Win键+R：运行</p><p>　　Win键+S：激活Cortana</p><p>　　Win键+X：打开高级用户功能</p><p>　　Win键+左/右/上/下：移动应用窗口</p><p>　　Win键+Ctrl+D：创建一个新的虚拟桌面</p><p>　　Win键+Ctrl+F4：关闭最近使用的虚拟桌面</p><p>　　Win键+Ctrl+左/右：切换虚拟桌面</p><p>　　Win键+Shift+左/右：将应用从一个显示屏移至另一个显示屏</p><p>　　Win键+1/2/3：打开任务栏中固定的程序，1代表任务栏中第一个应用图标</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl&nbsp;+&nbsp;V:粘贴文本光标</p><p>　　Ctrl&nbsp;+&nbsp;C:将选中的文本复制到剪贴板</p><p>　　Ctrl&nbsp;+&nbsp;A&nbsp;:选择当前行中的所有文本</p><p>　　Shift&nbsp;+左/右/上/下:移动光标并选中文本</p><p>　　Ctrl&nbsp;+&nbsp;Shift&nbsp;+左/右：移动光标向左或向右</p><p>　　Shift&nbsp;+向上翻页/下一页：移动光标向上或向下一页</p><p>　　Ctrl&nbsp;+&nbsp;Shift&nbsp;+&nbsp;Home&nbsp;/End：移动光标的开始或者结束“屏幕缓冲区，”选择所有文本光标和命令提示符开头或结尾的输出。</p><p>　　Ctrl&nbsp;+上/下：向上或向下移动一行命令提示符的历史</p><p>　　Alt&nbsp;+&nbsp;F4&nbsp;：关闭当前窗口</p></blockquote><p>保存下来，&nbsp;&nbsp;用到的时候可以require一下哦！</p>]]></description>
      <pubDate>Thu, 09 Jun 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>（程序猿养成计划）脚本语言实例（暂停更新）</title>
      <link>http://old-blog.smallyu.net/indexc3c9.html?id=8</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=8</guid>
      <description><![CDATA[<p>用一个页面来记录学习过程中编写的一些实例，包括原创和非原创，代码一定是经过多云转晴hower之手的。</p><p>页面地址：<a href="http://old-blog.smallyu.net/demo/index.html">http://oldblog.smallyu.net/demo/</a></p><p>/**以下引用内容用内联框架显示</p><blockquote><p><iframe width="100%" height="650" src="http://old-blog.smallyu.net/demo/index.html" frameborder="1"></iframe></p></blockquote><p>*/&nbsp;</p><p>欢迎来和多云转晴hower一起交流学习！<br/></p><p>暂停更新（2016.8.11）：任重而道远。</p>]]></description>
      <pubDate>Sat, 04 Jun 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>屏幕录制软件：Bandicam面前屏幕录制专家只是浮云（带注册机）</title>
      <link>http://old-blog.smallyu.net/index8803.html?id=7</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=7</guid>
      <description><![CDATA[<p>当你使用屏幕录制专家录制的游戏视频卡成汪的时候，当屏幕录制专家提示丢失了50%以上帧的时候，不要太过疑虑你的机子是不是out了，也许只是你应该换一个更好用的屏幕录制软件。</p><p>Bandicam是国外的一款软件，支持中国简体语言，功能强大，可以访问官网下载未注册版本：</p><p>官网地址：<a href="http://www.handicam.com/">http://www.handicam.com</a></p><p>关于Bandicam的介绍官网上已经很齐全，就不贴图了，重点在于介绍中有这么一句：<span style="font-size: 14px;">Bandicam是针对</span><span style="font-size: 14px; text-decoration: underline;">应用DirectX/OpenGL图形技术的程序</span><span style="font-size: 14px;">进行视频录制的软件。也就是说在录制游戏方面的性能很优越，值得友友尝试一下。</span></p><p><span style="font-size: 14px;">下面引用官网对Bandicam的部分介绍：</span></p><blockquote><h3 style="font: 700 12pt/23.46px arial, STHeiti, &quot;Microsoft YaHei&quot;, 宋体; margin: 0px 0px 8px; padding: 0px; border: 0px currentColor; border-image: none; text-align: left; color: rgb(51, 51, 51); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; vertical-align: baseline; white-space: normal; max-height: 999999px; widows: 1; font-size-adjust: none; font-stretch: inherit; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">主要特点及优点</h3><ul class=" list-paddingleft-2" style="list-style-type: square;"><li><p>可同时录制电脑屏幕、电脑声音、麦克风声音。</p></li><li><p>被录制的视频容量很小。(现有程序的1/5至1/20水平)</p></li><li><p>如果硬盘容量足够，可24小时长时间录制视频。</p></li><li><p>与其他软件不同，电脑上很少出现网速减慢现象(Lag)。</p></li><li><p>支持图像截图(BMP、PNG、JPG)及连续截图功能。</p></li><li><p>在录像对象屏幕上可添加网络摄像头(Webcam)视频。(可实时合并网络摄像头画面，PIP功能)</p></li><li><p>无需编码，即可将录制的视频上传至Youtube。(可上传720p及1080p)</p></li><li><p>可录制电脑全屏，或选择指定区域录制视频。</p></li><li><p>支持在预约时间开始录制视频，可使用自动结束的计时器功能。</p></li><li><p>可通过硬件加速并快速录制高清视频，也能实现高压缩。</p></li><li><p>支持CFR功能，能与Sony Vegas、Adobe Premiere等视频编辑软件兼容</p></li></ul></blockquote><p><span style="font-size: 14px;"></span></p><p style="white-space: normal;">当然，万能的网友还是提供了注册机的，可以通过下面的链接直接下载注册机以注册Bandicam：下载附件：<img src="http://old-blog.smallyu.net/zb_system/image/filetype/rar.png" style="margin-right: 2px; vertical-align: middle;"/><a title="Bandicam注册机.zip" href="http://old-blog.smallyu.net/zb_users/upload/2016/06/201606031464962742825018.zip" style="color: rgb(0, 102, 204); font-size: 12px;">Bandicam注册机.zip</a></p>]]></description>
      <pubDate>Fri, 03 Jun 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>每个人心中都有一个夏洛，尽管只是一场梦</title>
      <link>http://old-blog.smallyu.net/index3a9f.html?id=6</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=6</guid>
      <description><![CDATA[<p style="text-align: center;"><audio autoplay="autoplay" loop="loop" controls="controls"><source src="http://old-blog.smallyu.net/zb_users/upload/2016/05/201605301464540774343309.mp3" type="audio/mpeg"/></audio></p><p style="text-align: left;"><span style="font-family: Microsoft YaHei; font-size: 14px;">时隔N久，还是对《夏洛特烦恼》不能忘怀，很少有电影可以像它，让人翻出来一看再看。</span></p><p style="text-align: left;"><span style="font-family: &#39;Microsoft YaHei&#39;; text-indent: 28px;">文章标题前半句来自豆瓣某一影评，这不重要。我不写影评，也不会写，只是夏洛着实让我笑了，开怀大笑，并且，让我想了，想想人生，想想理想。本质来说，夏洛只是一场梦，他所经历的一切，只是自己的空想而已，电影将梦的内容真实华丽地展现了出来，然而事实上，如果夏洛真实存在于世间，那么，他经历了许多许多，经历了另一次人生，大彻大悟，改变自己对马冬梅的心意，是好事，可对别人来说，他仅仅只是做了一场梦，就是这样，夏洛还是夏洛，爱马冬梅了，很爱很爱，但还是一事无成、一无是处的夏洛。</span></p><p style="text-align: left;"><span style="font-family: &#39;Microsoft YaHei&#39;; text-indent: 28px;">写到这儿，我突然发现需要改变一下自己的观点了。原本以为夏洛只是改变了对马冬梅的情绪，而已，毕竟电影没有关于夏洛事业相关的内容，他会奋起吗？还是想像先前马冬梅说的，“整天躺在床上，什么都不做，四肢都快躺退化了”？电影没有说明，其实还是留给了我们一些遐想的。我以为夏洛没有事业上的变化，想要稍稍吐槽一下下，刚才却意识到，或许不是，改变了对马冬梅态度的同时，万一一不小心改变了对生活的态度，积极向上地生活，迎着新时代的光芒，走向人生的巅峰？</span></p><p style="text-align: left;"><span style="font-family: &#39;Microsoft YaHei&#39;; text-indent: 28px;">每个人心中都有一个夏洛。</span></p><p style="text-align: left;"><span style="font-family: &#39;Microsoft YaHei&#39;; text-indent: 28px;">一方面，《夏洛》思路“新颖”，给我们很强的代入感。以前，有一句话让我兴奋不已，“如果有一天你从睡梦中醒来，发现自己趴在小学课堂的课桌上，身旁的同桌在认真的发呆，看看窗外，熟悉的操场，原来自己所经历的一切，只是一场梦，一切都才要开始，一切都还充满希望……”夏洛，则将这个场景还原。它满足了我的这个心愿，也可能是很多人的心愿，饱了眼福。在看电影的时候就会想，如果自己是夏洛，遇上这样的情况，会发生些什么？拥有现代的记忆，过着以往的生活。回到中学，我要首先要做的事情和夏洛一样，一定一样，那就是拼命追求自己喜欢的女孩，不会给自己的过去留下遗憾。</span></p><p style="text-align: left;"><span style="font-family: &#39;Microsoft YaHei&#39;; text-indent: 28px;">虽然自己的中学时代并没有这样的人，如果有，那么一定会。即使没有，也可以有嘛（。。。）女神不都是想出来的……好吧，换个话题，夏洛用别人的歌让自己成为了大明星。其实这里也可以省略了，毕竟自己连唱歌都不会。危机感又袭来，现在想想，即使自己回到了过去，也不见得能混得好，是的，真的是的</span><span style="text-indent: 28px; font-family: Calibri;">T_T</span><span style="text-indent: 28px; font-family: 宋体;">。</span></p><p style="text-align: left;"><span style="font-family: &#39;Microsoft YaHei&#39;; text-indent: 28px;">另一方面，情节感人至深。马冬梅对夏洛无拘无束大大咧咧毫不遮掩的爱，多少人的梦，谁不想有一个这样爱自己的人。情感高潮，让夏洛情绪反转，推动电影大情节的，就要是马冬梅跟着坏混混进小树林了。看的时候曾经一度心疼啊，结果并没有发生想象中的事情，只是被电影的这种手法吊起了胃口。不得不说，我认为，马冬梅戴着彩色狗狗帽对着人流广告挥手的那个笑容，是整部片子马冬梅最美的镜头。当然，某人在某年某月某日某个时刻戴着彩色狗狗帽的笑容也是我认为曾经的最美最温暖的笑容，可惜已经成为过去了。</span></p><p style="text-align: center;"><img width="488" height="225" title="201605301464538308693589.png" style="width: 488px; height: 225px;" src="http://old-blog.smallyu.net/zb_users/upload/2016/05/201605301464538308693589.png"/></p><p><span style="font-family: &#39;Microsoft YaHei&#39;; text-indent: 28px;">自从前几天多云转晴</span><span style="text-indent: 28px; font-family: Calibri;">hower</span><span style="text-indent: 28px; font-family: 宋体;">博客建立后，突然觉得自己拥有了一个可以发言的阵地，这也是这篇文章会出现的原因。以前也有过几个博客，去年夏天的神天天雨博客，没几天就没落然后放弃了。想想原因，也许是因为无知，然后和某人有关，也确实没有什么存在的意义。仅仅是给自己一个展现自己的平台，写一些无所谓的话，同时技术也不过关，界面连自己的眼睛都满足不了，放弃在情理之中。对啊，时间也就只过了一年，发生了好多事情呢。</span></p><p><span style="font-family: &#39;Microsoft YaHei&#39;; text-indent: 28px;">回到《夏洛》，片中涉及到的有三首歌非常好，重点是配上夏洛的相关情节，感人。</span></p><p style="text-align: center;"><img width="483" height="201" title="201605301464538301541364.png" style="width: 483px; height: 201px;" src="http://old-blog.smallyu.net/zb_users/upload/2016/05/201605301464538301541364.png"/></p><p style="text-align: center; text-indent: 28px;"><span style="font-family: Microsoft YaHei; font-size: 14px;"><span style="font-family: Microsoft YaHei; font-size: 14px;">《一次就好》</span></span><span style="font-family: Microsoft YaHei; font-size: 14px;"><span style="font-family: Microsoft YaHei; font-size: 14px;"><br/></span></span></p><p style="text-align: center;"><span style="font-family: Microsoft YaHei; font-size: 14px;"><img width="482" height="301" title="201605301464538304216687.png" style="width: 482px; height: 301px;" src="http://old-blog.smallyu.net/zb_users/upload/2016/05/201605301464538304216687.png"/></span></p><p style="text-align: center; text-indent: 28px;"><span style="font-family: Microsoft YaHei; font-size: 14px;"><span style="font-family: Microsoft YaHei; font-size: 14px;">《有个爱你的人不容易》</span></span><span style="font-family: Microsoft YaHei; font-size: 14px;"><span style="font-family: Microsoft YaHei; font-size: 14px;"><br/></span></span></p><p style="text-align: center;"><span style="font-family: Microsoft YaHei; font-size: 14px;"><img width="489" height="284" title="201605301464538301525622.png" style="width: 489px; height: 284px;" src="http://old-blog.smallyu.net/zb_users/upload/2016/05/201605301464538301525622.png"/></span></p><p style="text-align: center;"><span style="font-family: Microsoft YaHei; font-size: 14px;"><span style="font-family: Microsoft YaHei; font-size: 14px;">《夏洛特烦恼》</span></span><span style="font-family: Microsoft YaHei; font-size: 14px;"><span style="font-family: Microsoft YaHei; font-size: 14px;"><br/></span></span></p><p><span style="font-family: Microsoft YaHei; font-size: 14px;"><span style="font-family: Microsoft YaHei; font-size: 14px;">我也想做一场梦。</span></span></p>]]></description>
      <pubDate>Mon, 30 May 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>XAMPP错误：Apache shutdown unexpectedly解决办法：更改端口</title>
      <link>http://old-blog.smallyu.net/indexd61c.html?id=5</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=5</guid>
      <description><![CDATA[<p>如果你新安装的XAMPP遇到apache不能启动的情况，提示如下错误信息：</p><blockquote><p>[Apache] &nbsp;Error: Apache shutdown unexpectedly.<br/>[Apache] &nbsp;This may be due to a blocked port, missing dependencies, <br/>[Apache] &nbsp;improper privileges, a crash, or a shutdown by another method.<br/>[Apache] &nbsp;Press the Logs button to view error logs and check<br/>[Apache] &nbsp;the Windows Event Viewer for more clues<br/>[Apache] &nbsp;If you need more help, copy and post this<br/>[Apache] &nbsp;entire log window on the forums</p></blockquote><p>关键信息在第二句：这可能是一个堵塞的端口，缺少了依赖关系。apache启动需要80端口和443端口，如果被占用将发生错误，可以通过XAMPP控制面板右侧栏的Netstat按钮查看主机的端口使用情况。</p><p style="text-align: center;"><img width="664" height="244" title="201605271464357219394974.png" style="width: 581px; height: 223px;" alt="搜狗截图20160527215318.png" src="http://old-blog.smallyu.net/zb_users/upload/2016/05/201605271464357219394974.png"/></p><p>想要解决这个问题的方法是简单的。只要更改apache的配置文件中所需使用的被占用的端口80或者443为其它端口，80端口的配置文件为httpd.conf，443端口的配置文件为httpd-ssl.conf，找到语句Listen，后面的数字即为对应端口号。（这里省略相应配置文件路径的内容，网络上相关内容很丰富了）</p><p><span style="font-size: 14px; text-decoration: underline;">注</span><span style="font-size: 14px; text-decoration: none;">：</span><span style="font-size: 16px; text-decoration: underline;"></span><span style="font-size: 14px;"></span></p><p><span style="font-size: 14px; text-decoration: none;">1.可能在配置文件中会找到多个80或者443的字样，</span><span style="font-size: 14px; text-decoration: underline;">只需更改Listen后面的数字</span><span style="font-size: 14px; text-decoration: none;">就可以了。</span></p><p><span style="font-size: 14px; text-decoration: none;">2.端口号可以随意定义，但是要注意</span><span style="color: #000000;"><span style="font-size: 14px; text-decoration: underline;">端口号最大值为65000</span><span style="font-size: 14px; text-decoration: none;"></span></span><span style="color: #000000;"><span style="font-size: 14px; text-decoration: none;"></span></span><span style="color: #000000;"></span><span style="font-size: 14px; text-decoration: none;">，不要超过这个数字，比如将80端口改为8080是合法的，但把443改为443443就是非法的，可以使用444等端口数值。</span></p>]]></description>
      <pubDate>Fri, 27 May 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>浅思考：我为什么想要坚持写博客</title>
      <link>http://old-blog.smallyu.net/indexd708.html?id=3</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=3</guid>
      <description><![CDATA[<p style="text-align: left;"><span style="font-family: Microsoft YaHei;"></span></p><p style="text-align: left;"><span style="font-family: Microsoft YaHei;"></span></p><p style="text-align: center;"><img title="201605261464238871130612.jpg" alt="850cfa3f7733c8b234deac0057aa4656.jpg" src="http://old-blog.smallyu.net/zb_users/upload/2016/05/201605261464238871130612.jpg" style="font-family: &#39;Microsoft YaHei&#39;;"/><br/></p><p style="text-align: left;"><span style="font-family: Microsoft YaHei;">一直想要得到一个足够说服自己坚持写博客的理由，未果。但现实征服了我自己，作为一个IT爱好者，网站builder，未来的程序猿，网络已然植根在我的生命中<span style="font: 14px/24px arial; color: #333333; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: #FFFFFF; -webkit-text-stroke-width: 0px;">。</span></span></p><p style="text-align: left;"><span style="font: 14px/24px Microsoft YaHei; color: #333333; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: #FFFFFF; -webkit-text-stroke-width: 0px;">来看一下下面的引用内容：</span></p><hr/><blockquote style="text-align: left;"><p style="text-align: left;">作者：陈素封<br style="text-align: left;"/>链接：https://zhuanlan.zhihu.com/p/19743861<br style="text-align: left;"/>来源：知乎<br style="text-align: left;"/>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p></blockquote><blockquote style="text-align: left;"><div style="text-align: left;"><p style="text-align: left;"><span style="background-color: #FFFFFF;">为什么你要写博客？</span></p><h2 style="text-align: left;"><span style="color: #000000; background-color: #FFFFFF;">一个选择</span></h2><p style="text-align: left;"><span style="background-color: #FFFFFF;">我知道现在可能说这话有点不合时宜，毕竟博客时代都已经过去了，再号召大家用过就好像时的东西是不是有点逆流而上？</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">我曾经也问过自己这个问题，但是我觉得，博客时代过去跟我们要开博客是没有多大关系的，就好像你的读书时代已经过去你就不再读书一样。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">判断一件事情值不值得去做有一个方法：在一张白纸的左边写不值得做的原因，然后在右边写值得做的原因，写完一比较，一权衡，自然能够得出结果。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">大家都成年人了，你会觉得这样思考分析总结的过程才是正确的思考的方法吧？</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">所以，我在这里列出要写（独立）博客的原因，供大家去选择，然后填在你白纸的右边。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">注意，我不是给你一个建议，而是提供一个选择，这个选择蕴藏着我也不知道的可能。</span></p><h2 style="text-align: left;"><span style="color: #000000; background-color: #FFFFFF;">博客的内容</span></h2><p style="text-align: left;"><span style="background-color: #FFFFFF;">写博客不难，你可以当作是生活的记录，但是这样的记录没有任何的意义。写要对得住写本身，写出来的东西应该是思考的结果。我认为，如果你要开一个博客，博客的内容应该是这样的：</span></p><ul class=" list-paddingleft-2"><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">1. 不是生活杂记、不是流水账、不是牢骚、不是抱怨、不是心情琐记……；</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">2. 有目的地写，要务实，追求质量；</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">3. 承认真实的自己，不要吹嘘，不要装逼，无需讨好读者；</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">4. 记录自己学习、思考、总结的过程；</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">5. 分享你的故事、所得、感想、经验；</span></p></li></ul><h2 style="text-align: left;"><span style="color: #000000; background-color: #FFFFFF;">值得写的原因</span></h2><p style="text-align: left;"><span style="background-color: #FFFFFF;">以下是一个清单，可以根据自己的情况匹配，然后选择。</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">重新认识自己</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">是不是很久没有跟自己对话了？</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">你可以尝试从回答一些问题开始，将你过去要回避的问题写下来，例如就可以从这个九个问题开始：</span></p><ul class=" list-paddingleft-2"><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">1、请你介绍一下你自己，你是个什么样的人？</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">2、你有什么理想吗？这个理想是怎么形成的？</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">3、你理想的伴侣关系是什么样的？你自己在这个伴侣关系中扮演什么样的角色？要承担什么样的责任？</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">4、你理想的事业是什么，你正在做的工作符合你的事业理想吗？这份工作对你的意义是什么？</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">5、你对亲子关系怎么看？对你来说，什么是一个理想的父亲（母亲），你期望自己成为这样一个理想父亲（母亲）吗？</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">6、你对钱怎么看，你认为赚到多少钱是足够的？如果你明天一早醒来，已经有足够的钱，你将会如何继续安排自己的生活？</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">7、对你来说，什么是理想的性生活？什么是理想的性道德，在你的性道德观中，什么样的性生活是禁忌的，需要避免的，什么样的性生活是美好的，需要得到鼓励和发展的？</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">8、你的择友标准是什么？什么样的人你会愿意交往，什么样的人你会拒绝和他交往？</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">9、你对死亡怎么看？你希望自己活到多少岁，你准备怎么度过从现在到死亡的这段时间？如果你要立遗嘱，这份遗嘱会怎么写？</span></p></li></ul><p style="text-align: left;"><span style="background-color: #FFFFFF;">以上的这九个问题摘自《很少人能顺畅回答这9个问题——心理治疗刚开始医生常常会先问你的 》by 李孟潮。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">这些问题的答案你可以选择不发，但是我强烈地建议写下来，只有在写的时候你才可以慎重地思考这些问题，而不会回避跳过或者留下空白，这是接受自己的第一步。</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">提供持续学习的动力</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">例如，我为自己设限每天写一千字，信息的不断输出给我带来恐惧，我害怕有一天我写无可写，于是我不停地阅读，通过个人的知识管理促使自己不断学习，提高核心竞争力。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">详细的知识管理可以看我的这篇文章：《个人知识管理的方法》，回复「知识」可见</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">积累更多的知识</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">写并不是单纯的写。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">例如你写着写着，你突然忘记了一个概念，于是上网找，找回来这个概念的时候，你重温这个概念，可能还会顺便看了一下这个概念的其他东西。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">例如你需要获取第一手的资料，寻找信息来源本身就是一个知识积累的过程，同时，你慢慢就学会了鉴别知识：什么是没有用的心灵鸡汤，什么是不值得关注的吐槽名人，还有，在这个过程中，你还养成你的心智。</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">提高将事情讲清楚的能力</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">很多东西你以为懂了，但当你在写下来的时候，你就觉得无从下手了。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">如果一件事情你不能讲清楚，十有八九你还没有完全理解。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">将事情写下来，慢慢就可以提高你的逻辑思维能力，分析能力，写会迫使你在你脑中搭建一个有条理的框架。例如我写这篇文章一样，我就将值得写博客的原因一点一点地罗列出来，事情就更加清晰，你也可以更好的思考问题。</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">分享带来的连锁反应</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">“通过分享，你获得了直接而快速的回报，你最终或许会发现你已将版权和“保留所有权利”抛诸脑后。新的经济学准则是：参与你作品的人越多，回报越高。在分享主义里，如果你愿意你可以保留所有权，但是我乐于分享。” by 毛向辉 《分享主义：一场思维革命》</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">互联网精神其中最重要的就是分享主义，基于分享主义，你可以享受到社会化及互联网给你带来的种种便利和好处，你分享了一个知识，你就成为了互联网中的一个点，这个点的大小由你自己来决定，互联网的大潮会将你的这个点推送到它所能触及的每个角落，让需要的人得到，同时，你的这个点也会继续扩大，连接到整个网络，这个点有可能连接成一张网，而你就是这张网的中心。</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">帮你找到志同道合的人</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">在微博，在朋友圈，你可能找不到跟你志同道合的人，而在博客，你可以通过看他的几篇文章就迅速地理解认同这个人，即使你没有见过这个人，但你也可以通过这种关联来相互学习。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">如果你在一个领域有相当的了解，你将这些内容发在网络上，网络上跟你志趣相投的人也会被你吸引过来，根据吸引力法则，你是怎样的人你就被怎么样的人吸引，这就是博客所能赋予你的魅力。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">即使博客没有被他人关注，我们依然可以找到同好，你可以自己将博文转载到其他站点，人们会通过搜索引擎找到你，有邮件、微博等工具，我们不乏与他人交流的途径。by Gabriel Weinberg《Why I blog》</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">记录成长</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">隔一段时间，你再回头看你写的博客，你会发现自己正在通过这样的方式在不断的成长，这种成长在自己眼里是一种财富，在别人眼里是一张地图，你得到了收获，不断修正自己的错误，别人得到了指引，避免走弯路。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">更多的情况是当你回望自己的时候你会发现自己是一个傻逼，so what，that is what I am！</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">培养持续做一件事情的能力</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">开始是坚持，后来是习惯，接着喜欢。以后当有人对你说，「你写那么多有用的东西，你真的很厉害啊！」你可以笑而不语，也可以大声说道：「你妹，你不知道我开始的时候多么痛苦！」</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">让你长久地去跑步，你可能做不到；让你每个月看一本书，你也可能做不到；但让你持续地写一个博客，你可以做得到。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">你不相信？你不试试你怎么知道？</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">默默地持续做一件事是一种难得的能力，也是一种难得的品质。</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">讨论反思</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">每人都会有思维的盲点，就好像这篇文章一样，可能你觉得我可能说得不对，你可以反驳我，我欢迎这种讨论，因为讨论的过程中会产生各种的思维的碰撞，这种碰撞会让你反思，也会激发出你新的灵感，这种讨论反思给自己的带来巨大的受益。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">互联网给你的反馈就是让你承受更多，接受更多，成为一个更好的人。</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">搜寻到你意想不到东西</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">世界不止是你的家，你的公司，你的朋友圈，你应该去发现一个更大的世界，通过写博客，你会知道世界上还有很多人像你一样在写博客，这些人和知识正在世界的某个角落在等着你。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">例如，在写这篇文章的过程中，我才知道了Gabriel Weinberg，我才要将阳志平的博客重读一遍。写的过程会让你有很多新的发现，这些新的发现都值得你去再写下来，总结分享出去。</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">一个人在做一件属于自己的事</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">很多你认为自己很牛逼的事情都是自己一个人做出来。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">别人在刷微博，你在看书，别人在看穿越剧，你在学英文，别人在去唱K，你在写个人总结。吃饭也要找同伴，出游要找同伴，看电影要找同伴，你上一次一个人在做一件属于自己的事是在什么时候？</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">如果你想要清晰地思考，就必须远离人群。但是走得越远，你的处境就会越困难，收到的阻力也会越大。因为你没有迎合社会习俗，而是一步步地与它背道而驰。如果自己就是潮水的一部分 ，怎么能看见潮流的方向呢？你只能永远保持质疑，问自己，什么话是我不能说的？为什么？——Paul Graham《不能说的话》</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">互联网的身份识别：</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">一个长期的价值博客是一份很好的简历。这里的“简历”并非是狭义上的求职简历，毕竟现在还没有到价值博客的时代，很多人写博客都是到处转载或者干脆碎碎念，正因此面试官未必拿个人博客当成了解一个人的更可靠窗口。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">这里的“简历”是指一个让别人了解自己的窗口，虽然我们未必做得到像罗永浩、Keso这样的博客，个人的影响力已经足以支撑出一份事业（牛博和5gme），但至少你会因此而结识更多的人，你的博客价值越高，你结识的人就越牛，跟牛人交流又会让你的眼界得到极大的开阔，打开一扇又一扇你原本不知道的门，于是你就变得更牛… 这是一个良性循环。by 刘未鹏</span></p><h3 style="text-align: left;"><span style="background-color: #FFFFFF;">最后</span></h3><p style="text-align: left;"><span style="background-color: #FFFFFF;">你可能想不到在白纸的左边（不值得写博客的原因）写什么了，想不到写个「博客时代已经过去」或者「我没有时间」也可以，但与此同时，你也可以用那些时间去思考一下「怎么做到长期写一个价值博客」。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">如果你不想思考，也可以回复「价值」看看别人的建议。</span></p><p style="text-align: left;"><span style="background-color: #FFFFFF;">推荐写作平台：</span></p><ul class=" list-paddingleft-2"><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">简书（推荐）</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">自己搭建一个独立博客</span></p></li><li><p style="text-align: left;"><span style="background-color: #FFFFFF;">新浪博客</span></p></li></ul></div></blockquote><hr/><p>可能稍微有点长，讲述的很详细了，那么下面的引用是关于，我为什么选择独立博客：</p><hr/><blockquote style="text-align: left;"><div style="text-align: left;"><strong>第三方BSP永远不靠谱。</strong>只要你有钱，还是用独立域名和空间，可以保证你30年后还可以访问你的文件。blogcn不过六七年就没了，微软的Space、雅虎的360、地球村，都证明，公司再大，服务也不靠谱。<br style="text-align: left;"/>用微博的人多了，写博客的人少了，但这和博客式微是两码事。微博只是把原先并不适应写博客的人吸引走了，博客依然有自己的生存空间。为了推广你的博客，也可能用长微博之类的方式嘛。<br style="text-align: left;"/>但博客从来都不是专门写给别人看的，因为微博比博客更适合写给别人看。如果你觉得写博客得到的回音少了，或者别的什么，那你理所应当转去微博。否则，你选啥BSP都行，反正是写给自己看。<br style="text-align: left;"/><br style="text-align: left;"/>作者：李书航<br style="text-align: left;"/>链接：http://www.zhihu.com/question/21140875/answer/17314663<br style="text-align: left;"/>来源：知乎<br style="text-align: left;"/>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</div></blockquote><hr/><p>当然，种种原因，还要归结于自己对建设站点的爱好。我不能保证可以坚持多长时间，但我由衷地希望自己可以坚持很长，很长的时间，就算是为了曾经的自己，现在的自己，未来的自己，以及，未出现的你。</p><p style="text-align: left;">最后，再来看一个引用，“作为技术人员为什么要写博客”：</p><hr/><p>&nbsp;</p><blockquote style="text-align: left;"><h3 style="margin: 15px auto; padding: 4px 0px; text-align: left; color: rgb(51, 51, 51); text-transform: none; line-height: 32px; text-indent: 0px; letter-spacing: normal; font-family: Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; font-style: normal; font-variant: normal; font-weight: bold; word-spacing: 0px; border-top-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-top-width: 1px; border-bottom-width: 1px; border-top-style: dashed; border-bottom-style: dashed; white-space: normal; widows: 1; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">一 我心中的博客</h3><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-family: Helvetica,Arial,sans-serif; font-size: 14px;">我所以指的写博客，不单只是写一篇文章出来这一结果。而应该是写的这一过程，写过技术文章的朋友应该跟我一样有这么一个过程。</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-family: Helvetica,Arial,sans-serif; font-size: 14px;">1 自己了解学习，文章所涉及到的知识点，及知识点衍生出来的知识点。</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-family: Helvetica,Arial,sans-serif; font-size: 14px;">2 对学习的知识点进行验证，以确保理论值与实践值保持一致</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-family: Helvetica,Arial,sans-serif; font-size: 14px;">3 构思文章的大纲，哪些部分需要重点写，需要配合实例代码，图片等信息</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">4 动手写，写完后再次检查校正并排版，然后发表</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">5 针对网友的评论中提出的问题进行回复</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">我写文章一般都会经历以上5上步，最终以上5步融合成一个结果那就是&quot;一篇文章&quot; 这一过程也是我心中对的&quot;写博客&quot;一词的诠释</span></p><h3 style="margin: 15px auto; padding: 4px 0px; text-align: left; color: rgb(51, 51, 51); text-transform: none; line-height: 32px; text-indent: 0px; letter-spacing: normal; font-family: Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; font-style: normal; font-variant: normal; font-weight: bold; word-spacing: 0px; border-top-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-top-width: 1px; border-bottom-width: 1px; border-top-style: dashed; border-bottom-style: dashed; white-space: normal; widows: 1; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">二 为什么要写博客</h3><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><strong style="margin: 0px; padding: 0px;">2.1 为自己</strong></span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">写博客对自己的提升是很大的，可能写一篇体现不出来，但是只要你坚持写效果就很明显，好处人个认为有以下几点</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><strong style="margin: 0px; padding: 0px;">2.1.1 强化知识点：</strong></span><span style="font-size: 14px;">在写一篇文章前，你必定是要把以文章中心为主的知识点及衍生的知识点都详细了解一 篇，在这一过程中必须会涉及到自己以前所了解过的知识，人的记忆是存在记忆曲线的需要不断的重复记忆才能长久的记住某一事物，而每写一篇文章时都会查阅资 料，在这一过程中必然会遇到以前记住了而现在渐渐淡忘的知识点，当你再次看到时瞬间就会回想起，此时以前的知识点就得到了强化。</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><strong style="margin: 0px; padding: 0px;">2.1.2 提升学习能力：</strong></span><span style="font-size: 14px;">同一样的人，了解同一知识点，用不同的方 法，产生的结果必然会不一样，找到最佳的学习方法，这也是一种能力，这种能力是经过多次实践探索之后总结出来的，以前我每次需了解某一种技术时都会先</span><a title="百度" style="margin: 0px; padding: 0px; color: rgb(69, 10, 17); font-size: 14px; text-decoration: underline;" href="http://lusongsong.com/tags/baidu.html" target="_blank"><span style="font-size: 14px;">百度</span></a><span style="font-size: 14px;">&nbsp;看各种搜索结果，发现没有想要的之后，再Google因为Google的结果与百度的会有所不同，Google结果中国外的文章相对会多一点，而偶然点了 一个链接进入了博客园，发现就是自己想要的东西，而且把概念，代码，及经验都写上去了，看完之后对我帮助很大。</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">渐渐的我便开始采这种方法了解新知识概念性的直接看百度百科，实质性的直接 上博客园的 找找看 ，群里的朋友还推荐了一种方法，比如我要学MVC 园子里很多人都写了 关于MVC的一系列文章，把那一系列的文章都看一遍，对于MVC就基本有了了解了，这便是学习能力的提升,对于某种技术用最短的时间做到了比较全面的了解</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><strong style="margin: 0px; padding: 0px;">2.1.3 提升文字组织能力：</strong></span><span style="font-size: 14px;">这个就不用说了，写博客，既然是写，就必然会有大量的文字，而如何组织文字表达出自己想表达的意思，是长期练习的，而写博客正好帮助你提高了你的文字组织能力，</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><strong style="margin: 0px; padding: 0px;">2.1.4 提升逻辑思维能力：</strong></span><span style="font-size: 14px;">不用说，技术性的东西从来就没的单独存 在的，都一层层技术相结合，那在了解某种技术时，自己的思维也是要顺着这种关系逐渐深入的，比如MVC，你不能只知道 M是什么V是什么 C是什么就行了吧，你得知道 M V C 这三者关系是怎样的，又是怎样交互，而你了解之后再把它写出来时，需要清晰逻辑。</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><strong style="margin: 0px; padding: 0px;">2.2 为他人</strong></span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><strong style="margin: 0px; padding: 0px;">2.2.1 有意的：</strong></span>&nbsp;<span style="font-size: 14px;">园子里有很多人都写过关于 MVC 框架 WCF 等等系列文章，目的就在于帮助新人快速上手，这个我深有体会，当初我开始学习MVC时就是看的T2噬菌体的MVC系　　列文章，整篇看完后再配合自己动手对于MVC就有了基本的了解了，在次感谢园子里无私献的大牛们。而以上行为就是有意的帮助</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><strong style="margin: 0px; padding: 0px;">2.2.2 无意的：</strong></span><span style="font-size: 14px;">很多时候在开发项目的过程中，遇到了技术问题，花了时间解决后，有人会写博客记录，并附上解决方法旨在当再次遇到问题时直接看下文章就知道如何处理了，</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">而碰巧的是，这种问题不止他一个人遇到了。很多人在开发时也遇到了这个问题，在网上找答案时，就找到了这篇文章，并根据文章提供的解决方法，顺利的解决了问题，这种帮助就是无意的帮助</span></p><h3 style="margin: 15px auto; padding: 4px 0px; text-align: left; color: rgb(51, 51, 51); text-transform: none; line-height: 32px; text-indent: 0px; letter-spacing: normal; font-family: Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; font-style: normal; font-variant: normal; font-weight: bold; word-spacing: 0px; border-top-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-top-width: 1px; border-bottom-width: 1px; border-top-style: dashed; border-bottom-style: dashed; white-space: normal; widows: 1; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">三 一定要写博客吗</h3><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">答案肯定是否定的，中国几百万的程序员，如果都写博客，那程序员的春天就来了，但是事实并非如此。而我所讲的 写博客 的产物并不只是一篇文章，更多的是，对自己能力的提升，自己对知识点的总结，而发表在博客上只是为了公开，还有很多人喜欢记录在云笔记里面。还有工作很 忙，没有空闲时间写出来，因为写技术性的文章，花的时间是很长的。写过的朋友都知道。</span></p><h3 style="margin: 15px auto; padding: 4px 0px; text-align: left; color: rgb(51, 51, 51); text-transform: none; line-height: 32px; text-indent: 0px; letter-spacing: normal; font-family: Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; font-style: normal; font-variant: normal; font-weight: bold; word-spacing: 0px; border-top-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-top-width: 1px; border-bottom-width: 1px; border-top-style: dashed; border-bottom-style: dashed; white-space: normal; widows: 1; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">四 博客会给你带来哪些收获</h3><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">古人云:一份耕耘,一份收获</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">以下这些是帮助他人而得到的一些认可，并非主观上去追求的</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">MVP：微软每年都颁发MVP给那些经常与其他专业人士分享知识和专业技能，受人尊敬、信任，而且平易近人的专家。而这个称号则是对你写的博客质量的肯定</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">知名度:文章写得好的人，技术水平肯定也很好，知道的人多了，知名度就有了，比如园子里排名前10的大家都知道，都看过他们的文章。</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">尊敬:对于技术界的大神，都是受人敬仰的，在园子里或者工作中也是一样的，在心里对大神们都是默默的佩服!至少我是这样啦，哈哈~也是我学习的榜样!</span></p><h3 style="margin: 15px auto; padding: 4px 0px; text-align: left; color: rgb(51, 51, 51); text-transform: none; line-height: 32px; text-indent: 0px; letter-spacing: normal; font-family: Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; font-style: normal; font-variant: normal; font-weight: bold; word-spacing: 0px; border-top-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-top-width: 1px; border-bottom-width: 1px; border-top-style: dashed; border-bottom-style: dashed; white-space: normal; widows: 1; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;">五 总结</span></h3><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">我所认的写博客是对自己所了解知识的强化，分享，自身能力的提升。当然 写 博客只是一种方法而以，只要能达到提升自我的效果什么方法都是可以的</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">之前有看过一则新闻：即便没有读者，你也要写博客 ，文章也讲解了很多写博客的好处。</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">而我写博客是希望，能提升自己的综合能力，并把自己的知识与经验分享给大家，如果有幸我的分享帮助了一些人，那将使我更加欣慰</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">最后附上一句名言：<em style="margin: 0px; padding: 0px;">有些事情你现在不去做，可能以后都不会有机会了!</em></span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">注：我代表不了大家，所以以上观点只代表我个人。</span></p><p style="font: 18px/34.2px Arial, Helvetica, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, sans-serif; margin: 0px; padding: 8px 0px; text-align: left; color: rgb(42, 42, 42); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; widows: 1; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><span style="font-size: 14px;">本文作者：</span><span style="margin: 0px; padding: 0px; color: #450A11; font-size: 14px; text-decoration: underline;"><a style="margin: 0px; padding: 0px; color: rgb(69, 10, 17); font-size: 14px; text-decoration: underline;" href="https://www.cnblogs.com/zery/p/3343893.html" target="_blank" rel="nofollow">Zery</a></span></p></blockquote><hr/><p>&nbsp;就是这样。</p>]]></description>
      <pubDate>Tue, 24 May 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
    <item>
      <title>欢迎使用Z-BlogPHP!</title>
      <link>http://old-blog.smallyu.net/index681a.html?id=1</link>
      <guid isPermaLink="false">http://old-blog.smallyu.net/?id=1</guid>
      <description><![CDATA[<p>欢迎使用Z-Blog,这是程序自动生成的文章.您可以删除或是编辑它:)</p><p>系统总共生成了一个&quot;留言本&quot;页面,和一个&quot;欢迎使用Z-BlogPHP!&quot;文章,祝您使用愉快!</p>]]></description>
      <pubDate>Mon, 23 May 2016 00:00:00 +0800</pubDate>
      <dc:creator>smallyu</dc:creator>
    </item>
  </channel>
</rss>
