作者:王姍姍,華清遠見嵌入式學院講師。
上周去參加答辯,內容是安防系統,然後就想到了我們如何來實現我們的程式,是選擇進程還是線程。帶著疑惑,查了些資料,總結如下:
1、首先要明確進程和線程的含義:
進程(Process)是具有一定獨立功能的程式關於某個資料集合上的一次運行活動,是系統進行資源分派和調度的一個獨立單位。與程式相比,程式只是一組指令的有序集合,它本身沒有任何啟動並執行含義,只是一個靜態實體。進程是程式在某個資料集上的執行,是一個動態實體。它因建立而產生,因調度而運行,因等待資源或事件而被處於等待狀態,因完成任務而被撤消,反映了一個程式在一定的資料集上啟動並執行全部動態過程。
每個正在系統上啟動並執行程式都是一個進程。每個進程包含一到多個線程。進程也可能是整個程式或者是部分程式的動態執行。線程是一組指令的集合,或者是程式的特殊段,它可以在程式裡獨立執行。也可以把它理解為代碼啟動並執行上下文。所以線程基本上是輕量級的進程,它負責在單個程式裡執行多任務。通常由作業系統負責多個線程的調度和執行。
多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。
使用線程的好處有以下幾點:
a)使用線程可以把佔據長時間的程式中的任務放到後台去處理
b)使用者介面可以更加吸引人,這樣比如使用者點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度
c)程式的運行速度可能加快
d)在一些等待的任務實現上如使用者輸入、檔案讀寫和網路收發資料等,線程就比較有用了。在這種情況下我們可以釋放一些珍貴的資源如記憶體佔用等等。
2、其次來看下線程和進程的關係
線程是屬於進程的,線程運行在進程空間內,同一進程所產生的線程共用同一記憶體空間,當進程退出時該進程所產生的線程都會被強制退出並清除。線程可與屬於同一進程的其它線程共用進程所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資訊(如程式計數器、一組寄存器和棧)。
3、然後我們來看下線程和進程間的比較
4、設計時考慮的提示
這裡參照ang639在多進程和多線程設計思考中提及的原則:
1.盡量避免長駐記憶體的進程,例如那些很少用到的功能,或周期性很長(10分鐘以上),把它們的功能提取出來,做成一個小的應用程式。需要的時候再把它們拉起來(如通過crontab配置,或直接system)。
2.把目標設計成子功能系統的組合可用提高重用的易用性和維護性。
把目標根據功能劃分不同的子系統,子系統間遵循特定的協議(文本或XML),由通訊聯絡起來,協作完成目標。
也就是說,我們在做設計的時候可以如下考慮:
1、線程的建立以及線程間的通訊和同步都比進程要快。 在多核CPU上的任務分割是對線程而言的,不是進程。
2、如果不需要頻繁的建立和銷毀 執行的效率是並不多的,需要頻繁建立的話,線程快。
3、其它的就根據你的實際情況選擇了, 要是沒有資料通訊什麼的, 線程間的通訊比進程間方便。最關鍵的一點,多線程可以讓同一個程式的不同部分並發執行。
所以在做安防系統的時候,警示系統和監控系統之間可以用多進程來做,對於警示系統中可以用多線程來實現如果發生意外,可以向使用者發送訊息,同時鳴笛,以及如果是火警的話,可以開啟閥門等。