1. 程式人生 > >程序執行緒與棧、堆的關係

程序執行緒與棧、堆的關係

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.
執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源
.
一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行.

程序在執行過程中擁有獨立的記憶體單元,而該程序的多個執行緒共享記憶體,從而極大地提高了程式的執行效率。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

在很多現代作業系統中,一個程序的(虛)地址空間大小為4G,分為系統(核心?)空間和使用者空間兩部分,系統空間為所有程序共享,而使用者空間是獨立的,一般WINDOWS程序的使用者空間為2G。 [見《windows核心程式設計第13章》]

一個程序中的所有執行緒共享該程序的地址空間,但它們有各自獨立的(/私有的)棧(stack),Windows執行緒的預設堆疊大小為1M。堆(heap)的分配與棧有所不同,一般是一個程序有一個C執行時堆,這個堆為本程序中所有執行緒共享,windows程序還有所謂程序預設堆,使用者也可以建立自己的堆。
用作業系統術語,執行緒切換的時候實際上切換的是一個可以稱之為執行緒控制塊的結構(TCB?),裡面儲存所有將來用於恢復執行緒環境必須的資訊,包括所有必須儲存的暫存器集,執行緒的狀態等。

堆: 是大家共有的空間,分全域性堆和區域性堆。全域性堆就是所有沒有分配的空間,區域性堆就是使用者分配的空間。堆在作業系統對程序初始化的時候分配,執行過程中也可以向系統要額外的堆,但是記得用完了要還給作業系統,要不然就是記憶體洩漏。

棧:是個執行緒獨有的,儲存其執行狀態和區域性自動變數的。棧線上程開始的時候初始化,每個執行緒的棧互相獨立,因此,棧是 thread safe的。作業系統在切換執行緒的時候會自動的切換棧,就是切換 SS/ESP暫存器。棧空間不需要在高階語言裡面顯式的分配和釋放。