| 0 推薦
多任務指的是系統可以同時運行多個進程,每個進程又可以同時執行多個線程.進程是應用程式的運行執行個體,擁有自己的地址空間.每個進程擁有一個主線程,同時還可以建立其他線程.線程是作業系統分配CPU時間的基底實體,每個線程佔用的CPU時間由系統分配,系統不停地線上程之間切換.進程中的線程共用進程的虛擬位址空間可以訪問進程的資源,處於並存執行狀態,這就是多線程的基本概念. 進程與線程的概念
進程是可以與其他程式並發執行的一次執行過程,是系統進行資源分派和調度的基本單位.進程是一個程式關於某個資料集的一次運行.也就是說,進程是運行中的程式,是程式的一次運行活動.進程是動態概念,而程式是靜態概念是指令的集合.因此,進程具有動態性和並發性.
從靜態角度看,進程實體由程式塊、進程式控制制塊(PCB)和資料區塊3部分組成,程式塊描述該進程所要完成的任務;資料區塊包括程式在執行時所需要的資料和工作區。進程式控制制塊包括進程的描述資訊、控制資訊、資源管理資訊和CPU現場保護資訊等,反映了進程的動態特性。
PCB是進程存在的唯一標誌,PCB描述了進程的基本情況系統根據PCB感知進程的存在,系統還通過PCB中所包含的各項變數的變化,來掌握進程所處的狀態,以達到控制進程活動的目的。在建立一個過程時,首先應建立其PCB,然後才能根據PCB中的資訊對進程實施有效管理和控制。當一個進程完成其功能後,系統則釋放PCB,進程也隨之消亡。一般情況下,進程的PCB結構都是全部或部分常駐記憶體的。
進程的狀態如下:
就緒狀態:是指進程分配到除處理機以外的必需資源(已具備了執行的條件)的狀態。進程被建立後處於就緒狀態,處於就緒狀態的進程可以有多個。
執行狀態:是指進程佔有處理機正在CPU上執行的狀態。在單CPU系統中,每一時刻只有一個進程處於執行狀態。
阻塞狀態:是指進程因等待某個事件的發生而放棄處理機進入等待處理機進入等待狀態。系統中處於這種狀態的進程可以有多個。
進程的狀態隨著自身的推進和外界的變化而變化。比如就緒狀態的進程被進程發送器選中進入執行狀態;執行狀態的進程因等待某一事件的發生轉入等待狀態;等待狀態的進程所等待事件來到便進入就緒狀態。進程的狀態可以動態地相互轉換,但阻塞狀態的進程不能直接進入執行狀態,就緒狀態可以動態地相互轉換,但阻塞的進程不能直接進入執行狀態,就緒狀態的進程不能直接進入阻塞狀態。在任何時候,任何進程都處於且只能處於某一狀態。
在支援線程的作業系統中,純種是進程中的一個實體,是系統實施調 度的獨立單位。線程只擁有一些在運行中必不可少的資源,它與屬於同一個進程的其他純種共用該進程所擁有的資源。各純種之間可以並發地運行。線程切換時只需儲存和設定少量寄存器的內容這,而並不涉及儲存空間管理方面的操作,所以線程切換的開銷遠遠小於進程的切換(進程狀態的要引起資源轉移及現場保護等問題)。同一個進程的多個線程共用同一個地址空間,這使得純種之間同步和通訊的實現也比較容易。 進程與線程的比較
進程和線程都是由作業系統所管理的程式啟動並執行基本單元,系統利用該基本單元實現系統對應用的並發笥。進程和線程的區別如下:
簡而言之,一個程式至少要有一個進程,一個進程至少要有一個線程。線程劃分尺度小於進程,使得多線程程式的並發性高。
另外,進程在執行過程中擁有獨立的內在單元,而多個線程共用記憶體,從而極大地提高了程式的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程式啟動並執行入口、順序執行序列和程式的出口。但是線程不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理,以及資源分派。這就是進程和線程的重要區別。 多線程技術的優越性
1.快速的關聯切換
由於作業系統級的進程獨佔自己的虛地址空間,調度進程時,系統必須交換地址空間,因而進程切換時間長。在同一程式內的多個線程共用同一地址空間,因而能使線程快速切換。例如,10個進程,每個進程10個線程的系統與100個進程、每個進程1個進程1個線程的系統相比,前者的運行速度要快於後者。
2.系統額外開銷小
對多個進程的管理(建立、調度等)有比較大的系統開銷。在需要動態建立新進程的應用中,比如在響應與每個客戶的請求而建立一個新的服務進程的伺服器應用程式中,這種開銷比較顯著。而對線程的管理雖然也會有系統開銷,但比進程的小得多。
3.通訊很容易實現
為了實現協作,進程或線程之間需要進行資料交換。對於自動共用同一地址空間的各線程來說,所有的全域資料都可以訪問,因而不需要什麼特殊手段就能自動實現資料共用。而進程之間的通訊則要複雜得多。
4.線程個數比進程個數多得多
許多多任務作業系統限制使用者進程總數,如不少UNIX版本的典型值為40-100,這對許多並發應用來說遠遠不夠。在多線程系統中,雖存線上程總數限額,但個數多得多(OS/2支援4096個線程) |