進程、多線程

進程是包含程序指令和相關資源的集合。每個進程和其他進程一起參與調度,競爭CPU,內存等系統資源。

每次進程切換,都存在進程資源的保存和恢復動作,這稱爲上下文切換。

進程的引入可以解決支持多用戶的問題,但是多進程系統也在如下方面產生了新的問題:進程頻繁切換引起的額外開銷可能會嚴重影響系統性能。
進程間通信要求複雜的系統級實現。在程序功能日趨複雜的情況下,上述缺陷也就凸現出來。比如,一個簡單的GUI程序,爲了有更好的交互性,通常用一個任務支持界面交互,另一個任務支持後臺運算。如果每個任務均由一個進程來實現,那會相當低效。對每個進程來說,系統資源看上去都是其獨佔的。比如內存空間,每個進程認爲自己的內存空間是獨有的。一次切換,這些獨立資源都需要切換。由此就演化出了利用分配給同一個進程的資源,儘量實現多個任務的方法。這也就引入了線程的概念。同一個進程內部的多個線程,共享的是同一個進程的所有資源。比如,與每個進程獨有自己的內存空間不同,同屬一個進程的多個線程共享該進程的內存空間。例如在進程地址空間中有一個全局變量globalVar,若A線程將其賦值爲1,則另一線程B可以看到該變量值爲1。兩個線程看到的全局變量globalVar是同一個變量通過線程可以支持同一個應用程序內部的併發,免去了進程頻繁切換的開銷,另外併發任務間通信也更簡單。

目前多線程應用主要用於兩大領域:網絡應用和嵌入式應用。爲什麼在這兩個領域應用較多呢?因爲多線程應用能夠解決兩大問題:併發。網絡程序具有天生的併發性。比如網絡數據庫可能需要同時處理數以千計的請求。而由於網絡連接的時延不確定性和不可靠性,一旦等待一次網絡交互,可以讓當前線程進入睡眠,退出調度,處理其他線程。這樣就能夠有效利用系統資源,充分發揮系統處理能力。實時。線程的切換是輕量級的,所以可以保證足夠快。每當有事件發生,狀態改變,都能有線程及時響應,而且每次線程內部處理的計算強度和複雜度都不大。在這種情況下,多線程實現的模型也是高效的。在有些語言中,對多線程或者併發的支持是直接內建在語言中的,比如Ada和VHDL。在C++裏面,對多線程的支持由具體操作系統提供的函數接口支持。不同的系統中具體實現方法不同。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章