第三方庫協議
一. 開源許可協議
開源許可協議使事情變得簡單,開發者很容易向一個項目貢獻自己的代碼,它還可以保護你原始作者的身份,使你至少獲得認可,開源許可協議還可以阻止其它人將某個產品據爲己有。
5大開源許可協議:GNU GPL, GNU LGPL, BSD, Apache, MIT,下面依次介紹。
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,臨界區。它是一種輕量級機制,在某一時間內只允許一個線程執行某個給定代碼段,如下圖所示。
利用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平臺間使用。