第三方庫協議

第三方庫協議


一. 開源許可協議

開源許可協議使事情變得簡單,開發者很容易向一個項目貢獻自己的代碼,它還可以保護你原始作者的身份,使你至少獲得認可,開源許可協議還可以阻止其它人將某個產品據爲己有。


5大開源許可協議:GNU GPL, GNU LGPL, BSD, Apache, MIT,下面依次介紹。

具體參見:http://www.cnblogs.com/pixy/p/4745558.html


GNU GPL

GNU Gerneral Public Licence。GPL保證源代碼及其衍生永遠保持開源,不允許修改後和衍生的代碼做爲閉源的商業軟件發佈和銷售,不適用於商業軟件。GPL具有“傳染性”,只要在一個軟件中使用(“使用”指類庫引用,修改後的代碼或者衍生代碼)GPL協議的產品,則該軟件產品必須也採用 GPL協議,既必須也是開源和免費。

GNU LGPL

Lesser Gerneral Public Licence。如果修改LGPL協議的代碼或者衍生,則所有修改的代碼,涉及修改部分的額外代碼和衍生的代碼都必須採用LGPL協議。(引用或修改LGPL的代碼及其衍生也必須使用LGPL開源,源於閉源的代碼不需要開源)。

BSD

Berkeley Software Distribution,伯克利軟件套件。鼓勵代碼共享,要求尊重原作者的著作權,允許使用者修改和重新發布代碼(以其他協議形式),允許閉源商業發佈和銷售。

Apache

Apache Licence。鼓勵代碼共享,要求尊重原作者的著作權,允許使用者修改和重新發布代碼(包括以其他協議形式),允許閉源商業發佈和銷售。

MIT

MIT協議。源自麻省理工學院,和BSD一樣寬鬆。只要求保留作者版權,無其他任何限制。


二. 存儲端解決方案

FreeNAS(免費NAS服務器)+ ZFS(Zettabyte File System)

三. 文件與進程

文件:存儲在磁盤中,是“死”的
進程:存在於內存中,是“活”的
文件與進程 >
其中,文件存儲在硬件磁盤中,進程來自文件和加載信息。


四. 多線程(Multi-Process)

線程:又叫執行序(臺灣),可以理解成代碼的副本

多線程:可以理解爲代碼只有一份,但作用於不同的資源上。


五. 多線程目的

1)加速(對於多核CPU)

2)提高代碼清晰度,簡化邏輯(windows95開始)


例如:

1) 早期word打印的同時,從鍵盤讀入數據,以單線程穿行處理時會發生衝突,即打字和打印不能同步流暢運行,需要等待對面的線程結束後才能調用。後期word引入多線程機制,解決該問題,使打字和打印以多線程方式運行,互不干擾,同時簡化邏輯。

2) MP3播放音樂時,利用單線程執行其UI界面的顯示和聲音的輸出時,CPU需要將UI結果送入顯卡,然後跳轉到播放音樂程序,將聲音輸入到聲卡,來回進行轉換,邏輯不清楚,且造成低質量用戶體驗。所以將MP3的UI界面顯示和聲音輸出放在多線程中進行操作,互不干擾,且運行流暢。

3) μTorrent以及BT種子文件下載電影時,將視頻分幀打包壓縮,然後使用多線程執行下載。


六. “多線程”風險

如果多線程調用函數運算中,函數不爲純函數,即給定固定輸入不存在固定輸出,或者說存在全局變量,則該多線程調用是不安全的,即存在一定風險。

純函數:不含全局變量的函數,即給定固定輸入可得固定輸出,可以列表查出結果。


例如:

void function(int x)
{
    // 處理數據,得到result
    A[p] = result;
    p++;
}

以上代碼是不安全的,因爲存在全局變量p。

這種危險性可能很隨機,而且運行時可能會出錯,可能不會出錯,而且在F5調試時很有可能表現正常,因爲F5調試時因爲中斷的時間問題,可能導致衝突的線程順利執行,相當於sleep(time),所以儘量避免該問題出現。


改進方法: 加鎖

void function(int x)
{
    // 處理數據,得到result
    Lock("Dont___");
    {
        A[p] = result;
        p++;
    }
}

七. 多線程“同步”問題

“同步”問題發生在多線程執行時,串行轉換到並行,或者並行轉換到串行的過程中。


1. Critical Section

Critical Section: CS,臨界區。它是一種輕量級機制,在某一時間內只允許一個線程執行某個給定代碼段,如下圖所示。
Critical Section

利用Windows API調用Critical Section的方法:

InitializeCriticalSection( ); % 初始化CS,CS即開始存在
EnterCriticalSection( ); % 進入CS
LeaveCriticalSection( ); % 退出CS
DeleteCriticalSection( ); % 釋放CS

2. Mutex

Mutex: 互斥量,是Critical Section的加強,可以跨進程共享。

WaitForSingleObject( ); // 建立臨界區
ReleaseMutex( ); // 釋放臨界區

3. Semaphore

Semaphore: 信號量,是Mutex的加強。


八. “Static”功能

1. 寫在main函數前面

1) 靜態變量
防止該變量在文件之間被相互使用,即該變量只能在本文件中使用。

static int p;
int main( )
{
    // process
}

2) 靜態函數
防止該變量在文件之間被相互使用。

static int function(int x);
int main( )
{
    // process
}

2. 寫在main函數(或子函數)裏面

相當於全局變量

void main( )
{
    static int a = 12;
    // process
}

等價於

int a = 12;
void main( )
{
    // process
}

九. Tips

1. 工具組件”sysinternods”


2. “硬鏈接”

存在於Uinx操作系統下,指同一個文件具有兩個相同的名字,其中一個文件被修改,則另一個文件 也會相應被修改。


3. “Process Explore”

重型任務管理器


4. “Working Set”

一定時間內,內存訪問的集合。


5. “Windbg”

程序非正常中斷診斷工具,一般用來“驗屍”檢測錯誤。


6. DDK

DDK是Device Development Kit,設備開發包的意思。一般指windows設備驅動程序開發包。如果你想開發一個設備驅動程序,如顯卡驅動程序,就必須使用DDK。


7. MinGW & Cygwin

MinGW: 是Minimalist GNUfor Windows的縮寫。它是一個可自由使用和自由發佈的Windows特定頭文件和使用GNU工具集導入庫的集合,允許你在GNU/Linux和Windows平臺生成本地的Windows程序而不需要第三方C運行時(C Runtime)庫。

Cygwin: Cygwin是一個在windows平臺上運行的類UNIX模擬環境,是cygnus solutions公司開發的自由軟件(該公司開發的著名工具還有eCos,不過現已被Redhat收購)。

所以MinGW在跨平臺間可以生成native的exe程序,而Cygwin則配置環境,使原始exe適應新環境。


8. RTX

小規模開發團隊即時通信,相當於內部qq羣,但與外部隔離,防止資源泄露,基於XMPP協議。


9. Event

block阻塞式等待。

SetEvent( );

10. Customer - Consumer模型


11. glib 庫

glib庫是一個跨平臺庫,遵從LFPL。可以在Windows API和Linux平臺間使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章