進程
進程控制塊(Process Control Block,PCB)
為了使參與并發(fā)執(zhí)行的每個程序(含數(shù)據(jù))都能獨立地運行,在操作系統(tǒng)中必須為之配置一個專門的數(shù)據(jù)結構,稱為進程控制塊(Process Control Block,PCB)。系統(tǒng)利用PCB來描述進程的基本情況和活動過程,進而控制和管理進程。
進程的組成
由程序段、相關的數(shù)據(jù)段和PCB三部分便構成了進程實體(又稱進程映像)。
所謂創(chuàng)建進程,實質(zhì)上是創(chuàng)建進程實體中的PCB;而撤銷進程,實質(zhì)上是撤銷進程的PCB。
進程的定義
- 進程是程序的一次執(zhí)行。
- 進程是一個程序及其數(shù)據(jù)在處理機上順序執(zhí)行時所發(fā)生的活動。
- 進程是具有獨立功能的程序在一個數(shù)據(jù)集合上運行的過程,它是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。
進程的特征
- 動態(tài)性:進程的實質(zhì)是進程實體的執(zhí)行過程。
- 并發(fā)性:是指多個進程實體同存于內(nèi)存中。
- 獨立性:在傳統(tǒng)的OS中,獨立性是進程實體是一個能獨立運行、獨立獲得資源和獨立接收調(diào)度的基本單位。
- 異步性:是指進程是按異步方式運行的,即按各自獨立的、不可預知的速度向前推進。
線程
進程的兩個屬性
- 進程是一個可擁有資源的獨立單位,一個進程要能獨立運行,它必須擁有一定的資源,包括用于存放程序正文、數(shù)據(jù)的磁盤和內(nèi)存地址空間,以及它在運行時所需要的I/O設備、已打開的文件、信號量;
- 進程同時又是一個可獨立調(diào)度和分派的基本單位,一個進程要能獨立運行,它還必須是一個可獨立調(diào)度和分派的基本單位。
每個進程在系統(tǒng)中都有唯一的PCB,系統(tǒng)可根據(jù)其PCB感知進程的存在,也可以根據(jù)其PCB中的信息,對進程進行調(diào)度,還可將斷點信息保存在其PCB中。反之,再利用進程PCB中的信息來恢復進程運行的現(xiàn)場。
正是由于進程有兩個基本屬性,才使進程成為一個能獨立運行的基本單位,從而也就構成了進程并發(fā)執(zhí)行的基礎。
時空開銷
為使程序能并發(fā)執(zhí)行,系統(tǒng)必須進行以下的一系列操作:
- 創(chuàng)建進程,系統(tǒng)在創(chuàng)建一個進程時,必須為它分配其所必需的,除處理機以外的所有資源,如內(nèi)存空間、I/O設備,以及建立相應的PCB;
- 撤銷進程:系統(tǒng)在撤銷進程時,又必須先對其所占有的資源執(zhí)行回收操作,然后再撤銷PCB;
- 進程切換:對進程進行上下文切換時,需要保留當前進程的CPU環(huán)境,設置新選中進程的CPU環(huán)境,因而須花費不少的處理機時間。
線程與進程的比較
線程:作為調(diào)度和分派的基本單位。
- 調(diào)度的基本單位
在傳統(tǒng)的OS中,進程是作為獨立調(diào)度和分派的基本單位,因而進程是能獨立運行的基本單位。在每次被調(diào)度時,都需要進行上下文切換,開銷較大。而在引入線程的OS鎮(zhèn)南關,已把線程作為調(diào)度和分派的基本單位,因而線程是能獨立運行的基本單位。但線程切換時,僅需保存和設置少量寄存器內(nèi)容,切換代價遠低于進程。同一進程中,線程的切換不會引起進程的切換,但從一個進程中的線程切換到另一個進程中的線程時,必然就會引起進程的切換。 - 并發(fā)性
在引入線程的OS中,不僅進程之間可以并發(fā)執(zhí)行,而且在一個進程中的多個線程之間亦可并發(fā)執(zhí)行,甚至還允許在一個進程中的所有線程都能并發(fā)執(zhí)行。同樣,不同進程中的線程也能并發(fā)執(zhí)行。這使得OS具有更好的并發(fā)性,從而能更加有效地提高系統(tǒng)資源的利用率和系統(tǒng)的吞吐量。 - 擁有資源
進程可以擁有資源,并作為系統(tǒng)中擁有資源的一個基本單位。然而,線程本身并不擁有系統(tǒng)資源,而是僅有一點必不可少的、能保證獨立運行的資源。比如:在每個線程中都應具有一個用于控制線程運行的線程控制塊TCB、用于指示被執(zhí)行指令序列的程序計數(shù)器、 保留局部變量、少數(shù)狀態(tài)參數(shù)和返回地址等的一組寄存器和堆棧。
線程除了擁有自己的少量資源外,還允許多個線程共享該進程所擁有的的資源,這首先表現(xiàn)在:屬于同一個進程的所有線程都具有相同的地址空間,這意味著,線程可以訪問該地址空間中的每一個虛地址;此外,還可以訪問進程所擁有的資源,如已打開的文件、定時器、信號量機構等的內(nèi)存空間和它所申請的I/O設備等。 - 獨立性
在同一進程中的不同線程之間的獨立性要比不同進程之間的獨立性低得多。這是因為,為了防止進程之間彼此干擾和破壞,每個進程都擁有一個獨立的地址空間和其他資源,除了共享全局變量外,不允許其他進程的訪問。但是同一個進程中的不同線程往往是為了提高并發(fā)性以及進行相互之間的合作而創(chuàng)建的,它們共享進程的內(nèi)存地址空間和資源,如每個線程都可以訪問它們所屬進程地址空間中的所有地址,如一個線程的堆??梢员黄渌€程讀、寫、甚至完全清除。由一個線程打開的文件可以供其它線程讀、寫。 - 系統(tǒng)開銷
在創(chuàng)建或撤銷進程時,系統(tǒng)都有為之分配和回收進程控制塊、分配或回收其它資源,如內(nèi)存空間和I/O設備等。OS為此所付出的開銷,明顯大于線程創(chuàng)建或撤銷時所付出的開銷。類似地,在進程切換時,涉及到進程上下文的切換,而線程的切換代價也遠低于進程的。此外,由于一個進程中的多個線程具有相同的地址空間,線程之間的同步和通信也比進行的簡單。因此,在一些OS中,線程的切換、同步和通信都無需操作系統(tǒng)內(nèi)核的干預。 - 支持多處理器系統(tǒng)
在多處理器系統(tǒng)中,對于傳統(tǒng)的進程,即單線程進程,不管有多少處理機,該進程只能運行在一個處理機上。但對于多線程進程,就可以將一個進程中的多個線程分配到多個處理機上,使它們并行執(zhí)行,這無疑將加速進程的完成。因此,現(xiàn)代多處理機OS都無一例外地引入了多線程。