進程與線程---------共享與私有
進程process:
是計算機中已運行程序的實體。程序本身只是指令、數據及其組織形式的描述,進程才是程序(那些指令和數據)的真正運行實例。
同一程序可產生多個進程(一對多關系),以允許同時有多位用戶運行同一 程序,卻不會相沖突。
進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
線程thread:
是操作系統能夠進行運算調度的最小單位。是獨立調度和分派的基本單位。
一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務;一個線程可以創建和撤銷另一個線程。
線程可以為操作系統內核調度的內核線程。線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧), 但是同一進程中的多條線程將共享該進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但同一進程中的多個線程有各自的調用棧(call stack),自己的寄存器環境(register context),自己的線程本地存儲(thread-local storage)。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時運行,但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。
一個進程中的所有線程共享該進程的地址空間,但它們有各自獨立的(/私有的)棧(stack),win線程的缺省堆棧大小為1M。堆heap的分配與棧有所不同,一般是一個進程有一個C運行時堆,
這個堆為本進程中所有線程共享,win進程還有進程默認堆,用戶也可以自己創建堆。用操作系統術語,就是線程切換的時候實際上切換的是一個可以稱之為線程控制塊的結構(TCB),裏面
保存所有將來用於恢復線程環境的必須信息,包括所有必須保存的寄存器集,線程的狀態。
堆:是公有的空間,分為全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間。堆在操作系統對進程初始化的時候分配,運行過程中也可以像系統要額外的堆,但是記得
用完了要還給操作系統。要不然就是內存泄漏。
棧:是線程獨有的,保存其運行狀態和局部自變量。棧在線程開始的時候初始化,每個線程的棧相互獨立。因此,棧是Thread safe的。操作系統在切換線程的時候後自動切換棧,即切換
SS<棧段寄存器>/ESP<棧頂指針>寄存器。棧空間不需要再高級語言裏面顯示的分配和釋放。
線程管理:
將線程公有的信息放在進程控制塊裏,將線程獨有的信息存放在線程控制塊中。
如何區分哪些信息時共享?哪些私有?
一般的評價標準是:如果某些資源不獨享會導致線程運行錯誤,則該資源就由某個線程獨享,而其他資源都由進程裏面的所有線程共享。
對於進程一線程的實現如何做解釋?
首先應該明白進程的調度,創建等實質上都是有操作系統實現的,即進程的實現只能由操作系統內核來實現,而不存在用戶態實現的情況。
對於線程,線程的管理者可以是用戶也可以是操作系統本身。因此,線程的實現就應該分為內核態線程實現和用戶態線程實現。
內核態線程實現:
線程時進程的不通過執行序列,即線程是獨立運行的基本單位,也是CPU的基本單位。
操作系統如何實現線程管理?
首先操作系統向管理進程一樣,應該保持維護線程的所有資源,將線程控制塊存放在操作系統的內核空間中。那麽此時操作系統就同時掌控進程控制塊和線程控制塊。
優點:用戶編程簡單;不容易阻塞。缺點:效率低,需要修改操作系統。
用戶態線程實現:
用戶自己做線程的切換,操作系統無需知道線程的存在。
需要創建一個調度線程,在執行完需主動把資源釋放給其他線程使用。 優點:靈活,無需修改操作系統實現。缺點:需要考慮很多原因,
現在操作系統的線程實現模型:
用戶態執行負責進程內部線程在非阻塞時的切換;內核態的操作系統負責阻塞線程的切換。每個內核態線程可以服務一個或多個用戶態線程。
線程什麽時候會從用戶態切換到內核態:
首先,如果程序運行過程中發生中斷或者異常,系統將自動切換到內核態運行中斷或異常處理機制;或者,程序進行系統調度也會從用戶態切換到內核態。
進程與線程---------共享與私有