Linux操作系統(tǒng)詳解_第1頁
Linux操作系統(tǒng)詳解_第2頁
Linux操作系統(tǒng)詳解_第3頁
Linux操作系統(tǒng)詳解_第4頁
Linux操作系統(tǒng)詳解_第5頁
已閱讀5頁,還剩400頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Linux操作系統(tǒng)詳解

(第一部分)(共三個部分)總目錄第1部分Linux操作系統(tǒng)

第1章操作系統(tǒng)概述

第2章處理機管理

第3章存儲管理

第4章調(diào)度

第5章設(shè)備

第6章文件系統(tǒng)第2部分操作系統(tǒng)命令及shell編程 第7章Linux基本命令 第8章使用vi編輯文件 第9章shell編程第3部分系統(tǒng)管理 第10章Linux系統(tǒng)軟件的獲取和安裝 第11章賬號管理 第12章文件系統(tǒng)管理 第13章TCP/IP網(wǎng)絡(luò)管理 第14章備份與恢復(fù) 第15章XWindow及Genie應(yīng)用程序第1部分Linux操作系統(tǒng)

第1章操作系統(tǒng)概述1.1操作系統(tǒng)簡介1.2操作系統(tǒng)接口1.3操作系統(tǒng)功能1.4操作系統(tǒng)結(jié)構(gòu)1.5Linux操作系統(tǒng)介紹1.6Linux的內(nèi)核特征1.7Linux的發(fā)展及展望1.8小結(jié)習(xí)題操作系統(tǒng)是計算機系統(tǒng)的基本系統(tǒng)軟件。軟件系統(tǒng)中操作系統(tǒng)是所有軟件的核心。操作系統(tǒng)負(fù)責(zé)控制、管理計算機的所有軟件、硬件資源,是惟一直接和硬件系統(tǒng)打交道的軟件,是整個軟件系統(tǒng)的基礎(chǔ)部分,同時還為計算機用戶提供良好的界面。因此,操作系統(tǒng)直接面對所有硬件、軟件和用戶,它是協(xié)調(diào)計算機各組成部分之間、人機之間關(guān)系的重要軟件系統(tǒng)。Linux是在日益普及的Internet上迅速形成和不斷完善的操作系統(tǒng)。Linux操作系統(tǒng)高效、穩(wěn)定,適應(yīng)多種硬件平臺,而最具有魅力的是它遵循GPL(GNUGeneralPublicLicense,GNU通用公共許可證,見附錄),整個系統(tǒng)的源代碼可以自由獲取,并且在GPL許可的范圍內(nèi)自由修改、傳播,這就為學(xué)習(xí)、應(yīng)用、開發(fā)操作系統(tǒng)及其他軟件提供了良好的基礎(chǔ)和較高的起點。本章首先介紹操作系統(tǒng)的概念、功能及其結(jié)構(gòu),接著介紹Linux系統(tǒng)的基本特征、發(fā)展現(xiàn)狀,并以此為基礎(chǔ),討論現(xiàn)代操作系統(tǒng)的一般特點和發(fā)展趨勢。1.1操作系統(tǒng)簡介1.1.1操作系統(tǒng)概念一種非形式的定義如下:操作系統(tǒng)是計算機系統(tǒng)中的一個系統(tǒng)軟件,它是這樣一些程序模塊的集合——它們管理和控制計算機系統(tǒng)中的硬件和軟件資源,合理地組織計算機工作流程,以便有效地利用這些資源為用戶提供一個功能強大、使用方便和可擴展的工作環(huán)境,從而在計算機與用戶之間起到接口作用。普通用戶使用操作系統(tǒng),是把操作系統(tǒng)當(dāng)作一個資源管理者,通過系統(tǒng)提供的系統(tǒng)命令和界面操作等工具,以某種易于理解的方式完成系統(tǒng)管理功能,有效地控制各種硬件資源,組織自己的數(shù)據(jù),完成自己的工作并和其他人共享資源。對于程序員來講,操作系統(tǒng)提供了一個與計算機硬件等價的擴展或虛擬的計算平臺。操作系統(tǒng)提供給程序員的工具除了系統(tǒng)命令、界面操作之外,還有系統(tǒng)調(diào)用,系統(tǒng)調(diào)用抽象了許多硬件細(xì)節(jié),程序可以以某種統(tǒng)一的方式進(jìn)行數(shù)據(jù)處理,程序員可以避開許多具體的硬件細(xì)節(jié),提高程序開發(fā)效率,改善程序移植特性。整個計算機系統(tǒng)可以認(rèn)為是按照一定規(guī)則分層構(gòu)建的,我們可以使用圖1.1來示意性地描述這種層次結(jié)構(gòu)。圖1.1計算機系統(tǒng)層次結(jié)構(gòu)示意圖1.1.2操作系統(tǒng)發(fā)展簡介操作系統(tǒng)是隨著計算機硬件的發(fā)展,圍繞著如何提高計算機系統(tǒng)資源的利用率和改善用戶界面的友好性而形成,發(fā)展和不斷成熟完善的。隨著計算機硬件的發(fā)展,計算機的計算速度越來越快,其高速的數(shù)據(jù)處理與低速的手工操作之間的矛盾日益突出,傳統(tǒng)的手工操作是系統(tǒng)的最大制約因素,昂貴的計算機硬件資源得不到有效的利用。一個重要的技術(shù)是批處理,專門的操作人員把用戶提交的任務(wù)按照一定的類別、順序組織起來,形成作業(yè)序列,這些作業(yè)成批地在專門的監(jiān)督程序控制之下自動執(zhí)行。這里的監(jiān)督程序就是操作系統(tǒng)的雛形。最初的批處理系統(tǒng)中,計算機內(nèi)存中仍然只有一個程序在運行,總體系統(tǒng)的效率仍然沒有發(fā)揮出來。解決這個問題的措施稱為多道技術(shù)。多道程序設(shè)計技術(shù)使得在內(nèi)存中有多個程序,保證系統(tǒng)的處理器總是處于工作狀態(tài),極大地提高了系統(tǒng)的利用率。多道技術(shù)開始使用在批處理系統(tǒng)中,稱為多道批處理系統(tǒng),這樣的系統(tǒng)效率高,但是,在脫機批處理情況下,高效帶來的問題是用戶對自己作業(yè)的控制程度降低。針對這個問題的方案是分時技術(shù)。分時系統(tǒng)把處理機的運行時間分成時間片,按照時間片輪流把處理機分配給每一個聯(lián)機用戶。由于每一個時間片很短,宏觀上來看,所有用戶同時操作計算機,各自獨立控制自己的作業(yè)。與分時系統(tǒng)相對應(yīng),還有一種實時(realtime)操作系統(tǒng),控制計算機對外來信息進(jìn)行快速處理,要求系統(tǒng)在允許的時間范圍之內(nèi)做出響應(yīng)。同時具有多道批處理、分時、實時處理功能,或者其中兩種以上功能的系統(tǒng),稱為通用操作系統(tǒng)。Linux操作系統(tǒng)就是具有內(nèi)嵌網(wǎng)絡(luò)功能的多用戶分時系統(tǒng)。它兼有多道批處理和分時處理功能,是一個典型的通用處理系統(tǒng)。一方面強調(diào)分布式計算和處理,另一方面強調(diào)物理上跨越不同的主機系統(tǒng)、邏輯上緊密耦合構(gòu)成統(tǒng)一完整的操作系統(tǒng)平臺,這樣的系統(tǒng)就是分布式操作系統(tǒng)(distributedoperatingsystem)。這是當(dāng)前操作系統(tǒng)發(fā)展的一個方向。當(dāng)前,計算機微型化和專業(yè)化趨勢已成事實。這兩種發(fā)展趨勢都產(chǎn)生了一個共同的需求,即嵌入式軟件。嵌入式軟件也需要操作系統(tǒng)平臺的支持,這樣的操作系統(tǒng)就是嵌入式操作系統(tǒng)。嵌入式軟件系統(tǒng)的規(guī)模小,相應(yīng)地,其操作系統(tǒng)的規(guī)模也小。嵌入式軟件的應(yīng)用平臺之一是各種電器,這樣的系統(tǒng)面向普通家庭和個人用戶,由于快速發(fā)展的網(wǎng)絡(luò)市場,使得家用電器的市場比傳統(tǒng)的計算機市場大很多。因此,嵌入式軟件可能成為21世紀(jì)信息產(chǎn)業(yè)的支柱之一,嵌入式操作系統(tǒng)也必將成為軟件廠商爭奪的焦點,成為操作系統(tǒng)發(fā)展的另一個熱門方向。1.2操作系統(tǒng)接口操作系統(tǒng)在整個軟件系統(tǒng)中處于中心地位,負(fù)責(zé)控制、管理計算機的所有軟件、硬件資源,它屏蔽了很多具體的硬件細(xì)節(jié),對計算機用戶提供統(tǒng)一、良好的界面(或稱為接口,interface)。本節(jié)介紹操作系統(tǒng)的接口界面,下一節(jié)主要介紹操作系統(tǒng)的管理功能。在計算機層次結(jié)構(gòu)中,操作系統(tǒng)通過接口向上層用戶提供各種服務(wù),而上層用戶通過操作系統(tǒng)接口來訪問硬件。操作系統(tǒng)提供的接口可以根據(jù)服務(wù)對象的不同而劃分為兩類:一是程序級的接口,提供給程序員使用,即系統(tǒng)調(diào)用;二是作業(yè)級的接口,提供給用戶使用,即操作命令。1.2.1程序員級接口系統(tǒng)調(diào)用是一組由操作系統(tǒng)提供的廣義指令。應(yīng)用程序通過系統(tǒng)調(diào)用來操縱系統(tǒng)內(nèi)核中特定的函數(shù),當(dāng)應(yīng)用程序需要進(jìn)行文件訪問、網(wǎng)絡(luò)傳輸?shù)炔僮鲿r,必須通過系統(tǒng)調(diào)用來完成。程序員在設(shè)計應(yīng)用程序時,涉及到系統(tǒng)資源,都必須使用系統(tǒng)調(diào)用來實現(xiàn),可以說,系統(tǒng)調(diào)用是操作系統(tǒng)提供給程序員的惟一接口。系統(tǒng)調(diào)用可以根據(jù)功能劃分為不同的類型。熟悉系統(tǒng)調(diào)用是一個優(yōu)秀程序員必備的條件。1.2.2用戶級接口操作系統(tǒng)提供給用戶使用的接口是操作命令,用戶可以使用這些操作命令來組織和控制作業(yè)的執(zhí)行或者管理整個計算機系統(tǒng)。實際上,計算機的操作命令界面是在系統(tǒng)調(diào)用的基礎(chǔ)上開發(fā)而成的。操作系統(tǒng)發(fā)展的主要方向除了提高系統(tǒng)資源利用率之外,就是改善用戶界面友好性。圖形用戶界面是操縱命令界面發(fā)展的一個里程碑。圖形用戶界面,降低了計算機操作的門檻,千萬個家庭成為計算機普及的對象。現(xiàn)在流行的操作系統(tǒng)一般都同時提供圖形和文本用戶界面。Linux系統(tǒng)就是如此,文本界面是shell接口,圖形界面是XWindow系統(tǒng)。1.3操作系統(tǒng)功能多用戶分時系統(tǒng),按照其功能劃分為處理機管理、存儲管理、設(shè)備管理、信息管理(文件系統(tǒng)管理),對于現(xiàn)代流行的操作系統(tǒng),還具有完整的網(wǎng)絡(luò)管理功能。這些管理功能都是由操作系統(tǒng)內(nèi)核實現(xiàn)的。1.3.1處理機管理作業(yè)、進(jìn)程需要適當(dāng)?shù)姆峙洹⒄{(diào)度,以便協(xié)調(diào)相互關(guān)系,共享有限的處理機資源,這是處理機管理的主要內(nèi)容。處理機管理是操作系統(tǒng)管理功能的關(guān)鍵,操作系統(tǒng)功能的一個主要指標(biāo)即是提高處理機的使用率,讓處理機盡可能處于工作狀態(tài)。1.3.2存儲管理存儲管理的目標(biāo)是讓有限的物理內(nèi)存盡可能滿足應(yīng)用程序?qū)?nèi)存的需求。存儲管理的內(nèi)容包括內(nèi)存的擴充、分配、保護(hù)等。操作系統(tǒng)多采用了稱為“虛擬內(nèi)存”的內(nèi)存管理方式。內(nèi)存一般采用部分分配的辦法。通常,內(nèi)存中總是同時存放了多個正在運行的程序?qū)嶓w,即進(jìn)程,在運行的過程中,他們之間可能會使用到相同內(nèi)存位置的內(nèi)容,這種技術(shù)稱為內(nèi)存共享,這樣,可以提高內(nèi)存的利用率。但是,必須要確保各進(jìn)程所占據(jù)的內(nèi)存的獨立和完整性。1.3.3設(shè)備管理除了CPU和內(nèi)存之外,計算機的其他部件都統(tǒng)稱為外部設(shè)備。這些設(shè)備在操作系統(tǒng)的控制下協(xié)調(diào)工作,共同完成信息的輸入、存儲和輸出任務(wù)。操作系統(tǒng)要對所有的設(shè)備進(jìn)行管理。一方面,讓每一個設(shè)備盡可能發(fā)揮自己的特長,實現(xiàn)與CPU和內(nèi)存的數(shù)據(jù)交換,提高外部設(shè)備的利用率。另一方面,隱蔽設(shè)備操作的具體細(xì)節(jié),對用戶提供一個統(tǒng)一、友好的設(shè)備使用界面。和處理機及內(nèi)存相比,外部設(shè)備的速度要慢得多,而且性能差別大,類型品種多,因此,設(shè)備管理是一項復(fù)雜而又重要的工作。1.3.4文件系統(tǒng)操作系統(tǒng)在控制、管理硬件的同時,也必須管理好軟件資源。操作系統(tǒng)的文件系統(tǒng)就是針對計算機的軟件資源而進(jìn)行的。文件系統(tǒng)主要提供以下服務(wù):文件存取,使每個用戶能夠?qū)ψ约旱奈募M(jìn)行快速的訪問、修改和存儲。文件共享,指提供某種手段,使存儲空間只保存一個副本,而所有授權(quán)用戶能夠共同訪問這些文件。文件保護(hù),指提供保護(hù)系統(tǒng)資源防止非法使用的手段。1.3.5網(wǎng)絡(luò)管理計算機的發(fā)展已經(jīng)進(jìn)入了互聯(lián)網(wǎng)時代,現(xiàn)在流行的操作系統(tǒng)一般都具有內(nèi)嵌的網(wǎng)絡(luò)功能,能夠在內(nèi)核級別控制、管理網(wǎng)絡(luò)。操作系統(tǒng)一般都提供網(wǎng)絡(luò)通信和網(wǎng)絡(luò)服務(wù)等基本功能。內(nèi)核中網(wǎng)絡(luò)部分,主要實現(xiàn)網(wǎng)絡(luò)設(shè)備控制和網(wǎng)絡(luò)協(xié)議,因此,網(wǎng)絡(luò)管理也就集中在通信這部分。1.4操作系統(tǒng)結(jié)構(gòu)本節(jié)簡單介紹操作系統(tǒng)的邏輯結(jié)構(gòu),然后介紹操作系統(tǒng)發(fā)展過程中使用過的幾種主要的體系結(jié)構(gòu)。1.4.1操作系統(tǒng)的邏輯結(jié)構(gòu)計算機系統(tǒng)可以理解為是分層構(gòu)造的。從邏輯關(guān)系來理解,操作系統(tǒng)本身也可以用層次結(jié)構(gòu)來描述??梢哉J(rèn)為至少有4層,從上到下依次為:面對用戶的外部接口,硬件無關(guān)的內(nèi)核部分,與硬件相關(guān)的內(nèi)核部分,面對硬件的外部接口??梢院唵蔚赜脠D1.2來描述。這種層次結(jié)構(gòu)可以看作是操作系統(tǒng)縱向的結(jié)構(gòu)。圖1.2操作系統(tǒng)邏輯層次示意圖操作系統(tǒng)也可根據(jù)不同的管理功能劃分為功能模塊。一種簡單的理解是,操作系統(tǒng)本身劃分為功能模塊,而每個模塊分層構(gòu)造,形成一個縱橫交錯的結(jié)構(gòu)。1.4.2操作系統(tǒng)的體系結(jié)構(gòu)軟件的體系結(jié)構(gòu)描述系統(tǒng)各部分軟件以及它們相互之間的關(guān)系,是軟件內(nèi)部結(jié)構(gòu)配置的一種抽象描述。軟件體系結(jié)構(gòu)定義各部分軟件系統(tǒng)的應(yīng)用界面規(guī)范及相互操作和數(shù)據(jù)通信的協(xié)議和限制。體系結(jié)構(gòu)相對穩(wěn)定、滿足應(yīng)用需求,同時具有適當(dāng)?shù)目蛇m應(yīng)性和可擴充性。1.模塊結(jié)構(gòu)模塊結(jié)構(gòu)是將操作系統(tǒng)內(nèi)核按照功能劃分為一個個單獨的模塊,模塊之間相對獨立,只能通過預(yù)先規(guī)定好的接口方式來調(diào)用,它們共享數(shù)據(jù),模塊是系統(tǒng)設(shè)計和實現(xiàn)的基本單位。每一個模塊實現(xiàn)一個完整單獨的功能,所有模塊之間相互調(diào)用,共同構(gòu)成一個完整的系統(tǒng)內(nèi)核。模塊結(jié)構(gòu)最大的優(yōu)點是效率高。模塊式結(jié)構(gòu)中,操作系統(tǒng)的邏輯層次關(guān)系具體由調(diào)用層次關(guān)系來體現(xiàn)。這種結(jié)構(gòu)的主要問題一是全局函數(shù)使用多,造成訪問控制困難;二是結(jié)構(gòu)不夠清晰,系統(tǒng)的可理解性、可維護(hù)性和可移植性都比較差。2.層次結(jié)構(gòu)層次結(jié)構(gòu)的方法把操作系統(tǒng)內(nèi)核按照一定的規(guī)則劃分為一系列相互依賴的層次,每個層次也可以分解為一系列更小的模塊,模塊負(fù)責(zé)完成一部分特定的功能,只能與相鄰的層次發(fā)生直接的聯(lián)系,所有這些層次的組合,就實現(xiàn)了整個系統(tǒng)。實際上,層次結(jié)構(gòu)可以理解為一種特殊的模塊式結(jié)構(gòu)。層次結(jié)構(gòu)可以大大方便系統(tǒng)的移植和擴充。把系統(tǒng)內(nèi)核劃分為嚴(yán)格的層次結(jié)構(gòu),為了滿足有序的層次調(diào)用關(guān)系,必然要犧牲部分靈活性和系統(tǒng)效率。3.對象結(jié)構(gòu)對象也可以理解為一種特殊的模塊,它是由一組數(shù)據(jù)集以及定義在其上的操作集封裝而成。對象結(jié)構(gòu)方法中,操作系統(tǒng)內(nèi)核按照內(nèi)核對象實體組織,每個內(nèi)核對象實體都有自己的數(shù)據(jù)和操作,對象之間通過消息傳遞來協(xié)調(diào)工作。對象模塊具有很強的獨立性,因此也具有很好的復(fù)用性能。對象模塊可以方便有效地控制內(nèi)部數(shù)據(jù)的訪問屬性,充分地隱藏信息,達(dá)到資源保護(hù)的目的。采用對象結(jié)構(gòu),系統(tǒng)的開發(fā)難度降低,具有良好的擴展性和移植性,同時有較好的安全功能。對象結(jié)構(gòu)操作系統(tǒng)內(nèi)核的一個嚴(yán)重問題是效率低。,Linux內(nèi)核基本屬于模塊結(jié)構(gòu),而MS-DOS系統(tǒng)內(nèi)核采用的是層次結(jié)構(gòu),WindowsNT/2000及Solaris則是典型的對象結(jié)構(gòu)。操作系統(tǒng)內(nèi)核按照其運行的情況可以分為:宏內(nèi)核與微內(nèi)核。前者也稱為單內(nèi)核,Linux系統(tǒng)屬于單內(nèi)核類型。對象結(jié)構(gòu)的系統(tǒng)內(nèi)核通常是微內(nèi)核,例如,WindowsNT/2000系統(tǒng)就是微內(nèi)核。1.5Linux操作系統(tǒng)介紹Linux系統(tǒng)有兩種不同的含義。從技術(shù)角度,Linux指的是由LinusTorvalds維護(hù)的開放源代碼UNIX類操作系統(tǒng)的內(nèi)核。然而,目前大多數(shù)人用它來表示以Linux內(nèi)核為基礎(chǔ)的整個操作系統(tǒng)。從這種意義講,Linux指的是開放源代碼的,包含內(nèi)核、系統(tǒng)工具、完整的開發(fā)環(huán)境和應(yīng)用的UNIX類操作系統(tǒng)。1.5.1Linux——自由操作系統(tǒng)Linux是一個UNIX操作系統(tǒng)的克隆,可以免費使用,遵循GPL聲明,可以自由修改和傳播。Linux包含了人們希望操作系統(tǒng)擁有的所有功能特性,這些功能包括真正的多任務(wù)、虛擬內(nèi)存、世界上最快的TCP/IP驅(qū)動程序、共享庫和多用戶支持。Linux現(xiàn)在是個人計算機和工作站上的UNIX類操作系統(tǒng)。它不僅繼承了UNIX的特征,而且在許多方面超過了UNIX。作為UNIX類操作系統(tǒng),它具有下列基本特征:

是真正的多用戶、多任務(wù)操作系統(tǒng);是符合POSIX標(biāo)準(zhǔn)的系統(tǒng);提供具有內(nèi)置安全措施的分層的文件系統(tǒng);提供shell命令解釋程序和編程語言;提供強大的管理功能,包括遠(yuǎn)程管理功能;具有內(nèi)核的編程接口;具有圖形用戶接口;具有大量有用的實用程序和通信、聯(lián)網(wǎng)工具;具有面向屏幕的編緝軟件。大量的高級程序設(shè)計語言已移植到Linux系統(tǒng)上,因而它是理想的應(yīng)用軟件開發(fā)平臺,而且,在Linux系統(tǒng)下開發(fā)的應(yīng)用程序具有很好的可移植性。同時,Linux還有許多獨到之處:(1)它的源代碼幾乎全部都是開放的。(2)它可以運行在許多硬件平臺上。(3)它不僅可以運行許多自由發(fā)布的應(yīng)用軟件,還可以運行許多商品化的應(yīng)用軟件。(4)強大的網(wǎng)絡(luò)功能。Linux系統(tǒng)的另一特征是它能充分發(fā)揮硬件的功能,因而它比其他操作系統(tǒng)的運行效率更高。因此,Linux將有廣泛的應(yīng)用前景。1.5.2UNIX、GNU與LinuxLinux是一種類UNIX系統(tǒng),二者有相當(dāng)?shù)臏Y源,同時,Linux遵循GNU的GPL許可證,是自由軟件家族中的一員,因此,要了解Linux,就必須先了解他們?nèi)咧g的關(guān)系。1.Linux與UNIX系統(tǒng)Linux的源頭要追溯到最早的UNIX。UNIX系統(tǒng)正式發(fā)表于1974年,到1975年的第6版中,引入了多道技術(shù)。1980年,Bell實驗室公布了VAX11/780系統(tǒng)平臺的32位操作系統(tǒng)UNIX32V。一個可以運行UNIX程序的系統(tǒng)就是UNIX。經(jīng)過多年發(fā)展,UNIX從實驗室走出來并成為了操作系統(tǒng)的主流。直到今天,UNIX系統(tǒng)以其穩(wěn)定、高效的性能在服務(wù)器高端市場中依然占有絕對優(yōu)勢。很多公司也開發(fā)了用于PC的UNIX。UNIX是一個簡單卻非常優(yōu)秀的操作系統(tǒng)模型。Linux系統(tǒng)最初以UNIX為原型,以實現(xiàn)POSIX標(biāo)準(zhǔn)作為其目標(biāo),到2000年為止,Linux核心從0.01版發(fā)展為2.4版。Linux具有穩(wěn)定高效的處理性能,擁有穩(wěn)定龐大的用戶群體,得到眾多廠商有力的支持,成為操作系統(tǒng)發(fā)展的熱點。Linux在低端服務(wù)器市場上已經(jīng)對WindowsNT/2000造成了極大的壓力。2.自由軟件運動與LinuxLinux只是自由軟件家族中的一員,是其中最具影響的成員之一。在計算機工業(yè)發(fā)展的初期,軟件只是硬件的附屬品。但是,公司很快認(rèn)識到軟件的價值,對軟件實施了版權(quán)控制,并限制源代碼的發(fā)布。RichardStallman在其他人的協(xié)作下創(chuàng)作了通用公共許可證(GeneralPublicLicense,GPL)。GPL保證任何人有共享和修改自由軟件的自由,任何人有權(quán)取得、修改和重新發(fā)布自由軟件的源代碼,并且規(guī)定在不增加附加費用的條件下得到源代碼。3.Linux的歷史Linux可以說完全是一個互聯(lián)網(wǎng)時代的產(chǎn)物,它是在互聯(lián)網(wǎng)上產(chǎn)生、發(fā)展和不斷壯大起來的。Linus在自己的PC上,利用Tanenbaum教授自行設(shè)計的微型UNIX操作系統(tǒng)MINIX為開發(fā)平臺,開發(fā)了屬于他自己的第一個程序。Linus說剛開始的時候他根本沒有想到要編寫一個操作系統(tǒng)內(nèi)核?!坝谑俏矣植坏貌粚懸粋€磁盤驅(qū)動程序,然后是一個文件系統(tǒng)。而一旦當(dāng)你有了任務(wù)切換器、文件系統(tǒng)和設(shè)備驅(qū)動程序之后,你當(dāng)然就擁有了一個UNIX”或者至少是它的一個內(nèi)核。Linux就以這樣一種極其古怪但也極其自然的方式問世了。Linus并沒有在MINIX新聞組中公布它。他只是在赫爾辛基技術(shù)大學(xué)的一臺FTP服務(wù)器上發(fā)了一則消息,說用戶可以下載Linux的公開版本。到1992年1月止,全世界大約只有100個左右的人在使用Linux。1993年,Linus的第一個“產(chǎn)品”版Linux1.0問世的時候,是按完全自由發(fā)行版權(quán)進(jìn)行發(fā)行的。Linux與GPL的結(jié)合,使許多軟件開發(fā)人員相信這是一個有前途的項目,開始參與內(nèi)核的開發(fā)工作,并將GNU項目的C庫、gcc、Emacs、bash等很快移植到Linux內(nèi)核上來。商業(yè)軟件公司的加盟也使大多數(shù)Linux的普通用戶吃了定心丸。Linux從一開始就主要是在一些軟件行業(yè)中的高手之間流行的,并且很快就在全球范圍內(nèi)集結(jié)了一大批職業(yè)的和業(yè)余的技術(shù)專家,形成了一個數(shù)量龐大而且非常熱心的支持者群體。他們能夠通過網(wǎng)絡(luò)很快地響應(yīng)使用者所遇到的任何問題。

1997年,Linux支持者群體在眾多的軟件公司中一舉勝出,榮獲了美國《InfoWorld》雜志的最佳技術(shù)支持獎,而這一獎項原本只是為商業(yè)公司而設(shè)立的。Linux核心的版本發(fā)展情況見表1.1。該表摘自參考文獻(xiàn)[2],表中最后一項,程序行數(shù)(LinesofCode,LOC)包含了Linux可應(yīng)用于如x86、PPC、SPARC等所有平臺的程序代碼。

表1.1Linux核心發(fā)展情況(截止1998年)年份

使用者數(shù)量

版本大小(LOC)199110.0110k

19921k0.9640k199320k0.99100k1994100k1.0170k1995500k1.2250k

19961.5M2.0400k19973.5M2.1800k19987.5M2.1.1101.5M當(dāng)Linux走向成熟時,一些人開始建立軟件包來簡化新用戶安裝和使用Linux的方法。這些軟件包稱為Linux發(fā)布或Linux發(fā)行版本。在早期眾多的Linux發(fā)行版本中,最有影響的要數(shù)Slackware發(fā)布。Linux文檔項目(LDP)是圍繞Slackware發(fā)布寫成的。目前,RedHat發(fā)行版本的安裝更容易,應(yīng)用軟件更多,已成為最流行的Linux發(fā)行版本,2000年秋天已經(jīng)發(fā)行了7.0版本;而Caldera則致力于Linux的商業(yè)應(yīng)用,它的發(fā)展速度也很快。中文化的Linux發(fā)行版本也有很多,國內(nèi)自主建立的如BluePointLinux、FlagLinux、XtermLinux以及美國的XLinux、TurboLinux等。每種發(fā)行版本都有各自的優(yōu)點和弱點,但它們都提供相對完整的應(yīng)用軟件及幫助文檔,都使用相同的內(nèi)核和開發(fā)工具,大家都使用同一個名稱——Linux系統(tǒng)。1.6Linux的內(nèi)核特征Linux操作系統(tǒng)的核心穩(wěn)定而高效,以獨占的方式執(zhí)行最底層任務(wù),保證其他程序的正常運行。它是整個系統(tǒng)的核心,具有獨特的性質(zhì)。本節(jié)試圖從操作系統(tǒng)接口、功能及內(nèi)核結(jié)構(gòu)等幾個方面來展示Linux核心的特征。1.6.1接口特色按照POSIX標(biāo)準(zhǔn),一個可以運行UNIX程序的系統(tǒng)就是UNIX。Linux系統(tǒng)提供和一般UNIX系統(tǒng)相同的標(biāo)準(zhǔn)界面,包括程序級的和用戶級的,因此也是一個UNIX系統(tǒng),一般,大家稱之為類UNIX系統(tǒng),以區(qū)別于其他傳統(tǒng)意義上的UNIX系統(tǒng)。在程序級,Linux系統(tǒng)提供標(biāo)準(zhǔn)的UNIX函數(shù)庫,一個在Linux下開發(fā)的應(yīng)用程序,可以幾乎不經(jīng)過任何改動就可以在其他UNIX系統(tǒng)下編譯執(zhí)行,完成同樣的功能。Linux系統(tǒng)對用戶同時提供圖形和文本用戶界面,文本界面是shell接口,圖形界面是XWindow系統(tǒng)。UNIX下的基本命令,在Linux下功能和使用方式都完全相同。而最早在UNIX平臺開發(fā)的圖形用戶界面XWindow系統(tǒng),在Linux系統(tǒng)下運行良好并可以展示與其他版本UNIX系統(tǒng)下相同甚至更好的效果。更為可喜的是,在XWindow系統(tǒng)基礎(chǔ)上,自由軟件開發(fā)者們?yōu)長inux開發(fā)了不少種類的桌面系統(tǒng),在這樣的環(huán)境下,用戶幾乎可以不再需要傳統(tǒng)的文本用戶界面,所有的操作都可以通過鼠標(biāo)點擊來完成。這樣的系統(tǒng)有方便快捷的KDE(KDesktopEnvironment),基于CORBA組件技術(shù),具有圖形功能的GNOME(GNU’sNetworkObjectModelEnvironment)等等,它們都遵循GPL,都處在高速發(fā)展階段,相信他們的功能會更加完善。桌面系統(tǒng)的發(fā)展,基于桌面系統(tǒng)的辦公、家用軟件的發(fā)展,將會使Linux操作系統(tǒng)的用戶界面更加友好,Linux系統(tǒng)針對辦公用戶及普通家庭的普及工作也將具有更明顯的競爭力和更美好的前景。1.6.2功能特色Linux核心最早運行在Intel80386系列PC機上,現(xiàn)在,它也可以運行在Apple系列、DECAlpha系列、MIPS和Motorola68000系列的計算機上,同時,一些改進(jìn)的嵌入式Linux核心還可以運行于手機、家電等設(shè)備上。從Linux2.0開始,它不僅支持單處理器的機器,還能支持對稱多處理器(SMP)的機器,實現(xiàn)真正的多任務(wù)工作。Linux系統(tǒng)可以支持多種硬件設(shè)備。Linux系統(tǒng)下的驅(qū)動程序開發(fā)和Windows系統(tǒng)相比要簡單得多。最初的硬件設(shè)備驅(qū)動程序,都是由自由軟件開發(fā)者們提供的,隨著Linux系統(tǒng)的普及,越來越多的硬件

廠商也開始提供設(shè)備驅(qū)動,這對于廣大使用者無疑是又一個好消息。Linux采用多級分頁的存儲管理模式,具體的技術(shù)特征將在后面介紹。Linux自身使用的專用的文件系統(tǒng)為Ext2,可以提供方便有效的文件共享及保護(hù)機制。同時,它可以通過虛擬文件系統(tǒng)的技術(shù),支持包括微軟系列操作系統(tǒng)所使用的Fat16、Fat32和NTFS等文件系統(tǒng)在內(nèi)的幾十種現(xiàn)有的文件系統(tǒng)。Linux系統(tǒng)具有內(nèi)置的TCP/IP協(xié)議棧,可以提供各種高效的網(wǎng)絡(luò)功能,包括基本的進(jìn)程間通訊、網(wǎng)絡(luò)文件服務(wù)等。1.6.3結(jié)構(gòu)特征Linux內(nèi)核基本采用模塊結(jié)構(gòu),單內(nèi)核模式,這使得系統(tǒng)具有很高的運行效率,但系統(tǒng)的可擴展性及可移植性受到一定的影響。為了解決這個問題,Linux使用了附加模塊技術(shù)。利用模塊技術(shù),可以方便地在內(nèi)核中添加新的組件或卸載不再需要的內(nèi)核組件,而且這種裝載和卸載可以動態(tài)進(jìn)行。內(nèi)核模塊的引入也帶來了對系統(tǒng)性能、內(nèi)存利用和系統(tǒng)穩(wěn)定性的一些影響,可動態(tài)裝卸的模塊需要系統(tǒng)增加額外的資源來記錄、管理,而裝入的內(nèi)核模塊和其他內(nèi)核部分一樣,具有相同的訪問權(quán)限,差的內(nèi)核模塊會導(dǎo)致系統(tǒng)不穩(wěn)定甚至崩潰,一些惡意的內(nèi)核模塊可能對系統(tǒng)安全造成極大的威脅??偟膩碇v,Linux內(nèi)核基本采用模塊式結(jié)構(gòu)構(gòu)造,同時加入動態(tài)的模塊技術(shù),在追求系統(tǒng)整體效率的同時,實現(xiàn)了內(nèi)核的動態(tài)可伸縮性。這樣的結(jié)構(gòu),給系統(tǒng)移植帶來一定的負(fù)面影響,但是,在廣大自由軟件愛好者們不懈的努力下,Linux系統(tǒng)仍然不斷地推出支持新硬件平臺的版本,Linux可以運行的硬件平臺超過任何一種商業(yè)系統(tǒng),具有較好的平臺適應(yīng)性。1.7Linux的發(fā)展及展望1.7.1開發(fā)模式自由軟件的開發(fā)模式不同于以往任何一種軟件開發(fā)模式。軟件工程的發(fā)展,實現(xiàn)了軟件的工程化生產(chǎn)——在經(jīng)過詳細(xì)的需求分析之后,進(jìn)入設(shè)計階段,然后是實現(xiàn)、測試等等,整個過程有嚴(yán)格的工作流程、時間限制和質(zhì)量控制,程序員在整個生產(chǎn)過程中的作用,相當(dāng)于傳統(tǒng)工廠里流水線上的工人,只是按照“圖紙”完成某個零部件加工而已,這樣的開發(fā)模式強調(diào)的是統(tǒng)一規(guī)劃,集中管理。一大批分布于世界各地的軟件愛好者,以互聯(lián)網(wǎng)為紐帶,通過BBS、新聞組及電子郵件等現(xiàn)代通訊方式,同時參與一個軟件開發(fā)項目。一個初步工作的軟件雛形首先發(fā)布出來,然后大家同時開始工作,分別結(jié)合自己的實際經(jīng)驗和需要,尋找軟件中的漏洞,提出改進(jìn)意見,發(fā)布在互聯(lián)網(wǎng)上,很快,另外的人也發(fā)現(xiàn)了漏洞,接著,有人又提出了改進(jìn)方案,給出了補丁,經(jīng)過這些人分頭修整,這個軟件好像滾雪球一樣,以很快的速度不斷完善。在這樣的開發(fā)模式中,程序員是獨立的實體,他們大多是用業(yè)余時間來為自由軟件服務(wù)的,沒有工作任務(wù)的壓力,他們創(chuàng)作性工作帶來的成就感是他們最大的動力。這樣的開發(fā)模式稱為“巴扎”(Bazaar)模式自由軟件的出現(xiàn),改變了傳統(tǒng)的以公司為主體的封閉的軟件開發(fā)模式。采用了開放和協(xié)作的開發(fā)模式,無償提供源代碼,容許任何人取得、修改和重新發(fā)布自由軟件的源代碼。這種開發(fā)模式激發(fā)了世界各地的軟件開發(fā)人員的積極性和創(chuàng)造熱情,大量軟件開發(fā)人員投入到了自由軟件的開發(fā)中。軟件開發(fā)人員的集體智慧得到充分發(fā)揮,大大減少了不必要的重復(fù)勞動,并使自由軟件的漏洞能得到及時發(fā)現(xiàn)和克服。任何一家公司都不可能投入如此強大的人力去開發(fā)和檢驗商品化軟件。這種開發(fā)模式使自由軟件具有強大的生命力。1.7.2內(nèi)核版本為了確??此茻o序的市集開發(fā)過程能夠有序地進(jìn)行,自由軟件一般都必須采取強有力的版本控制措施。Linux內(nèi)核采用的是雙樹系統(tǒng)。一棵樹是穩(wěn)定樹,主要用于發(fā)行;另一棵樹是非穩(wěn)定樹或者開發(fā)樹,用于產(chǎn)品開發(fā)、改進(jìn)。一些新特性、實驗性改進(jìn)等首先在開發(fā)樹中進(jìn)行。如果在開發(fā)樹中所做的改進(jìn)也可以應(yīng)用于穩(wěn)定樹,那么在開發(fā)樹中經(jīng)過測試以后,就在穩(wěn)定樹中進(jìn)行相同的改進(jìn)。按照Linus的觀點,一旦開發(fā)樹經(jīng)過了足夠的發(fā)展,開發(fā)樹就會成為新的穩(wěn)定樹,如此周而復(fù)始地進(jìn)行下去。源代碼版本序號的形式為x.y.z。對于穩(wěn)定樹來說,y是偶數(shù);對于開發(fā)樹來說,y是比相應(yīng)穩(wěn)定樹大一的奇數(shù)。截止到2000年10月,最新的穩(wěn)定內(nèi)核版本號是2.4.test9。這種開發(fā)會比常規(guī)慣例要快,因為每一版本所包含的改變比以前更少了,內(nèi)核開發(fā)人員只需花很短的時間就能夠完成一個實驗開發(fā)周期。當(dāng)今,Linus率領(lǐng)分布在世界各地的Linux內(nèi)核開發(fā)隊伍正在完善他們的作品。Linux內(nèi)核2.x版本充分顯示了Linux開發(fā)隊伍的非凡的創(chuàng)造力和市集開發(fā)模式的價值。Linux核心開發(fā)者的名單記錄在文件/usr/src/linux/CREDITS中。事實上,UNIX開始發(fā)展時,也采用了類似的開發(fā)模式。這種開發(fā)模式使得UNIX的安全漏洞比其他操作系統(tǒng)解決得更徹底。從充分發(fā)揮開發(fā)人員的集體智慧這一點看,采用這種開發(fā)模式無疑是一大進(jìn)步。1.7.3國內(nèi)應(yīng)用狀況隨著Linux核心的不斷成熟,各種性能穩(wěn)定、安裝方便、支持多語種的發(fā)行版本被廣泛地使用。Linux得到廣大硬件、整機廠商和應(yīng)用程序廠商的大力支持,這一切,都使得Linux這個年輕的系統(tǒng)充滿了希望。由于多種原因,Linux在國內(nèi)的推廣比國外晚了幾年,近年來有更多的軟件愛好者開始了Linux的學(xué)習(xí)、應(yīng)用和研究開發(fā),同時,許多大學(xué)還把它作為操作系統(tǒng)課程實驗的內(nèi)容,這些都為Linux在中國的推廣使用奠定了基礎(chǔ)。Linux的使用開始于國內(nèi)的高校和科研單位,最初大家在各地的電子公告牌上研論問題,隨著討論的深入,他們開始成立各種民間組織,建立自己的主服務(wù)器。愛好者們在這些地方,下載軟件,自由地討論Linux方面的問題,尋找志同道合者切磋,方便而高效地交流信息。這為Linux的進(jìn)一步推廣和本地化創(chuàng)造了良好的環(huán)境。目前國內(nèi)較有影響的推廣項目是1997年6月17日在國家經(jīng)濟信息中心網(wǎng)上建立的自由軟件協(xié)會站點(圖1.3),其網(wǎng)址是:/freesoft.html,這既是一個大型自由軟件庫,也是一個自由軟件應(yīng)用的示范項目。整個系統(tǒng)建立在Linux基礎(chǔ)上,提供WWW、FTP、DNS、News和郵件服務(wù),從開通到2000年12月,訪問人數(shù)已超過70萬人次。同時,國內(nèi)也出現(xiàn)了多家Linux發(fā)行商,推出多種漢化的Linux版本,如BluePoint、XtermLinux、FlagLinux等等,同時也提供系統(tǒng)集成、技術(shù)支持等服務(wù)。總的來講,國內(nèi)Linux發(fā)展還處于一個比較低的層次,初級入門用戶很多,實際應(yīng)用用戶少、而從事自由軟件開發(fā)的人就更少了。1.7.4發(fā)展方向Linux內(nèi)核本身的發(fā)展方向主要是硬件支持、嵌入系統(tǒng)和分布式系統(tǒng)這三個方面。提供更多高性能的硬件驅(qū)動程序,讓更新、更好的硬件迅速在Linux系統(tǒng)下工作,是Linux普及和廣泛應(yīng)用的基礎(chǔ)。隨著以計算技術(shù)、通信技術(shù)為主體的信息技術(shù)的快速發(fā)展和Internet的廣泛應(yīng)用,嵌入式軟件成為軟件業(yè)的新熱點。面對如此巨大的電子產(chǎn)品市場和潛在用戶群,嵌入式軟件的應(yīng)用前景十分廣闊,而Linux系統(tǒng)本身的開放特性以及穩(wěn)定的性能,都比較適合作為開發(fā)嵌入系統(tǒng)的原型,國內(nèi)外都有這樣的研究項目,也有相當(dāng)成功的事例。分布系統(tǒng)是當(dāng)前操作系統(tǒng)發(fā)展的另一個重要領(lǐng)域。以Linux內(nèi)核為基礎(chǔ),按照自由軟件開發(fā)模式,發(fā)展高性能的自由分布操作系統(tǒng),是操作系統(tǒng)發(fā)展的必然趨勢。

此外,Linux上的桌面系統(tǒng)、應(yīng)用軟件,尤其是軟件開發(fā)工具也是Linux發(fā)展的重要方面。桌面系統(tǒng)直接關(guān)系到Linux界面的友好性,易用性。應(yīng)用軟件關(guān)系到系統(tǒng)的可用性,而在自由軟件開發(fā)模式當(dāng)中引入軟件工程新技術(shù)和成功經(jīng)驗,有助于快速開發(fā)Linux平臺上的應(yīng)用軟件。1.8小結(jié)本章首先介紹了操作系統(tǒng)的一般概念及發(fā)展歷史,接著介紹了操作系統(tǒng)的外部接口、管理功能及其內(nèi)部結(jié)構(gòu),特別強調(diào)了計算機系統(tǒng)層次結(jié)構(gòu)的概念。以此為基礎(chǔ),詳細(xì)剖析了Linux系統(tǒng)的接口、功能和結(jié)構(gòu),包括Linux的發(fā)展及其開發(fā)模式。操作系統(tǒng)是計算機系統(tǒng)的基本系統(tǒng)軟件,在整個計算機系統(tǒng)中處于核心地位,它是這樣一些程序模塊的集合——它們管理和控制計算機系統(tǒng)中的硬件和軟件資源,合理地組織計算機工作流程,以便有效地利用這些資源為用戶提供一個功能強大、使用方便和可擴展的工作環(huán)境,從而在計算機與用戶之間起到接口作用。Linux是在日益普及的Internet上迅速形成和不斷完善的操作系統(tǒng)。Linux操作系統(tǒng)高效、穩(wěn)定,適應(yīng)多種硬件平臺,支持多種文件系統(tǒng),它遵循GPL協(xié)議,整個系統(tǒng)的源代碼可以自由獲取,并且在GPL許可的范圍內(nèi)自由修改、傳播,這就為學(xué)習(xí)、應(yīng)用、開發(fā)操作系統(tǒng)及其他軟件提供了良好的基礎(chǔ)和較高的起點。學(xué)習(xí)操作系統(tǒng)一般概念和原理,對于理解、使用和管理Linux系統(tǒng),開發(fā)應(yīng)用軟件以及系統(tǒng)軟件,都具有相當(dāng)重要的意義。習(xí)題1-1操作系統(tǒng)的基本功能有哪些?1-2從技術(shù)的角度講,Linux是一個什么樣的操作系統(tǒng)?你認(rèn)為它有哪些不足?如何改進(jìn)?1-3閱讀通用許可證協(xié)議和參考文獻(xiàn)[1]、[2],深入了解自由軟件的“巴扎”開發(fā)模式,你愿意讓大家共享你的軟件嗎?為什么?你認(rèn)為“巴扎”模式有哪些優(yōu)點?哪些缺點?缺點如何改進(jìn)?1-4訪問Linux核心代碼站點

,了解Linux核心發(fā)展的最新進(jìn)展及新增功能。1-5訪問Internet,了解一個國內(nèi)的自由軟件項目,向大家介紹這個項目的管理及進(jìn)展情況,給出你對該項目的評價及改進(jìn)意見。第2章處理機管理2.1作業(yè)2.2進(jìn)程2.3線程2.4小結(jié)習(xí)題提高處理機(CPU)的使用率,使它盡可能處于工作狀態(tài),是操作系統(tǒng)管理功能的主要目標(biāo)之一。在Linux系統(tǒng)中,提高處理機使用率的技術(shù)措施主要是多道和分時,處理機在進(jìn)程之間切換,按照一定的規(guī)則輪流執(zhí)行每個進(jìn)程。對于單個處理機的系統(tǒng),這些進(jìn)程宏觀上看似并行執(zhí)行,而微觀上來看仍然是串行執(zhí)行的,這種執(zhí)行方式被稱為并發(fā)執(zhí)行。操作系統(tǒng)通過并發(fā)控制機制,對處理機進(jìn)行分配、調(diào)度,在保證每個進(jìn)程都得到公平合理執(zhí)行的同時,使系統(tǒng)中的各種資源得到充分的使用。本章主要圍繞處理機管理展開,著重介紹進(jìn)程的概念,同時也包括相關(guān)的兩個基本概念:作業(yè)和線程。2.1作業(yè)作業(yè)是用戶向計算機系統(tǒng)提交一項工作的基本單位,是用戶在一次事務(wù)處理或計算過程中要求計算機所做工作的總和。作業(yè)和程序是兩個相互聯(lián)系而又不同的概念。如果一次業(yè)務(wù)處理可以由某一個程序完成,就是說這個業(yè)務(wù)處理只要提交這一個程序就夠了,這種情況下,這個程序就是一個作業(yè)。通常,完成一次業(yè)務(wù)需要由多個程序協(xié)同完成,這時,多個程序、這些程序需要的數(shù)據(jù)以及必要的作業(yè)說明一起構(gòu)成一個作業(yè)。系統(tǒng)通過作業(yè)說明書或者作業(yè)控制語句(JCL)控制程序和相應(yīng)的數(shù)據(jù)執(zhí)行,完成整個業(yè)務(wù)處理。按照對作業(yè)的處理方式,可以分為聯(lián)機、批處理等作業(yè)。Linux系統(tǒng)中的shell提供了操作系統(tǒng)和用戶之間的聯(lián)機命令接口。Linux的shell同時提供了程序級接口。用戶通過提交一個命令或一個命令序列以批處理方式執(zhí)行特定的操作(詳見本書第2部分)。在Linux分時批處理系統(tǒng)中,也可以根據(jù)對作業(yè)執(zhí)行時的響應(yīng)特征分為前臺作業(yè)和后臺作業(yè)。在多用戶系統(tǒng)中,多個用戶、不同類型的作業(yè)可能同時請求執(zhí)行,控制和管理這些作業(yè),協(xié)調(diào)它們之間的關(guān)系,就是作業(yè)調(diào)度,作業(yè)調(diào)度是處理機調(diào)度的一部分。2.2進(jìn)程計算機內(nèi)存中同時存放多個相互獨立的已經(jīng)開始運行的程序?qū)嶓w,大家按照某種規(guī)則輪流使用處理器,這是現(xiàn)代多道操作系統(tǒng)實現(xiàn)資源共享,提高系統(tǒng)資源利用率的主要方式。描述這些程序?qū)嶓w的概念就是進(jìn)程。在多道情況下,每個進(jìn)程獨立地?fù)碛懈鞣N必要的資源,占有處理機,獨立地運行。在多道系統(tǒng)中,同時存在多個進(jìn)程,所以當(dāng)某個進(jìn)程進(jìn)入等待狀態(tài)時,操作系統(tǒng)將把處理機控制權(quán)拿過來并交給其他可以運行的進(jìn)程。進(jìn)程之間存在著相互制約、相互依賴的約束關(guān)系。一種最糟糕的情況是所有進(jìn)程都擁有部分資源,同時在等待其他進(jìn)程擁有的資源,這樣,大家都無法運行,進(jìn)入一種永久等待的狀態(tài),這種情況稱為死鎖,死鎖是對系統(tǒng)資源極大的浪費,必須設(shè)法避免。本節(jié)著重討論現(xiàn)代多道操作系統(tǒng)中的核心概念——進(jìn)程,這是理解操作系統(tǒng)工作原理的基礎(chǔ)和關(guān)鍵。首先介紹單個進(jìn)程的狀態(tài)、狀態(tài)轉(zhuǎn)換的條件和控制原語、進(jìn)程在系統(tǒng)中的靜態(tài)描述等,接著介紹多個進(jìn)程之間的約束關(guān)系,由此引出進(jìn)程間通信的概念,通信是協(xié)調(diào)、解決進(jìn)程間約束關(guān)系的惟一手段,這種約束關(guān)系處理不當(dāng)造成的最嚴(yán)重的后果就是死鎖。2.2.1進(jìn)程的概念進(jìn)程(process)的概念最早出現(xiàn)在60年代中期,用于多道系統(tǒng),在Linux系統(tǒng)中,進(jìn)程也稱為任務(wù)(task)。簡單地講,進(jìn)程就是正在運行的程序,更為嚴(yán)謹(jǐn)?shù)谋磉_(dá)是,進(jìn)程是一個具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。進(jìn)程的概念對于理解操作系統(tǒng)有決定性的意義,而真正理解進(jìn)程,必須了解它的基本性質(zhì)。進(jìn)程是操作系統(tǒng)分配資源和進(jìn)行調(diào)度的獨立單位,具有獨立性。同時,具有動態(tài)性。多道系統(tǒng)中同時存在多個進(jìn)程,這些進(jìn)程擁有各自的資源,各自獨立地執(zhí)行,對于單處理機系統(tǒng),進(jìn)程宏觀上同時運行而微觀上是依次執(zhí)行,這種情況稱為并發(fā)執(zhí)行。1.進(jìn)程和程序進(jìn)程和程序是一對相互聯(lián)系的概念。程序是指令的有序集合,是一個靜態(tài)的概念,描述完成某個功能的一個具體操作過程,而進(jìn)程是程序針對某一組數(shù)據(jù)的一次執(zhí)行過程,更強調(diào)動態(tài)特征。一個完整的進(jìn)程,包括程序、執(zhí)行程序所需要的數(shù)據(jù),同時還必須包括記錄進(jìn)程狀態(tài)的數(shù)據(jù)資料。在多道分時操作系統(tǒng)中,按照時間片輪流在各個進(jìn)程間切換。對于單處理器系統(tǒng),每一個時刻只能有一個進(jìn)程在執(zhí)行,當(dāng)分配給該進(jìn)程的時間片用完之后,不管該進(jìn)程運行到什么程度,都必須立即停止,然后讓出處理器資源,下一個進(jìn)程進(jìn)入執(zhí)行狀態(tài)。讓出處理器的進(jìn)程必須記錄好正在運行的狀態(tài),包括寄存器、堆棧等各種信息,這些信息保證當(dāng)處理器下次切換到這個進(jìn)程的時候,進(jìn)程能夠正確地從上次執(zhí)行到的位置繼續(xù)往下執(zhí)行。一個程序在處理相同或不同的操作數(shù)據(jù)時可以同時對應(yīng)于多個進(jìn)程。一個進(jìn)程也可以包含多個程序,某個程序在運行過程中,可能同時會調(diào)用到多個其他程序,這些具有調(diào)用關(guān)系的多個程序共同構(gòu)成一次完整的運行活動,即一個完整的進(jìn)程。舉一個直觀的例子。我們在Linux系統(tǒng)下使用編輯器vi進(jìn)行編輯,同時打開多個窗口,編輯多個不同名稱的文件,vi編輯器是一個可執(zhí)行程序,不同的文件就是不同的操作數(shù)據(jù),而對應(yīng)于這些文件同時打開的每一個編輯窗口就對應(yīng)著一個進(jìn)程,每一個進(jìn)程都處于不同的狀態(tài)。如果說程序是提供計算機操作的一組工作流程的話,進(jìn)程就是具體的工作過程,按照同樣的工作流程,針對不同的原料,可以同時開始多個工作過程,得到多種不同的成品。這種工作流程和工作過程的關(guān)系就可以類比為程序和進(jìn)程的關(guān)系。2.進(jìn)程和作業(yè)作業(yè)是用戶向計算機系統(tǒng)提交一項工作的基本單位,是用戶在一次事務(wù)處理或計算過程中要求計算機所做工作的總和。進(jìn)程是一個具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動,是操作系統(tǒng)分配資源和進(jìn)行調(diào)度的基本單位。作業(yè)是描述用戶向系統(tǒng)提交工作任務(wù)的實體單位,而進(jìn)程是系統(tǒng)完成工作任務(wù)時程序執(zhí)行的實體單位。從這個角度講,他們處于不同的層次,作業(yè)描述用戶和操作系統(tǒng)之間的任務(wù)委托關(guān)系,而進(jìn)程描述操作系統(tǒng)內(nèi)部任務(wù)的具體執(zhí)行過程。一個用戶的任務(wù),即作業(yè),由用戶提交給系統(tǒng),必須以進(jìn)程的形式具體完成。對于批處理系統(tǒng),通常,作業(yè)放在外存中專門的作業(yè)隊列中等待進(jìn)入內(nèi)存執(zhí)行,要經(jīng)過一次宏觀調(diào)度,由外存進(jìn)入內(nèi)存,以進(jìn)程的形式運行。而對于UNIX/Linux這樣的分時系統(tǒng),沒有宏觀調(diào)度,作業(yè)不經(jīng)過調(diào)度,直接進(jìn)入內(nèi)存,以進(jìn)程的形式開始運行。任何一個進(jìn)程,都存在于內(nèi)存中,并且是已經(jīng)開始運行的動態(tài)實體。2.2.2進(jìn)程描述我們知道,進(jìn)程是一個動態(tài)的概念,描述程序的一次運行活動。它存在于系統(tǒng)的內(nèi)存中,是操作系統(tǒng)可感知、可控制的動態(tài)實體,是系統(tǒng)分配各種資源、進(jìn)行調(diào)度的基本單位。1.進(jìn)程控制塊現(xiàn)在我們來討論進(jìn)程在內(nèi)存中的靜態(tài)存在方式。在多道系統(tǒng)中,處理機在多個進(jìn)程之間來回切換,每個進(jìn)程都會在暫停、運行這兩種狀態(tài)之間來回轉(zhuǎn)換。當(dāng)一個進(jìn)程在處理機切換過來重新進(jìn)入運行狀態(tài)時,它必須嚴(yán)格精確地接著上次運行的位置繼續(xù)進(jìn)行,進(jìn)程的靜態(tài)描述可以保持切換現(xiàn)場,確保準(zhǔn)確銜接,保證進(jìn)程調(diào)度的實現(xiàn),順利完成程序所規(guī)定任務(wù)。進(jìn)程切換現(xiàn)場稱為進(jìn)程上下文(context),包含了一個進(jìn)程所具有的全部信息,一般包括:進(jìn)程控制塊(ProcessControlBlock,PCB)、有關(guān)程序段和相應(yīng)的數(shù)據(jù)集,具體組成見圖2.1。程序段是某個進(jìn)程執(zhí)行的相關(guān)指令集合,和靜態(tài)的程序段有明確的對應(yīng)關(guān)系,相應(yīng)數(shù)據(jù)集是這個程序段正在操作的那部分?jǐn)?shù)據(jù),PCB是記錄進(jìn)程各種狀態(tài)的數(shù)據(jù)體,PCB是操作系統(tǒng)管理感知、控制進(jìn)程的數(shù)據(jù)實體,通過它,就可以找到進(jìn)程的程序段和數(shù)據(jù)集,系統(tǒng)正是通過PCB來控制進(jìn)程的。一般來講,PCB記錄著進(jìn)程的所有資料,是全部或部分常駐內(nèi)存的,PCB記錄著程序段和數(shù)據(jù)集的地址指針,通過這些指針,就可以得到具體的指令和數(shù)據(jù)。PCB記錄了進(jìn)程的全部控制信息,一般較龐大而復(fù)雜,它可以按照功能大概分成四個組成部分:進(jìn)程描述信息、進(jìn)程控制信息、進(jìn)程相關(guān)的資源信息和CPU現(xiàn)場保護(hù)結(jié)構(gòu)(如圖2.1)。圖2.1進(jìn)程描述數(shù)據(jù)關(guān)系示意圖(進(jìn)程上下文)2.Linux的PCBLinux系統(tǒng)的進(jìn)程控制塊PCB用一個稱為task-struct的結(jié)構(gòu)體來描述。(1)進(jìn)程描述信息通過進(jìn)程描述信息,Linux系統(tǒng)可以惟一地確定某一個進(jìn)程的基本情況,可以了解該進(jìn)程所屬的用戶及用戶組等信息,同時還能確定這個進(jìn)程與所有其他進(jìn)程之間的關(guān)系。這些描述信息包括:進(jìn)程號、用戶和組標(biāo)識以及描述進(jìn)程家族關(guān)系的連接信息。①進(jìn)程號(pid,processidentifier)Linux系統(tǒng)為每一個進(jìn)程分配一個標(biāo)識號,通過這個標(biāo)識號識別、控制、調(diào)度這個進(jìn)程,別的進(jìn)程也通過這個標(biāo)識號來識別這個進(jìn)程并與之通信,用戶也可以使用操作命令或系統(tǒng)調(diào)用通過標(biāo)識號來控制該進(jìn)程。②用戶和組標(biāo)識(userandgroupidentifier)Linux系統(tǒng)中有四類不同的用戶和組標(biāo)識,主要用來控制進(jìn)程對系統(tǒng)文件的訪問權(quán)限,實現(xiàn)系統(tǒng)資源的安全訪問。

Linux使用組將文件和目錄的訪問特權(quán)授予一組用戶,一個進(jìn)程可以同時屬于多個組,這些組都被放在進(jìn)程的task-struct中的group數(shù)組中。③連接信息(Links)Linux系統(tǒng)中的進(jìn)程之間形成樹狀的家族關(guān)系,連接信息記錄某個進(jìn)程的父進(jìn)程、兄弟進(jìn)程(具有相同父進(jìn)程的進(jìn)程)以及子進(jìn)程的信息,描述一個進(jìn)程在整個家族系統(tǒng)中的具體位置。(2)進(jìn)程控制信息進(jìn)程控制信息記錄了進(jìn)程的當(dāng)前狀態(tài)、調(diào)度信息、記時和時間信息以及進(jìn)程間通信信息,是系統(tǒng)確定進(jìn)程的狀態(tài)、了解進(jìn)程之間的關(guān)系、進(jìn)行進(jìn)程調(diào)度的主要依據(jù)。①進(jìn)程當(dāng)前狀態(tài)進(jìn)程的生命周期中,總是不停地在各種狀態(tài)之間轉(zhuǎn)換,有關(guān)進(jìn)程的狀態(tài)及轉(zhuǎn)換規(guī)則,在下一小節(jié)討論。②調(diào)度信息系統(tǒng)的調(diào)度程序利用這部分信息決定哪一個進(jìn)程應(yīng)該運行,包括優(yōu)先級、實時優(yōu)先級、計數(shù)器和調(diào)度策略。③記時信息包括時間和定時器,給出進(jìn)程占有和利用CPU的情況,是調(diào)度的依據(jù),也是進(jìn)行統(tǒng)計、分析以及記費的依據(jù)。④通信信息多個進(jìn)程之間通信的各種信息也記錄在PCB中。Linux支持典型的UNIX進(jìn)程間通信機制——信號、管道,也支持SystemⅤ通信機制——共享內(nèi)存、信號量和消息隊列。(3)進(jìn)程資源信息Linux的PCB中包含大量的系統(tǒng)資源信息,這些信息記錄了與該進(jìn)程有關(guān)的存儲器的各種地址和資料、文件系統(tǒng)以及打開文件的信息等等。通過這些資料,進(jìn)程就可以得到運行需要的相關(guān)程序段以及必要的數(shù)據(jù)。(4)CPU現(xiàn)場信息進(jìn)程的靜態(tài)描述必須保證一個進(jìn)程在獲得處理機并重新進(jìn)入運行狀態(tài)時,能夠精確地接著上次運行的位置繼續(xù)進(jìn)行。相關(guān)程序段和數(shù)據(jù)集以及處理機現(xiàn)場(或處理機狀態(tài))都必須保存。處理機(CPU)現(xiàn)場信息一般包括處理機的內(nèi)部寄存器和堆棧等基本數(shù)據(jù)。task-struct是Linux系統(tǒng)的進(jìn)程控制塊(PCB),通過對PCB的操作,系統(tǒng)為進(jìn)程分配資源并進(jìn)行調(diào)度,最終完成進(jìn)程的創(chuàng)建和撤銷。系統(tǒng)利用PCB中的描述信息來標(biāo)識一個進(jìn)程,根據(jù)PCB中的調(diào)度信息決定該進(jìn)程是否應(yīng)該運行。如果這個進(jìn)程要進(jìn)入運行,首先根據(jù)其中的CPU現(xiàn)場信息來恢復(fù)運行現(xiàn)場,然后根據(jù)資源信息獲取對應(yīng)的程序段和數(shù)據(jù)集,接著上次的位置開始執(zhí)行,同時通過PCB中的通信信息和其他進(jìn)程協(xié)同工作。2.2.3進(jìn)程狀態(tài)及轉(zhuǎn)換系統(tǒng)通過PCB對進(jìn)程進(jìn)行控制,進(jìn)程不斷地在不同的狀態(tài)之間轉(zhuǎn)換。1.進(jìn)程的基本狀態(tài)在分時系統(tǒng)中,一個進(jìn)程擁有了所需要的全部資源,就可以開始執(zhí)行,當(dāng)分配的時間片結(jié)束,讓出CPU資源,這種只要能夠占有CPU就能進(jìn)入執(zhí)行的狀態(tài)稱為就緒狀態(tài)。有時,多個進(jìn)程之間互相制約,某個進(jìn)程必須等到某個事件發(fā)生(才能夠競爭CPU資源,這是等待狀態(tài),當(dāng)?shù)却氖录l(fā)生之后,這個進(jìn)程被喚醒,由等待狀態(tài)進(jìn)入就緒狀態(tài),直到獲得CPU才開始執(zhí)行。等待狀態(tài)、就緒狀態(tài)和執(zhí)行狀態(tài)是一個進(jìn)程所具有的最基本的三種狀態(tài),見圖2.2。圖2.2進(jìn)程基本狀態(tài)及轉(zhuǎn)換示意圖2.Linux系統(tǒng)進(jìn)程狀態(tài)Linux系統(tǒng)的2.2.16版本進(jìn)程共有六種狀態(tài),包括運行狀態(tài)、可中斷等待狀態(tài)、不可中斷等待狀態(tài)、僵死狀態(tài)、暫停狀態(tài)和交換狀態(tài),而在2.4.0版本中取消了交換狀態(tài),加入獨占狀態(tài)。表2.1Linux系統(tǒng)(2.2.X—2.4.X版本)進(jìn)程狀態(tài)表進(jìn)程狀態(tài)值說明TASK-RUNNING0運行態(tài)TASK-INTERRUPTIBLE1等待態(tài),可中斷TASK-UNINTERRUPTIBLE2等待態(tài),不可中斷TASK-ZOMBIE4僵死態(tài)TASK-STOPPED8暫停態(tài)TASK-SWAPPING16交換態(tài)(2.4.X版本已取消)TASK-EXCLUSIVE32獨占態(tài)(1)運行狀態(tài)(running)Linux系統(tǒng)中的運行狀態(tài)實際包含了上述基本狀態(tài)中的執(zhí)行和就緒兩種狀態(tài),進(jìn)程到底是正在運行還是處于就緒狀態(tài)準(zhǔn)備運行,要靠當(dāng)前是否占有CPU資源來區(qū)分。(2)等待狀態(tài)Linux系統(tǒng)把基本的等待狀態(tài)進(jìn)一步細(xì)化為可中斷的等待態(tài)和不可中斷的等待態(tài)兩種。處于這種狀態(tài)的進(jìn)程都在等待某個事件或某個資源,可中斷等待狀態(tài)的進(jìn)程可以被信號喚醒而進(jìn)入就緒狀態(tài)等待調(diào)度,而不可中斷等待狀態(tài)的進(jìn)程是因為硬件資源無法滿足,不能被信號喚醒,必須等到所等待的資源得到之后由特定的方式喚醒。(3)僵死狀態(tài)(zombie)由于某些原因進(jìn)程被終止,這個進(jìn)程所擁有的內(nèi)存、文件等資源全部釋放之后,還保存著PCB信息,這種占有PCB但已經(jīng)無法運行的進(jìn)程就處于僵死狀態(tài)。(4)暫停狀態(tài)處于暫停狀態(tài)的進(jìn)程,一般都是由運行狀態(tài)轉(zhuǎn)換而來,等待某種特殊處理。比如處于調(diào)試跟蹤的程序,每執(zhí)行到一個斷點,就轉(zhuǎn)入暫停狀態(tài),等待新的輸入信號。(5)交換狀態(tài)處于交換狀態(tài)的進(jìn)程正在執(zhí)行內(nèi)存、外存的交換工作。這個狀態(tài)在2.2.X版本的內(nèi)核中基本已經(jīng)不使用,在2.4.X版本中沒有這種狀態(tài)。(6)獨占狀態(tài)它應(yīng)該是等待狀態(tài)的一種,處于獨占狀態(tài)的進(jìn)程位于等待隊列中,當(dāng)?shù)却氖录l(fā)生時,只有處于這種狀態(tài)的進(jìn)程被喚醒,其他處于可中斷和不可中斷等待狀態(tài)的進(jìn)程則繼續(xù)等待。Linux2.4引入獨占狀態(tài)后,如果事件發(fā)生,只喚醒處于獨占狀態(tài)的那一個進(jìn)程,這就可以大大提高Apache這類Web應(yīng)用的效率,使Linux更適合網(wǎng)絡(luò)服務(wù)器的角色。來看Linux系統(tǒng)進(jìn)程的狀態(tài)轉(zhuǎn)換情況。采取一定的簡化措施:按照進(jìn)程是否占有處理機為依據(jù),把進(jìn)程的運行狀態(tài)分為執(zhí)行和就緒兩種狀態(tài);等待狀態(tài)統(tǒng)一考慮,不再區(qū)分是否可中斷,獨占狀態(tài)也作為一種等待狀態(tài)處理;不涉及交換狀態(tài)。見圖2.3。圖2.3Linux系統(tǒng)進(jìn)程狀態(tài)及轉(zhuǎn)換示意圖圖2.3同時也記錄了一個進(jìn)程在整個生命周期的變化過程。從圖的左下方開始看,系統(tǒng)在某種特定的情況下,響應(yīng)某個要求,首先分配各種資源,創(chuàng)建一個新的進(jìn)程,進(jìn)程進(jìn)入就緒隊列。所有的進(jìn)程必須在就緒之后,才有資格競爭CPU,進(jìn)入運行狀態(tài)。這樣,進(jìn)程的整個生命周期中,大致的轉(zhuǎn)換路徑總是沿著三個閉合回路進(jìn)行。就緒狀態(tài)和執(zhí)行狀態(tài)形成第一個回路。進(jìn)程進(jìn)入就緒態(tài),放入可執(zhí)行隊列等待,一旦被調(diào)度函數(shù)選中,就切換現(xiàn)場,進(jìn)入運行狀態(tài),等自己的時間片耗盡之后,馬上保護(hù)現(xiàn)場,讓出CPU,轉(zhuǎn)入就緒狀態(tài),等待新的調(diào)度。執(zhí)行狀態(tài)、等待狀態(tài)和就緒狀態(tài)形成第二個回路。處于執(zhí)行狀態(tài)的進(jìn)程,有時需要等待某個事件或某種資源的發(fā)生,這時,繼續(xù)占有CPU也無法開展工作,就轉(zhuǎn)入等待狀態(tài),CPU由下一個被調(diào)度的進(jìn)程占有。當(dāng)?shù)却M(jìn)程所等待的事件發(fā)生后,等待進(jìn)程被喚醒,進(jìn)入就緒狀態(tài)。執(zhí)行狀態(tài)、暫停狀態(tài)和就緒狀態(tài)構(gòu)成第三個回路。當(dāng)接收到某種特殊的信號,比如SIGSTOP(Linux的停止信號)時,處于執(zhí)行狀態(tài)的進(jìn)程放棄CPU,保護(hù)現(xiàn)場之后,進(jìn)入暫停狀態(tài),直到獲得另外一個特殊的信號才進(jìn)入就緒狀態(tài)。一個處于執(zhí)行狀態(tài)的進(jìn)程調(diào)用退出函數(shù)exit之后,進(jìn)程就會進(jìn)入僵死狀態(tài),這種狀態(tài)下,進(jìn)程釋放了PCB之外的所有系統(tǒng)資源。也就是說,它在系統(tǒng)中只留下這個進(jìn)程的一個PCB。僵死進(jìn)程的父進(jìn)程通過PCB了解到該進(jìn)程所處的狀態(tài)后,采取相應(yīng)的處理措施,回收PCB,這個進(jìn)程就完成了它的使命,從僵死走向徹底消亡,上圖右上方的虛箭頭表示了這種結(jié)局。2.2.4進(jìn)程控制進(jìn)程控制,是指對系統(tǒng)中的全部進(jìn)程實施有效的管理,使得進(jìn)程能夠及時創(chuàng)建、撤銷,正確地完成進(jìn)程各狀態(tài)之間的轉(zhuǎn)換,使得多個進(jìn)程高效率并發(fā)執(zhí)行,達(dá)到系統(tǒng)資源高度共享的目的。進(jìn)程狀態(tài)之間的轉(zhuǎn)換轉(zhuǎn)換通常由三種不同的方式控制:進(jìn)程控制原語、系統(tǒng)核心函數(shù)(比如調(diào)度)、和外部事件發(fā)生(比如中斷)。這里說的所謂原語,指系統(tǒng)狀態(tài)下執(zhí)行的一些具有特定功能的程序段,這些程序段具有“原子性”,是執(zhí)行過程中不可分割的最小單位。用于進(jìn)程控制的原語有:創(chuàng)建原語、撤銷原語、阻塞原語、喚醒原語等。(1)創(chuàng)建原語進(jìn)程創(chuàng)建原語用于建立一個新的進(jìn)程,這個新進(jìn)程可以由內(nèi)核調(diào)用進(jìn)程創(chuàng)建原語建立,也可以由父進(jìn)程執(zhí)行進(jìn)程創(chuàng)建原語生成一個子進(jìn)程,子進(jìn)程還可以生成子進(jìn)程,以形成樹形進(jìn)程家族結(jié)構(gòu)。進(jìn)程創(chuàng)建原語的主要任務(wù)是形成進(jìn)程的PCB,因此,調(diào)用者必須提供有關(guān)的參數(shù),例如進(jìn)程名、進(jìn)程優(yōu)先級、進(jìn)程正文段起始地址、資源清單等。(2)撤銷原語當(dāng)一個進(jìn)程完成了指定的任務(wù)或由于某種錯誤導(dǎo)致異常終止時,要撤銷這個進(jìn)程以便釋放進(jìn)程占用的資源。進(jìn)程撤銷原語根據(jù)調(diào)用者提供的信息,找到指定的進(jìn)程,回收其占用的資源和PCB。(3)阻塞原語當(dāng)正在運行的進(jìn)程需要等待某一事件,由自己調(diào)用阻塞原語把自己阻塞起來成為等待狀態(tài)。阻塞原語主要完成保護(hù)CPU現(xiàn)場的工作,即首先中斷處理機保存該進(jìn)程的CPU現(xiàn)場,然后把被阻塞的進(jìn)程置為等待狀態(tài),插入到相應(yīng)的等待隊列,最后轉(zhuǎn)入進(jìn)程調(diào)度程序,從就緒隊列中選擇一個進(jìn)程投入運行。(4)喚醒原語當(dāng)處于等待狀態(tài)的進(jìn)程所等待的事件出現(xiàn)時,由發(fā)現(xiàn)者進(jìn)程調(diào)用喚醒原語喚醒被阻塞的進(jìn)程。進(jìn)程控制原語由系統(tǒng)執(zhí)行。同時,操作系統(tǒng)還提供了一些用于進(jìn)程控制的系統(tǒng)調(diào)用和操作命令,用戶可以通過程序或者命令的方式控制進(jìn)程。2.2.5進(jìn)程約束現(xiàn)代操作系統(tǒng)中,程序并發(fā)執(zhí)行,多個進(jìn)程各自獨立地運行,同時競爭和共享系統(tǒng)中有限的資源,這種競爭與合作構(gòu)成了系統(tǒng)進(jìn)程之間的約束關(guān)系。每個進(jìn)程獨立地申請和釋放系統(tǒng)資源,把申請某一類資源的進(jìn)程稱為該類資源的消費者,把釋放同類資源的進(jìn)程稱為該類資源的生產(chǎn)者,就得到描述進(jìn)程約束關(guān)系的一般模型:生產(chǎn)者-消費者問題,也稱為有界緩沖區(qū)問題。比較簡單的情況,兩進(jìn)程共享一個長度為N(N>0)的有界緩沖區(qū),一個進(jìn)程Pp往緩沖區(qū)中送數(shù)據(jù),是生產(chǎn)者,另一個進(jìn)程Pc從緩沖區(qū)中讀取數(shù)據(jù),是消費者,如圖2.4,下面來討論它們間的約束關(guān)系。圖2.4簡單的生產(chǎn)者-消費者問題首先,生產(chǎn)者進(jìn)程Pp和消費者進(jìn)程Pc共享同一個有界緩沖區(qū),對這個緩沖區(qū)的操作必須是獨占的。這種不允許多個并發(fā)進(jìn)程交叉執(zhí)行的資源稱為臨界資源,臨界的程序段資源稱為臨界部分或臨界區(qū)。臨界資源是由于不同并發(fā)進(jìn)程共享某個資源造成的,不可能通過增加資源的方法解決。這種因為共享某一公有資源而引起的在臨界資源內(nèi)不允許并發(fā)進(jìn)程交叉執(zhí)行的現(xiàn)象,稱為進(jìn)程間的間接約束。由于對臨界資源的共享,而產(chǎn)生了臨界區(qū)問題。對于有著臨界區(qū)問題的并行進(jìn)程之間必須互斥,以保證不會同時進(jìn)入臨界區(qū)。其次,對生產(chǎn)者進(jìn)程Pp和消費者進(jìn)程Pc訪問共享有界緩沖區(qū)的順序有嚴(yán)格的要求。具體來講,這種限制為:(1)消費者進(jìn)程Pc要接收數(shù)據(jù)時,有界緩沖區(qū)必須至少有一個單元是滿的;(2)生產(chǎn)者進(jìn)程Pp要發(fā)送數(shù)據(jù)時,有界緩沖區(qū)必須至少有一個單元是空的。這樣存在一組相互獨立的并發(fā)進(jìn)程,各自的執(zhí)行結(jié)果互為對方的執(zhí)行條件,從而限制各進(jìn)程執(zhí)行速度的過程,稱為進(jìn)程間的直接制約。存在直接制約關(guān)系,相互發(fā)送消息進(jìn)行互相合作、互相等待,各自按照一定的速度向前推進(jìn)的過程稱為同步。消費者進(jìn)程和生產(chǎn)者進(jìn)程之間因為共享緩沖區(qū),相互競爭而間接制約,具有互斥關(guān)系,同時相互以對方的運行結(jié)果為條件而直接制約,也具有同步的關(guān)系,是一對同時具有競爭和合作的進(jìn)程。在并發(fā)系統(tǒng)中,進(jìn)程之間相互制約,具有同步和互斥是相當(dāng)普遍的現(xiàn)象。這種進(jìn)程之間的相互關(guān)系,依靠單個進(jìn)程自身的力量是無法解決的,必須以進(jìn)程間的相互通信為基礎(chǔ),互相發(fā)送信息,才能協(xié)調(diào)解決。具體的同步、互斥實現(xiàn)方案有很多種,分別基于不同的通信方式。2.2.6進(jìn)程通信進(jìn)程間通信是協(xié)調(diào)解決多個進(jìn)程之間的約束關(guān)系,實現(xiàn)進(jìn)程共同進(jìn)展的關(guān)鍵技術(shù),是多道系統(tǒng)中控制進(jìn)程并發(fā)執(zhí)行必不可少的機制。進(jìn)程間的通信有兩種方式:一是互相發(fā)送少量的控制信息,一般只傳遞一個或者幾個字節(jié)的數(shù)據(jù),進(jìn)程利用這些簡單的信息,實現(xiàn)互斥和同步,控制運行速度,這種簡單的通信方式被稱為進(jìn)程間的低級通信;另外一種方式稱為進(jìn)程間的高級通信,基本不涉及進(jìn)程執(zhí)行速度控制,用來在進(jìn)程之間傳遞大量的信息,由于這種通信方式主要用于交換信息,因此,在開發(fā)本地進(jìn)程間通信的同時,也為遠(yuǎn)程進(jìn)程間的通信,和計算機網(wǎng)絡(luò)的開發(fā)及控制奠定了基礎(chǔ)。1.進(jìn)程通信類型按照通信進(jìn)程雙方的地位,可以把進(jìn)程通信分為:主從式、會話式、消息或郵箱機制以及共享存儲區(qū)四種類型。(1)主從式主進(jìn)程一方在整個通信過程中處于絕對的控制地位,它可以直接控制從進(jìn)程的動作,自由地使用從進(jìn)程的資源和數(shù)據(jù)。(2)會話式一方進(jìn)程提供服務(wù),另外一方進(jìn)程在得到服務(wù)方的許可之后,可以使用其提供的服務(wù)。在通信過程中,雙方的連接關(guān)系固定,客戶進(jìn)程提出服務(wù)請求,服務(wù)進(jìn)程根據(jù)情況控制服務(wù)的狀態(tài)和內(nèi)容。(3)消息或郵箱機制通信雙方具有平等的地位,和現(xiàn)實生活中的郵件類似。通信雙方通過緩沖區(qū)或郵箱存放被傳送的數(shù)據(jù),不需要建立雙方直接的連接關(guān)系。申請通信的發(fā)起方進(jìn)程不管接收方進(jìn)程的狀態(tài),把信息直接送入雙方共享的緩沖區(qū)(或者郵箱)中,接收進(jìn)程在合適的時機去讀取緩沖區(qū)(或者郵箱)以接收信息。(4)共享存儲區(qū)共享存儲區(qū)通信方式中,通信雙方進(jìn)程共享內(nèi)存中的一段存儲空間,共同操作這個存儲區(qū),達(dá)到數(shù)據(jù)共享的目的。通信過程中,數(shù)據(jù)一直存放在共享存儲區(qū)中,不需要移動,因此特別適用于大量數(shù)據(jù)的傳遞。2.Linux系統(tǒng)的進(jìn)程通信Linux系統(tǒng)提供了多種通信機制,利用這些機制,可以方便地進(jìn)行進(jìn)程之間的相互協(xié)調(diào),實現(xiàn)進(jìn)程的互斥和同步。(1)信號(signal)信號屬于Linux系統(tǒng)的低級通信,主要用于在進(jìn)程之間傳遞控制信號。信號可以發(fā)給一個或多個進(jìn)程,可以是由某個進(jìn)程發(fā)出,也可以由鍵盤中斷產(chǎn)生,還可以是由shell程序向其子進(jìn)程發(fā)送任務(wù)控制命令時產(chǎn)生。進(jìn)程在某些系統(tǒng)錯誤環(huán)境下也會有信號產(chǎn)生。除了兩個信號外,進(jìn)程可以忽略這些信號中的絕大部分,這兩個信號是引起進(jìn)程終止執(zhí)行的SIGSTOP信號和引起進(jìn)程退出的SIGKILL信號。至于其他信號,進(jìn)程可以選擇處理它們的具體方式。信號沒有固有的相對優(yōu)先級。并不是系統(tǒng)中每個進(jìn)程都可以向所有其他進(jìn)程發(fā)送信號,只有核心和超級用戶具有此權(quán)限。普通進(jìn)程只能向具有相同uid和gid的進(jìn)程或者在同一進(jìn)程組中的進(jìn)程發(fā)送信號。信號是通過設(shè)置task-struct結(jié)構(gòu)中signal域里的某一位來產(chǎn)生的。如果進(jìn)程沒有阻塞信號并且處于可中斷的等待狀態(tài),則可以將其狀態(tài)改成running,若確認(rèn)進(jìn)程還處在運行隊列中,就可以通過信號喚醒它。(2)管道(pipe)管道是UNIX操作系統(tǒng)傳統(tǒng)的進(jìn)程通信技術(shù)。Linux管道通信包括無名管道和有名管道兩種,通過文件系統(tǒng)來實現(xiàn)。管道也是一種特殊的文件類型,實際上是通過文件系統(tǒng)的高速緩沖實現(xiàn)的。兩個進(jìn)程通過管道進(jìn)行通信時,兩個進(jìn)程分別進(jìn)行讀和寫操作,都指向緩沖區(qū)中同樣的物理單元,一個進(jìn)程寫入數(shù)據(jù),另一個進(jìn)程從緩沖區(qū)中讀取數(shù)據(jù),從而實現(xiàn)信息傳遞。管道方式只能按照先進(jìn)先出方式單向傳遞信息。管道方式可以用來進(jìn)行大規(guī)模的數(shù)據(jù)傳遞。(3)SYSTEMⅤ進(jìn)程間通信信號量、消息隊列和共享內(nèi)存是UNIX/Linux系統(tǒng)常用的通信方式。消息隊列用來在進(jìn)程之間傳遞分類的格式化數(shù)據(jù),共享內(nèi)存方式可以使不同進(jìn)程共同訪問一塊虛擬存儲空間,通過對該存儲區(qū)的共同操作來實現(xiàn)數(shù)據(jù)傳遞,信號量主要用于進(jìn)程之間的同步控制,通常和共享內(nèi)存共同使用。這三種方式在系統(tǒng)中是作為一個整體實現(xiàn)的。共享內(nèi)存是這三種方式中通信效率最高的,它在進(jìn)程的虛擬空間中進(jìn)行,而且不需要數(shù)據(jù)的移動也可以實現(xiàn)大規(guī)模的數(shù)據(jù)傳遞。(4)套接字(socket)套接字是用來通過網(wǎng)絡(luò)實現(xiàn)運行于不同計算機上的進(jìn)程之間通信的機制。它可以實現(xiàn)數(shù)據(jù)的雙向規(guī)模傳遞,是整個網(wǎng)絡(luò)通信的基礎(chǔ)。具體的原理和實現(xiàn)與網(wǎng)絡(luò)協(xié)議等有關(guān),不做具體的介紹。2.2.7死鎖死鎖,是指所有并發(fā)進(jìn)程都擁有部分資源,同時都在等待其他進(jìn)程擁有的資源,而且在得到對方資源之前不會釋放自己占有的資源,所有進(jìn)程都進(jìn)入永久等待狀態(tài)而無法運行的情況。死鎖是并發(fā)進(jìn)程約束關(guān)系處理不當(dāng)造成的最嚴(yán)重的后果,是對系統(tǒng)資源極大的浪費,必須設(shè)法避免。死鎖出現(xiàn)的根本原因是系統(tǒng)資源的有限性。并發(fā)進(jìn)程競爭資源,調(diào)度不當(dāng),就可能出現(xiàn)死鎖的情況,因此必須采取適當(dāng)?shù)拇胧﹣硐梨i。產(chǎn)生死鎖的必要條件有四個:并發(fā)進(jìn)程之間是互斥關(guān)系,每個進(jìn)程必須獨占某個系統(tǒng)資源;進(jìn)程占有的資源在未結(jié)束使用之前,不能被強行剝奪,只能由該進(jìn)程自己釋放;進(jìn)程需要的資源采用部分分配的方式,在等待新資源的同時,繼續(xù)占有已分配的資源;各占有資源的進(jìn)程形成環(huán)路,每一個進(jìn)程已獲得的資源同時被下一個進(jìn)程請求。解決死鎖的方案就是破壞死鎖產(chǎn)生的必要條件。方法分為預(yù)防、回避、檢測恢復(fù)三種。預(yù)防指采取某種策略,控制并發(fā)進(jìn)程對資源的請求,保證死鎖的四個必要條件在系統(tǒng)運行的任何時刻都無法滿足。避免指系統(tǒng)采取某種算法,對資源使用情況進(jìn)行預(yù)測,使資源分配盡可能合理,避免死鎖的發(fā)生。這兩種方法需要大量的系統(tǒng)開銷,而且系統(tǒng)的資源也無法得到充分的利用。因此,一般系統(tǒng)都采取檢測恢復(fù)的方法,這種方法是在死鎖發(fā)生之后,根據(jù)系統(tǒng)情況,檢測死鎖發(fā)生的位置和原因,使用外力,重新分配資源,破壞死鎖發(fā)生的條件,系統(tǒng)就可以從死鎖狀態(tài)恢復(fù)正常運行,這樣的方法只要使用少量的系統(tǒng)資源,尤其是CPU時間就可以排除死鎖。2.3線程多道處理系統(tǒng)中,進(jìn)程是系統(tǒng)調(diào)度和資源分配的基本單位,計算機的CPU不停地在不同進(jìn)程之間切換,進(jìn)程切換現(xiàn)場稱為進(jìn)程上下文,每一次切換過程,系統(tǒng)都要對換出進(jìn)程的上下文做詳細(xì)記錄,然后恢復(fù)換入進(jìn)程的上下文。因此,系統(tǒng)的進(jìn)程管理過程要耗費相當(dāng)多的系統(tǒng)資源和CPU時間,尤其是對于需要頻繁進(jìn)程切換的任務(wù)。針對進(jìn)程切換的時間和資源耗費問題,為了減少系統(tǒng)進(jìn)程切換的時間,提高整個系統(tǒng)的效率,引入了線程的概念。2.3.1線程的概念線程是在一個進(jìn)程內(nèi)的基本調(diào)度單位。線程可以看作是一個執(zhí)行流,擁有記錄自己狀態(tài)和運行現(xiàn)場的少量數(shù)據(jù)(棧段和上下文),但沒有單獨的代碼段和數(shù)據(jù)段,而是與其他線程共享。多個線程共享一個進(jìn)程內(nèi)部的各種資源,分別按照不同的路徑執(zhí)行,同時線程也是一個基本調(diào)度單位,可以在一個進(jìn)程內(nèi)部進(jìn)行線程切換,現(xiàn)場保護(hù)工作量小。一方面通過共享進(jìn)程的基本資源而減輕系統(tǒng)開銷,另一方面提高了現(xiàn)場切換的效率,因此,線程也被稱為輕權(quán)進(jìn)程或輕量級進(jìn)程。許多流行的多任務(wù)操作系統(tǒng)基本都支持線程。按照系統(tǒng)的管理策略,線程可以分為用戶級線程和系統(tǒng)級線程(內(nèi)核級線程)兩種基本類型。用戶級線程指不需要內(nèi)核支持,在用戶程序中實現(xiàn)的線程都需要用戶程序自己完成。系統(tǒng)級線程由內(nèi)核完成線程的調(diào)度并提供相應(yīng)的系統(tǒng)調(diào)用,用戶程序可以通過這些接口函數(shù)對線程進(jìn)行一定的控制和管理。用戶級線程不需要額外的內(nèi)核開銷,一般只要提供一個線程庫即可,剩下的工作就主要由用戶自己負(fù)責(zé)了。但是由于用戶級線程與系統(tǒng)內(nèi)核無關(guān),當(dāng)一個進(jìn)程因I/O而被調(diào)度程序切換為等待狀態(tài)時,屬于該進(jìn)程的某個執(zhí)行線程可能仍然處于執(zhí)行狀態(tài)。系統(tǒng)級線程的調(diào)度由內(nèi)核完成,不需要更多用戶干預(yù),但要占用更多的系統(tǒng)開銷,效率相對低一些。線程也是系統(tǒng)中動態(tài)變化的實體,它描述程序的運行活動,在內(nèi)存中需要記錄。線程的記錄信息要保證系統(tǒng)能夠準(zhǔn)確地進(jìn)行線程切換。在線程的生命周期里,線程作為一個基本的執(zhí)行單位而存在,不斷地在執(zhí)行和停止的狀態(tài)之間轉(zhuǎn)換。線程的基本狀態(tài)是執(zhí)行、就緒和等待。線程的同步是一個相當(dāng)關(guān)鍵的問題。線程之間的通信相對容易,而線程間的同步問題需要更仔細(xì)地對待,特別是用戶級線程,這個問題相當(dāng)突出。2.3.2線程和進(jìn)程進(jìn)程是操作系統(tǒng)資源分配和系統(tǒng)調(diào)度的基本單位,每一個進(jìn)程都有自己獨立的地址空間和各種資源,線程也是一種系統(tǒng)調(diào)度的基本單位,多個線程可以共享一個進(jìn)程的資源,在存儲方面,線程占用的資源更少。進(jìn)程的調(diào)度主要由操作系統(tǒng)完成,而線程根據(jù)其類型的不同,可以由系統(tǒng)調(diào)度(內(nèi)核級線程),也可以由用戶進(jìn)行調(diào)度(用戶級線程)。進(jìn)程調(diào)度的過程中要進(jìn)行切換,切換現(xiàn)場的保護(hù)與恢復(fù)要求對進(jìn)程上下文做完整的記錄,要消耗一定的存儲資源和處理機時間;線程共享進(jìn)程的資源,可以在進(jìn)程內(nèi)部切換,不涉及資源保存和內(nèi)存地址變換等操作,可以節(jié)約大量的空間和時間資源。因此,對于切換頻繁的工作任務(wù),多線程方式比多進(jìn)程方式可以提供更高的響應(yīng)速度。多個線程共享同一進(jìn)程的資源,線程相互間通訊容易。而進(jìn)程間通訊一般必須要通過系統(tǒng)提供的進(jìn)程間通訊機制。進(jìn)程和線程都是用來描述程序的運行活動,是存在于系統(tǒng)存儲區(qū)中的動態(tài)實體,都有自己的狀態(tài),整個生命周期都在不同的狀態(tài)之間切換。2.3.3Linux系統(tǒng)的線程Linux可以同時支持內(nèi)核級線程(也稱為系統(tǒng)級線程)和用戶級線程。Linux的系統(tǒng)級線程在表示格式、管理調(diào)度等方面與進(jìn)程沒有嚴(yán)格的區(qū)分,都是當(dāng)作進(jìn)程來統(tǒng)一對待。Linux系統(tǒng)級線程和進(jìn)程的區(qū)別主要在于資源管理方面,線程可以共享父進(jìn)程的部分資源(執(zhí)行上下文)。在Linux系統(tǒng)中,線程共享資源的類型是可以控制的,系統(tǒng)調(diào)用clone

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論