多任務編程超入門-(2) 進程和線程

作為多任務編程的基本概念,進程和線程的概念是無論如何迴避不了的。很多公司面試時也會問倒二者的區別。如果到互聯網上隨便搜一下,就能找到關於進程和線程的文章,但是相信讀過之後,懂得人會點頭,不懂的還是不懂。所以本文採用另外一種方式來說明。

單任務系統的情況

在這種情況下,所有的系統資源都交給程序使用,編程者只需要考慮處理的流程和邏輯即可。這裡的資源包括:CPU時間,內存(堆,棧),全局變數,硬體設備(顯示器,鍵盤,通訊介面,音頻設備)等。

多任務操作系統的情況

進程

對於編程者來說,最理想的情況就是,根本不用意識自己是多任務操作系統環境中編寫程序。

也就是說,至少看起來所有的系統資源都交給程序使用,編程者只需要考慮處理的流程和邏輯即可。這裡的資源包括:CPU時間, 內存(堆,棧,全局變數),硬體設備(顯示器,鍵盤,通訊介面,音頻設備)等。

但問題是,物理內存,設備只有一份,多個程序同時執行時必然發生競爭。這個問題當然不用我們考慮,因為多任務操作系統已經解決了:

1.為每個程序提供一定的CPU時間,保證程序可以按照某種間隔被執行。這種執行是二進位機器碼層面的。

2.為每個程序提供了獨立的,虛擬的內存空間,程序對虛擬內存進行的操作會映射到實際的物理內存上。

3.對於顯示部分,提供了窗口機制,將程序的輸出導向特定的窗口。同時系統將鍵盤,滑鼠的輸出導向當前活動的窗口。

4.有一些硬體,比如音頻輸入設備,串口等實在無法在程序之間共享。這樣的硬體就採用了獨佔的方式,如果某個程序佔用了某個設備,其他程序就不能使用。

這些都做到以後,可以說基本上實現了我們的理想:編程者不用意識自己是在為多任務操作系統編寫程序。每個任務作為單獨的程序來設計和實現,任務之間的調度利用操作系統的功能來實現。

這樣的程序執行過程就是進程。基本上進程就相當於多任務操作系統中的應用程序。(許多規模較大的應用也可以包含多個進程)

進程的好處是最大限度保持程序執行過程之間的獨立性,使增加任務或者調整任務內容變得簡單。但同時也可以看到操作系統要為每個進程分配資源,映射內存操作,控制各種輸入輸出。所有這些都需要相當的系統開銷。所以多任務操作系統也是隨著硬體性能的提高而逐漸發展起來的。

線程

理解了進程的優缺點以後,再理解線程就容易了。很多時候在一個進程內部還是需要多任務處理,比如視頻時軟體在視頻解碼時還要接受用戶操作。對於這種情況下就需要在進程內部提供多任務處理機制:線程。

一個進程中的線程之間CPU時間的分配和進程類似,但是共同使用進程的資源,操作系統不必為每個線程提供另外的映射機制,這樣做的結果:

1.多個線程共用一個資源時,需要編程者利用操作系統提供的介面主動的進行訪問控制和同步。

2.由於使用共同的內存空間,堆,棧等,所以不需要另外的地址映射等處理,可以實現比較快速的數據交換。

總結

就好像沒法回答夏天和冬天那個更好一樣,也沒有辦法回答進程和線程那個更好,我們應該做的就是在適當的場合使用適當的技術。

寫在文章的最後

既然已經讀到這裡了,拜託大家再用一分鐘時間,將文章轉發到各位的朋友圈,微信群中。

本公共號的成長需要您的支持!

以上就是今天的文章,歡迎點贊並推薦個您的朋友!

閱讀更多更新文章,請關注【面向對象思考】微信公眾號!


推薦閱讀:

EA&UML日拱一卒--序列圖(Sequence Diagram)::連續
EA&UML日拱一卒--活動圖::數據區
EA&UML日拱一卒--活動圖::活動(續)
多任務編程超入門-(1) 什麼是多任務

TAG:面向對象編程 | 面向對象分析與設計 |