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

<channel>
	<title>Computer, Electron and Technology &#187; doc</title>
	<atom:link href="http://www.donevii.com/tags/%e6%96%87%e6%a1%a3%e8%b5%84%e6%96%99/feed" rel="self" type="application/rss+xml" />
	<link>http://www.donevii.com</link>
	<description>DoneVII CET &#38; CPPLITE</description>
	<lastBuildDate>Wed, 02 Jun 2010 10:45:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>GTK+主循环(main loop)的工作原理</title>
		<link>http://www.donevii.com/post/580.html</link>
		<comments>http://www.donevii.com/post/580.html#comments</comments>
		<pubDate>Mon, 20 Oct 2008 14:09:49 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[c/c++/c#]]></category>
		<category><![CDATA[doc]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[glib]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[循环]]></category>

		<guid isPermaLink="false">http://www.donevii.com/?p=580</guid>
		<description><![CDATA[转至：http://www.builder.com.cn 我们知道GUI应用程序都是事件驱动的。这些事件大部分都来自于用户，比如键盘事件、鼠标事件或笔点事件。还有一些事件来自于系统内部，比如定时事件、socket事件... ]]></description>
			<content:encoded><![CDATA[<p>转至：http://www.builder.com.cn</p>
<p><span style="font-family: 宋体;"><span style="font-size: small;">我们知道<span lang="EN-US">GUI应用程序都是事件驱动的。这些事件大部分都来自于用户，比如键盘事件、鼠标事件或笔点事件。还有一些事件来自于系统内部，比如定时事件、socket事件和其它文件事件等等。在没有任何事件的情况下，应用程序处于睡眠状态。</span></span></span></p>
<p><span style="font-family: 宋体;" lang="EN-US"><span style="font-size: small;"> </span></span></p>
<p><span style="font-family: 宋体;"><span style="font-size: small;">因为这种事件驱动机制，<span lang="EN-US">GUI应用程序都毫无例外的需要一个主循环(main loop)。主循环(main loop)控制应用程序什么时候进入睡眠状态，什么时候被唤醒。主循环实现得好，应用程序才能工作正常又省电。</span></span></span></p>
<p><span style="font-family: 宋体;" lang="EN-US"><span style="font-size: small;"> </span></span></p>
<p><span style="font-family: 宋体;" lang="EN-US"><span style="font-size: small;">Win32 GUI应用程序的主循环是我们比较熟悉的，其大致如下：</span></span></p>
<table style="border: medium none; background: #e6e6e6 none repeat scroll 0% 0%; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" bgcolor="#e6e6e6">
<tbody>
<tr>
<td style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" width="568" valign="top">
<p align="left"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span> </span></span><span style="color: #009900;" lang="EN-US">// Main message loop:</span></span></span></p>
<p align="left"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span> </span></span><span style="color: blue;" lang="EN-US">while</span><span style="color: black;" lang="EN-US"> (</span><span style="color: #a000a0;" lang="EN-US">GetMessage</span><span style="color: black;" lang="EN-US">(&amp;</span><span style="color: gray;" lang="EN-US">msg</span><span style="color: black;" lang="EN-US">, </span><span style="color: #a000a0;" lang="EN-US">NULL</span><span style="color: black;" lang="EN-US">, 0, 0)) </span></span></span></p>
<p align="left"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span> </span>{</span></span></span></p>
<p align="left"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span> </span></span><span style="color: blue;" lang="EN-US">if</span><span style="color: black;" lang="EN-US"> (!</span><span style="color: #a000a0;" lang="EN-US">TranslateAccelerator</span><span style="color: black;" lang="EN-US">(</span><span style="color: gray;" lang="EN-US">msg</span><span style="color: black;" lang="EN-US">.</span><span style="color: gray;" lang="EN-US">hwnd</span><span style="color: black;" lang="EN-US">, </span><span style="color: gray;" lang="EN-US">hAccelTable</span><span style="color: black;" lang="EN-US">, &amp;</span><span style="color: gray;" lang="EN-US">msg</span><span style="color: black;" lang="EN-US">)) </span></span></span></p>
<p align="left"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span> </span>{</span></span></span></p>
<p align="left"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span> </span></span><span style="color: #880000;" lang="EN-US">TranslateMessage</span><span style="color: black;" lang="EN-US">(&amp;</span><span style="color: gray;" lang="EN-US">msg</span><span style="color: black;" lang="EN-US">);</span></span></span></p>
<p align="left"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span> </span></span><span style="color: #a000a0;" lang="EN-US">DispatchMessage</span><span style="color: black;" lang="EN-US">(&amp;</span><span style="color: gray;" lang="EN-US">msg</span><span style="color: black;" lang="EN-US">);</span></span></span></p>
<p align="left"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span> </span>}</span></span></span></p>
<p><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span> </span>}</span></span></span></td>
</tr>
</tbody>
</table>
<p><span style="font-family: 宋体;" lang="EN-US"><span style="font-size: small;"> </span></span></p>
<p><span style="font-size: small;"><span style="font-family: 宋体;">在这个主循环中，它不断的从消息队列中提取消息，然后分发给消息的目标</span><span lang="EN-US"><span style="font-family: Times New Roman;">(</span></span><span style="font-family: 宋体;">通常是窗口</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体;">，直到</span><span lang="EN-US"><span style="font-family: Times New Roman;">GetMessage</span></span><span style="font-family: 宋体;">返回</span><span lang="EN-US"><span style="font-family: Times New Roman;">FALSE</span></span><span style="font-family: 宋体;">（收到</span><span lang="EN-US"><span style="font-family: Times New Roman;">WM_QUIT</span></span><span style="font-family: 宋体;">消息，一般调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">PostQuitMessage</span></span><span style="font-family: 宋体;">）为止，如果队列中没有消息，应用程序就进入睡眠状态。这种方法简单明了，缺陷也是明显的，它只能挂在消息队列上，而不能同时挂在多个</span><span style="color: black; font-family: 宋体;">事件</span><span style="font-family: 宋体;">源上</span><span lang="EN-US"><span style="font-family: Times New Roman;">(</span></span><span style="font-family: 宋体;">如管道和</span><span lang="EN-US"><span style="font-family: Times New Roman;">socket</span></span><span style="font-family: 宋体;">等</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体;">。要挂在多个</span><span style="color: black; font-family: 宋体;">事件</span><span style="font-family: 宋体;">源上，需要使用其它方式，比如用</span><span lang="EN-US"><span style="font-family: Times New Roman;">WaitForMultipleObjects</span></span><span style="font-family: 宋体;">，那就比较麻烦了。</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="font-family: 宋体;">而在</span><span lang="EN-US"><span style="font-family: Times New Roman;"><a href="http://www.donevii.com/post/tag/gtk" class="st_tag internal_tag" rel="tag" title="Posts tagged with gtk">GTK</a>+</span></span><span style="font-family: 宋体;">应用程序中，其</span><span style="font-family: 宋体;">主循环<span lang="EN-US">(main loop)更加简单，但是非常的不明了：</span></span></span></p>
<table style="border: medium none; background: #e6e6e6 none repeat scroll 0% 0%; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" bgcolor="#e6e6e6">
<tbody>
<tr>
<td style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" width="568" valign="top"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman; font-size: small;">gtk_main ();</span></span></td>
</tr>
</tbody>
</table>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="font-family: 宋体;">不少人用</span><span lang="EN-US"><span style="font-family: Times New Roman;"><a href="http://www.donevii.com/post/tag/gtk" class="st_tag internal_tag" rel="tag" title="Posts tagged with gtk">GTK</a>+</span></span><span style="font-family: 宋体;">写了很长时间的程序，还是觉得这行代码很神秘，不知道里面到底干了什么。本文试图分析一下</span><span lang="EN-US"><span style="font-family: Times New Roman;">gtk_main</span></span><span style="font-family: 宋体;">的工作原理：</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">gtk_main</span></span><span style="font-family: 宋体;">主要是对</span><span lang="EN-US"><span style="font-family: Times New Roman;">glib</span></span><span style="font-family: 宋体;">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="font-family: 宋体;">的包装，基本上分为三步：</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;">1.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span></span><span style="font-family: 宋体;"><span style="font-size: small;">调用初始化函数。</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;">2.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">进入</span><span lang="EN-US"><span style="font-family: Times New Roman;">glib main loop</span></span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;">3.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">~</span></span><span style="font-family: 宋体;">初始化函数。</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="font-family: 宋体;">所以弄清楚</span><span lang="EN-US"><span style="font-family: Times New Roman;">glib main loop</span></span><span style="font-family: 宋体;">之后，</span><span lang="EN-US"><span style="font-family: Times New Roman;">gtk_main</span></span><span style="font-family: 宋体;">的实现也就尽收眼底了，本文重点分析</span><span lang="EN-US"><span style="font-family: Times New Roman;">glib</span></span><span style="font-family: 宋体;">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="font-family: 宋体;">的实现。</span><span lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="font-family: 宋体;">使用模式大致如下：</span></span></p>
<table style="border: medium none; background: #e6e6e6 none repeat scroll 0% 0%; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" bgcolor="#e6e6e6">
<tbody>
<tr>
<td style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" width="568" valign="top">
<p align="left"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: black;" lang="EN-US">loop = g_main_loop_new (</span><span style="color: #a000a0;" lang="EN-US">NULL</span><span style="color: black;" lang="EN-US">, </span><span style="color: #a000a0;" lang="EN-US">TRUE</span><span style="color: black;" lang="EN-US">);</span></span></span></p>
<p align="left"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman; font-size: small;">g_main_loop_run (loop);</span></span></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">g_main_loop_new</span></span><span style="color: black; font-family: 宋体;">创建一个</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="color: black; font-family: 宋体;">对象，一个</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="color: black; font-family: 宋体;">对象只能被一个线程使用，但一个线程可以有多个</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="color: black; font-family: 宋体;">对象。在</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;"><a href="http://www.donevii.com/post/tag/gtk" class="st_tag internal_tag" rel="tag" title="Posts tagged with gtk">GTK</a>+</span></span><span style="color: black; font-family: 宋体;">应用中，一个线程使用多个</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="color: black; font-family: 宋体;">的主要用途是实现模态对话框，它在</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">gtk_dialog_run</span></span><span style="color: black; font-family: 宋体;">函数里创建一个新的</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="color: black; font-family: 宋体;">，通过该</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">main loop</span></span><span style="color: black; font-family: 宋体;">分发消息，直到对话框关闭为止。</span></span></p>
<p><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">g_main_loop_run</span></span><span style="color: black; font-family: 宋体;">则是进入主循环，它会一直阻塞在这里，直到让它退出为止。有事件时，它就处理事件，没事件时就睡眠。</span></span></p>
<p><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">g_main_loop_quit</span></span><span style="font-family: 宋体;">则是用于退出</span><span style="color: black; font-family: 宋体;">主循环，相当于</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">Win32</span></span><span style="color: black; font-family: 宋体;">下的</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">PostQuitMessage</span></span><span style="font-family: 宋体;">函数。</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">Glib main loop</span></span><span style="color: black; font-family: 宋体;">的最大特点就是支持多事件源，使用非常方便。来自用户的键盘和鼠标事件、来自系统的定时事件和</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">socket</span></span><span style="color: black; font-family: 宋体;">事件等等，还支持一个称为</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">idle</span></span><span style="color: black; font-family: 宋体;">的事件源，其主要用途是实现异步事件。</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">Main loop</span></span><span style="color: black; font-family: 宋体;">的基本组成如下图所示：</span></span></p>
<p><span style="font-size: small;"><span lang="EN-US"></span></span></p>
<p><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/absurd/211144/o_mainloop_struct.jpg" alt="" /></span></span></span></p>
<p><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">GMainLoop</span></span><span style="font-family: 宋体;">的主要部件是</span><span lang="EN-US"><span style="font-family: Times New Roman;">GMainContext</span></span><span style="font-family: 宋体;">，</span><span lang="EN-US"><span style="font-family: Times New Roman;">GMainContext</span></span><span style="font-family: 宋体;">可以在多个</span><span lang="EN-US"><span style="font-family: Times New Roman;">GMainLoop</span></span><span style="font-family: 宋体;">间共享，但要求这些</span><span lang="EN-US"><span style="font-family: Times New Roman;">GMainLoop</span></span><span style="font-family: 宋体;">都在同一个线程中运行，前面提到的模态对话框就属于这一类。</span><span lang="EN-US"><span style="font-family: Times New Roman;">GMainContext</span></span><span style="font-family: 宋体;">通常由多个</span><span lang="EN-US"><span style="font-family: Times New Roman;">GSource</span></span><span style="font-family: 宋体;">组成，</span><span lang="EN-US"><span style="font-family: Times New Roman;">GSource</span></span><span style="font-family: 宋体;">是事件源的抽象，任何事件源，只要实现</span><span lang="EN-US"><span style="font-family: Times New Roman;">GSource</span></span><span style="font-family: 宋体;">规定的接口，都可以挂到</span><span lang="EN-US"><span style="font-family: Times New Roman;">GMainContext</span></span><span style="font-family: 宋体;">中来。</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">GSource</span></span><span style="font-family: 宋体;">的接口函数有：</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">1.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">gboolean (*prepare)<span> </span>(GSource<span> </span>*source, gint<span> </span>*timeout_);</span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">进入睡眠之前，在</span><span lang="EN-US"><span style="font-family: Times New Roman;">g_main_context_prepare</span></span><span style="font-family: 宋体;">里，</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">调用所有</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">prepare</span></span><span style="font-family: 宋体;">函数，计算最小的</span><span lang="EN-US"><span style="font-family: Times New Roman;">timeout</span></span><span style="font-family: 宋体;">时间，该时间决定下一次睡眠的时间。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">2.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">gboolean (*check)<span> </span>(GSource<span> </span>*source); poll</span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">被唤醒后，在</span><span lang="EN-US"><span style="font-family: Times New Roman;">g_main_context_check</span></span><span style="font-family: 宋体;">里，</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">调用所有</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">check</span></span><span style="font-family: 宋体;">函数，检查是否有</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">已经准备好了。如果</span><span lang="EN-US"><span style="font-family: Times New Roman;">poll</span></span><span style="font-family: 宋体;">是由于错误或者超时等原因唤醒的，就不必进行</span><span lang="EN-US"><span style="font-family: Times New Roman;">dispatch</span></span><span style="font-family: 宋体;">了。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">3.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">gboolean (*dispatch) (GSource*source, GSourceFunc callback,gpointer user_data); </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">当有</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">准备好了，在</span><span lang="EN-US"><span style="font-family: Times New Roman;">g_main_context_dispatch</span></span><span style="font-family: 宋体;">里，</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">调用所有</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">dispatch</span></span><span style="font-family: 宋体;">函数，去分发消息。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">4.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">void<span> </span>(*finalize) (GSource<span> </span>*source); </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">在</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">被移出时，</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">调用该函数去销毁</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">。</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">Main loop</span></span><span style="font-family: 宋体;">的工作流程简图如下：</span></span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/absurd/211144/o_mainloop_workflow.jpg" alt="" /></span></span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="font-family: 宋体;">下面我们看看几个内置</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">的实现机制：</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;"><strong><span lang="EN-US">Idle</span></strong><span lang="EN-US"> </span></span><span style="font-family: 宋体;">它主要用实现异步事件，功能类似于</span><span lang="EN-US"><span style="font-family: Times New Roman;">Win32</span></span><span style="font-family: 宋体;">下的</span><span lang="EN-US"><span style="font-family: Times New Roman;">PostMessage</span></span><span style="font-family: 宋体;">。但它还支持重复执行的特性，根据用户注册的回调函数的返回值而定。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">1.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">g_idle_prepare</span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">把超时设置为</span><span lang="EN-US"><span style="font-family: Times New Roman;">0</span></span><span style="font-family: 宋体;">，也就是即时唤醒，不进入睡眠状态。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">2.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">g_idle_check </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">始终返回</span><span lang="EN-US"><span style="font-family: Times New Roman;">TRUE</span></span><span style="font-family: 宋体;">，表示准备好了。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">3.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">g_idle_dispatch </span></span></span><span style="font-family: 宋体;"><span style="font-size: small;">调用用户注册的回调函数。</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;"><strong><span lang="EN-US">Timeout</span></strong><span lang="EN-US"> </span></span><span style="font-family: 宋体;">它主要用于实现定时器，支持一次定时和重复定时，根据用户注册的回调函数的返回值而定。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">1.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">g_timeout_prepare </span></span></span><span style="font-family: 宋体;"><span style="font-size: small;">计算下一次的超时时间。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">2.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">g_timeout_check </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">检查超时时间是否到了，如果到了就返回</span><span lang="EN-US"><span style="font-family: Times New Roman;">TRUE</span></span><span style="font-family: 宋体;">，否则返回</span><span lang="EN-US"><span style="font-family: Times New Roman;">FALSE</span></span><span style="font-family: 宋体;">。</span></span></p>
<p><span style="font-family: Times New Roman;"><span lang="EN-US"><span style="font-size: small;">3.</span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span><span lang="EN-US"><span style="font-size: small;">g_timeout_dispatch</span></span></span><span style="font-family: 宋体;"><span style="font-size: small;">调用用户注册的回调函数。</span></span></p>
<p><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"> </span></span></span></p>
<p><span style="font-size: small;"><span style="font-family: 宋体;">线程可以向自己的</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">中增加</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">，也可以向其它线程的</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">增加</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">。向自己的</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">中增加</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">时，</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">已经唤醒了，所以不会存在什么问题。而向其它线程的</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">增加</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">时，对方线程可能正挂在</span><span lang="EN-US"><span style="font-family: Times New Roman;">poll</span></span><span style="font-family: 宋体;">里睡眠，所以要想法唤醒它，否则</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">可能来不及处理。在</span><span lang="EN-US"><span style="font-family: Times New Roman;">Linux</span></span><span style="font-family: 宋体;">下，这是通过</span><span lang="EN-US"><span style="font-family: Times New Roman;">wake_up_pipe</span></span><span style="font-family: 宋体;">管道实现的，</span><span lang="EN-US"><span style="font-family: Times New Roman;">mainloop</span></span><span style="font-family: 宋体;">在</span><span lang="EN-US"><span style="font-family: Times New Roman;">poll</span></span><span style="font-family: 宋体;">时，它除了等待所有的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Source</span></span><span style="font-family: 宋体;">外，还会等待</span><span lang="EN-US"><span style="font-family: Times New Roman;">wake_up_pipe</span></span><span style="font-family: 宋体;">管道。要唤醒</span><span lang="EN-US"><span style="font-family: Times New Roman;">poll</span></span><span style="font-family: 宋体;">，调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">g_main_context_wakeup_unlocked</span></span><span style="font-family: 宋体;">向</span><span lang="EN-US"><span style="font-family: Times New Roman;">wake_up_pipe</span></span><span style="font-family: 宋体;">里写入字母</span><span lang="EN-US"><span style="font-family: Times New Roman;">A</span></span><span style="font-family: 宋体;">就行了。</span></span></p>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/112.html" title="這十八招Web2.0創業者千萬不要學 (2006-10-24)">這十八招Web2.0創業者千萬不要學</a> (0)</li>
	<li><a href="http://www.donevii.com/post/89.html" title="用rsync对网站进行镜像备份 (2006-10-18)">用rsync对网站进行镜像备份</a> (0)</li>
	<li><a href="http://www.donevii.com/post/758.html" title="清除指定squid缓存文件的脚本 (2009-02-09)">清除指定squid缓存文件的脚本</a> (0)</li>
	<li><a href="http://www.donevii.com/post/940.html" title="每天看 svn 库变更的一个小 shell 脚本 (2009-11-06)">每天看 svn 库变更的一个小 shell 脚本</a> (0)</li>
	<li><a href="http://www.donevii.com/post/75.html" title="挣脱Windows的枷锁：Linux屏幕录像 (2006-10-10)">挣脱Windows的枷锁：Linux屏幕录像</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/580.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转] Chunked编码</title>
		<link>http://www.donevii.com/post/466.html</link>
		<comments>http://www.donevii.com/post/466.html#comments</comments>
		<pubDate>Tue, 02 Sep 2008 13:57:02 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[protocol]]></category>
		<category><![CDATA[chunked]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[transfer]]></category>
		<category><![CDATA[编码]]></category>
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://www.donevii.com/?p=466</guid>
		<description><![CDATA[转至: http://www.21andy.com/blog/20071109/660.html 有时候，Web服务器生成HTTP Response是无法在Header就确定消息大小的，这时一般来说服务器将不会提供Content-Length的头信息，而采用Chunked编码动态的提供body... ]]></description>
			<content:encoded><![CDATA[<p>转至: <a title="Chunked编码" href="http://www.21andy.com/blog/20071109/660.html">http://www.21andy.com/blog/20071109/660.html</a></p>
<p>有时候，Web服务器生成HTTP Response是无法在Header就确定消息大小的，这时一般来说服务器将不会提供Content-Length的头信息，而采用Chunked编码动态的提供body内容的长度。</p>
<p>进行Chunked编码传输的HTTP Response会在消息头部设置：</p>
<div class="hl-surround">
<div class="hl-main">Transfer-<a href="http://www.donevii.com/post/tag/encoding" class="st_tag internal_tag" rel="tag" title="Posts tagged with encoding">Encoding</a>: chunked</div>
</div>
<p>表示Content Body将用Chunked编码传输内容。</p>
<p>Chunked编码使用若干个Chunk串连而成，由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分，头部内容指定下一段正文的字符总数（十六进制的数字）和数量单位（一般不写），正文部分就是指定长度的实际内容，两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容，是一些附加的Header信息（通常可以直接忽略）。具体的Chunk编码格式如下：</p>
<div class="hl-surround">
<div class="hl-main">　　Chunked-Body = *chunk<br />
　　　　　　　　　&#8221;0&#8243; CRLF<br />
　　　　　　　　　footer<br />
　　　　　　　　　CRLF<br />
　　chunk = chunk-size [ chunk-ext ] CRLF<br />
　　　　　　chunk-data CRLF</p>
<p>　　hex-no-zero = &lt;HEX excluding &#8220;0&#8243;&gt;</p>
<p>　　chunk-size = hex-no-zero *HEX<br />
　　chunk-ext = *( &#8220;;&#8221; chunk-ext-name [ "=" chunk-ext-value ] )<br />
　　chunk-ext-name = token<br />
　　chunk-ext-val = token | quoted-string<br />
　　chunk-data = chunk-size(OCTET)</p>
<p>　　footer = *entity-header</p></div>
</div>
<p>RFC文档中的Chunked解码过程如下：</p>
<div class="hl-surround">
<div class="hl-main">　　length := 0<br />
　　read chunk-size, chunk-ext (if any) and CRLF<br />
　　while (chunk-size &gt; 0) {<br />
　　read chunk-data and CRLF<br />
　　append chunk-data to entity-body<br />
　　length := length + chunk-size<br />
　　read chunk-size and CRLF<br />
　　}<br />
　　read entity-header<br />
　　while (entity-header not empty) {<br />
　　append entity-header to existing header fields<br />
　　read entity-header<br />
　　}<br />
　　Content-Length := length<br />
　　Remove &#8220;chunked&#8221; from Transfer-<a href="http://www.donevii.com/post/tag/encoding" class="st_tag internal_tag" rel="tag" title="Posts tagged with encoding">Encoding</a></div>
</div>
<p>最后提供一段PHP版本的chunked解码代码：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #00008b;">$chunk_size</span><span style="color: gray;"> = </span><span style="color: olive;">(</span><span style="color: blue;">integer</span><span style="color: olive;">)</span><span style="color: blue;">hexdec</span><span style="color: olive;">(</span><span style="color: blue;">fgets</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$socket_fd</span><span style="color: gray;">, </span><span style="color: maroon;">4096</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">while</span><span style="color: olive;">(</span><span style="color: gray;">!</span><span style="color: blue;">feof</span><span style="color: olive;">(</span><span style="color: #00008b;">$socket_fd</span><span style="color: olive;">)</span><span style="color: gray;"> &amp;&amp; </span><span style="color: #00008b;">$chunk_size</span><span style="color: gray;"> &gt; </span><span style="color: maroon;">0</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
    </span><span style="color: #00008b;">$bodyContent</span><span style="color: gray;"> .= </span><span style="color: blue;">fread</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$socket_fd</span><span style="color: gray;">, </span><span style="color: #00008b;">$chunk_size</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;">;<br />
    </span><span style="color: blue;">fread</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$socket_fd</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;">; </span><span style="color: #ffa500;">// skip \r\n</span><span style="color: gray;"><br />
    </span><span style="color: #00008b;">$chunk_size</span><span style="color: gray;"> = </span><span style="color: olive;">(</span><span style="color: blue;">integer</span><span style="color: olive;">)</span><span style="color: blue;">hexdec</span><span style="color: olive;">(</span><span style="color: blue;">fgets</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$socket_fd</span><span style="color: gray;">, </span><span style="color: maroon;">4096</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span></div>
</div>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/468.html" title="[转] HTTP协议之Chunked解析 (2008-09-02)">[转] HTTP协议之Chunked解析</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/466.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]内存种类知多少</title>
		<link>http://www.donevii.com/post/388.html</link>
		<comments>http://www.donevii.com/post/388.html#comments</comments>
		<pubDate>Mon, 14 Jan 2008 08:39:12 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mtk]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[RAM]]></category>
		<category><![CDATA[SDRAM]]></category>
		<category><![CDATA[介绍]]></category>
		<category><![CDATA[历史]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[缓存]]></category>
		<category><![CDATA[芯片]]></category>

		<guid isPermaLink="false">http://www.donevii.com/post/388.html</guid>
		<description><![CDATA[终于知道为什么SDRAM都被CPU当做Internal RAM来用。 凡是对电脑有所了解的朋友都知道内存这玩意，可是，可能有不少朋友对内存的认识仅仅局限在SDRAM和DDR SDRAM这两种类型，事实上，内存的种类是... ]]></description>
			<content:encoded><![CDATA[<pre>    <em>终于知道为什么<a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>都被CPU当做Internal RAM来用。</em></pre>
<pre>    凡是对电脑有所了解的朋友都知道内存这玩意，可是，可能有不少朋友对内存的认识仅仅局限在<a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>和DDR <a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>这两种类型，事实上，内存的种类是非常多的，从能否写入的角度来分，就可以分为RAM(随机存取存储器)和ROM(只读存储器)这两大类。每一类别里面有分别有许多种类的内存。以下就让我们看看内存到底有些什么种类吧！</pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_01.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　一、RAM(Random Access Memory，随机存取存储器)</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_02.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　RAM的特点是：电脑开机时，操作系统和应用程序的所有正在运行的数据和程序都会放置其中，并且随时可以对存放在里面的数据进行修改和存取。它的工作需要由持续的电力提供，一旦系统断电，存放在里面的所有数据和程序都会自动清空掉，并且再也无法恢复。</pre>
<pre>
 </pre>
<pre>　　根据组成元件的不同，RAM内存又分为以下十八种：</pre>
<pre>
 </pre>
<pre>　　01.DRAM（Dynamic RAM，动态随机存取存储器）：</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_03.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　这是最普通的RAM，一个电子管与一个电容器组成一个位存储单元，DRAM将每个内存位作为一个电荷保存在位存储单元中，用电容的充放电来做储存动作，但因电容本身有漏电问题，因此必须每几微秒就要刷新一次，否则数据会丢失。存取时间和放电时间一致，约为2~4ms。因为成本比较便宜，通常都用作计算机内的主存储器。</pre>
<pre>
 </pre>
<pre>　　02.SRAM（Static RAM，静态随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_04.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　静态，指的是内存里面的数据可以长驻其中而不需要随时进行存取。每6颗电子管组成一个位存储单元，因为没有电容器，因此无须不断充电即可正常运作，因此它可以比一般的动态随机处理内存处理速度更快更稳定，往往用来做高速缓存。</pre>
<pre>
 </pre>
<pre>　　03.VRAM（Video RAM，视频内存）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_05.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　它的主要功能是将显卡的视频数据输出到数模转换器中，有效降低绘图显示芯片的工作负担。它采用双数据口设计，其中一个数据口是并行式的数据输出入口，另一个是串行式的数据输出口。多用于高级显卡中的高档内存。</pre>
<pre>
 </pre>
<pre>　　04.FPM DRAM（Fast Page Mode DRAM，快速页切换模式动态随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_06.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　改良版的DRAM，大多数为72Pin或30Pin的模块。传统的DRAM在存取一个BIT的数据时，必须送出行地址和列地址各一次才能读写数据。而FRM DRAM在触发了行地址后，如果CPU需要的地址在同一行内，则可以连续输出列地址而不必再输出行地址了。由于一般的程序和数据在内存中排列的地址是连续的，这种情况下输出行地址后连续输出列地址就可以得到所需要的数据。FPM将记忆体内部隔成许多页数Pages，从512B到数KB不等，在读取一连续区域内的数据时，就可以通过快速页切换模式来直接读取各page内的资料，从而大大提高读取速度。在96年以前，在486时代和PENTIUM时代的初期，FPM DRAM被大量使用。</pre>
<pre>
 </pre>
<pre>　　05.EDO DRAM（Extended Data Out DRAM，延伸数据输出动态随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_07.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　这是继FPM之后出现的一种存储器，一般为72Pin、168Pin的模块。它不需要像FPM DRAM那样在存取每一BIT 数据时必须输出行地址和列地址并使其稳定一段时间，然后才能读写有效的数据，而下一个BIT的地址必须等待这次读写操作完成才能输出。因此它可以大大缩短等待输出地址的时间，其存取速度一般比FPM模式快15%左右。它一般应用于中档以下的Pentium主板标准内存，后期的486系统开始支持EDO DRAM，到96年后期，EDO DRAM开始执行。。</pre>
<pre>
 </pre>
<pre>　　06.BEDO DRAM（Burst Extended Data Out DRAM，爆发式延伸数据输出动态随机存取存储器）</pre>
<pre>
 </pre>
<pre>　　这是改良型的EDO DRAM，是由美光公司提出的，它在芯片上增加了一个地址计数器来追踪下一个地址。它是突发式的读取方式，也就是当一个数据地址被送出后，剩下的三个数据每一个都只需要一个周期就能读取，因此一次可以存取多组数据，速度比EDO DRAM快。但支持BEDO DRAM内存的主板可谓少之又少，只有极少几款提供支持（如VIA APOLLO VP2），因此很快就被DRAM取代了。</pre>
<pre>
 </pre>
<pre>　　07.MDRAM（Multi-Bank DRAM，多插槽动态随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_09.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　MoSys公司提出的一种内存规格，其内部分成数个类别不同的小储存库 (BANK)，也即由数个属立的小单位矩阵所构成，每个储存库之间以高于外部的资料速度相互连接，一般应用于高速显示卡或加速卡中，也有少数主机板用于L2高速缓存中。</pre>
<pre>
 </pre>
<pre>　　08.WRAM（Window RAM，窗口随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_10.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　韩国Samsung公司开发的内存模式，是VRAM内存的改良版，不同之处是它的控制线路有一、二十组的输入/输出控制器，并采用EDO的资料存取模式,因此速度相对较快，另外还提供了区块搬移功能（BitBlt），可应用于专业绘图工作上。</pre>
<pre>
 </pre>
<pre>　　09.RDRAM（Rambus DRAM，高频动态随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_11.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　Rambus公司独立设计完成的一种内存模式，速度一般可以达到500~530MB/s，是DRAM的10倍以上。但使用该内存后内存控制器需要作相当大的改变，因此它们一般应用于专业的图形加速适配卡或者电视游戏机的视频内存中。</pre>
<pre>
 </pre>
<pre>　　10.<a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>（Synchronous DRAM，同步动态随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_12.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　这是一种与CPU实现外频Clock同步的内存模式，一般都采用168Pin的内存模组，工作电压为3.3V。 所谓clock同步是指内存能够与CPU同步存取资料，这样可以取消等待周期，减少数据传输的延迟，因此可提升计算机的性能和效率。</pre>
<pre>
 </pre>
<pre>　　11.SGRAM（Synchronous Graphics RAM，同步绘图随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_13.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　<a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>的改良版，它以区块Block，即每32bit为基本存取单位，个别地取回或修改存取的资料，减少内存整体读写的次数，另外还针对绘图需要而增加了绘图控制器，并提供区块搬移功能（BitBlt），效率明显高于<a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>。</pre>
<pre>
 </pre>
<pre>　　12.SB SRAM（Synchronous Burst SRAM，同步爆发式静态随机存取存储器）</pre>
<pre>
 </pre>
<pre>　　一般的SRAM是非同步的，为了适应CPU越来越快的速度，需要使它的工作时脉变得与系统同步，这就是SB SRAM产生的原因。</pre>
<pre>
 </pre>
<pre>　　13.PB SRAM（Pipeline Burst SRAM，管线爆发式静态随机存取存储器）</pre>
<pre>
 </pre>
<pre>　　CPU外频速度的迅猛提升对与其相搭配的内存提出了更高的要求，管线爆发式SRAM取代同步爆发式SRAM成为必然的选择，因为它可以有效地延长存取时脉，从而有效提高访问速度。</pre>
<pre>
 </pre>
<pre>　　14.DDR <a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>（Double Data Rate二倍速率同步动态随机存取存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_16.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　作为<a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>的换代产品，它具有两大特点：其一，速度比<a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>有一倍的提高；其二，采用了DLL（Delay Locked Loop：延时锁定回路）提供一个数据滤波信号。这是目前内存市场上的主流模式。</pre>
<pre>
 </pre>
<pre>　　15.SLDRAM （Synchronize Link，同步链环动态随机存取存储器）</pre>
<pre>
 </pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_17.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre> </pre>
<pre>
 </pre>
<pre>　　这是一种扩展型<a href="http://www.donevii.com/post/tag/sdram" class="st_tag internal_tag" rel="tag" title="Posts tagged with SDRAM">SDRAM</a>结构内存，在增加了更先进同步电路的同时，还改进了逻辑控制电路，不过由于技术显示，投入实用的难度不小。</pre>
<pre>
 </pre>
<pre>　　16.CDRAM（CACHED DRAM，同步缓存动态随机存取存储器）</pre>
<pre>
 </pre>
<pre>　　这是三菱电气公司首先研制的专利技术，它是在DRAM芯片的外部插针和内部DRAM之间插入一个SRAM作为二级CACHE使用。当前，几乎所有的CPU都装有一级CACHE来提高效率，随着CPU时钟频率的成倍提高，CACHE不被选中对系统性能产生的影响将会越来越大，而CACHE DRAM所提供的二级CACHE正好用以补充CPU一级CACHE之不足，因此能极大地提高CPU效率。</pre>
<pre>
 </pre>
<pre>　　17.DDRII (Double Data Rate Synchronous DRAM，第二代同步双倍速率动态随机存取存储器)</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_19.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　DDRII 是DDR原有的SLDRAM联盟于1999年解散后将既有的研发成果与DDR整合之后的未来新标准。DDRII的详细规格目前尚未确定。</pre>
<pre>
 </pre>
<pre>　　18.DRDRAM (Direct Rambus DRAM)</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_20.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　是下一代的主流内存标准之一，由Rambus 公司所设计发展出来，是将所有的接脚都连结到一个共同的Bus，这样不但可以减少控制器的体积，已可以增加资料传送的效率。</pre>
<pre>
 </pre>
<pre>　　二、ROM(READ Only Memory，只读存储器)</pre>
<pre>
 </pre>
<pre>　　ROM是线路最简单半导体电路，通过掩模工艺，一次性制造，在元件正常工作的情况下，其中的代码与数据将永久保存，并且不能够进行修改。一般应用于PC系统的程序码、主机板上的 BIOS (基本输入/输出系统Basic Input/Output System)等。它的读取速度比RAM慢很多。</pre>
<pre>
 </pre>
<pre>　　根据组成元件的不同，ROM内存又分为以下五种：</pre>
<pre>
 </pre>
<pre>　　1.MASK ROM（掩模型只读存储器）</pre>
<pre>
 </pre>
<pre>　　制造商为了大量生产ROM内存，需要先制作一颗有原始数据的ROM或EPROM作为样本，然后再大量复制，这一样本就是MASK ROM，而烧录在MASK ROM中的资料永远无法做修改。它的成本比较低。</pre>
<pre>
 </pre>
<pre>　　2.PROM（Programmable ROM，可编程只读存储器）</pre>
<pre>
 </pre>
<pre>　　这是一种可以用刻录机将资料写入的ROM内存，但只能写入一次，所以也被称为“一次可编程只读存储器”(One Time Progarmming ROM，OTP-ROM)。PROM在出厂时，存储的内容全为1，用户可以根据需要将其中的某些单元写入数据0(部分的PROM在出厂时数据全为0，则用户可以将其中的部分单元写入1)， 以实现对其“编程”的目的。</pre>
<pre>
 </pre>
<pre>　　3.EPROM（Erasable Programmable，可擦可编程只读存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_24.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　这是一种具有可擦除功能，擦除后即可进行再编程的ROM内存，写入前必须先把里面的内容用紫外线照射它的IC卡上的透明视窗的方式来清除掉。这一类芯片比较容易识别，其封装中包含有“石英玻璃窗”，一个编程后的EPROM芯片的“石英玻璃窗”一般使用黑色不干胶纸盖住， 以防止遭到阳光直射。</pre>
<pre>
 </pre>
<pre>　　4.EEPROM（Electrically Erasable Programmable，电可擦可编程只读存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_25.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　功能与使用方式与EPROM一样，不同之处是清除数据的方式，它是以约20V的电压来进行清除的。另外它还可以用电信号进行数据写入。这类ROM内存多应用于即插即用（PnP）接口中。</pre>
<pre>
 </pre>
<pre>　　5.<a href="http://www.donevii.com/post/tag/flash" class="st_tag internal_tag" rel="tag" title="Posts tagged with flash">Flash</a> Memory（快闪存储器）</pre>
<pre>
 </pre>
<p><center></p>
<pre><img src="http://www.ithard.com/pics/newspic/2004/07/21/040719_hd_kr_memory_26.jpg" /></pre>
<p></center></p>
<pre>
 </pre>
<pre>　　这是一种可以直接在主机板上修改内容而不需要将IC拔下的内存，当电源关掉后储存在里面的资料并不会流失掉，在写入资料时必须先将原本的资料清除掉，然后才能再写入新的资料，缺点为写入资料的速度太慢。</pre>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/504.html" title="google背后的分布式架构 (2008-09-23)">google背后的分布式架构</a> (0)</li>
	<li><a href="http://www.donevii.com/post/128.html" title="应用加速 (2006-10-26)">应用加速</a> (0)</li>
	<li><a href="http://www.donevii.com/post/129.html" title="大型高并发高负载网站的系统架构 (2006-10-26)">大型高并发高负载网站的系统架构</a> (0)</li>
	<li><a href="http://www.donevii.com/post/387.html" title="[转]嵌入式系统 Boot Loader 技术内幕 (2008-01-14)">[转]嵌入式系统 Boot Loader 技术内幕</a> (0)</li>
	<li><a href="http://www.donevii.com/post/9.html" title="flickr对javascript干的好事 (2006-08-17)">flickr对javascript干的好事</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/388.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google 坚信的 10 大信条</title>
		<link>http://www.donevii.com/post/385.html</link>
		<comments>http://www.donevii.com/post/385.html#comments</comments>
		<pubDate>Mon, 07 Jan 2008 08:47:25 +0000</pubDate>
		<dc:creator>dengwei</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[信条]]></category>
		<category><![CDATA[手机]]></category>

		<guid isPermaLink="false">http://www.donevii.com/post/385.html</guid>
		<description><![CDATA[1. Focus on the user and all else will follow. 关注使用者,则一切将水到渠成. (H:对我来说这就是客户关系的经营,设身处地的为客户着想,而不是把这些行为都当成新案子的酬庸;至于新案子?对我而言这绝... ]]></description>
			<content:encoded><![CDATA[<p>1. Focus on the user and all else will follow. 关注使用者,则一切将水到渠成.<br />
(H:对我来说这就是客户关系的经营,设身处地的为客户着想,而不是把这些行为都当成新案子的酬庸;至于新案子?对我而言这绝对是第二个考虑&#8230; 我想只要用心,客户是可以感受到并给予回馈.)2. It&#8217;s best to do one thing really, really well. 尽力将一件事做到最好.<br />
(H:手上正在进行的工作,别只是把他做完就好,也不要有太多的权宜、妥协!尽可能真的把他的「做好」,因为老想着之后再回过头来怎样又怎样,经验告诉我,通常回过头来怎样又怎样的机会是非常低的,然而这个不完美的作品却已经被客户在心中悄悄的打了分数.)<br />
3. Fast is better than slow. 快比慢好.<br />
(H:这不是指把事情做的快的意思,比如说:你写的程序跑起来效率要高、有新的点子想到就要快点实作、&#8230;. 太多了,说不完.)<br />
4. Democracy on the web works. 网络的民主效应.<br />
(H: Web 2.0!!! Wikipedia, <a href="http://www.donevii.com/post/tag/blog" class="st_tag internal_tag" rel="tag" title="Posts tagged with blog">Blog</a>&#8230;.. )<br />
5. You don&#8217;t need to be at your desk to need an answer. 您不一定要在桌子前找答案.<br />
(手机通讯,行动通讯,3G&#8230;.)<br />
6. You can make money without doing evil. 不做坏事也能赚钱.<br />
7. There&#8217;s always more information out there. 「信息」也无涯.<br />
8. The need for information crosses all borders. 对信息的需求没有国界.<br />
9. You can be serious without a suit. 不穿西装也可以很正经.<br />
(H: 早上你可以晚点进公司,上班时间你可以开心的大声说笑,傍晚你也可以早点下班回家,这些我都不在乎;但是你不能上班时间不工作而回家报边加班边工作,是因为公司风水比较差吗?你必需要对自己开出来的Schedule负责,当你面对自己开的Schedule是一再的Delay,那我会势必质疑你的能力!也许我什么都没说,但请相信我,很多事情是看在眼里,放在心底的.我的重点是&#8211;你要对你自己的决定/行为负责,形式上的一些规定对我来讲并不是重点.)<br />
10. Great just isn&#8217;t good enough. 精益求精.<br />
(H:没啥好说说的,尽可能做到下面这句话吧 &#8212; Be the only one, not number one.)</p>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/298.html" title="[转]与豆瓣网杨勃聊天（续） (2007-01-31)">[转]与豆瓣网杨勃聊天（续）</a> (0)</li>
	<li><a href="http://www.donevii.com/post/112.html" title="這十八招Web2.0創業者千萬不要學 (2006-10-24)">這十八招Web2.0創業者千萬不要學</a> (0)</li>
	<li><a href="http://www.donevii.com/post/586.html" title="评论:Web2.0用户之殇[转自cnbeta] (2008-10-21)">评论:Web2.0用户之殇[转自cnbeta]</a> (0)</li>
	<li><a href="http://www.donevii.com/post/110.html" title="翻译：On having layout (2006-10-24)">翻译：On having layout</a> (0)</li>
	<li><a href="http://www.donevii.com/post/758.html" title="清除指定squid缓存文件的脚本 (2009-02-09)">清除指定squid缓存文件的脚本</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/385.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[转] 一步一步学习Vim 全图解释</title>
		<link>http://www.donevii.com/post/357.html</link>
		<comments>http://www.donevii.com/post/357.html#comments</comments>
		<pubDate>Mon, 17 Dec 2007 01:10:14 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[基本]]></category>
		<category><![CDATA[操作]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[键盘]]></category>

		<guid isPermaLink="false">http://www.donevii.com/post/357.html</guid>
		<description><![CDATA[Whole 中文版 感谢 fdl 的翻译工作 以下是学习这些基本的VIM命令的基本步骤，在学习完之后，可以依照上图进一步的学习和使用！！ 步骤1 注释1: 1) h j k l为光标键，分别左下上右 2) i 插入键进入... ]]></description>
			<content:encoded><![CDATA[<p><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/26a4d44679.gif" style="display: block" title="ctrl+鼠标滚轮缩放" /><br />
Whole 中文版 感谢 fdl 的翻译工作</p>
<p><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/48c300a889.png" style="display: block" title="ctrl+鼠标滚轮缩放" /><br />
以下是学习这些基本的<a href="http://www.donevii.com/post/tag/vim" class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">VIM</a>命令的基本步骤，在学习完之后，可以依照上图进一步的学习和使用！！<br />
步骤1</p>
<p>注释1:<br />
1) h j k l为光标键，分别左下上右<br />
2) i 插入键进入编辑模式，Esc键退出到一般模式<br />
3) x 删除当前光标所在字符，X删除当前光标前的一个字符<br />
4) A 在一行的末尾添加text，a在当前光标后添加text<br />
5) u 执行Undo操作，Ctrl+R表示Redo<br />
6) 0 跳到行首，$ 跳到行尾 ^跳到行首(类似正则式$和^的意义)<br />
7) w b e移动一个单词word(全部是字符或者符号)<br />
8) W B E移动一个单词WORD(以空格隔开)<br />
9) R 进入插入编辑模式，并且对被编辑位置进行覆盖<br />
10) :w 保存 :q 退出 :q! 强制退出</p>
<p align="center"><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/018e06e545.gif" style="display: block" title="ctrl+鼠标滚轮缩放" /></p>
<p>步骤2</p>
<p>注释2:<br />
1) f 移动光标从当前位置到下一个f后跟的字符的右边,包含此指定字符,F 方向相反为前一个，需要和操作(operator)配合操作<br />
2) t 和 T类似f 和 F，只是它们一直到指定的字符左才停，即不包含指定的字符。<br />
3) d 删除操作 与上面 w f t 等配合：例如&#8221;dw&#8221;删除下一word，&#8221;df-&#8221;从当前位置一直往前删除到字符&#8221;-&#8221;，不保留&#8221;-&#8221;，&#8221;dt-&#8221;删除直到&#8221;-&#8221;但是保留&#8221;-&#8221;<br />
4) c 删除且进入编辑模式(类似d和i的结合),同样可以与f t T w 等motion结合<br />
5) j k 可以和c和d结合，删除所有末尾或开头的所有行<br />
6) . 可以重复最后一次编辑的所有操作，注意是在一般模式下重复最后一次编辑操作<br />
7) 操作和motion可以和数字组合，&#8221;d2w&#8221; 删除后2个单词word &#8220;d2t,&#8221;删除知道这一行的第2个&#8221;,&#8221;<br />
8) cc 和 dd 删除当前行<br />
9) v 进入可视模式</p>
<p align="center"><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/a94bd4850c.gif" style="display: block" title="ctrl+鼠标滚轮缩放" /></p>
<p>步骤3</p>
<p>注释3:<br />
1) y 后面跟任意的motion执行copy操作<br />
2) p (paster)粘贴，如果复制的是字符形式，则粘贴到右边，行形式粘贴到下面<br />
3) P 同上p操作，但是粘贴方向相反，在左边或上面<br />
4) yy 复制当前行<br />
5) y 也可以在可视模式(visual mode)下工作，同时，d,c,x..等text删除操作也将被删除内容进行复制(这一点要注意)<br />
6) &#8220;和a-z字符如果在复制/删除/粘贴命令前表示选择一个寄存器暂存<br />
7) 在复制/删除前的A-Z 寄存器意味进行叠加复制，就是多个复制操作的内容将被加起来<br />
8) &#8220;*操作或者&#8221;+操作选择系统的剪贴板<br />
9) o 在当前行下新其一行进入插入模式，O 操作类似o，只是在当前行的上新起一行</p>
<p align="center"><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/94ec70d670.gif" style="display: block" title="ctrl+鼠标滚轮缩放" /></p>
<p>步骤4</p>
<p>注释4:<br />
1) / 是基本的查找motion，可以和operation结合执行操作，也可以单独使用，直接查找匹配后面的正则式<br />
2) ? 与/相同，但是方向相反backward，/ 方向forward<br />
3) n 重复最后一次查找方向， N 重复最后一次查找的相反方向<br />
4) * 和 # 查找当前光标所在的实体相同的实体，前者方向向前，后者方向向后，两者仅在<a href="http://www.donevii.com/post/tag/vim" class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">vim</a>下有效(vi not support)</p>
<p align="center"><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/64599d02d8.gif" style="display: block" title="ctrl+鼠标滚轮缩放" /></p>
<p>步骤5</p>
<p>注释5:<br />
1) m 操作后跟a-z字符用来设置一个标记mark<br />
2) ` 后面跟a-z字符可以去这个字符表示的标记处<br />
3) &#8216; 和一个字符可以到所在行的第一个非空处<br />
4) A-Z 标记为全局标记 a-z仅在每个buffer内可见<br />
5) `. 表示到最后一个修改的地方<br />
6) q 后跟字符a-z用来记录宏<br />
7) @ 后跟字符用了重放宏，@@ 重放最后一个宏</p>
<p align="center"><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/fa0e3069f7.gif" style="display: block" title="ctrl+鼠标滚轮缩放" /></p>
<p>步骤6</p>
<p>注释6:<br />
1) % 在配对的( 和 ) [ 和 ]等 之间跳动<br />
2) H M L 直接跳到整个屏幕的最上面，中间和最下面<br />
3) G 跳到文件的末尾，G 前面跟行号表明跳到指定的行<br />
4) &#8211; 或者 + 直接跳到前一行 或 后一行<br />
5) K 跳到帮助<br />
6) ( 和 )跳到当前句子的最前和最后<br />
7) { 和 }跳到前一个空行 或 后一个空行<br />
8) [[ 跳到前一个第0列是{的位置(必须{为第0列)<br />
9) ]] 跳到下一个第0列是}的位置</p>
<p align="center"><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/07f967eb50.gif" style="display: block" title="ctrl+鼠标滚轮缩放" /></p>
<p>步骤7</p>
<p>注释7:<br />
1) J 连接当前行和下一行在一般模式，或所有行在可是模式<br />
2) r 后跟任意字符替换当前字符<br />
3) C 为c$的简写，表示删除当前位置到行结束并进入插入模式<br />
4) D 为d$的简写，表示删除当前到行结束<br />
5) Y 为yy的简写，复制整个行<br />
6) s 删除当前光标所在字符并进入插入模式<br />
7) S 清除当前行，并进入插入模式<br />
8) &gt; 和一个motion 表示缩进一行或多行<br />
9) &lt; 和一个motion 表示不缩进<br />
10) = 和一个motion 表示重新格式化text<br />
11) &gt; &lt; 和 = 工作在可视模式下，且均可重复例如&gt;&gt;表示缩进整个当前行</p>
<p align="center"><img resized="1" border="0" vspace="5" width="450" src="http://unix-cd.com/vc/attachment/070821/57f82f590b.gif" style="display: block" title="ctrl+鼠标滚轮缩放" /></p>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/229.html" title="设计模式之Life time controller模式 (2006-11-27)">设计模式之Life time controller模式</a> (0)</li>
	<li><a href="http://www.donevii.com/post/297.html" title="目前主流开发技术的分析和总结 (2007-01-19)">目前主流开发技术的分析和总结</a> (0)</li>
	<li><a href="http://www.donevii.com/post/89.html" title="用rsync对网站进行镜像备份 (2006-10-18)">用rsync对网站进行镜像备份</a> (0)</li>
	<li><a href="http://www.donevii.com/post/128.html" title="应用加速 (2006-10-26)">应用加速</a> (0)</li>
	<li><a href="http://www.donevii.com/post/78.html" title="[转]C/C++/Perl/汇编/Java效率比较 (2006-10-11)">[转]C/C++/Perl/汇编/Java效率比较</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/357.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>什么是MIPS？</title>
		<link>http://www.donevii.com/post/362.html</link>
		<comments>http://www.donevii.com/post/362.html#comments</comments>
		<pubDate>Mon, 17 Dec 2007 01:09:16 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[mips]]></category>
		<category><![CDATA[risc]]></category>
		<category><![CDATA[sgi]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.donevii.com/post/362.html</guid>
		<description><![CDATA[Million Instructions Per Second的缩写，每秒处理的百万级的机器语言指令数。这是衡量CPU速度的一个指标。像是一个Intel 80386 电脑可以每秒处理3百万到5百万机器语言指令，既我们可以说80386是3到5MIPS... ]]></description>
			<content:encoded><![CDATA[<p>Million Instructions Per Second的缩写，每秒处理的百万级的机器语言指令数。这是衡量CPU速度的一个指标。像是一个Intel 80386 电脑可以每秒处理3百万到5百万机器语言指令，既我们可以说80386是3到5MIPS的CPU。MIPS只是衡量CPU性能的指标。这是</p>
<p>一种过时的而且不科学的衡量处理器速度与性能的度量单位，不过依然在用。</p>
<p>MIPS技术公司是一家设计制造高性能、高档次及嵌入式32位和64位处理器的厂商，在RISC处理器方面占有重要地位。1984年，MIPS计算机公司成立。1992年，SGI收购了MIPS计算机公司。1998年，MIPS脱离SGI，成为MIPS技术公司。</p>
<p>MIPS公司设计RISC处理器始于二十世纪八十年代初，1986年推出R2000处理器，1988年推R3000处理器，1991年推出第一款64位商用微处器R4000。之后又陆续推出R8000（于1994年）、R10000（于1996年）和R12000（于1997年）等型号。</p>
<p>随后，MIPS公司的战略发生变化，把重点放在嵌入式系统。1999年，MIPS公司发布MIPS32和MIPS64架构标准，为未来MIPS处理器的开发奠定了基础。新的架构集成了所有原来NIPS指令集，并且增加了许多更强大的功能。MIPS公司陆续开发了高性能、低功耗的32位处理器内核（core）MIPS324Kc与高性能64位处理器内核MIPS64 5Kc。2000年，MIPS公司发布了针对MIPS32 4Kc的版本以及64位MIPS 64 20Kc处理器内核。</p>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/295.html" title="项目管理实战之团队管理 (2007-01-15)">项目管理实战之团队管理</a> (0)</li>
	<li><a href="http://www.donevii.com/post/229.html" title="设计模式之Life time controller模式 (2006-11-27)">设计模式之Life time controller模式</a> (0)</li>
	<li><a href="http://www.donevii.com/post/228.html" title="设计模式之Double Checked Locking模式 (2006-11-27)">设计模式之Double Checked Locking模式</a> (0)</li>
	<li><a href="http://www.donevii.com/post/740.html" title="管理者，请你远离产品开发/设计部门[转] (2009-01-12)">管理者，请你远离产品开发/设计部门[转]</a> (0)</li>
	<li><a href="http://www.donevii.com/post/297.html" title="目前主流开发技术的分析和总结 (2007-01-19)">目前主流开发技术的分析和总结</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/362.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转] MTK平台芯片概说</title>
		<link>http://www.donevii.com/post/354.html</link>
		<comments>http://www.donevii.com/post/354.html#comments</comments>
		<pubDate>Mon, 26 Nov 2007 05:11:28 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mtk]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[平台]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[手机]]></category>
		<category><![CDATA[联发科技]]></category>
		<category><![CDATA[芯片]]></category>
		<category><![CDATA[蕊片]]></category>

		<guid isPermaLink="false">http://www.donevii.com/post/354.html</guid>
		<description><![CDATA[转至 http://blog.sina.com.cn/mobliephone 目前联发科技已开发出MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228等系列平台,其中MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228、MT6229、MT6225、MT6223、MT6230均... ]]></description>
			<content:encoded><![CDATA[<p>转至 <a href="http://blog.sina.com.cn/mobliephone" title="http://blog.sina.com.cn/mobliephone">http://blog.sina.com.cn/mobliephone</a></p>
<p>目前联发科技已开发出MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228等系列平台,其中MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228、MT6229、MT6225、MT6223、MT6230均为基带芯片，所有芯片均采用ARM7的核。<br />
MT6305为电源管理芯片，有MT6305、MT6305N、MT6305BN；</p>
<p>MT6129、MT6139是射频芯片。MT6129为早期的射频RF芯片，一般与MT6205的CPU一起使用。现在用的多的是MT6129C、MT6129N、MT6129D，其中MT6129C、MT6129N一般用在MT6217、MT6218、MT6219的CPU的机器上，MT6129D一般用在MT6226、MT6227的CPU的机器上。RF3146（7×7mm）、RF3146D（双频）、RF3166（6×6mm）为RFMD的PA。</p>
<p>MT6205为最早的方案，只有GSM的基本功能，不支持GPRS、WAP、MP3等功能。(2003年MP)；<br />
MT6218为在MT6205基础上增加GPRS、WAP、MP3功能。MT6217为MT6218的cost down方案，与MT6128 PIN TO PIN，只是软件不同而已，另外MT6217支持16bit数据。（2004年MP）<br />
MT6219为MT6218上增加内置AIT的1.3M camera处理IC，增加MP4功能。8bit数据。（2005年MP）<br />
MT6226为MT6219 cost 升级产品，内置0.3M 摄相处理IC，支持GPRS、WAP、MP3、MP4等，内部配置比MT6219优化及改善，比如配蓝牙是可用很便宜的芯片CSR的BC03模块USD3即可支持数据传输（如听立体声MP3等）功能。<br />
MT6226M为MT6226高配置设计，内置的是1.3M摄像处理IC。（2006年MP）<br />
MT6227与MT6226功能基本一样，PIN TO PIN，只是内置的是2.0M 摄像处理IC。（2006年MP）<br />
MT6228比MT6227增加TV OUT功能，内置3.0M 摄像处理IC，支持支持GPRS、WAP、MP3、MP4。（2006年MP）<br />
从MT6226后软件均可支持网络摄像头功能，也就是说你的机子可以用于QQ视频。</p>
<p>MT6229平台支持EDGE功能，其他功能和6228基本一致。</p>
<p>MT6225是6217的代替产品，可以接cam但是没有isp，也就是没有特效，变焦，但是其主频很高和6228/6229一样达到了104mhz,可以接wifi,并且给设计公司提出了更高的要求——如何利用104m的资源去实现mp4的编解码，如何用104m的资源跑更多的应用，这些都是设计公司做的,对设计公司的要求也非常得高。</p>
<p>MT6223是6205的替代，支持语音，短信，MP3,不支持T_F卡，USB盘，没有集成ISP，PMIC内签。</p>
<p>目前市面上出的双卡双待手机,一般是采取的方案分为以下几种:MT6226+6205,MT6225+6205和MT6225+6223</p>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/402.html" title="[转] 移动互联网的终端革命 (2008-05-02)">[转] 移动互联网的终端革命</a> (0)</li>
	<li><a href="http://www.donevii.com/post/504.html" title="google背后的分布式架构 (2008-09-23)">google背后的分布式架构</a> (0)</li>
	<li><a href="http://www.donevii.com/post/124.html" title="C++资源之不完全导引 (2006-10-26)">C++资源之不完全导引</a> (0)</li>
	<li><a href="http://www.donevii.com/post/229.html" title="设计模式之Life time controller模式 (2006-11-27)">设计模式之Life time controller模式</a> (0)</li>
	<li><a href="http://www.donevii.com/post/228.html" title="设计模式之Double Checked Locking模式 (2006-11-27)">设计模式之Double Checked Locking模式</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/354.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>redhad下的openssl(安装和卸载)</title>
		<link>http://www.donevii.com/post/348.html</link>
		<comments>http://www.donevii.com/post/348.html#comments</comments>
		<pubDate>Fri, 21 Sep 2007 10:47:46 +0000</pubDate>
		<dc:creator>dengwei</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[openssl]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.donevii.com/?p=348</guid>
		<description><![CDATA[转至: http://blog.csdn.net/baitianhai/archive/2004/10/27/155461.aspx 最近在鼓捣redhat linux，想自己以源代码方式安装软件，不想用rpm方式安装。 首先从httpd开始，先卸载在安装倒是比较容易，不过后来像添加... ]]></description>
			<content:encoded><![CDATA[<p>转至: http://<a href="http://www.donevii.com/post/tag/blog" class="st_tag internal_tag" rel="tag" title="Posts tagged with blog">blog</a>.csdn.net/baitianhai/archive/2004/10/27/155461.aspx</p>
<p>最近在鼓捣redhat linux，想自己以源代码方式安装软件，不想用rpm方式安装。</p>
<p>首先从httpd开始，先卸载在安装倒是比较容易，不过后来像添加ssl功能，发现编译的时候需要用openssl的安装目录，本人比较愚笨，一顿好找也没有找到，于是就想把openssl也以源代码方式安装。先卸载，此时出现问题，系统好多东西依赖于openssl的库，我查了好多资料也没找到什么办法，于是我最后一狠心，用rpm -e &#8211;nodeps给卸载了，然后手动安装了openssl，然后重新启动，这下坏了，好多服务都起不来了，smb,ssh等等，图形模式也起不来了，我欲哭无泪。</p>
<p>因为我是在虚拟机上安装的，smb起不来了，我只能重新安装系统了。这次安装我大多数东西都没选择，一路安装完毕，结果在文本方式发现vi编辑没有颜色了，哎，也不知道是少装了那个东西弄得（各位谁知道麻烦告诉告诉我一下），只能按照猜测重新安装了又添加了一些东西。不过幸运的vi高亮显示功能又有了，遗憾的是具体是那个软件我还是不清楚。有了上次的教训我不敢轻易卸掉系统原来的openssl了，我从网上搜索到了一篇安装openssl的英文文章，地址在 http://www.devside.net/web/<a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>/linux/openssl 我按照上面说的安装了zlib,openssl。步骤简介如下（怕以后忘了）</p>
<p>安装zlib</p>
<p>Home : http://www.gzip.org/zlib/</p>
<p>Package(linux source) : http://www.gzip.org/zlib/</p>
<p>Our Configuration</p>
<p>Install to : /usr/local</p>
<p>Module types : dynamically and staticly loaded modules, *.so and *.a</p>
<p>Build Instructions</p>
<p>zlib library files are placed into /usr/local/lib and zlib header files are placed into /usr/local/include, by default.</p>
<p>Build static libraries</p>
<p>&#8230;/zlib-1.2.1]# ./configure</p>
<p>&#8230;/zlib-1.2.1]# make test</p>
<p>&#8230;/zlib-1.2.1]# make install</p>
<p>Build shared libraries</p>
<p>&#8230;/zlib-1.2.1]# make clean</p>
<p>&#8230;/zlib-1.2.1]# ./configure &#8211;shared</p>
<p>&#8230;/zlib-1.2.1]# make test</p>
<p>&#8230;/zlib-1.2.1]# make install</p>
<p>&#8230;/zlib-1.2.1]# cp zutil.h /usr/local/include</p>
<p>&#8230;/zlib-1.2.1]# cp zutil.c /usr/local/include</p>
<p>/usr/local/lib should now contain&#8230;</p>
<p>libz.a</p>
<p>libz.so -&gt; libz.so.1.2.1</p>
<p>libz.so.1 -&gt; libz.so.1.2.1</p>
<p>libz.so.1.2.1</p>
<p>/usr/local/include should now contain&#8230;</p>
<p>zconf.h</p>
<p>zlib.h</p>
<p>zutil.h</p>
<p>[Optional] Instructions for non-standard placement of zlib</p>
<p>Create the directory that will contain zlib</p>
<p>&#8230;/zlib-1.2.1]# mkdir /usr/local/zlib</p>
<p>Follow the given procedure above, except</p>
<p>&#8230;/zlib-1.2.1]# ./configure &#8211;prefix=/usr/local/zlib</p>
<p>Update the Run-Time Linker</p>
<p>/etc/ld.so.cache will need to be updated with the new zlib shared lib: libz.so.1.2.1</p>
<p>For standard zlib installation&#8230;</p>
<p>Add /usr/local/lib to /etc/ld.so.conf, if specified path is not present</p>
<p>/etc]# ldconfig</p>
<p>If zlib was installed with a prefix&#8230;</p>
<p>Add /usr/local/zlib/lib to /etc/ld.so.conf</p>
<p>/etc]# ldconfig</p>
<p>安装openssl</p>
<p>Download</p>
<p>Home : http://www.openssl.org/</p>
<p>Package(source) : openssl-0.9.7d.tar.gz</p>
<p>Our Configuration</p>
<p>install to : /usr/local/ssl</p>
<p>module types : dynamically and staticly loaded modules, *.so *.a</p>
<p>Build Instructions</p>
<p>&#8230;/openssl-0.9.7d]# ./config</p>
<p>&#8211;prefix=/usr/local/ssl</p>
<p>[default location]</p>
<p>shared</p>
<p>[in addition to the usual static libraries, create shared libraries]</p>
<p>zlib-dynamic</p>
<p>[like "zlib", but has OpenSSL load the zlib library dynamically when needed]</p>
<p>&#8230;/openssl-0.9.7d]# ./config -t</p>
<p>[display guess on system made by ./config]</p>
<p>&#8230;/openssl-0.9.7d]# make</p>
<p>&#8230;/openssl-0.9.7d]# make test</p>
<p>&#8230;/openssl-0.9.7d]# make install</p>
<p>Update the Run-time Linker</p>
<p>ld.so.cache will need to be updated with the location of the new OpenSSL shared libs: libcrypto.so.0.9.7 and libssl.so.0.9.7</p>
<p>Sometimes it is sufficient to just add these two files to /lib, but we recommend you follow these instructions instead.</p>
<p>Edit /etc/ld.so.conf</p>
<p>Add /usr/local/ssl/lib to the bottom.</p>
<p>&#8230;]# ldconfig</p>
<p>Update the PATH</p>
<p>Edit /root/.bash_profile</p>
<p>Add /usr/local/ssl/bin to the PATH variable.</p>
<p>Re-login</p>
<p>Testing</p>
<p>&#8230;]# openssl version</p>
<p>Should display OpenSSL 0.9.7d 17 Mar 2004</p>
<p>If an older version is shown, your system contains a previously installed OpenSSL.</p>
<p>Repeate the steps in Update the PATH, except place the specified location at the start of the PATH variable.</p>
<p>[the older openssl, on most systems, is located under /usr/bin]</p>
<p>[the command 'which openssl' should display the path of the openssl that your system is using]</p>
<p>/usr/local/ssl/bin]# ./openssl version should display the correct version.</p>
<p>但是我最后没有得到想要的结果，系统原来的openssl还是没能卸载掉，我该怎么做那？我继续搜索资料，哈，幸运的我找了，在一个国内论坛上是这么说的</p>
<p>cd /usr/local/ssl/lib</p>
<p>ln -s libcrypto.so.0.9.7 libcrypto.so.2</p>
<p>ln -s libssl.so.0.9.7 libssl.so.2</p>
<p>//最后要刷新系统的动态连接库配置</p>
<p>echo /usr/local/ssl/lib &gt;&gt; /etc/ld.so.conf</p>
<p>ldconfig -v</p>
<p>这下子我豁然开朗，原来依赖的那2个文件是个软链接啊，我把它修改为我现在真正的openssl库文件不是就行了吗？于是一顿忙碌后，我终于执行了 rpm -e -nodeps ，然后重新启动系统，一路运行下去，全是绿灯。一时间感觉自己好幸福啊</p>
<p>为了这个问题我查了国内的几个比较大的unix/linux网站都没找到资料，不过从这里http://bbs.netbuddy.org/unix/737.html还是找到了（国外的E文大概意思能看懂，但是查找起来还是没找到，也不知道这方面好点的网站），</p>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/504.html" title="google背后的分布式架构 (2008-09-23)">google背后的分布式架构</a> (0)</li>
	<li><a href="http://www.donevii.com/post/78.html" title="[转]C/C++/Perl/汇编/Java效率比较 (2006-10-11)">[转]C/C++/Perl/汇编/Java效率比较</a> (0)</li>
	<li><a href="http://www.donevii.com/post/758.html" title="清除指定squid缓存文件的脚本 (2009-02-09)">清除指定squid缓存文件的脚本</a> (0)</li>
	<li><a href="http://www.donevii.com/post/128.html" title="应用加速 (2006-10-26)">应用加速</a> (0)</li>
	<li><a href="http://www.donevii.com/post/129.html" title="大型高并发高负载网站的系统架构 (2006-10-26)">大型高并发高负载网站的系统架构</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/348.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSSL相关命令（for Linux）详细介绍</title>
		<link>http://www.donevii.com/post/347.html</link>
		<comments>http://www.donevii.com/post/347.html#comments</comments>
		<pubDate>Fri, 21 Sep 2007 08:19:49 +0000</pubDate>
		<dc:creator>dengwei</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://www.donevii.com/?p=347</guid>
		<description><![CDATA[转至: http://blog.ixpub.net/8400463 加密算法： 对称加密算法： DES、IDEA、RC2、RC4、AES、Skipjack &#8230;&#8230; 非对称加密算法： RSA、DSA、DiffieHellman、PKCS、PGP &#8230;&#8230; 单向的HASH算法属于报文摘要算法... ]]></description>
			<content:encoded><![CDATA[<p>转至: http://<a href="http://www.donevii.com/post/tag/blog" class="st_tag internal_tag" rel="tag" title="Posts tagged with blog">blog</a>.ixpub.net/8400463</p>
<p>加密算法：</p>
<p>对称加密算法：</p>
<p>DES、IDEA、RC2、RC4、AES、Skipjack &#8230;&#8230;</p>
<p>非对称加密算法：</p>
<p>RSA、DSA、DiffieHellman、PKCS、PGP &#8230;&#8230;</p>
<p>单向的HASH算法属于报文摘要算法，虽然有些也出自OpenSSL库。<br />
命令操作：</p>
<p>1、生成普通私钥：<br />
[weigw@TEST src]$ openssl genrsa -out privatekey.key 1024</p>
<p>Generating RSA private key, 1024 bit long modulus &#8230;.++++++ &#8230;&#8230;.++++++ e is 65537 (0&#215;10001)</p>
<p>2、生成带加密口令的密钥：</p>
<p>[weigw@TEST src]$ openssl genrsa -des3 -out privatekey.key 1024</p>
<p>Generating RSA private key, 1024 bit long modulus &#8230;&#8230;&#8230;&#8230;++++++ &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;++++++ e is 65537 (0&#215;10001) Enter pass phrase for privatekey.key: Verifying &#8211; Enter pass phrase for privatekey.key:</p>
<p>在生成带加密口令的密钥时需要自己去输入密码。对于为密钥加密现在提供了一下几种算法：<br />
-des encrypt the generated key with DES in cbc mode</p>
<p>-des3 encrypt the generated key with DES in ede cbc mode (168 bit key)</p>
<p>-aes128, -aes192, -aes256 encrypt PEM output with cbc aes</p>
<p>去除密钥的口令：<br />
[weigw@TEST src]$ openssl rsa -in privatekey.key -out</p>
<p>privatekey.key Enter pass phrase for privatekey.key: writing RSA key</p>
<p>通过生成的私钥去生成证书：</p>
<p>[weigw@TEST src]$ openssl req -new -x509 -key privatekey.key -out cacert.crt -days 1095</p>
<p>You are about to be asked to enter information that will be incorporated into your certificate request.</p>
<p>What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter &#8216;.&#8217;, the field will be left blank.</p>
<p>&#8212;&#8211;</p>
<p>Country Name (2 letter code) [GB]:CN</p>
<p>State or Province Name (full name) [Berkshire]:beijing</p>
<p>Locality Name (eg, city) [Newbury]:beijing</p>
<p>Organization Name (eg, company) [My Company Ltd]:wondersoft</p>
<p>Organizational Unit Name (eg, section) []:develop</p>
<p>Common Name (eg, your name or your <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>&#8217;s hostname) []:WeiGW</p>
<p>Email Address []:weigongwan@sina.com</p>
<p>在生成证书的时候需要按照提示输入一些个人信息。</p>
<p>通过私钥生成公钥：</p>
<p>[weigw@TEST src]$ openssl rsa -in privatekey.key -pubout -out pubkey.key writing RSA key</p>
<p>格式转换：（证书、私钥、公钥）（PEM &lt;&#8212;&#8211;&gt;DER）</p>
<p>[weigw@TEST src]$ openssl x509 -in cacert.crt -inform. PEM -out cacert.der -outform. DER</p>
<p>[weigw@TEST src]$</p>
<p>[weigw@TEST src]$ openssl rsa -in privatekey.key -inform. PEM -out privatekey.der -outform. DER</p>
<p>writing RSA key</p>
<p>[weigw@TEST src]$ openssl rsa -pubin -in pubkey.key -inform. PEM -pubout -out pubkey.der -outform. DER</p>
<p>writing RSA key</p>
<p>从DER格式转换成PEM格式一样，就是把inform的格式改成DERoutform的格式改成PEM即可。</p>
<p>下面是一个服务器和客户端认证的证书、私钥生成方法：（<a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.crt、client.crt、ca.crt）</p>
<p>第一步： 生成私钥</p>
<p>[weigw@TEST bin]$ openssl genrsa -out <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.key 1024</p>
<p>Generating RSA private key, 1024 bit long modulus .++++++ ..<br />
&#8230;&#8230;&#8230;++++++ e is 65537 (0&#215;10001)</p>
<p>[weigw@TEST bin]$ openssl genrsa -out client.key 1024</p>
<p>Generating RSA private key, 1024 bit long modulus &#8230;++++++ &#8230;&#8230;<br />
&#8230;&#8230;&#8230;.++++++ e is 65537 (0&#215;10001)</p>
<p>[weigw@TEST bin]$ openssl genrsa -out ca.key 1024</p>
<p>Generating RSA private key, 1024 bit long modulus &#8230;&#8230;.<br />
..++++++ &#8230;&#8230;&#8230;++++++ e is 65537 (0&#215;10001)</p>
<p>[weigw@TEST bin]$</p>
<p>第三步： 申请证书（为请求文件签名）</p>
<p>[weigw@TEST bin]$ openssl ca -in <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.csr -out <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.crt -cert ca.crt -keyfile ca.key</p>
<p>[weigw@TEST bin]$ openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key</p>
<p>如果在这步出现错误信息：</p>
<p>[weigw@TEST bin]$ openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key</p>
<p>Using configuration from /usr/share/ssl/openssl.cnf I am unable to access the ./demoCA/newcerts directory ./demoCA/newcerts: No such file or directory</p>
<p>[weigw@TEST bin]$</p>
<p>自己手动创建一个CA目录结构：<br />
[weigw@TEST bin]$ mkdir ./demoCA<br />
[weigw@TEST bin]$ mkdir demoCA/newcerts<br />
创建个空文件：<br />
[weigw@TEST bin]$ vi demoCA/index.txt<br />
向文件中写入01：<br />
[weigw@TEST bin]$ vi demoCA/serial</p>
<p>合并证书文件（crt）和私钥文件（key）：</p>
<p>[weigw@TEST bin]$ cat client.crt client.key &gt; client.pem [weigw@TEST bin]$ cat <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.crt <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.key &gt; <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.pem</p>
<p>合并成pfx证书：</p>
<p>[weigw@TEST bin]$ openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12</p>
<p>Enter Export Password:</p>
<p>Verifying &#8211; Enter Export Password:</p>
<p>[weigw@TEST bin]$openssl pkcs12 -export -clcerts -in <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.crt -inkey <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.key -out <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.p12<br />
Enter Export Password:<br />
Verifying &#8211; Enter Export Password:</p>
<p>文本化证书：</p>
<p>[weigw@TEST bin]$ openssl pkcs12 -in client.p12 -out client.txt Enter Import Password:</p>
<p>MAC verified OK</p>
<p>Enter PEM pass phrase: Verifying &#8211; Enter PEM pass phrase:</p>
<p>[weigw@TEST bin]$openssl pkcs12 -in <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.p12 -out <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.txt</p>
<p>Enter Import Password:</p>
<p>MAC verified OK</p>
<p>Enter PEM pass phrase: Verifying &#8211; Enter PEM pass phrase:</p>
<p>屏幕模式显式：（证书、私钥、公钥）</p>
<p>[weigw@TEST bin]$ openssl x509 -in client.crt -noout -text -modulus</p>
<p>[weigw@TEST bin]$ openssl rsa -in <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.key -noout -text -modulus</p>
<p>[weigw@TEST bin]$ openssl rsa -in <a href="http://www.donevii.com/post/tag/server" class="st_tag internal_tag" rel="tag" title="Posts tagged with server">server</a>.pub -noout -text -modulus</p>
<p>得到DH：</p>
<p>[weigw@TEST bin]$ openssl dhparam -out dh1024.pem 1024</p>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/348.html" title="redhad下的openssl(安装和卸载) (2007-09-21)">redhad下的openssl(安装和卸载)</a> (0)</li>
	<li><a href="http://www.donevii.com/post/154.html" title="Linux 常用快捷键 (2006-10-31)">Linux 常用快捷键</a> (0)</li>
	<li><a href="http://www.donevii.com/post/504.html" title="google背后的分布式架构 (2008-09-23)">google背后的分布式架构</a> (0)</li>
	<li><a href="http://www.donevii.com/post/112.html" title="這十八招Web2.0創業者千萬不要學 (2006-10-24)">這十八招Web2.0創業者千萬不要學</a> (0)</li>
	<li><a href="http://www.donevii.com/post/89.html" title="用rsync对网站进行镜像备份 (2006-10-18)">用rsync对网站进行镜像备份</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/347.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>被误传了几千年的七句话</title>
		<link>http://www.donevii.com/post/343.html</link>
		<comments>http://www.donevii.com/post/343.html#comments</comments>
		<pubDate>Mon, 16 Jul 2007 04:47:04 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[女人]]></category>
		<category><![CDATA[男人]]></category>
		<category><![CDATA[类]]></category>

		<guid isPermaLink="false">http://www.donevii.com/?p=343</guid>
		<description><![CDATA[在中国崇尚权威的文化氛围中，名人名言占的地位是很重的，很多名家说的话，往往被人当成指导自己人生观世界观的不二准则。但几千年流传下来的名言中，也有一些话被人刻意或无知地曲... ]]></description>
			<content:encoded><![CDATA[<p>在中国崇尚权威的文化氛围中，名人名言占的地位是很重的，很多名家说的话，往往被人当成指导自己人生观世界观的不二准则。但几千年流传下来的名言中，也有一些话被人刻意或无知地曲解，背离了话语者本身的意旨与初衷，迷惑了天下万千受众&hellip;&hellip; </p>
<p>1、以德报怨 </p>
<p>原句：&ldquo;或曰：&lsquo;以德报怨，何如？&rsquo;子曰：&ldquo;何以报德？以直报怨，以德报德&rdquo; &mdash;&mdash;《论语 宪问》 </p>
<p>万万没想到原来在孔子这句&ldquo;以德报怨&rdquo;的后边还跟着另外一段话，什么话呢？子曰：&ldquo;以德报怨，何以报德？以直报怨，以德报德！&rdquo;看完以后，幡然醒悟，原来我们都被某个断章取义的孔子FANS给玩了一把！ </p>
<p>当时的真实情况是怎么样的呢？孔子的一个弟子问他说：师傅，别人打我了，我不打他，我反而要对他好，用我的道德和教养羞死他，让他悔悟，好不好？孔子就说了，&ldquo;你以德报怨，那&lsquo;何以报德&rsquo;，别人以德来待你的时候，你才需要以德来回报别人；可是现在别人打了你，你就应该&lsquo;以直报怨&rsquo;，拿起板砖飞他！&rdquo; </p>
<p>歪曲程度：8 </p>
<p>反面影响：9 </p>
<p>2、民可使由之，不可使知之 </p>
<p>原句：&ldquo;子曰：兴于诗，立于礼，成于乐。子曰：民可使由之，不可使知之。&rdquo;&mdash;&mdash;《论语&middot;秦伯》 </p>
<p>我们结合上下文的语境，很容易就能得出这句话正确的分句方法：&ldquo;子曰：兴于诗，立于礼，成于乐。民可，使由之，不可，使知之。&rdquo; </p>
<p>孔子的整句话就是说，诗、礼、乐这三样东西是教育民众的基础，一定要抓好。如果人民掌握了诗、礼、乐，好！让他们自由发挥；如果人民还玩不来这些东西，我们就要去教化他们，让他们知道和明白这些东西。这才是&ldquo;有教无类&rdquo;的大教育家孔老先生的本意。 </p>
<p>歪曲程度：7 </p>
<p>反面影响：9 </p>
<p>3、无毒不丈夫 </p>
<p>原句：量小非君子，无度不丈夫。&mdash;&mdash;民间谚语联对 </p>
<p>这句来自民间的谚语本来应该是&ldquo;量小非君子，无度不丈夫&rdquo;，这本来是个很好的句子，里边充分运用了对仗。显示出了一份阳刚有力的气魄，一个胸怀坦荡的男人形象就跃然于纸上，可惜劳动人民口耳相传的这一句话，到了朝廷上那些所谓的学高八斗的&ldquo;君子&rdquo;嘴里就变了个味。为什么呢？ </p>
<p>这要从古时候文人的习性说起，在这副对联式的谚语里，&ldquo;度&rdquo;为仄声字，念着别扭，很容易读为平声字&ldquo;毒&rdquo;。那些对音律美感要求甚高的学者们某天吃饱了没事儿干，便发挥他们的专长自做主张，把这句改为&ldquo;无毒不丈夫&rdquo;了。 </p>
<p>歪曲程度：9 </p>
<p>反面影响：5 </p>
<p>4 唯女子与小人难养也 </p>
<p>原句：唯女子与小人难养也，近之则不孙，远之则怨。&mdash;&mdash;《论语&middot;阳货》 </p>
<p>在《史记&middot;孔子世家》里，提到了孔子之前的卫国之行，孔子&ldquo;居卫月余，灵公与夫人同车，宦者雍渠参乘出，使孔子为次乘，招摇市过之。孔子曰：&lsquo;吾未见好德如好色者也。&rsquo;于是丑之，去卫。&rdquo; </p>
<p>我来大致翻译一下这段话，当代全国教育劳模孔老先生受卫国国君的邀请，来到了卫国参观学习休养。但在这期间，孔老先生突然发现自己被涮了，人家根本是拿他的身份来炫耀自己抬高自己而已，并不是真正支持他来这教化卫国民众的。尤其是那个卫灵公的老婆，为了抬高自己的身望，公开炫耀，贬低了孔子。 </p>
<p>孔老先生很郁闷，收拾行李就离开了卫国，离开之后，心情平复了，想起卫国公老婆那种仗着得宠、骄横跋扈乱政扰民的烂事儿，就发了感慨：&ldquo;唯女子与小人难养也！近之则不孙，远之则怨。&rdquo; </p>
<p>看看孔子的卫国之行，一切都明白了，他这话断不是发神经突然开骂起包括自己老妈在内的所有女人，而是有一个特指的对象，这个对象，就是卫灵公那位老婆南子等人。 </p>
<p>歪曲程度：6 </p>
<p>反面影响：9 </p>
<p>5、吾生也有涯，而知也无涯 </p>
<p>原句：吾生也有涯，而知也无涯，以有涯随无涯，殆已 &mdash;&mdash;&mdash;&mdash;&mdash;&mdash;《庄子&middot;养生主》 </p>
<p>庄子的这句话其实是这样说的，&ldquo;吾生也有涯，而知也无涯，以有涯随无涯，殆已。&rdquo;我庄子的生命是有限的，但我面对的知识是无限的，要我以本来有限的生命，去追求那种永远看不到边的尽头，这样会搞死自己的&rdquo; </p>
<p>歪曲程度：8 </p>
<p>反面影响：3 </p>
<p>6、相濡以沫 </p>
<p>原句：相濡以沫，不如相忘于江湖&mdash;&mdash;《庄子&middot;大宗师》 </p>
<p>相濡以沫，多美的情景，虽然这并不是爱情最理想的状态。当年街道居委会的老大妈就算再没文化，这句话肯定是会说的。只是我们都没曾想到，后边还跟了一句&ldquo;还可以相忘于江湖&rdquo; </p>
<p>7：天地不仁，以万物为刍狗 </p>
<p>原句：天地不仁，以万物为刍狗，圣人不仁，以百姓为刍狗&mdash;&mdash;《道德经》 </p>
<p>其实这句话的真正意思是说，天地不情感用事，对万物一视同仁，圣人不情感用事，对百姓一视同仁。你们推崇的这句话，它的原意中根本没有你们所需要的压迫与歧视，却恰恰相反，它说的是一个公平的道理：我们所有的人，所有的众生在天地的眼中，都是平等的。</p>
<p>转自：<a href="http://hi.baidu.com/2010/blog/item/7c070cf30ab91bc90a46e01b.html">http://hi.baidu.com/2010/blog/item/7c070cf30ab91bc90a46e01b.html</a></p>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/208.html" title="司马南：中国是一个什么样的国家 (2006-11-17)">司马南：中国是一个什么样的国家</a> (0)</li>
	<li><a href="http://www.donevii.com/post/174.html" title="[转载]在职程序员为啥比不过在野程序员 (2006-11-06)">[转载]在职程序员为啥比不过在野程序员</a> (0)</li>
	<li><a href="http://www.donevii.com/post/76.html" title="给所有女孩的一封信 (2006-10-10)">给所有女孩的一封信</a> (0)</li>
	<li><a href="http://www.donevii.com/post/550.html" title="让我笑喷了的44个论坛回复 (2008-10-08)">让我笑喷了的44个论坛回复</a> (0)</li>
	<li><a href="http://www.donevii.com/post/21.html" title="血腥恐怖电影Emule资源 (2006-08-18)">血腥恐怖电影Emule资源</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/343.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
