• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 17,  comments - 2,  trackbacks - 0
             
                 摘要:   閱讀全文
            posted @ 2008-11-02 20:44 BeyondCN 閱讀(201) | 評論 (0)編輯 收藏
                 摘要: 轉換指南: 將程序從托管擴展 C++ 遷移到 C++/CLI發(fā)布日期 : 5/31/2005 | 更新日期 : 5/31/2005Stanley B. Lippman Microsoft Corporation適用于:C++/CLI 第二版ISO-C++摘要 :C++/CLI代表 ISO-C++標準語言的一個動態(tài)編程范型擴展。本文列舉了 V1 版本語言的功能...  閱讀全文
            posted @ 2008-10-30 17:08 BeyondCN 閱讀(1368) | 評論 (0)編輯 收藏
                 摘要: 利用C#制作一個仿IE地址欄的文本框利用IE上網(wǎng)時,只要在地址欄中輸入幾個字母,與這幾個字母模糊匹配的地址就會自動顯示出來供用戶選擇(如下圖),用戶通過按鍵盤上的上、下箭頭在已有選項中遍歷,找到自己需要的選項后,按回車鍵進行選擇,也可以直接用鼠標進行操作,非常方便,我們在程序中也可以利用這一功能,實現(xiàn)自動提示,方便用戶輸入,下面就以一個實際例子介紹我在工作中是如何實現(xiàn)的。從上圖中可以看出,最佳的辦...  閱讀全文
            posted @ 2008-10-30 14:41 BeyondCN 閱讀(546) | 評論 (0)編輯 收藏
            2000年6月,Microsoft推出了“Microsoft.NET下一代互聯(lián)網(wǎng)軟件和服務戰(zhàn)略”,引起IT行業(yè)的廣泛關注。2000年9月,Microsoft在舊金山發(fā)布了Enterprise 2000。同月,Microsoft原總裁兼首席執(zhí)行官鮑爾默來到中國就“下一代互聯(lián)網(wǎng)”的主題進行演講,在中國掀起了一股“.NET旋風”。2000年11月,Microsoft在Comdex計算機大展上發(fā)布了Visual Studio.NET軟件,并展示了其.NET發(fā)展戰(zhàn)略的框架體系和開發(fā)工具的相關特性,全面加速了Microsoft以.NET技術進軍市場的步伐。 

              Microsoft的.NET戰(zhàn)略意味著:Microsoft以及在Microsoft平臺上的開發(fā)者將會制造服務,而不是制造軟件。在未來幾年之內,Microsoft將陸續(xù)發(fā)布有關.NET的平臺和工具,用于在因特網(wǎng)上開發(fā)Web服務。那時,工作在.NET上的用戶、開發(fā)人員和IT工作人員都不再購買軟件、安裝軟件和維護軟件。取而代之的是,他們將定制服務,軟件會自動安裝,所有的維護和升級也會通過互聯(lián)網(wǎng)進行。“Microsoft.NET 代表了一個集合、一個環(huán)境、一個可以作為平臺支持下一代Internet的可編程結構。”這就是鮑爾默對.NET的描述。


              作為.NET的最新特性組成部分,Microsoft .NET Framework是一個用于構建,部署和運行Web服務及應用程序的平臺。它為將現(xiàn)有投資與下一代應用程序和服務的集成提供了高產(chǎn)的,基于標準的,多語言環(huán)境,同時它還用于解決Internet級應用程序的部署和操作問題。.NET框架包含三個主要部分:通用語言運行時,一組層次化的統(tǒng)一的類庫,及組件化版本的動態(tài)服務器主頁(稱為ASP.NET)。

              用于開發(fā).NET Framework的語言有Visual C#、VB.NET和C++托管擴展(Managed Extensions for C++)。其中C#是開發(fā).NET的元語言,而C++托管擴展是在C++基礎上建立起來的,用來為Visual C++程序員開發(fā).NET框架應用程序而設計。為敘述方便,我們將C++托管擴展就稱之為“托管C++”。
            為了幫助C/C++以及Visual C++程序員或愛好者快速使用托管C++開發(fā).NET Framework程序,我們將陸續(xù)推出相關的一系列文章。

              本篇“托管C++概述”主要講述了什么是托管C++、開發(fā).NET Framework(框架)的項目類型以及與標準C++之間的區(qū)別。

              1、什么是托管C++?

              在回答這個問題,首先要搞清楚什么是“托管”(Managed)。托管是.NET的一個專門概念,它是融于通用語言運行時(CLR)中的一種新的編程理念,因此我們完全可以把“托管”視為“.NET”。那么什么是“通用語言運行時”?通用語言運行時是.NET 框架應用程序的執(zhí)行引摯。它提供了許多服務,其中包括:代碼管理(裝入和執(zhí)行)、類型安全性驗證、元數(shù)據(jù)(高級類型信息)訪問、為管理對象管理內存、管理代碼,COM對象和預生成的DLLs(非管理代碼和數(shù)據(jù))的交互操作性、對開發(fā)人員服務的支持等等。

              也就是說,使用托管C++意味著,我們的代碼可以被CLR所管理,并能開發(fā)出具有最新特性如垃圾自動收集、程序間相互訪問等的.NET框架應用程序。

              由托管概念所引發(fā)的C++應用程序包括托管代碼、托管數(shù)據(jù)和托管類三個組成部分。  

              (1) 托管代碼:.Net環(huán)境提供了許多核心的運行(RUNTIME)服務,比如異常處理和安全策略。為了能使用這些服務,必須要給運行環(huán)境提供一些信息代碼(元數(shù)據(jù)),這種代碼就是托管代碼。所有的C#、VB.NET、JScript.NET默認時都是托管的,但Visual C++默認時不是托管的,必須在編譯器中使用命令行選項(/CLR)才能產(chǎn)生托管代碼。

              (2) 托管數(shù)據(jù):與托管代碼密切相關的是托管數(shù)據(jù)。托管數(shù)據(jù)是由公共語言運行的垃圾回收器進行分配和釋放的數(shù)據(jù)。默認情況下,C#、Visual Basic 和 JScript.NET 數(shù)據(jù)是托管數(shù)據(jù)。不過,通過使用特殊的關鍵字,C# 數(shù)據(jù)可以被標記為非托管數(shù)據(jù)。Visual C++數(shù)據(jù)在默認情況下是非托管數(shù)據(jù),即使在使用 /CLR 開關時也不是托管的。

              (3) 托管類:盡管Visual C++數(shù)據(jù)在默認情況下是非托管數(shù)據(jù),但是在使用C++的托管擴展時,可以使用“__gc”關鍵字將類標記為托管類。就像該名稱所顯示的那樣,它表示類實例的內存由垃圾回收器管理。另外,一個托管類也完全可以成為 .NET 框架的成員,由此可以帶來的好處是,它可以與其他語言編寫的類正確地進行相互操作,如托管的C++類可以從Visual Basic類繼承等。但同時也有一些限制,如托管類只能從一個基類繼承等。需要說明的是,在托管C++應用程序中既可使用托管類也可以使用非托管類。這里的非托管類不是指標準C++類,而是使用托管C++語言中的__nogc關鍵字的類。

            2、用托管C++可以開發(fā).NET框架的項目類型

              使用托管C++應該是C++程序員編寫.NET框架應用程序最好的一種選擇,通過集成在Visual Studio.NET開發(fā)環(huán)境的托管C++向導,我們可以創(chuàng)建以下幾種開發(fā).NET框架的項目類型:

              (1) 托管C++應用程序:用來創(chuàng)建一個支持托管擴展的單獨C++應用程序,使用它還可創(chuàng)建任何類型的應用程序,包括.NET框架客戶應用程序。

              (2) 托管C++類庫:用來創(chuàng)建一個支持托管擴展的C++DLL,使用它可以生成一個能被.NET框架應用程序調用的托管類型的組件。

              (3) 托管C++空項目:用來創(chuàng)建一個空的托管項目,該項目只含有支持托管擴展的正確編譯和鏈接的開關選項。使用它能將一個已有的C++源文件進入到一個托管環(huán)境中。

              (4) 托管C++ Web服務:用于創(chuàng)建兩個項目,一個是C++托管擴展項目,另一個是部署項目。

              3、托管C++與標準C++的主要區(qū)別

              盡管托管C++是從標準C++建立而來的,但它與標準C++有著本質上的區(qū)別,這主要體現(xiàn)在以下幾個方面:

              (1) 廣泛采用“名稱空間”(namespace)

              名稱空間是類型的一種邏輯命名方案,.NET使用該命名方案用于將類型按相關功能的邏輯類別進行分組,利用名稱空間可以使開發(fā)人員更容易在代碼中瀏覽和引用類型。當然,我們也可將名稱空間理解成是一個“類庫名”。 

              盡管很早Microsoft就在Visual C++中支持名稱空間的編程方式,但是很少引起Visual C++程序員的普遍關注。現(xiàn)在在托管C++程序中,我們必須使用這一方式,即使用#using和using關鍵字。例如下面的簡單程序代碼是在控制臺上輸出“Hello World”:

            #using 
            using namespace System;
            int main(void)
            {
            Console::WriteLine(S"Hello World");
            return 0;
            }

              代碼中,#using是用來將一個元數(shù)據(jù)文件輸入到托管C++程序中,這些文件可以是包含托管數(shù)據(jù)和結構的MSIL (Microsoft intermediate language,微軟中間語言)文件,如DLL、EXE、OBJ文件等。mscorlib.dll是.NET框架的一個核心類庫,包含主要的名稱空間System。程序的第二行代碼“using namespace System;”用來使用System名稱空間。System是.NET框架根名稱空間,包含最基本的類型,如用于數(shù)據(jù)流的輸入/輸出的System::IO等。

              在對托管C++程序開發(fā)的不斷深入,我們不久就會發(fā)現(xiàn),許多類型的引用都要在程序的前面使用#using和using來進行。

              (2) 基本數(shù)據(jù)類型的變化

              我們知道,標準C++語言的數(shù)據(jù)類型是非常豐富的。而托管C++的數(shù)據(jù)類型更加豐富,不僅包含了標準C++中的數(shù)據(jù)類型,而且新增了__int64(64位整型)、Decimal(96位十進制數(shù))、String*(字符串類型)和Object*(對象類型)等類型,表1-1列出它們各自數(shù)據(jù)類型。

            類型描述標準C++類型名托管C++類型名長度(位)
            布爾型boolbool8
            字符型charsigned char8
            無符號字符型unsigned charchar8
            短整型short [int]short16
            無符號短整型unsigned short [int]unsigned short16
            整型intint 或 long32
            無符號整型unsigned [int]unsigned int 或 long32
            長整型long [int]long32
            無符號長整型unsigned long [int]unsigned long32
            單精度浮點型floatfloat32
            雙精度浮點型doubledouble64
            長雙精度浮點型long double--64
            Unicode字符--wchar_t16
            64位整型--__int6464
            無符號64位整型--unsigned __int6464
            96位十進制值--Decimal96
            對象類型--Object*32
            字符串類型--String*--


              需要注意的是,String和Object在定義一個變量時,注意要有星號(“*”),但這個變量不是指針變量,這與標準C++的含義是不一樣的。例如上面的代碼可以改為:

            #using 
            using namespace System;
            int main(void)
            {
            String* hello = S"Hello World";
            Console::WriteLine(hello);
            return 0;
            }
             (3) 新增三個托管C++類型:__gc class、__value class和__gc interface

              一個__gc類或結構意味著該類或結構的生命周期是由.NET開發(fā)平臺自動管理及垃圾自動收集,用戶不必自已去調用delete來刪除。定義一個__gc類或結構和標準C++基本相似,所不同的是在class或struct前加上__gc,例如下面的代碼:

            __gc class G {
            public:
            int k;
            int sum(int);
            };

            G::sum(int i) {return i*(i + 1)/2;}
            int main()
            {
            G * g = new G;
            Console::WriteLine(g->sum(4)); // 結果輸出10
            return 0;
            }

              但要注意:

              A. 一個__gc類不能從一個非托管類中繼承,且不能包含從它派生的非托管類。但一個__gc類最多可以從一個托管類中繼承。

              B. 一個__gc類不能定義成一個友元類或包含一個友元成員函數(shù)。所謂友元函數(shù),是用來讓外部函數(shù)訪問類中的私有和保護類型成員。

              C. 一個__gc類不能聲明或定義以及重載new或delete操作以及不能包含using等聲明。

              __value類是用來使用具有短生命期的小型數(shù)據(jù)項,它不同于__gc類。__gc類數(shù)據(jù)分配在CLR堆中,而__value類對象是在運行棧或稱為NDP(.NET Developer Platform,.NET開發(fā)者平臺)堆中創(chuàng)建的,從而避免了垃圾回收器不斷分配和釋放空間而帶來的開銷。一個__value類可以聲明成為一個局部變量、參數(shù)和返回值,也可嵌入到一個__gc類中或是作為一個靜態(tài)變量或在C++堆中分配的變量。例如下面的代碼:

            #using 
            using namespace System;
            __value struct V { int i; };
            __gc struct G { V v; }; // 嵌入到__gc類中
            V f(V v) { // 定義一個全局函數(shù),其值存儲在運行棧中
            v.i += 1; // 不影響原來形參v的值
            return v; // 返回V結構類型的值
            }
            int main(void) 
            {
            V v1 = {10}; // 在運行棧中聲明并初始化
            V v2 = f(v1); // 調用f函數(shù),此時v1中的i為10,而v2中的i為11
            G *pG = new G; // 為G實例分配堆空間
            pG->v = v1; // pG的v中的i為10
            pG->v.i += v2.i; // pG的v中的i為10+11=21
            Console::WriteLine(v1.i); // 輸出結果為10
            Console::WriteLine(v2.i); // 輸出結果為11
            Console::WriteLine(pG->v.i); // 輸出結果為21
            return 0;
            }

              除此之外,所有的__gc對象都是從類System::Object派生而來,因而能夠很容易使用作用在__gc類中的集合和映射功能。然而__value類型并沒有與這個基類所共享,因而不能直接將__value作為函數(shù)中的Object*實參。為了解決這個問題,.NET允許我們使用__box關鍵字將一個__value類型視為一個__gc對象。此時__value類型被封裝成一個__gc類樁子(Stub),并被復制到NDP堆中。由于在托管C++中,box不具備隱式轉換的功能,因此在轉換時必須指明轉換的類型。

              托管C++中的__gc接口最能體現(xiàn)COM接口的思想,它的定義和聲明是非常簡單的,它除了關鍵字不同外,與一個__gc類的聲明極為相似。例如下面的代碼定義了一個接口IMyBase,其中包含了一個f的方法:

            __gc __interface Ibase {
            void f();
            };

              需要說明的是,接口中所有的方法默認時都是純虛的且都是公有的,我們不需要在方法之前使用virtual關鍵字或在方法之后加上“= 0”。其次,在一個__gc接口中不能包含數(shù)據(jù)成員以及靜態(tài)成員,也不能包含任何類的聲明。下面舉一個示例來說明__gc接口的使用:

            #using 
            using namespace System;

            __gc __interface Ibase1 {
            int f(int);
            };
            __gc __interface Ibase2 {
            int f(int);
            };
            __gc struct C: Ibase1, Ibase2 {
            int f(int i) { // 接口方法的實現(xiàn)
            return 2*i-1;
            };
            };

            int main(void){
            C* c = new C;
            Console::WriteLine((c -> f(1)).ToString()); // 輸出結果為1
            Console::WriteLine((__try_cast (c)->f(2)).ToString()); 
            // 輸出結果為3

            Console::WriteLine((__try_cast (c)->f(3)).ToString());
            // 輸出結果為5

            return 0;
            }

              代碼中,__try_cast用來將某個對象轉換成一個指定類型,并當類型轉換失敗時自動處理由此產(chǎn)生的異常。ToString用來將對象描述成一個字符串。
            (4) 簡化屬性操作

              在__gc類中可以使用.NET的屬性,這個屬性簡化了屬性函數(shù)的調用操作,這與標準C++中的屬性不一樣。在標準C++中分別通過get_和put_成員函數(shù)來設置或獲取相關屬性的值。現(xiàn)在,托管C++中的屬性操作就好比是對一個屬性變量進行操作,例如下列代碼:

            #using 
            using namespace System;

            __gc class G {
            public:
            __property int get_Size() {
            Console::WriteLine(S"get_屬性");
            return nSize;
            };
            __property void set_Size(int i) { 
            Console::WriteLine(S"set_屬性");
            nSize = i;
            };
            private:
            int nSize;
            };

            int main() {
            G * pG = new G;
            pG->Size = 10; // 調用set_Size
            int i = pG->Size; // 調用get_Size
            Console::WriteLine(i);
            }

              程序結果為:

               set_屬性

               get_屬性

               10

              需要說明的是,托管C++使用__property關鍵字來定義一個屬性的成員函數(shù)。從代碼中可以看出設置和獲取屬性的成員函數(shù)名稱中分別使用了set_和get_,這樣編譯器會自動生成一個偽成員變量Size,這個變量名是set_和get_成員函數(shù)后面的名稱。注意不要再在get_成員函數(shù)代碼中使用這個偽成員變量Size,它會引起該函數(shù)的遞歸調用。

              (5) 托管C++的委派

              在C/C++中,一個函數(shù)的地址就是內存地址。這個地址不會帶有任何其它附加信息,如函數(shù)的參數(shù)個數(shù)、參數(shù)類型、函數(shù)的返回值類型以及這個函數(shù)的調用規(guī)范等。總之,C/C++的回調函數(shù)不具備類型安全性。而.NET框架在回調函數(shù)的基礎增加了提供類型安全的機制,稱為委派。

              托管C++的委派方法不像C#那么復雜,它簡化了委派絕大部分的內部機制,因而使得它的使用變成非常簡單容易。例如下面的代碼:

            #using 
            using namespace System;

            __delegate int GetDayOfWeek(); // 委派方法的聲明
            __gc class MyCalendar
            {
            public:
            MyCalendar() : m_nDayOfWeek(4) {}
            int MyGetDayOfWeek() {
            Console::WriteLine("非靜態(tài)方法"); 
            return m_nDayOfWeek; 
            }
            static int MyStaticGetDayOfWeek() { 
            Console::WriteLine("靜態(tài)方法"); 
            return 6; 
            }
            private:
            int m_nDayOfWeek;
            };

            int main(void)
            {
            GetDayOfWeek * pGetDayOfWeek; // 聲明委派類型變量
            int nDayOfWeek;

            // 將類的靜態(tài)方法MyStaticGetDayOfWeek綁定成委派
            pGetDayOfWeek = new GetDayOfWeek(0, &MyCalendar::MyStaticGetDayOfWeek);
            nDayOfWeek = pGetDayOfWeek->Invoke(); // 委派的調用
            Console::WriteLine(nDayOfWeek);

            // 將一個類的實例綁定成委派
            MyCalendar * pcal = new MyCalendar();
            pGetDayOfWeek = 
            static_cast(Delegate::Combine(pGetDayOfWeek,
            new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
            nDayOfWeek = pGetDayOfWeek->Invoke();
            Console::WriteLine(nDayOfWeek);

            // 刪除綁定委派的類實例
            pGetDayOfWeek = 
            static_cast(Delegate::Remove(pGetDayOfWeek,
            new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));

            return 0;
            }

              輸出結果是:

               靜態(tài)方法
              
               6

               靜態(tài)方法

               非靜態(tài)方法

               4

              4、結速語

              總之,使用托管C++是C++程序員編寫.NET框架應用程序最好的一種選擇,在充分理解.NET框架基礎上,避免了使用其他語言如C#、VB.NET所帶來的額外開銷。
            posted @ 2008-10-24 11:43 BeyondCN 閱讀(256) | 評論 (0)編輯 收藏

            我心目中的編程高手(完整版)

            -- Bill Joy MIT BBS上說微軟電話面試的一道題就是“Who do you think is the best coder, and why?”。我覺得挺有意思的,也來湊個熱鬧。排名不分先后。

            心目中的編程高手 (1)

            Joy.Colloquium.png    Bill Joy , 前任Sun的首席科學家,當年在Berkeley時主持開發(fā)了最早版本的BSD。他還是vi和csh的作者。當然,Csh Programming Considered Harmful 是另一個話題樂。據(jù)說他想看看自己能不能寫個操作系統(tǒng),就在三天里寫了個自己的Unix, 也就是BSD的前身。當然是傳說了,但足見他的功力。另一個傳說是,1980年初的時候,DARPA讓BBN在Berkley Unix里加上BBN開發(fā)的TCP/IP代碼。但當時還是研究生的B伯伯怒了,拒絕把BBN TCP/IP加入BSD,因為他覺得BBN的TCP/IP寫得不好。于是B伯伯出手了,端的是一箭封喉,很快就寫出了高性能的伯克利版TCP/IP。當時 BBN和DARPA簽了巨額合同開發(fā)TCP/IP Stack,誰知他們的代碼還不如一個研究生的好。于是他們開會。只見當時B伯伯穿個T-shirt出現(xiàn)在會議室(當時穿T-shirt不象現(xiàn)在,還是相 當散漫的哈)。只見BBN問:你怎么寫出來的?而B伯伯答:簡單,你讀協(xié)議,然后編程就行了。最令偶暈倒的是,B伯伯碩士畢業(yè)后決定到工業(yè)界發(fā)展,于是就 到了當時只有一間辦公室的Sun, 然后他就把Sparc設計出來樂... 象這種軟硬通吃的牛人,想不佩服都不行的說。據(jù)Bill Joy的同事說,一般開會的時候B伯伯總是拿一堆雜志漫不經(jīng)心地讀。但往往在關鍵之處,B伯伯發(fā)言,直切要害,提出漂亮的構想,讓同事們徹底崩潰。對了,他還是Java Spec和JINI的主要作者之一。

            心目中的編程高手 (2)

            John.Carmack.png    John Carmack ,ID Software的founder和Lead Programmer。上個月和一個搞圖形的師兄聊天,他竟然不知道John Carmack, 也讓偶大大地暈了一把。不過也許搞研究的和搞實戰(zhàn)的多少有些隔吧。想必喜歡第一人稱射擊游戲的都知道J哥哥。90年代初只要能在PC上搞個小動畫都能讓人 驚嘆一番的時候,J哥哥就推出了石破天驚的Castle Wolfstein, 然后再接再勵,doom, doomII, Quake...每次都把3-D技術推到極致。J哥哥的簡歷上說自己的專長是"Exhaust 3-D technology",真是牛人之言不我欺的說。做J哥哥這樣的人是很幸福的,因為各大圖形卡廠家一有了新產(chǎn)品就要向他“進貢”,不然如果他的游戲不支 持哪種卡,哪種卡基本就會夭折樂。當初MS的Direct3D也得聽取他的意見,修改了不少API。當然,J哥哥在結婚前十數(shù)年如一日地每天編程14小時 以上,也是偶們凡人望塵莫及的。對了,J哥哥高中肆業(yè)(?!),可以說是自學成才。不過呢,誰要用這個例子來為自己學習不好辯護,就大錯特錯了。那 Leonardo Da Vinci還是自學成才呢(人是私生子,不能上學)。普通人和天才還是有區(qū)別的。對了,其實偶們叫“達分奇”是相當不對的,因為Vinci是地名,而Da Vinci就是從Vinci來的人的意思。換句話說,Leonardo Da Vinci就是“從Vinci來的Leonardo”的意思。叫別人“Da Vinci”就不知所謂樂。嗯,扯遠了,打住。

            心目中的編程高手 (3)

            David.Cutler.png    David Cutler ,VMS 和Windows NT的首席設計師,去微軟前號稱硅谷最牛的kernel開發(fā)員。當初他和他的手下在微軟一周內把一個具備基本功能的bootable kernel寫出來,然后說:"who can't write an OS in a week?",也是牛氣沖天的說。順便說一句,D爺爺?shù)絅T3.5時,管理1500名開發(fā)員,自己還兼做設計和編程,不改coder本色啊。D爺爺天生脾 氣火爆,和人爭論時喜歡雙手猛擊桌子以壯聲勢。:-) 日常交談F-word不離口。他面試秘書時必問:"what do you think of the word 'FUCK'?",讓無數(shù)美女剎羽而歸。終于有一天,一個同樣火爆的女面對這個問題脫口而出:"That's my favorite word"。于是她被錄取樂,為D爺爺工作到NT3.5發(fā)布。

            心目中的編程高手 (4)

            Donald.E.Knuth.png    Donald E. Knuth 。 高爺爺其實用不著偶多說。學編程的不知道他就好像學物理的不知道牛頓,學數(shù)學的不知道歐拉,學音樂的不知道莫扎特,學Delphi的不知到Anders Hejlsberg,或者學Linux不知道Linus Torvalds一樣,不可原諒啊。:-) 為了讓文章完整,就再羅唆幾句吧。高爺爺本科時就開始給行行色色的公司寫各種稀奇古怪的編譯器掙外快了。他賣給別人時收一兩千美元,那些公司拿了 code,加工一下賣出去就是上萬上十萬。不過也沒見高爺爺不爽過,學者本色的說。想想那可是60年代初啊,高爺爺寫編譯器寫多了,順帶就搞出了個 Attribute Grammar和LR(k),大大地造福后人啊。至于高爺爺在CalTech的編程比賽(有Alan Kay得眾多高高手參加)總是第一,寫的Tex到86年就code freeze,還附帶2^n美分獎勵等等都是耳熟能詳,偶就不饒舌樂。順便說一下,高老大爺是無可爭議的寫作高手。他給Concrete Mathematics寫的前言可謂字字鏗鏘,堪為前言的典范。他的技術文章也是一絕,文風細致,解釋精當,而且沒有學究氣,不失輕快跳脫。記得幾年前讀 Concrete Mathematics,時不時開懷大笑,讓老媽極其郁悶,覺得我nerdy到家,不可救藥。其實呢,子非魚,安知魚之樂,更不知那完全是高爺爺?shù)墓凇?說到寫作高手,不能不提Stephen A. Cook。他的文章當年就被我們的寫作老師極力推薦,號稱典雅文風的樣本。庫爺爺一頭銀發(fā),身材頎長,總是面帶謙和的微笑,頗有仙風道骨,正好和他的仙文 相配的說。高爺爺其實還是開源運動的先驅。雖然他沒有象Richard Stallman那樣八方奔走,但他捐獻了好多作品,都可以在網(wǎng)上看到,比如著名的Mathematical Writing,MMIXWare,The Tex Book等,更不用說足以讓他流芳百世的Tex樂。

            心目中的編程高手 (5)

            Ken.Thompson.png    Ken Thompson ,C 語言前身B語言的作者,Unix的發(fā)明人之一(另一個是Dennis M. Riche老大,被尊為DMR),Belle(一個厲害的國際象棋程序)的作者之一,操作系統(tǒng)Plan 9的主要作者(另一個是大牛人Rob Pike, 前不久被google挖走了)。Ken爺爺也算是計算機歷史上開天辟地的人物了。1969年還是計算機史前時代,普通人都認為只有大型機才能運行通用的操 作系統(tǒng),小型機只有高山仰止的份兒。至于用高級語言來寫操作系統(tǒng),更是笑談。Ken爺爺自然不是池中物,于是他和DMR怒了,在1969年到1970間用 匯編在PDP-7上寫出了UNIX的第一個版本。他們并不知道,一場轟轟烈烈的UNIX傳奇由此拉開了序幕。Ken爺爺在1971年又把Unix用C重 寫,于是C在隨后20年成就了不知多少豪杰的夢想和光榮。Ken爺爺還有段佳話:裝了UNIX的PDP-11最早被安裝在Bell Lab里供大家日常使用。很快大家就發(fā)現(xiàn)Ken爺爺總能進入他們的帳戶,獲得最高權限。Bell Lab里的科學家都心比天高,當然被搞得郁悶無比。于是有高手怒了,跳出來分析了UNIX代碼,找到后門,修改代碼,然后重新編譯了整個UNIX。就在大 家都以為“這個世界清凈了”的時候,他們發(fā)現(xiàn)Ken爺爺還是輕而易舉地拿到他們的帳戶權限,百思不解后,只好繼續(xù)郁悶。誰知道這一郁悶,就郁悶了14年, 直到Ken爺爺?shù)莱鰝€中緣由。原來,代碼里的確有后門,但后門不在Unix代碼里,而在編譯Unix代碼的C編譯器里。每次C編譯器編譯UNIX的代碼, 就自動生成后門代碼。而整個Bell Lab的人,都是用Ken爺爺?shù)腃編譯器。

            心目中的編程高手 (6)

            Rob.Pike.png    Rob Pike , AT&T Bell Lab前Member of Technical Staff,現(xiàn)在google研究操作系統(tǒng)。羅伯伯是Unix的先驅,是貝爾實驗室最早和Ken Thompson以及Dennis M. Ritche開發(fā)Unix的猛人,UTF-8的設計人。他還在美國名嘴David Letterman的晚間節(jié)目上露了一小臉,一臉憨厚地幫一胖子吹牛搞怪。讓偶佩服不已的是,羅伯伯還是1980年奧運會射箭的銀牌得主。他也是個頗為厲 害的業(yè)余天文學家,設計的珈瑪射線望遠鏡差點被NASA用在航天飛機上。他還是兩本經(jīng)典,The Unix Programming Environment 和 The Practice of Programming 的作者之一。如果初學者想在編程方面精益求精,實在該好好讀讀這兩本書。它們都有中文版的說。羅伯伯還寫出了Unix下第一個基于位圖的窗口系統(tǒng),并且是 著名的blit終端的作者。當然了,羅伯伯還是號稱銳意革新的操作系統(tǒng),Plan9,的主要作者。可惜的是,Plan9并沒有引起多少人的注意。羅伯伯一 怒之下,寫出了振聾發(fā)聵的雄文 Systems Software Research is Irrelevant,痛斥當下系統(tǒng)開發(fā)不思進取,固步自封的弊病。雖然這篇文章是羅伯伯含忿出手,頗有偏激之詞,但確實道出了系統(tǒng)開發(fā)的無奈:開發(fā)周期 越來越長,代價越來越大,用戶被統(tǒng)一到少數(shù)幾個系統(tǒng)上,結果越來越多的活動是測量和修補,而真正的革新越來越少。就在羅伯伯郁悶之極的時候,google 登門求賢來樂。如果說現(xiàn)在還有一家大眾公司在不遺余力地把系統(tǒng)開發(fā)推向極致的話,也就是google樂。隨便看看google的成果就知道了。具有超強容 錯和負載平衡能力的分布式文件系統(tǒng)GFS(現(xiàn)在能夠用100,000臺廉價PC搭起一個巨型分布系統(tǒng),并且高效便宜地進行管理的系統(tǒng)也不多哈),大規(guī)模機 器學習系統(tǒng)(拼寫檢查,廣告匹配,拼音搜尋。。。哪個都很牛的說),更不用說處理海量并行計算的各式google服務了。Rob在System Software Research is Irrelevant里蕭瑟地說現(xiàn)在沒有人再關心系統(tǒng)研究的前沿成果了。想不到他錯了,因為google關心。google網(wǎng)絡了大批功成名就的牛人,還 有大量初生牛犢般博士做開發(fā),顯然不是沒事耍酷,而是因為它們的開發(fā)總是試圖吸取系統(tǒng)研究的最新成果。想必Rob Pike在google很幸福。愿他做出更棒的系統(tǒng)。

            心目中的編程高手 (7)

            Dennis.M.Ritchie.png    Dennis M. Ritchie 既然Ken Thompson是我的偶像,新聞組上人稱DMR的Dennis M. Ritchie自然也是,畢竟兩人共同締造了UNIX,而Dennis幾乎獨力把C搞大(當然,C的前身是B,而B是Ken Thompson一手做出來的)。J D兩人1983年分享圖靈獎,是有史以來少數(shù)幾個因工程項目得獎的工程師(本來是唯一的一對兒,但Alan Kay才因為SmallTalk得獎,所以就成了唯二的樂)。一個人一生能做出一個卓越的系統(tǒng)已經(jīng)不易,DMR的C和UNIX長盛不衰近30年,至今生機 勃勃,DMR此生可以無憾的說。D爺爺也算有家學淵源:他老爸在AT&T貝爾實驗室工作了一輩子,并在電路設計方面卓有成就,還出了本頗有影響的 書The Design of Switching Circuits,據(jù)說在交換理論和邏輯設計方面有獨到的論述。當然,D爺爺和他老爸是不同時代的人:他老爸的研究成形于晶體管發(fā)明之前,而D爺爺?shù)墓ぷ?離了晶體管就玩兒不轉樂。:-D不要看D爺爺搞出了C,其實他最愛的編程語言是Alef,在Plan9上運行,支持并行編程。Alef的語法和C相似,但 數(shù)據(jù)類型和執(zhí)行方式都和C大大不同。說到語言,D爺爺對后來人有非常中肯的建議:抱著學習的目的來開發(fā)你自己的語言,不要冀望于它被眾人接受。這個建議不 光對語言開發(fā)有用,也適用于其它大型系統(tǒng)的開發(fā)。別的不說,DMR后來領導自己的團隊在1995年和1996分別推出了Plan9和Inferno操作系 統(tǒng),又用多少人知道呢?其實,D爺爺當初也沒想過C會風行世界。他開發(fā)C的初衷和Eric S. Raymond在Cathedral and Bazaar里闡述的一樣,就是要消除自己對現(xiàn)有工具的不爽之處。誰知D爺爺無心插柳,C竟然受到眾多程序員的狂熱擁戴,連D爺爺自己都大惑不解。在一次 采訪中D爺爺說大概那是因為C的抽象程度碰巧既滿足了程序員的要求,又容易實現(xiàn)。當然C一度是Unix上的通用語言也是原因。但不管怎么說,D爺爺對編程 語言出色的審美意識奠定了C廣為流傳的基礎。最后八卦一下。D爺爺?shù)臉I(yè)余愛好和NBA大牛Karl Malone一樣:開卡車。不過D爺爺更喜歡開NASCAR,而KM獨愛巨無霸。J D爺爺自稱心中不供偶像,如果一定要說一個,那就是Ken Thompson了。現(xiàn)在Ken爺爺退休當飛機教練去了,而D爺爺當了貝爾實驗室系統(tǒng)開發(fā)部的頭,整日忙于開支票。他倆合作20年,屢屢創(chuàng)造歷史。這段令 人神往的佳話,也就長留你我心中樂。P.S.,很多人都以為Brian W. Kernighan是C的作者。其實BWK只是寫了那本經(jīng)典K&R C。據(jù)D爺爺說,他,Ken和Kernighan三人中,Kernighan最能寫文章,他次之,而Ken寫得最少;但說到編程,Ken爺爺才是當之無愧 的老大。

            心目中的編程高手 (8)

            Edsger.Wybe.Dijkstra.png    Edsger Wybe Dijkstra 對,就是E.W. Dijkstra. 一提到EWD,很多人就會想起找最短路徑的Dijkstra Algorithm,就好像一提到Sir. Tony Hoare,就想起Quick Sort一樣。其實這些個算法不過是兩個牛人在他們職業(yè)生涯中最瑣碎的貢獻。比如Dijkstra算法,無非是戴爺爺在1956年為了展示新計算機 ARMAC的計算能力,初試身手的成果,屬于他的算法處女作。據(jù)戴爺爺自述,他搞出最短路徑算法的時候連紙筆都沒用。當時他和他老婆在阿姆斯特丹一家咖啡 廳的陽臺上曬太陽喝咖啡,突然就把這個算法想出來樂。而且當時的算法研究還比較原始,牛人們忙著用計算機搞數(shù)值計算,對離散算法不屑一顧。那時連一個象樣 的專注于離散算法的專業(yè)期刊都沒有。戴爺爺于是推遲發(fā)表這個算法。直到1959年,他才把這個算法發(fā)表在Numerische Mathematik的創(chuàng)刊號上,權為捧場。:-) EWD在多個領域牛氣沖天,端的是理論和編程兩手硬的高手。只不過他的很多工作比較深刻,學校的老先生們覺得本科生接受不了,不給本科生講而已。戴爺爺大 概因為最短路徑算法一戰(zhàn)成名,于是有人請他參加另一臺計算機X1的設計工作,并且把設計實時中斷系統(tǒng)的任務派給了他。現(xiàn)在看來實時中斷也許不算什么,但要 知到,X1前根本就沒有實時中斷的概念。實現(xiàn)它簡直就是一場豪賭。戴爺爺起初還不情愿,但經(jīng)不住項目負責人Bram和Carel的輪番“吹捧”:我們知道 實時中斷讓您工作變得非常困難,但象您這樣的牛人肯定能做出來的說。結果戴爺爺被糖衣炮彈徹底擊穿,接下了這個燙手山芋。兩三年后,他不僅搞出了實時中 斷,還圍繞這個寫出了自己的博士論文,順利戴上博士帽。讓戴爺爺真正成名立萬的還是在X1上開發(fā)的Algo60,最早的高級語言之一。戴爺爺沒日沒夜地工 作了8個月,就搞出了Algo60,也因此獲得了1972年的圖靈獎。因為Algo60,戴爺爺發(fā)表了一篇石破天驚的文章:Recursive Programming,于是人們才知道,原來高級語言也可以高效地實現(xiàn)遞歸,原來從此以后,所有程序員都不可避免地和戴爺爺發(fā)明的一個詞(應該說是概 念)打交道:堆棧。而且Algo60還讓戴爺爺深入地思考多道程序設計的問題,最終發(fā)明了每個系統(tǒng)程序員都繞不開的概念:semaphore。當然,戴爺 爺總是把他發(fā)明的概念嚴格形式化,極具科學家本色的說。和這些成就想比,他提出的吃飯的哲學家問題,也就沒什么好說的了。說來好笑,當時的大學(忘了哪所 了)還是覺得戴爺爺沒有受過正統(tǒng)的數(shù)學訓練,也不是專門搞數(shù)值分析的,所以最后不太情愿地給了他一個教職。這種小挫折并不能妨礙象戴爺爺這樣的牛人創(chuàng)造歷 史。他一邊教數(shù)值分析(:-D),一邊開始開發(fā)一個新的操作系統(tǒng),并培養(yǎng)計算機科學家。幾年后,THE Multiprogramming System橫空出世。THE是第一個支持松散耦合,顯式同步的進程并由此使得嚴格證明系統(tǒng)沒有死鎖變得容易的操作系統(tǒng)。可惜戴爺爺任職的系不識貨,還強 行解散了他的研究小組(1972年戴爺爺給他的系主任說他得了圖靈獎,系主任的第一反應是你們搞計算機就喜歡亂發(fā)獎)。這讓戴爺爺相當郁悶,得了抑郁癥。 在極度郁悶之中,戴爺爺決定用寫作來治療自己的抑郁癥。于是經(jīng)典就誕生樂:Notes on Structured Programming。戴爺爺從此被尊為結構化編程的奠基人,而且他的抑郁癥也被治好樂。EWD太牛,結果他的故事也太多。先到這里吧。1973起,他 的故事就在美國發(fā)生了。

            心目中的編程高手 (9)

            Anders.Hejlsberg.png    Anders Hejlsberg , 微軟.NET的首席架構師,編程語言設計和實現(xiàn)的頂尖高手。他一手做出了Turbo Pascal,也是Delphi, J++(尤其是WFC),C#和.NET的主要作者。這些作品的名字足以為他立傳。作為一個程序員,我在這樣的大師面前實在無語。生子當如Anders的 說。李維的《Borland傳奇》里已詳細講述了Anders的傳奇故事,我就不用費舌了:http://java.mblogger.cn/iexploiter/posts/1505.aspx。Artima上有Anders談C#的系列訪談。MSDN上有一段Anders導游的錄像。有興趣可以去看看牛人的豐采。 
            posted @ 2008-10-22 21:29 BeyondCN 閱讀(110) | 評論 (0)編輯 收藏

            黑客書架上出現(xiàn)頻率最高的9部半書籍


            每一位黑客都需要一個堅實的圖書館來尋找靈感以及查找參考資料。這兒的列表能給你一些你想要的東西,里面既有計算機科學的頂級大學教材,也有對業(yè)界的真知灼見,還有你不可或缺的參考書籍。它囊括了黑客的經(jīng)典著作。 

            人月神話:軟件工程評述-周年版 

            Fredrick P. Brooks著 

            這本論述軟件工程中人的因素的經(jīng)典著作出版于1975年。這些年來,技術已經(jīng)發(fā)生了很大的變化,但是人的因素還是和原來一樣讓人頭痛。這是一本有深刻洞察力的書籍,也是一本在業(yè)界非常著名,常常被引用的書籍。《人月神話》概括了許多在大中型項目中經(jīng)常遇到的,也是非常致命的問題。它提出了2條著名的準則: 

            ?人月神話:向一個已經(jīng)延后的項目中投入更多的人力資源只會讓它更延后 
            ?沒有銀彈:沒有一種策略,技術或者技巧可以極大地提高程序員的生產(chǎn)力 
            我不僅向程序員推薦這本書,也想任何一個項目管理人員推薦這本書。項目經(jīng)理和程序員都會喜歡布魯克斯清楚而明晰的觀點。 

            C 程序設計語言(第二版) 


            這是一本權威的C語言參考書籍,人們通常叫它K&R。它無比精煉,同時也能恰到好處地給初學者提供足夠的信息。K&R提供的信息剛好是你需要的,不多也不少。274頁的篇幅是你說能發(fā)現(xiàn)的參考書中最緊湊的。我敢說Java的作者是很難寫出如此簡明扼要的著作。 

            這本書適合任意一個學習C語言或者想尋找C語言參考書的人。K&R也是任何一位想撰寫語言參考或者技術著作的人必讀的書目。 

            如果你沒有任何的編程經(jīng)驗,K&R不太適合做為起點。但是如果你足夠有沖勁的話,它還是能讓你學到不少東西。初學者需要去買一本答案,它提供了所有練習的詳細解釋。 

            計算機程序設計與解釋 (第二版) 

            Harlod Abelson和Gerald Jay Sussman著 

            SICP是一本被很多頂級高校,諸如加州大學伯克利分校,麻省理工學院等,使用的入門書籍。它用Scheme語言介紹了許多強大的范例,比如遞歸,lamda表達式,抽象以及解釋性語言。 

            我發(fā)現(xiàn)這本書做為入門教材是難以想象的厚重。我工作了幾年并且對這些東西有了更深的了解以后,再來重新讀這本書,仍然學到了很多東西。 

            如果你在課堂上沒用到這本書,我推薦你把它找來仔細看看自己遺漏了什么,特別是你沒用使用過LISP這樣的語言的話。 

            代碼大全2:軟件架構的實用手冊 

            Steve McConnell著 

            《代碼大全2》是一本在軟件架構方面得到高度評價的書。McConnell在書中定義了主要的編程和調試的架構,也闡述了一些架構設計,詳細設計,單元測試,整合和整合測試的內容。 

            這本書的主要目的是讓你寫出更好的代碼。McConnell涉及了包括管理軟件復雜度,重構,代碼風格和寫出優(yōu)美的注釋等方方面面的內容。 

            這本書推薦給任何一個想寫出健壯的代碼的人。當你學習到了良好的代碼實踐,那么你就會節(jié)約很多起步的時間;同時,它對于有多年經(jīng)驗的程序員也能幫助他們改變自己不好的開發(fā)習慣。 

            算法簡介 

            Thomas H. Cormen,Charles E. Leiserson,Ronald L. Rivest 和 Clifford Stein著 

            這是另外一本教材。《算法簡介》也許是大學中使用的最多的算法教材。它同時也是一本非常好的參考書。 

            盡管在實際情況中大部分程序員在生產(chǎn)環(huán)境中都不會自己去寫諸如快速排序這樣的算法實現(xiàn),但是算法知識是了解你所應用的庫以及你自己代碼實際效率的基礎。 

            《算法簡介》被推薦給任何一個想完善自己算法技巧的開發(fā)人員,它也被推薦給那些對NP完備性,隨機算法,快速傅立葉變換等課題感興趣的人。閱讀這本書也需要良好的數(shù)學知識。 

            設計模式:可復用的面向對象軟件的原則 

            Erich Gamma,Richard Helm,Ralph Johnson和John M. Vlissides著 

            這本書闡述了各種面向對象的設計模式。對于書中23種模式的每一種,作者都給出了深度分析,這些分析包括清晰的示例,常見的缺陷,相關的模式,用C++或者SmallTalk寫的示例代碼。這些模式涵蓋了單件模式,觀察者模式,模板方法模式,迭代器模式和代理模式。 

            這本書對于使用面向對象語言的中級或者高級開發(fā)者是必讀書目。剛剛進入面向對象開發(fā)的開發(fā)人員最好在掌握了面向對象語言以及在非實驗性項目中深入實踐以后再來學習里面的模式。否者你學到的東西不可能是很牢靠的。 

            編程珍珠 (第二版) 

            Jon Bentley著 

            這本書在學習解決問題的技巧方面非常突出。15章的每一個章節(jié)都對應著一個任務,例如排序電話號碼,創(chuàng)建回文詞或者搜索文本。Bentley先定義問題,然后再提出不同的解決方案,提供了討論和對每個解決方案清晰的分析,最后再給出了編程的基本原則。 

            《編程珍珠》包含了一些非常聰明的主意,它們可以用來做為解決一些小問題的時候做為參考。但是這本書更有用的地方是如何從工程師的角度解決問題。 

            我把這本書推薦給每一位享受編程工作的人。 

            編譯器:原則,技術和工具 

            Alfred V. Aho, Ravi Sethi 和Jeffrey D. Ullman著 

            《編譯器:原則,技術和工具》通常被叫做“龍書”(封面上有一條紅色的龍)。它是編譯原理課堂上的標準圖書。它涵蓋了你想知道的編譯器的各方面:文法,分析器,詞法分析,語法,中間語言的產(chǎn)生,運行時環(huán)境,優(yōu)化等等。如果你對這些東西還沒有足夠的了解的話,那么你就要準備去學習一些新的術語和概念,比如確定性有限自動機,有限狀態(tài)自動機,LR剖析器等等。 

            我很喜歡龍書的各部分并且對里面的數(shù)學概念和理論很感興趣(它們貫穿了整本書)。如果你很喜歡正則表達式和狀態(tài)機,那么你會很喜歡這本書。另外一方面,如果你想知道一些現(xiàn)代編譯器的實現(xiàn)原理,你可能無法在里面找到你所需要的東西。龍書是1986年出版的,不能涵蓋這些現(xiàn)代的話題。 

            Unix強大工具 第三版 

            Shelley Powers,Jerry Peek,Tim O' Reilly和Mike Loukides著 

            這本書是O'Reilly出版社出版的很多偉大著作中的一本。《Unix強大工具》達到了1200頁,完全描述了Unix下面命令行工具,用法,腳本語法示例。 

            《Unix強大工具》是一本組織的非常好的參考書。如果你依次讀下去,你會發(fā)現(xiàn)自己會變成讓人驚訝的計算機癮君子典型代表。 

            這本書里面大部分內容都可以在Google上面搜索到,但是有時候我們也需要這樣一本很好的參考書。 

            這本書是為數(shù)不多的適合于初學者和專家的書籍之一。不管是Unix新手還是有多年經(jīng)驗的系統(tǒng)管理員都能從這本書獲益。 

            便車旅行者指南終極收藏版:5部完整的小說和一個故事 

            Douglas Adams著 

            這不是一本技術書籍。但是如果你沒讀過這部便車旅行者三部曲,你就不可能摘掉計算機癮君子的帽子。它其實包含了5本書,《銀河便車指南》,《宇宙盡頭的旅館》,《生活,宇宙和一切》,《再見,謝謝那些魚》,《大部無害》,再加上一篇短篇小說《小柴法德謹慎行事》 

            在發(fā)現(xiàn)對生活,宇宙和一切的答案中找到愉悅。學習如何制作Pan Galactic Gargle Blaster(這應該是一種飲料,但是不知道怎么翻譯。出處在這兒:http://ywsl.com/bbs/bbsshow.aspx?id=42780 

            The Hitch Hiker's Guide to the Galaxy also mentions alcohol. It says that the best drink in existence is the Pan Galactic Gargle Blaster.It says that the effect of a Pan Galactic Gargle Blaster is like having your brains smashed out by a slice of lemon wrapped round a large gold brick. 
            ),而這一切都是毫不痛苦的。 

            這個版本有漂亮的黑色皮革封面,還有絲帶書簽。閱讀的時候就好像在讀一本很好的圣經(jīng),而且還更可信。(我要在某些喜歡爭辯的人發(fā)現(xiàn)我之前收回我的話,這只是一個玩笑而已啦) 
            posted @ 2008-10-21 13:27 BeyondCN 閱讀(410) | 評論 (1)編輯 收藏
            epoll是多路復用IO(I/O Multiplexing)中的一種方式,但是僅用于linux2.6以上內核,在開始討論這個問題之前,先來解釋一下為什么需要多路復用IO.

            以一個生活中的例子來解釋.

            假設你在大學中讀書,要等待一個朋友來訪,而這個朋友只知道你在A號樓,但是不知道你具體住在哪里,于是你們約好了在A號樓門口見面.

            如果你使用的阻塞IO模型來處理這個問題,那么你就只能一直守候在A號樓門口等待朋友的到來,在這段時間里你不能做別的事情,不難知道,這種方式的效率是低下的.

            現(xiàn)在時代變化了,開始使用多路復用IO模型來處理這個問題.你告訴你的朋友來了A號樓找樓管大媽,讓她告訴你該怎么走.這里的樓管大媽扮演的就是多路復用IO的角色.

            進一步解釋select和epoll模型的差異.

            select版大媽做的是如下的事情:比如同學甲的朋友來了,select版大媽比較笨,她帶著朋友挨個房間進行查詢誰是同學甲,你等的朋友來了,于是在實際的代碼中,select版大媽做的是以下的事情:

            int n = select(&readset,NULL,NULL,100);

            for (int i = 0; n > 0++i)
            {
               
            if (FD_ISSET(fdarray[i], &readset))
               {
                  do_something(fdarray[i]);
                  --n;
               }
            }

            epoll版大媽就比較先進了,她記下了同學甲的信息,比如說他的房間號,那么等同學甲的朋友到來時,只需要告訴該朋友同學甲在哪個房間即可,不用自己親自帶著人滿大樓的找人了.于是epoll版大媽做的事情可以用如下的代碼表示:
            n=epoll_wait(epfd,events,20,500);
                
            for(i=0;i<n;++i)
            {
                do_something(events[n]);
            }

            在epoll中,關鍵的數(shù)據(jù)結構epoll_event定義如下:
            typedef union epoll_data {
                            
            void *ptr;
                            
            int fd;
                            __uint32_t u32;
                            __uint64_t u64;
                    } epoll_data_t;

                    
            struct epoll_event {
                            __uint32_t events;      
            /* Epoll events */
                            epoll_data_t data;      
            /* User data variable */
                    }; 
            可以看到,epoll_data是一個union結構體,它就是epoll版大媽用于保存同學信息的結構體,它可以保存很多類型的信息:fd,指針,等等.有了這個結構體,epoll大媽可以不用吹灰之力就可以定位到同學甲.

            別小看了這些效率的提高,在一個大規(guī)模并發(fā)的服務器中,輪詢IO是最耗時間的操作之一.再回到那個例子中,如果每到來一個朋友樓管大媽都要全樓的查詢同學,那么處理的效率必然就低下了,過不久樓底就有不少的人了.

            對比最早給出的阻塞IO的處理模型, 可以看到采用了多路復用IO之后, 程序可以自由的進行自己除了IO操作之外的工作, 只有到IO狀態(tài)發(fā)生變化的時候由多路復用IO進行通知, 然后再采取相應的操作, 而不用一直阻塞等待IO狀態(tài)發(fā)生變化了.

            從上面的分析也可以看出,epoll比select的提高實際上是一個用空間換時間思想的具體應用

            posted @ 2008-10-16 09:40 BeyondCN 閱讀(276) | 評論 (0)編輯 收藏
            僅列出標題
            共2頁: 1 2 
            精品久久久久久无码不卡| 久久精品国产亚洲Aⅴ香蕉| 亚洲精品美女久久久久99小说| 久久亚洲国产精品一区二区| 91精品婷婷国产综合久久| 精品久久国产一区二区三区香蕉| 精品国产乱码久久久久久人妻| 中文字幕热久久久久久久| 一本色道久久99一综合| 国产成人精品久久亚洲| 久久妇女高潮几次MBA| 国产精品久久久天天影视香蕉| 狠狠色婷婷久久一区二区| 狠狠干狠狠久久| 无码精品久久久久久人妻中字| 成人a毛片久久免费播放| 久久精品无码一区二区WWW| 久久99精品国产麻豆蜜芽| 性高湖久久久久久久久| 亚洲精品综合久久| 久久免费视频网站| 精品综合久久久久久888蜜芽| 久久久久久免费视频| 久久99精品久久久久久秒播| 久久精品国产亚洲AV麻豆网站 | 久久精品人人做人人妻人人玩| 久久无码人妻精品一区二区三区 | 久久综合久久综合亚洲| 超级碰久久免费公开视频| 精品免费久久久久久久| 久久精品国产99国产精品导航| 青青久久精品国产免费看 | yy6080久久| 久久精品无码免费不卡| 9久久9久久精品| 成人综合伊人五月婷久久| 午夜精品久久久久久久久| 亚洲伊人久久综合影院| 久久久久99精品成人片| 久久久久久一区国产精品| 久久久久女教师免费一区|