程序是資源分配的最小單位,執行緒是cpu排程的最小單位。
程序和執行緒都是乙個時間段的描述,是cpu工作時間段的描述,不過是顆粒大小不同。
就是上下文切換之間的程式執行的部分。是執行中的程式的描述,也是對應於該段cpu執行時間的描述。
是共享了程序的上下文環境,的更為細小的cpu時間段。執行緒主要共享的是程序的位址空間。
這裡描述的程序執行緒概念和實際**中所說的程序執行緒是有區別的。程式語言中的定義方式僅僅是語言的實現方式,是對程序執行緒概念的物化。
在軟體編碼方面,我們說的程序,其實是稍不同的,程式語言中建立的程序是乙個無限loop,對應的是tcb塊。這個是作業系統進行排程的單位。所以和上面的cpu執行時間段還是不同的。
程序,與之相關的東西有定址空間,暫存器組,堆疊空間等。即不同的程序,這些都不同,從而能相互區別。
現代的大多數作業系統都不是實時作業系統,windows系統也是如此。
所以不能奢望執行緒會立即啟動,windows內部會實現特殊的演算法進行執行緒間排程,在某個時刻它會決定執行哪個執行緒,反映到底層就是某個執行緒分配到了一小段cpu時間,來執行一小段工作。
執行緒的排程是個複雜的過程,對於c#開發者來說,需要理解的是:執行緒之間的排程占有一定時間和空間的開銷,並且不實時。
1.執行緒核心物件thread kernel object,每個執行緒都會建立乙個物件,主要包含執行緒上下文資訊,(32位系統中占用記憶體700位元組)。
2.執行緒環境塊thread environment block,包括執行緒的異常處理鏈,32位系統中占用4kb記憶體。
3.使用者模式棧user mode stack,即執行緒棧,用於儲存方法的引數、區域性變數和返回值,每個執行緒棧占用1024kb記憶體。
4.核心模式棧kernel mode stack,當呼叫作業系統的核心模式函式時,系統會將函式引數從使用者模式棧複製到核心模式棧,32位系統中占用12kb記憶體。
1.執行緒建立時,系統相繼初始化以上記憶體空間。
2.接著clr會呼叫所有載入dll的dllmain方法,並傳遞連線標誌(執行緒終止時,也會呼叫dll的dllmain方法,並傳遞分離標誌)。
3.執行緒上下文切換,乙個系統會載入很多程序,而乙個程序又包含多個執行緒。但是乙個cpu在任何時候都只能有乙個執行緒在執行,為了讓每個執行緒看上去都在執行,系統會不斷切換」執行緒上下文「:每個執行緒大概得到幾十毫秒的執行時間。這個過程大概分為5個步驟:
執行緒和程序
標準的定義是 程序是執行緒的容器,乙個程序可於乙個或者多個執行緒,它是系統分配資源的基本單位 同乙個程序下,執行緒共享位址空降 已經開啟的檔案 訊號處理函式 報警訊號和其他,執行緒自己只保留程式計數器和棧。但是很遺憾的,這個只是教科書上的定義,實際情況是每個作業系統實現的作業系統特性不同,實現的方法...
程序和執行緒
乙個程序就是當前正在執行的乙個程式,包括程式的暫存器 程式計數器和變數的當前值。不同的程序擁有不同的位址空間。而執行緒可以理解為是程序中的控制流。同乙個程序內也就是說在同乙個位址空間內可以有多個控制流。也就是可以有多個線 程,他們共享位址空間。我們通常將程序視為是資源的集合,程序中有程式的正文 資料...
執行緒和程序
對於求職者,在面試的時候大多都會被問到 你對多執行緒了解麼?給我講講執行緒和程序的區別吧。在unix中,乙個程序可以理解為執行緒 位址空間 檔案描述符 資料,道破現實,其實就相當於老闆和員工,老闆就是程序,員工就是執行緒。老闆需要僱傭若干員工 執行緒 還要有辦公樓 位址空間 還要有若干的辦公裝置 檔...