進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位. 編程
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源. windows
一個線程能夠建立和撤銷另外一個線程; 同一個進程中的多個線程之間能夠併發執行.多線程
進程在執行過程當中擁有獨立的內存單元,而該進程的多個線程共享內存,從而極大地提升了程序的運行效率。
每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。 併發
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。spa
在不少現代操做系統中,一個進程的(虛)地址空間大小爲4G,分爲系統(內核?)空間和用戶空間兩部分,系統空間爲全部進程共享,而用戶空間是獨立的,通常WINDOWS進程的用戶空間爲2G。 操作系統
一個進程中的全部線程共享該進程的地址空間,但它們有各自獨立的(/私有的)棧(stack),Windows線程的缺省堆棧大小爲1M。堆(heap)的分配與棧有所不一樣,通常是一個進程有一個C運行時堆,這個堆爲本進程中全部線程共享,windows進程還有所謂進程默認堆,用戶也能夠建立本身的堆。
用操做系統術語,線程切換的時候實際上切換的是一個能夠稱之爲線程控制塊的結構(TCB?),裏面保存全部未來用於恢復線程環境必須的信息,包括全部必須保存的寄存器集,線程的狀態等。線程
堆: 是你們共有的空間,分全局堆和局部堆。全局堆就是全部沒有分配的空間,局部堆就是用戶分配的空間。堆在操做系統對進程初始化的時候分配,運行過程當中也能夠向系統要額外的堆,可是記得用完了要還給操做系統,要否則就是內存泄漏。orm
棧:是個線程獨有的,保存其運行狀態和局部自動變量的。棧在線程開始的時候初始化,每一個線程的棧互相獨立,所以,棧是 thread safe的。操做系統在切換線程的時候會自動的切換棧,就是切換 SS/ESP寄存器。棧空間不須要在高級語言裏面顯式的分配和釋放。進程
進程簡說:內存
進程就是程序的一次執行。
進程是爲了在CPU上實現多道編程而發明的一個概念。
事實上咱們說線程是進程裏面的一個執行上下文,或者執行序列,顯然一個進程能夠同時擁有多個執行序列,更加詳細的描述是,舞臺上有多個演員同時出場,而這些演員和舞臺就構成了一齣戲,類比進程和線程,每一個演員是一個線程,舞臺是地址空間,這個同一個地址空間裏面的全部線程就構成了進程。
好比當咱們打開一個word程序,其實已經同時開啓了多個線程,這些線程一個負責顯示,一個接受輸入,一個定時進行存盤,這些線程一塊兒運轉讓咱們感到咱們的輸入和屏幕顯示同時發生,而不用鍵入一些字符等好長時間才能顯示到屏幕上。
線程管理:
將線程共有的信息存放在進程控制塊中,將線程獨有的信息存放在線程控制塊中。
那麼如何區分哪些信息是共享的?哪些信息是獨享的呢?
通常的評價標準是:若是某些資源不獨享會致使線程運行錯誤,則該資源就由每一個線程獨享,而其餘資源都由進程裏面的全部線程共享。
線程共享資源 |
線程獨享資源 |
地址空間 |
程序計數器 |
全局變量 |
寄存器 |
打開的文件 |
棧 |
子進程 |
狀態字 |
鬧鈴 |
|
信號及信號服務程序 |
|
記帳信息 |
|
通常狀況下進程共享資源與獨享資源的劃分
那麼對於進程及線程的實現作如何解釋呢?
首先應該明白進程的調度,建立等實質上都是由操做系統實現的,因此說進程的實現只能由操做系統內核來實現,而不存在用戶態實現的狀況。可是對於線程就不一樣了,線程的管理者能夠是用戶也能夠是操做系統自己,線程是進程內部的東西,固然存在由進程直接管理線程的可能性。所以線程的實現就應該分爲內核態線程實現和用戶態線程實現。
================================================================================================================
內核態線程實現:
那麼操做系統是如何實現管理線程的呢?
操做系統管理線程的好處是:
1.用戶編程簡單;
2.若是一個線程執行阻塞操做,操做系統能夠從容的調度另一個線程的執行。
內核線程的實現缺點是:
1.效率低,由於線程在內核態實現,每次線程切換都須要陷入到內核,由操做系統來調度,而有用戶態切換到內核態是要話費不少時間的,另外內核態實現會佔用內核稀有的資源,由於操做系統要維護線程列表,操做系統所佔內核空間一旦裝載後就沒法動態改變,而且線程的數量遠遠大於進程的數量,隨着線程數的增長內核將耗盡;
2.內核態的實現須要修改操做系統,這個是誰都不想要作的事情;
====================================================================================================================
那麼用戶態是如何實現管理線程的呢?
用戶態管理線程就是用戶本身作線程的切換,本身管理線程的信息,操做系統無需知道線程的存在。
在用戶態下進行線程的管理須要用戶建立一個調度線程。一個線程在執行完一段時間後主動把資源釋放給其餘線程使用,而在內核臺下則無需如此,由於操做系統可經過週期性的時鐘中斷把控制權奪過來,在用戶態實現狀況下,執行系統的調度器也是線程,沒有能力奪取控制權。
用戶態實現有什麼優勢?
首先是靈活,由於操做系統不用知道線程的存在,因此任何操做系統上都能應用;
其次,線程切換快,由於切換在用戶態進行,無需陷入帶內核態;
再次,不用修改操做系統實現容易。
用戶態實現的缺點呢?
=============================================================================================================================
如今操做系統的線程實現模型:
鑑於用戶態與內核態都存在缺陷,現代操做將二者結合起來。用戶態的執行負責進程內部線程在非阻塞時的切換;內核態的操做系統負責阻塞線程的切換,即咱們同時實現內核態和用戶態線程管理。每一個內核態線程能夠服務一個或者更多個用戶態線程。
線程從用戶態切換到內核態:
什麼狀況下會形成線程從用戶態到內核態的切換呢?
首先,若是在程序運行過程當中發生中斷或者異常,系統將自動切換到內核態來運行中斷或異常處理機制。
此外,程序進行系統調用也會從用戶態切換到內核態。