標籤:描述符 影響 效率 實踐 地理 獲得 分數 集合 通訊
1.進程線程,什麼是線程和進程?區別是啥?
程式並不能單獨運行,只有將程式裝載到記憶體中,系統為它分配資源才能運行,而這種執行的程式就稱之為進程。程式和進程的區別就在於:程式是指令的集合,它是進程啟動並執行靜態描述文本;進程是程式的一次執行活動,屬於動態概念。
進程是作業系統資源分派的基本單位(cpu、記憶體、檔案、網路連接埠),進程是應用程式的執行執行個體,比如電腦裡運行著瀏覽器進程、QQ用戶端進程、郵件進程還有其他動作系統的一些基礎進程;線程是調度和程式執行的基本單位。為什麼是調度的基本單位
並發 != 並行
進程:多個程式的並發執行;線程:程式中多個任務的並發執行。
同一個進程內的線程共用進程的資源,進程擁有獨立的地址空間,線程共用進程的地址空間
電腦能在我寫部落格的時候收取郵件還能發送QQ訊息,當然對於cpu來講,某一個時刻只會運行一個進程,但是我們的作業系統有任務發送器,讓cpu根據調度來在這些進程之間不斷的切換。在一秒鐘之內,作業系統就會在不同的進程中切換很多次,這也是對於我們人來講,感覺就像是電腦在同時做這幾件事情,但對於cpu來講他是在不同進程之間的執行來回切換。
進程調度演算法
之所以會有線程,是因為在進程中運行多種活動時,當進行某一項活動時比如讀取磁碟資料,此時進程就處於阻塞狀態,整個事情的進展就處於暫時的停止狀態,如果我們將進程中的多種工作指派給不同的線程去處理,比如一個線程在向記憶體中寫入資料,一個線程在分析資料,這樣就不會在讀取資料的時候無法分析資料了。這就是為什麼會有線程的概念。
其次線程可以共用進程中的資源比如開啟的檔案、全域變數等公用資源,另外線程比進程更輕量級,建立和銷毀比進程要快10-100倍。這兩個也是線程之所以存在的原因。
線程在進程的記憶體空間中有自己的記憶體空間用來臨時儲存自己的堆棧或寄存器內容或程式計數器,用來恢複繼續運行,進程中不同的線程不像不同的進程之間存在著很大的獨立性,所有線程都有完全一樣的地址空間,這意味著線程之間共用全域變數。由於各個線程都可以訪問進程地址空間中的任意記憶體位址,所以一個線程可以修改讀取甚至刪除另一線程的堆棧,線程之間是沒有保護的。因為不同的線程肯定來自同一進程也就是同一使用者,他們之間不會有敵意,他們之間還可以共用開啟的檔案集、子進程、以及相關訊號。而不同的線程之間的通訊就複雜的多,同一進程中的多個線程是相互信任的,而不同的進程之間是不信任的。
線程間共用進程的所有資源,每個線程有自己的堆棧和局部變數。線程由CPU獨立調度執行,在多CPU環境下就允許多個線程同時運行。同樣多線程也可以實現並行作業,每個請求分配一個線程來處理。
進程和線程都可以認為是並發執行程式,但是只有多處理器下的多線程才可以真正實現並發(多個線程在同一個時間片同時運行),其他的實際上並不是真正的並發,都是交替在cpu上運行,只是每個程式啟動並執行時間很短(時間片),快速的交替,所以看上去就是同時在運行(並發)。
幾乎是同樣的效果,為什麼又分為進程和線程呢?進程和線程最大的區別在於,進程與進程間互不影響,他們擁有各自的完整的虛擬記憶體,是一個完整的個體。而線程存在於進程中,一個進程可以有很多線程,同一個進程下的線程具有很多共用的記憶體,比如檔案描述符,全域變數等,也有他們私人的資料,如棧區的記憶體等。所以建立一個線程的開銷(佔有的資源)遠遠小於一個進程,這也就是為什麼分進程和線程的原因 。
所以總結一下程式,進程線程的關係吧。一個啟動並執行程式可以有多個進程,一個進程下面可以有多個線程。這就是這三者的關係。要想更加深入地理解這個概念,還是得通過編程去理解。因為理論和實踐的關係,馬克思已經討論地不要不要的。
第一:因為進程擁有獨立的堆棧空間和資料區段,所以每當啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的資料表來維護它的程式碼片段、堆棧段和資料區段,這對於多進程來說十分“奢侈”,系統開銷比較大,而線程不一樣,線程擁有獨立的堆棧空間,但是共用資料區段,它們彼此之間使用相同的地址空間,共用大部分資料,比進程更節儉,開銷比較小,切換速度也比進程快,效率高,但是正由於進程之間獨立的特點,使得進程安全性比較高,也因為進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。一個線程死掉就等於整個進程死掉。
第二:體現在通訊機制上面,正因為進程之間互不干擾,相互獨立,進程的通訊機制相對很複雜,譬如管道,訊號,訊息佇列,共用記憶體,通訊端等通訊機制,而線程由於共用資料區段所以通訊機制很方便。。
進程至少有 5 種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。
線程,在網路或多使用者環境下,一個伺服器通常需要接收大量且不確定數量使用者的並發請求,為每一個請求都建立一個進程顯然是行不通的,——無論是從系統資源開銷方面或是響應使用者請求的效率方面來看。因此,作業系統中線程的概念便被引進了。線程,是進程的一部分,一個沒有線程的進程可以被看作是單線程的。線程有時又被稱為輕權進程或輕量級進程,也是 CPU 調度的一個基本單位。
進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括文本地區(text region)、資料區域(data region)和堆棧(stack region)。文本地區儲存處理器執行的代碼;資料區域儲存變數和進程執行期間使用的動態分配的記憶體;堆棧地區儲存著活動程序呼叫的指令和本地變數。
進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變數,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程式要比多線程的程式健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共用某些變數的並行作業,只能用線程,不能用進程。
進程在執行過程中擁有獨立的記憶體單元,而多個線程共用記憶體,從而極大地提高了程式的運行效率
匯流排程數<= CPU數量:並行運行
匯流排程數> CPU數量:並發運行
Why: 由於CPU與其他PC資源之間速度的不協調,人們想提高資源使用率,所以人們提出了多任務系統。得益於CPU的計算速度,我們可以“同時”運行多個任務,實質上是多個任務之間輪流使用CPU資源,由於速度超快,給使用者的感覺就是連續的。
How: 1)任務的執行需要依賴各個PC資源,我們可以稱為電腦執行的上下文環境。要實現“同時執行”,就需要不斷輪換,為了後來繼續從目前狀態執行下去,電腦需要儲存切換前的程式上下文。所以有了進程:用進程去描述程式當前內容相關的狀態資訊----記憶體位置、變數值、任務ID……所以,進程是資源分派的單位。一般來說宏觀上可以看做是一個軟體的運行,例如一個word文檔的開啟。
2)多個任務之間切換因為要儲存上下文、調入上下文,一旦多了的時候,還是有一定的時間消耗的。為了進一步提高資源使用率,人們在進程中,引入了線程,線程只是CPU輪流調度的單位,其他上下文資訊用所在進程中的。這樣環境切換的耗時就降了下來。同樣的,宏觀上來可以看做是一個軟體中的多個處理功能,例如上述開啟word中拼字檢查功能、字型加粗……
作業系統按照一定的規則來分配什麼時候由誰來獲得CPU的計算資源,比如分時間片
在開銷方面:每個進程都有獨立的代碼和資料空間(程式上下文),程式之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共用代碼和資料空間,每個線程都有自己獨立的運行棧和程式計數器(PC),線程之間切換的開銷小。
所處環境:在作業系統中能同時運行多個進程(程式);而在同一個進程(程式)中有多個線程同時執行(通過CPU調度,在每個時間片中只有一個線程執行)
記憶體配置方面:系統在啟動並執行時候會為每個進程分配不同的記憶體空間;而對線程而言,除了CPU外,系統不會為線程分配記憶體(線程所使用的資源來自其所屬進程的資源),線程組之間只能共用資源。
內含項目關聯性:沒有線程的進程可以看做是單線程的,如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程。
80674777
52540348
https://www.cnblogs.com/azheng007/p/3581696.html
作業系統問題解答