Linux操作系統詳解_第1頁
Linux操作系統詳解_第2頁
Linux操作系統詳解_第3頁
Linux操作系統詳解_第4頁
Linux操作系統詳解_第5頁
已閱讀5頁,還剩400頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Linux操作系統詳解

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

第1章操作系統概述

第2章處理機管理

第3章存儲管理

第4章調度

第5章設備

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

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

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

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

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

使用者數量

版本大小(LOC)199110.0110k

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論