1.從win32角度看,程序含有記憶體和資源。被程序擁有的記憶體,理論上可以高達2gb。資源則包括核心物件(如file handles和執行緒),user資源(如對話方塊和字串),gdi資源(如devives context和brushes)。
2.程序本身並不能夠執行,它只是提供乙個安置記憶體和執行緒的地方。
3.matt pietrek在windows 95 system programming secrets一書中的解釋是:「程序就是一大堆物件的所有權的集合」,也就是說,程序擁有物件。程序可以擁有記憶體(更精確地說是擁有memory context),可以擁有file handles,可以擁有執行緒,也可以擁有一大串dll模組(被載入這一程序的位址空間中)。
4.每乙個程序都關係到記憶體。記憶體可以大致分為3種型別:
code,data,stack
5.code是程式的可執行部分,一定是唯讀性質。這是cpu唯一允許執行的記憶體。可執行windows nt的兩種晶元:intel晶元和risc晶元都有這項限制。
6.data是你的程式中的所有變數(不包括函式中的區域性變數),可以區分為全域性變數和靜態變數兩種。當然執行緒也可以使用malloc()或new動態配置記憶體。
7.stack是你呼叫函式時所用的堆疊空間,其中有區域性變數。每個執行緒產生時配有乙個堆疊。如果不需要,作業系統會將它動態擴充。
8.程序和記憶體並沒有真正」做「什麼事情。一旦cpu開始執行程式**,你就有乙個「執行緒」。在同一時間同一程序,你可以擁有一大把執行緒,執行同一段**。定義乙個執行緒,需要的資料並不多。執行緒在「任何時刻下的狀態」被定義在程序的某塊記憶體中,以及cpu暫存器中。其他重要的資料,如變數以及應用程式的呼叫堆疊,儲存在程序中的那些可被其他執行緒共享的記憶體中。
9.執行緒相比於程序而言執行緒廉價,啟動比較快,退出也比較快,對系統資源的衝擊比較小,而且,執行緒彼此分享了大部分核心物件(如file handles)的擁有權。
10.unix產生乙個程序所需的額外負擔(overhead)比在win32中低的多。然而,win32產生乙個執行緒,代價又更廉價的多。乙個單cpu的windos nt機器上擁有500個執行緒並不是太過分的事情,而大部分unix如果有500個程序就會有嚴重的效率問題,甚至幾十其中大部分沒有活動(non-active)。
11.在搶先式多工系統中,當硬體計時器認為某個執行緒已經執行很久了,就會發生乙個中斷(interrupt),於是cpu取得目前這個執行緒的當前狀態,也就是把所有暫存器中的內容拷貝到堆疊中,再把它從堆疊中拷貝到乙個context結構(這樣便儲存了執行緒的狀態)中,以備以後再用。
12.要切換不同的執行緒,作業系統應先切換該執行緒所隸屬之程序的記憶體,然後再恢復改執行緒放在context結構中的暫存器值。這個過程被稱作context switch。也就是換一套memory context--page directory和page tables。
13.不同執行緒間如果需要通訊,唯有依賴特別的設計,使之擁有共享記憶體(shared memory)。如果兩個執行緒屬於同一程序,他們將共享所有的記憶體。
14.乙個操作(operation)如果能夠不受中斷地完成,我們稱之為atomic operation。檢查標記和設立標記必須是乙個atomic operation,如果它被中斷,就會產生乙個race condition。檢查標記和設立標記的動作非常平常,所以被實現於很多cpu硬體中,名為test和set指令。實際上只有作業系統會使用test和set指令。作業系統提供比較高階的機制,讓你的程式用以取代test和set。
《Win32多執行緒程式設計》學習筆記 (1)
最近開始看 win32 多執行緒程式設計 感覺受益匪淺,寫出來的目的有兩個 一是想看看自己理解的程度,能否總結出作者真正想表達的內容。2是與大家共享。好了,廢話就不說那麼多了!文章開始講述了作業系統的演化,作者從早期的 ms dos1.0 版本單任務系統到 2.x的可以允許常駐程式 tsr 但是 m...
win32多執行緒程式設計
使用3個執行緒完成6個任務,工作的執行是靠呼叫sleep 來模擬,時間長度是隨機給予的,只要乙個執行緒結束,就會有另乙個執行緒被產生。taskques.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define win32 le...
Win32 多執行緒程式設計
程序和執行緒都是作業系統的概念 程序是應用程式的執行例項 每個程序是由私有的虛擬位址空間 資料和其它各種系統資源組成 程序在執行過程中建立的資源隨著程序的終止而被銷毀 所使用的系統資源在程序終止時被釋放或關閉 執行緒是程序內部的乙個執行單元 系統建立好程序後 實際上就啟動執行了該程序的主執行執行緒 ...