1. 程式人生 > >線程和進程的比較

線程和進程的比較

基本 最小 tps 臨時變量 內存空間 可能 highlight targe 使用

一個程序就是一個進程,而一個程序中的多個任務則被稱為線程。進程是表示資源分配的基本單位,又是調度運行的基本單位。線程是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。 進程和線程的關系
(1)一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。線程是操作系統可識別的最小執行和調度單位。
(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。同一進程中的多個線程共享代碼段(代碼和常量),數據段(全局變量和靜態變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量。
(3)處理機分給線程,即真正在處理機上運行的是線程。
(4)線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。
如果把上課的過程比作進程,那麽每個學生就是一個線程,他們共享教室,即線程共享進程的內存空間。每一個時刻,只能一個學生問老師問題,老師回答完畢,輪到下一個。即線程在一個時間片內占有cpu

一個關於進程和線程的例子:

  試想當兩個程序員在兩個獨立的辦公室一起做一個軟件項目,他們可以安靜地工作、不互相幹擾,並且他們人手一套參考手冊。但是,他們溝通起來就有些困難,比起可以直接互相交談,他們必須使用電話、電子郵件或到對方的辦公室進行直接交流。並且,管理兩個辦公室需要有一定的經費支出,還需要購買多份參考手冊。

  假設,讓開發人員同在一間辦公室辦公,他們可以自由的對某個應用程序設計進行討論,也可以在紙或白板上輕易的繪制圖表,對設計觀點進行輔助性闡釋。現在,你只需要管理一個辦公室,只要有一套參考資料就夠了。遺憾的是,開發人員可能難以集中註意力,並且還可能存在資源共享的問題(比如,“參考手冊哪去了?”)

  以上兩種方法,描繪了並發的兩種基本途徑。每個開發人員代表一個線程,每個辦公室代表一個處理器。第一種途徑是有多個單線程的進程,這就類似讓每個開發人員擁有自己的辦公室,而第二種途徑是在單一進程裏有多個線程,如同一個辦公室裏有兩個開發人員。讓我們在一個應用程序中簡單的分析一下這兩種途徑。

  線程很像輕量級的進程:每個線程互相獨立運行,且線程可以在不同的指令序列中運行。但是,進程中的所有線程都共享地址空間(堆上的空間共享,棧上的空間獨立),並且所有線程訪問到大部分數據——全局變量仍然是全局的,指針、對象的引用或數據可以在線程之間傳遞。雖然,進程之間通常共享內存,但是這種共享通常也是很難建立,且難以管理。因為,同一數據的內存地址在不同的進程中是不相同。

技術分享圖片

技術分享圖片

  地址空間共享,以及缺少線程間數據的保護,使得操作系統的記錄工作量減少,所以使用多線程相關的開銷遠小於使用多個進程,不過,共享內存的靈活性是有代價的:如果數據要被多個線程訪問,那麽程序員必須確保每個線程所訪問到的數據是一致的。

線程和進程的比較