進程和線程(單CPU)

分時操做系統:安全

         時間片:是把計算機的系統資源(尤爲是 CPU時間)進行時間上的分割,每一個時間段稱爲一個時間片,每一個用戶依次輪流使用時間片。多線程

分時技術:把處理機的運行時間分爲很短的時間片,按時間片輪流把處理機分給各聯機做業使用。併發

將系統處理機時間與內存空間按必定的時間間隔,輪流地切換給各終端用戶的程序使用。因爲時間間隔很短,每一個用戶的感受就像他獨佔計算機同樣。分時操做系統的特色是可有效增長資源的使用率。    ide

 

進程/線程(單CPU工具

進程:性能

程序自己只是數據、指令及其組織形式的描述,進程纔是程序的真正執行實體。在早期面向進程設計的計算機結構中(如早期的UNIXLinux 2.4及更早的版本),進程是程序的基本執行實體;在當代面向線程設計的計算機結構中(如當代多數操做系統、Linux 2.6及更新的版本),進程是線程的容器。spa

使用者下達執行程序的命令後,就會產生進程。同一程序可產生多個進程(一對多關係),以容許同時有多位使用者執行同一程序而不產生衝突。操作系統

 

狹義定義:進程是正在運行的程序的實例(an instance of a computer program that is being executed)。線程

廣義定義:進程是一個具備必定獨立功能的程序關於某個數據集合的一次運行活動。它是操做系統動態執行的基本單元,在傳統的操做系統中,進程既是基本的分配單元,也是基本的執行單元。設計

 

進程的概念主要有兩點:

第一,進程是一個實體。每個進程都有它本身的地址空間,通常狀況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量

第二,進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操做系統執行之),它才能成爲一個活動的實體,咱們稱其爲進程。

進程須要一些資源才能完成工做:

如程序的可運行機器碼的一個在存儲器的映像。 分配到的存儲器(一般包括虛擬內存的一個區域)。存儲器的內容包括可運行代碼、特定於進程的數據(輸入、輸出)、調用堆棧、堆棧(用於保存運行時運數中途產生的數據)。 分配給該進程的資源的操做系統描述符,諸如文件描述符(Unix術語)或文件句柄(Windows)、數據源和數據終端。 安全特性,諸如進程擁有者和進程的權限集(能夠允許的操做)。 處理器狀態(內文),諸如寄存器內容、物理存儲器尋址等。當進程正在運行時,狀態一般儲存在寄存器,其餘狀況在存儲器。

進程的切換:從正在運行的進程中回收處理器,而後再由待運行進程來佔用處理器。

實質就是把進程存放在處理囂的寄存器中的中間數據、進程狀態及堆棧中的內容存放在進程的私有堆棧。讓進程來佔用處理囂實質上就是把某個進程存放在私有堆棧中寄存囂的數據再恢復處處理囂寄存囂中去,並把待運行進程的斷點送入處理囂的程序指針。

在切換時,一個進程存儲在處理器各寄存器中的中間數據叫作進程的上下文,因此進程切換就是被停止運行進程與待運行進程上下文的切換。

         進程的狀態:

1.       ready:就緒態;等待cpu時間片來運行;一個進程要想運行,他的全部條件實現得知足;例如:他所須要打開的某幾個硬盤的文件,加載至內存,再分cpu時間片等;他的準備工做都作好了,就等待內核分配給他cpu時間片來運行了,這個狀態就叫ready

就緒進程能夠按多個優先級來劃分隊列。例如,當一個進程因爲時間片用完而進入就緒狀態時,排入低優先級隊列;當進程由I/O操做完成而進入就緒狀態時,排入高優先級隊列。

2.       running:運行態;這個進程正在cpu上運行;運行過程當中也有可能被其餘進程搶佔cpu,被切換出去;也可能與其餘進程正常上下文切換。

3.       ready:這是另外一種ready;在運行中,cpu時間片到了;被切換出來等待下一個cpu時間片,這種狀態也叫ready

4.       sleeping:睡眠態;例:1個進程被分配到5msCPU時間片,運行到2ms時須要從硬盤加載一個文件到內存中,大約須要等待30ms,那剩下的3ms也就不要了,進入睡眠態(這是由於一些外部事件未獲得知足而切換出去的進程)

運行態轉睡眠態分爲兩種類型:1)等待IO完成才能從睡眠態中醒來(uninterruptable sleeping)(2)與IO無關,程序運行過程當中本身須要終止一段時間這也是一種睡眠態(interruptable sleeping)

進程等待條件知足才能被叫醒,這種狀態被稱爲非可中斷睡眠態,如須要從硬盤上加載一個文件到內存,進程要等待文件被加載完纔可被喚醒。

而可中斷睡眠態可能只要等待一次鍵盤的輸入(例如),就能夠喚醒進程。

5.       stopped:中止態;不讓進程運行也不讓進程退出;只有等用戶手動喚醒進程。例如:在前臺運行進程時,按下ctrl+z組合鍵,便可中止該進程。

6.       zombie:僵死態;每一個進程經過系統調用來fork()自身來建立子進程,建立完之後開始時子進程與父進程指向的是同一個內存空間,直到子進程修改了一部份內容之後纔會複製一份到新內存空間,擁有本身的內存空間,這叫COWcopy on write)機制;當一個子進程完成了,佔用的內存資源收回來,打開的文件關閉起來,這都是由父進程來作的工做,此時子進程就處於僵死態,這是正常的僵死態,一旦父進程幫他收屍就真正結束了;非正常僵死態是子進程死的時候父進程早已死了,沒有父進程爲他收屍,所以進程一直存在,內存沒法釋放----這就叫內存泄漏!!!若是父進程先結束了子進程就成了孤兒進程(設計好的軟件會在父進程結束時由父進程將子進程委託給init進程做爲子進程)

若是僵死進程多的話系統上能夠內存將愈來愈少!

 

線程:

         進程可以進行運算調度的最小單位。包含在進程之中,是進程實際運算的單位。一條線程指的是進程中一個單一順序的控制流,一個進程中能夠並行多個線程,每條線程並行執行不一樣的任務。

同一進程中的多條線程將共享該進程中的所有系統資源,如虛擬地址空間,文件描述符和信號處理等等。但同一進程中的多個線程有各自的調用棧(call stack),本身的寄存器環境(register context),本身的線程本地存儲(thread-local storage)。

線程間通訊比使用進程間通訊更有效和更容易。由於進程中的全部線程共享相同的地址空間,他們不須要使用共享內存。使用互斥對象或者其餘同步工具保護共享數據不被併發訪問。

線程庫提供的同步工具易於實現靈活而強大的同步工具。這些工具可以替換傳統的進程間通訊工具,例如消息隊列。管道可用做線程間通訊路徑。

一個進程能夠有不少線程,每條線程並行執行不一樣的任務。

 

線程的狀態:

         因爲線程之間的相互制約,導致線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。

就緒狀態:線程具有運行的全部條件,邏輯上能夠運行,在等待處理機

運行狀態:線程佔有處理機正在運行

阻塞狀態:線程在等待一個事件(如某個信號量),邏輯上不可執行。

線程的特色:

1.       輕型實體

包括程序、數據和TCB。線程的動態特性由TCB描述,TCB包括如下信息:

1)   線程狀態

2)   線程不運行時,被保存的現場資源

3)   執行堆棧

4)   存放每一個線程的局部變量主存區

5)   訪問同一進程中的主存和其它資源

TCB用於指示被執行指令序列的程序計數囂、保留局部變量、少數狀態參數和返回地址等的一組堆棧囂和堆棧

2.       獨立調立和分派的基本單位

線程是能獨立運行的基本單位,於是也是獨立調派和分派的基本單位。因爲線程很是輕量級,故線程的切換很是迅速且開銷小。

3.       可併發執行

在一個進程的多個線程之間,可併發執行,甚至容許在一個進程中全部線程都能併發執行;一樣,不一樣進程中的線程也能併發執行,充分利用和發揮了處理機與外圍設備並行工做的能力。

4.       共享進程資源

在同一進程中的各個線程,均可以共享該進程所擁有的資源,這首先表如今:全部線程都具備相同的地址空間(進程的地址空間),這意味着,線程能夠訪問該地址空間的每個虛地址;此外,還能夠訪問進程所擁有的已打開文件、定時器、信號量機構等。因爲同一個進程內的線程共享內存和文件,因此線程之間互相通訊沒必要調用內核

進程與線程比較:

1.       進程擁有獨立的地址空間和其它資源,同一進程內的線程共用相同進程上下文

2.       若一個文件有多個進程都須要訪問,則該文件就會被打開屢次。而線程是共享資源的,故線程對系統資源的消耗會少些。

3.       進程間通信須要經過IPC機制,同一進程內的線程可經過共享內存和文件進行。

4.       線程上下文切換速度較快

線程的缺點:

1.       因同一進程的線程間共用進程的上下文,線程間會發生資源爭用,進而引發阻塞,影響性能。

2.       同一進程的線程間共享進程內存,故任何一個線程掛掉就會形成整個進程的崩潰。

3.       線程調度時,要保存線程狀態,若調度頻繁,須要佔用大量CPU時鐘週期。

相關文章
相關標籤/搜索