版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
四??イ?1■ユエ丫?,三鮑清華大學(xué)計(jì)算機(jī)基礎(chǔ)教育課程系列教材 湯荷美董淵李莉程志銳編著Linux基礎(chǔ)教程Linux基礎(chǔ)教程(1)清華大,林-5?????稷泰タ?材Linux用礎(chǔ)數(shù)盤⑴Linux用礎(chǔ)數(shù)盤⑴操忙系統(tǒng)基礎(chǔ)11?貝?■■■BSfB,?操作系統(tǒng)基礎(chǔ)UAUN.第2UAUN.第2章處理機(jī)管理作業(yè)進(jìn)程線程小結(jié)習(xí)題肩華ラ——一提高處理機(jī)(CPU)的使用率,使它盡可能處于工作狀態(tài),是操作系統(tǒng)管理功能的主要目標(biāo)之一。在Linux系統(tǒng)中,提高處理機(jī)使用率的技術(shù)措施主要是多道和分時(shí),處理機(jī)在進(jìn)程之間切換,按照一定的規(guī)則輪流執(zhí)行每個(gè)進(jìn)程。對(duì)于單個(gè)處理機(jī)的系統(tǒng),這些進(jìn)程宏觀上看似并行執(zhí)行,而微觀上來看仍然是串行執(zhí)行的,這種執(zhí)行方式被稱為并發(fā)執(zhí)行。操作系統(tǒng)通過并發(fā)控制機(jī)制,對(duì)處理機(jī)進(jìn)行分配、調(diào)度,在保證每個(gè)進(jìn)程都得到公平合理執(zhí)行的同時(shí),使系統(tǒng)中的各種資源得到充分的使用。本章主要圍繞處理機(jī)管理展開,著重介紹進(jìn)程的概念,同時(shí)也包括相關(guān)的兩個(gè)基本概念:作業(yè)和線程。58本Linux經(jīng)典電子書教程(免積分下載)/iegirltao/l)log/static/22341604120136221733144/2.1作業(yè)作業(yè)是用戶向計(jì)算機(jī)系統(tǒng)提交一項(xiàng)工作的基本單位,是用戶在ー次事務(wù)處理或計(jì)算過程中要求計(jì)算機(jī)所做工作的總和。作業(yè)和程序是兩個(gè)相互聯(lián)系而又不同的概念。如果ー次業(yè)務(wù)處理可以由某ー個(gè)程序完成,就是說這個(gè)業(yè)務(wù)處理只要提交這ー個(gè)程序就夠了,這種情況下,這個(gè)程序就是一個(gè)作業(yè)。通常,完成一次業(yè)務(wù)需要由多個(gè)程序協(xié)同完成,這時(shí),多個(gè)程序、這些程序需要的數(shù)據(jù)以及必要的作業(yè)說明一起構(gòu)成一個(gè)作業(yè)。系統(tǒng)通過作業(yè)說明書或者作業(yè)控制語句(JCL)控制程序和相應(yīng)的數(shù)據(jù)執(zhí)行,完成整個(gè)業(yè)務(wù)處理。按照對(duì)作業(yè)的處理方式,可以分為聯(lián)機(jī)、批處理等作業(yè)。Linux系統(tǒng)中的shell提供了操作系統(tǒng)和用戶之間的聯(lián)機(jī)命令接口。Linux的shell同時(shí)提供了程序級(jí)接口。用戶通過提交ー個(gè)命令或ー個(gè)命令序列以批處理方式執(zhí)行特定的操作(詳見本書第2部分)。在Linux分時(shí)批處理系統(tǒng)中,也可以根據(jù)對(duì)作業(yè)執(zhí)行時(shí)的響應(yīng)特征分為前臺(tái)作業(yè)和后臺(tái)作業(yè)。在多用戶系統(tǒng)中,多個(gè)用戶、不同類型的作業(yè)可能同時(shí)請(qǐng)求執(zhí)行,控制和管理這些作業(yè),協(xié)調(diào)它們之間的關(guān)系,就是作業(yè)調(diào)度,作業(yè)調(diào)度是處理機(jī)調(diào)度的一部分。2.2進(jìn)程計(jì)算機(jī)內(nèi)存中同時(shí)存放多個(gè)相互獨(dú)立的已經(jīng)開始運(yùn)行的程序?qū)嶓w,大家按照某種規(guī)則輪流使用處理器,這是現(xiàn)代多道操作系統(tǒng)實(shí)現(xiàn)資源共享,提高系統(tǒng)資源利用率的主要方式。描述這些程序?qū)嶓w的概念就是進(jìn)程。在多道情況下,每個(gè)進(jìn)程獨(dú)立地?fù)碛懈鞣N必要的資源,占有處理機(jī),獨(dú)立地運(yùn)行。在多道系統(tǒng)中,同時(shí)存在多個(gè)進(jìn)程,所以當(dāng)某個(gè)進(jìn)程進(jìn)入等待狀態(tài)時(shí),操作系統(tǒng)將把處理機(jī)控制權(quán)拿過來并交給其他可以運(yùn)行的進(jìn)程。進(jìn)程之間存在著相互制約、相互依賴的約束關(guān)系。ー種最糟糕的情況是所有進(jìn)程都擁有部分資源,同時(shí)在等待其他進(jìn)程擁有的資源,這樣,大家都無法運(yùn)行,進(jìn)入ー種永久等待的狀態(tài),這種情況稱為死鎖,死鎖是對(duì)系統(tǒng)資源極大的浪費(fèi),必須設(shè)法避本節(jié)著重討論現(xiàn)代多道操作系統(tǒng)中的核心概念ーー進(jìn)程,這是理解操作系統(tǒng)工作原理的基礎(chǔ)和關(guān)鍵。首先介紹單個(gè)進(jìn)程的狀態(tài)、狀態(tài)轉(zhuǎn)換的條件和控制原語、進(jìn)程在系統(tǒng)中的靜態(tài)描述等,接著介紹多個(gè)進(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)〇簡(jiǎn)單地講,進(jìn)程就是正在運(yùn)行的程序,更為嚴(yán)謹(jǐn)?shù)谋磉_(dá)是,進(jìn)程是ー個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。進(jìn)程的概念對(duì)于理解操作系統(tǒng)有決定性的意義,而真正理解進(jìn)程,必須了解它的基本性質(zhì)。進(jìn)程是操作系統(tǒng)分配資源和進(jìn)行調(diào)度的獨(dú)立單位,具有獨(dú)立性。同時(shí),具有動(dòng)態(tài)性。多道系統(tǒng)中同時(shí)存在多個(gè)進(jìn)程,這些進(jìn)程擁有各自的資源,各自獨(dú)立地執(zhí)行,對(duì)于單處理機(jī)系統(tǒng),進(jìn)程宏觀上同時(shí)運(yùn)行而微觀上是依次執(zhí)行,這種情況稱為并發(fā)執(zhí)行。.進(jìn)程和程序進(jìn)程和程序是ー對(duì)相互聯(lián)系的概念。程序是指令的有序集合,是ー個(gè)靜態(tài)的概念,描述完成某個(gè)功能的一個(gè)具體操作過程,而進(jìn)程是程序針對(duì)某ー組數(shù)據(jù)的ー次執(zhí)行過程,更強(qiáng)調(diào)動(dòng)態(tài)特征。ー個(gè)完整的進(jìn)程,包括程序、執(zhí)行程序所需要的數(shù)據(jù),同時(shí)還必須包括記錄進(jìn)程狀態(tài)的數(shù)據(jù)資料。在多道分時(shí)操作系統(tǒng)中,按照時(shí)間片輪流在各個(gè)進(jìn)程間切換。對(duì)于單處理器系統(tǒng),每ー個(gè)時(shí)刻只能有ー個(gè)進(jìn)程在執(zhí)行,當(dāng)分配給該進(jìn)程的時(shí)間片用完之后,不管該進(jìn)程運(yùn)行到什么程度,都必須立即停止,然后讓出處理器資源,下ー個(gè)進(jìn)程進(jìn)入執(zhí)行狀態(tài)。讓出處理器的進(jìn)程必須記錄好正在運(yùn)行的狀態(tài),包括寄存器、堆棧等各種信息,這些信息保證當(dāng)處理器下次切換到這個(gè)進(jìn)程的時(shí)候,進(jìn)程能夠正確地從上次執(zhí)行到的位置繼續(xù)往下執(zhí)行。ー個(gè)程序在處理相同或不同的操作數(shù)據(jù)時(shí)可以同時(shí)對(duì)應(yīng)于多個(gè)進(jìn)程。ー個(gè)進(jìn)程也可以包含多個(gè)程序,某個(gè)程序在運(yùn)行過程中,可能同時(shí)會(huì)調(diào)用到多個(gè)其他程序,這些具有調(diào)用關(guān)系的多個(gè)程序共同構(gòu)成一次完整的運(yùn)行活動(dòng),即ー個(gè)完整的進(jìn)程。舉ー個(gè)直觀的例子。我們?cè)贚inux系統(tǒng)下使用編輯器vi進(jìn)行編輯,同時(shí)打開多個(gè)窗口,編輯多個(gè)不同名稱的文件,vi編輯器是ー個(gè)可執(zhí)行程序,不同的文件就是不同的操作數(shù)據(jù),而對(duì)應(yīng)于這些文件同時(shí)打開的每一個(gè)編輯窗口就對(duì)應(yīng)著ー個(gè)進(jìn)程,每ー個(gè)進(jìn)程都處于不同的狀態(tài)。如果說程序是提供計(jì)算機(jī)操作的ー組工作流程的話,進(jìn)程就是具體的工作過程,按照同樣的工作流程,針對(duì)不同的原料,可以同時(shí)開始多個(gè)工作過程,得到多種不同的成品。這種工作流程和工作過程的關(guān)系就可以類比為程序和進(jìn)程的關(guān)系。.進(jìn)程和作業(yè)作業(yè)是用戶向計(jì)算機(jī)系統(tǒng)提交一項(xiàng)工作的基本單位,是用戶在ー次事務(wù)處理或計(jì)算過程中要求計(jì)算機(jī)所做工作的總和。進(jìn)程是ー個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng),是操作系統(tǒng)分配資源和進(jìn)行調(diào)度的基本單位。作業(yè)是描述用戶向系統(tǒng)提交工作任務(wù)的實(shí)體單位,而進(jìn)程是系統(tǒng)完成工作任務(wù)時(shí)程序執(zhí)行的實(shí)體單位。從這個(gè)角度講,他們處于不同的層次,作業(yè)描述用戶和操作系統(tǒng)之間的任務(wù)委托關(guān)系,而進(jìn)程描述操作系統(tǒng)內(nèi)部任務(wù)的具體執(zhí)行過程。一個(gè)用戶的任務(wù),即作業(yè),由用戶提交給系統(tǒng),必須以進(jìn)程的形式具體完成。mSlTYPR.ES.S. :莪海函㈱般mSlTYPR.ES.S. 對(duì)于批處理系統(tǒng),通常,作業(yè)放在外存中專門的作業(yè)隊(duì)列中等待進(jìn)入內(nèi)存執(zhí)行,要經(jīng)過一次宏觀調(diào)度,由外存進(jìn)入內(nèi)存,以進(jìn)程的形式運(yùn)行。而對(duì)于UNIX/Linux這樣的分時(shí)系統(tǒng),沒有宏觀調(diào)度,作業(yè)不經(jīng)過調(diào)度,直接進(jìn)入內(nèi)存,以進(jìn)程的形式開始運(yùn)行。任何ー個(gè)進(jìn)程,都存在于內(nèi)存中,并且是已經(jīng)開始運(yùn)行的動(dòng)態(tài)實(shí)體。2.2.2進(jìn)程描述我們知道,進(jìn)程是ー個(gè)動(dòng)態(tài)的概念,描述程序的ー次運(yùn)行活動(dòng)。它存在于系統(tǒng)的內(nèi)存中,是操作系統(tǒng)可感知、可控制的動(dòng)態(tài)實(shí)體,是系統(tǒng)分配各種資源、進(jìn)行調(diào)度的基本單位。1.進(jìn)程控制塊現(xiàn)在我們來討論進(jìn)程在內(nèi)存中的靜態(tài)存在方式。在多道系統(tǒng)中,處理機(jī)在多個(gè)進(jìn)程之間來回切換,每個(gè)進(jìn)程都會(huì)在暫停、運(yùn)行這兩種狀態(tài)之間來回轉(zhuǎn)換。當(dāng)ー個(gè)進(jìn)程在處理機(jī)切換過來重新進(jìn)入運(yùn)行狀態(tài)時(shí),它必須嚴(yán)格精確地接著上次運(yùn)行的位置繼續(xù)進(jìn)行,進(jìn)程的靜態(tài)描述可以保持切換現(xiàn)場(chǎng),確保準(zhǔn)確銜接,保證進(jìn)程調(diào)度的實(shí)現(xiàn),順利完成程序所規(guī)定進(jìn)程切換現(xiàn)場(chǎng)稱為進(jìn)程上下文(contex。,包含了一個(gè)進(jìn)程所具有的全部信息,一般包括:進(jìn)程控制塊(ProcessControlBlock,PCB)、有關(guān)程序段和相應(yīng)的數(shù)據(jù)集,具體組成見圖2.1。程序段是某個(gè)進(jìn)程執(zhí)行的相關(guān)指令集合,和靜態(tài)的程序段有明確的對(duì)應(yīng)關(guān)系,相應(yīng)數(shù)據(jù)集是這個(gè)程序段正在操作的那部分?jǐn)?shù)據(jù),PCB是記錄進(jìn)程各種狀態(tài)的數(shù)據(jù)體,PCB是操作系統(tǒng)管理感知、控制進(jìn)程的數(shù)據(jù)實(shí)體,通過它,就可以找到進(jìn)程的程序段和數(shù)據(jù)集,系統(tǒng)正是通過PCB來控制進(jìn)程的。一般來講,PCB記錄著進(jìn)程的所有資料,是全部或部分常駐內(nèi)存的,PCB記錄著程序段和數(shù)據(jù)集的地址指針,通過這些指針,就可以得到具體的指令和數(shù)據(jù)。????????????????mSlTYPR.ES.S. PCB記錄了進(jìn)程的全部控制信息,一般較龐大而復(fù)雜,它可以按照功能大概分成四個(gè)組成部分:進(jìn)程描述信息、進(jìn)程控制信息、進(jìn)程相關(guān)的資源信息和CPU現(xiàn)場(chǎng)保護(hù)結(jié)構(gòu)(如圖2.1)。圖2.1進(jìn)程描述數(shù)據(jù)關(guān)系示意圖(進(jìn)程上下文)2.Linux的PCBLinux系統(tǒng)的進(jìn)程控制塊PCB用ー個(gè)稱為task-struct的結(jié)構(gòu)體來描述。(1)進(jìn)程描述信息通過進(jìn)程描述信息,Linux系統(tǒng)可以惟一地確定某ー個(gè)進(jìn)程的基本情況,可以了解該進(jìn)程所屬的用戶及用戶組等信息,同時(shí)還能確定這個(gè)進(jìn)程與所有其他進(jìn)程之間的關(guān)系。這些描述信息包括:進(jìn)程號(hào)、用戶和組標(biāo)識(shí)以及描述進(jìn)程家族關(guān)系的連接信息。進(jìn)程號(hào)(pid,processidentifier)Linux系統(tǒng)為每ー個(gè)進(jìn)程分配ー個(gè)標(biāo)識(shí)號(hào),通過這個(gè)標(biāo)識(shí)號(hào)識(shí)別、控制、調(diào)度這個(gè)進(jìn)程,別的進(jìn)程也通過這個(gè)標(biāo)識(shí)號(hào)來識(shí)別這個(gè)進(jìn)程并與之通信,用戶也可以使用操作命令或系統(tǒng)調(diào)用通過標(biāo)識(shí)號(hào)來控制該進(jìn)程。用戶和組標(biāo)識(shí)(userandgroupidenti行er)Linux系統(tǒng)中有四類不同的用戶和組標(biāo)識(shí),主要用來控制進(jìn)程對(duì)系統(tǒng)文件的訪問權(quán)限,實(shí)現(xiàn)系統(tǒng)資源的安全訪問。Linux使用組將文件和目錄的訪問特權(quán)授予一組用戶,一個(gè)進(jìn)程可以同時(shí)屬于多個(gè)組,這些組都被放在進(jìn)程的task-struct中的group數(shù)組中。③連接信息(Links)Linux系統(tǒng)中的進(jìn)程之間形成樹狀的家族關(guān)系,連接信息記錄某個(gè)進(jìn)程的父進(jìn)程、兄弟進(jìn)程(具有相同父進(jìn)程的進(jìn)程)以及子進(jìn)程的信息,描述ー個(gè)進(jìn)程在整個(gè)家族系統(tǒng)中的具體位置。(2)進(jìn)程控制信息進(jìn)程控制信息記錄了進(jìn)程的當(dāng)前狀態(tài)、調(diào)度信息、記時(shí)和時(shí)間信息以及進(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)度程序利用這部分信息決定哪ー個(gè)進(jìn)程應(yīng)該運(yùn)行,包括優(yōu)先級(jí)、實(shí)時(shí)優(yōu)先級(jí)、計(jì)數(shù)器和調(diào)度策略。③記時(shí)信息包括時(shí)間和定時(shí)器,給出進(jìn)程占有和利用CPU的情況,是調(diào)度的依據(jù),也是進(jìn)行統(tǒng)計(jì)、分析以及記費(fèi)的依據(jù)。④通信信息多個(gè)進(jìn)程之間通信的各種信息也記錄在PCB中。Linux支持典型的UNIX進(jìn)程間通信機(jī)制——信號(hào)、管道,也支持SystemV通信機(jī)制——共享內(nèi)存、信號(hào)量和消息隊(duì)列。(3)進(jìn)程資源信息Linux的PCB中包含大量的系統(tǒng)資源信息,這些信息記錄了與該進(jìn)程有關(guān)的存儲(chǔ)器的各種地址和資料、文件系統(tǒng)以及打開文件的信息等等。通過這些資料,進(jìn)程就可以得到運(yùn)行需要的相關(guān)程序段以及必要的數(shù)據(jù)。(4)CPU現(xiàn)場(chǎng)信息進(jìn)程的靜態(tài)描述必須保證ー個(gè)進(jìn)程在獲得處理機(jī)并重新進(jìn)入運(yùn)行狀態(tài)時(shí),能夠精確地接著上次運(yùn)行的位置繼續(xù)進(jìn)行。相關(guān)程序段和數(shù)據(jù)集以及處理機(jī)現(xiàn)場(chǎng)(或處理機(jī)狀態(tài))都必須保存。處理機(jī)(CPU)現(xiàn)場(chǎng)信息一般包括處理機(jī)的內(nèi)部寄存器和堆棧等基本數(shù)據(jù)。task-stmct是Linux系統(tǒng)的進(jìn)程控制塊(PCB),通過對(duì)PCB的操作,系統(tǒng)為進(jìn)程分配資源并進(jìn)行調(diào)度,最終完成進(jìn)程的創(chuàng)建和撤銷。系統(tǒng)利用PCB中的描述信息來標(biāo)識(shí)ー個(gè)進(jìn)程,根據(jù)PCB中的調(diào)度信息決定該進(jìn)程是否應(yīng)該運(yùn)行。如果這個(gè)進(jìn)程要進(jìn)入運(yùn)行,首先根據(jù)其中的CPU現(xiàn)場(chǎng)信息來恢復(fù)運(yùn)行現(xiàn)場(chǎng),然后根據(jù)資源信息獲取對(duì)應(yīng)的程序段和數(shù)據(jù)集,接著上次的位置開始執(zhí)行,同時(shí)通過PCB中的通信信息和其他進(jìn)程協(xié)同工作。2.2.3進(jìn)程狀態(tài)及轉(zhuǎn)換系統(tǒng)通過PCB對(duì)進(jìn)程進(jìn)行控制,進(jìn)程不斷地在不同的狀態(tài)之間轉(zhuǎn)換。1.進(jìn)程的基本狀態(tài)在分時(shí)系統(tǒng)中,ー個(gè)進(jìn)程擁有了所需要的全部資源,就可以開始執(zhí)行,當(dāng)分配的時(shí)間片結(jié)束,讓出CPU資源,這種只要能夠占有CPU就能進(jìn)入執(zhí)行的狀態(tài)稱為就緒狀態(tài)。有時(shí),多個(gè)進(jìn)程之間互相制約,某個(gè)進(jìn)程必須等到某個(gè)事件發(fā)生(才能夠競(jìng)爭(zhēng)CPU資源,這是等待狀態(tài),當(dāng)?shù)却氖录l(fā)生之后,這個(gè)進(jìn)程被喚醒,由等待狀態(tài)進(jìn)入就緒狀態(tài),直到獲得CPUオ開始執(zhí)行。等待狀態(tài)、就緒狀態(tài)和執(zhí)行狀態(tài)是ー個(gè)進(jìn)程所具有的最基本的三種狀態(tài),見圖四??イ?1■ユエY■,三鮑陽度/圖陽度/圖2.2進(jìn)程基本狀態(tài)及轉(zhuǎn)換示意圖時(shí)間片メ 、等待事件,耗シ X睡眠ノ (等待)事件發(fā)生,喚醒ノ2.Linux系統(tǒng)進(jìn)程狀態(tài)Linux系統(tǒng)的2216版本進(jìn)程共有六種狀態(tài),包括運(yùn)行狀態(tài)、可中斷等待狀態(tài)、不可中斷等待狀態(tài)、僵死狀態(tài)、暫停狀態(tài)和交換狀態(tài),而在2.4.0版本中取消了交換狀態(tài),加入獨(dú)占狀態(tài)。表2.1Linux系統(tǒng)(2.2.X—2.4.X版本)進(jìn)程狀態(tài)表進(jìn)程狀態(tài)值說明TASK-RUNNING0運(yùn)行態(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獨(dú)占態(tài)(1)運(yùn)行狀態(tài)(miming)Linux系統(tǒng)中的運(yùn)行狀態(tài)實(shí)際包含了上述基本狀態(tài)中的執(zhí)行和就緒兩種狀態(tài),進(jìn)程到底是正在運(yùn)行還是處于就緒狀態(tài)準(zhǔn)備運(yùn)行,要靠當(dāng)前是否占有CPU資源來區(qū)分。(2)等待狀態(tài)Linux系統(tǒng)把基本的等待狀態(tài)進(jìn)ー步細(xì)化為可中斷的等待態(tài)和不可中斷的等待態(tài)兩種。處于這種狀態(tài)的進(jìn)程都在等待某個(gè)事件或某個(gè)資源,可中斷等待狀態(tài)的進(jìn)程可以被信號(hào)喚醒而進(jìn)入就緒狀態(tài)等待調(diào)度,而不可中斷等待狀態(tài)的進(jìn)程是因?yàn)橛布Y源無法滿足,不能被信號(hào)喚醒,必須等到所等待的資源得到之后由特定的方式喚醒。(3)僵死狀態(tài)(zombie)由于某些原因進(jìn)程被終止,這個(gè)進(jìn)程所擁有的內(nèi)存、文件等資源全部釋放之后,還保存著PCB信息,這種占有PCB但已經(jīng)無法運(yùn)行的進(jìn)程就處于僵死狀態(tài)。(4)暫停狀態(tài)處于暫停狀態(tài)的進(jìn)程,一般都是由運(yùn)行狀態(tài)轉(zhuǎn)換而來,等待某種特殊處理。比如處于調(diào)試跟蹤的程序,每執(zhí)行到ー個(gè)斷點(diǎn),就轉(zhuǎn)入暫停狀態(tài),等待新的輸入信號(hào)。(5)交換狀態(tài)處于交換狀態(tài)的進(jìn)程正在執(zhí)行內(nèi)存、外存的交換エ作。這個(gè)狀態(tài)在2.2.X版本的內(nèi)核中基本已經(jīng)不使用,在2.4.X版本中沒有這種狀態(tài)。(6)獨(dú)占狀態(tài)它應(yīng)該是等待狀態(tài)的ー種,處于獨(dú)占狀態(tài)的進(jìn)程位于等待隊(duì)列中,當(dāng)?shù)却氖录l(fā)生時(shí),只有處于這種狀態(tài)的進(jìn)程被喚醒,其他處于可中斷和不可中斷等待狀態(tài)的進(jìn)程則繼續(xù)等待。Linux2.4引入獨(dú)占狀態(tài)后,如果事件發(fā)生,只喚醒處于獨(dú)占狀態(tài)的那一個(gè)進(jìn)程,這就可以大大提高Apache這類Web應(yīng)用的效率,使Linux更適合網(wǎng)絡(luò)服務(wù)器的角色。來看Linux系統(tǒng)進(jìn)程的狀態(tài)轉(zhuǎn)換情況。采取一定的簡(jiǎn)化措施:按照進(jìn)程是否占有處理機(jī)為依據(jù),把進(jìn)程的運(yùn)行狀態(tài)分為執(zhí)行和就緒兩種狀態(tài);等待狀態(tài)統(tǒng)一考慮,不再區(qū)分是否可中斷,獨(dú)占狀態(tài)也作為ー種等待狀態(tài)處理;不涉及交換狀態(tài)。見圖2.3。跟蹤調(diào)度——一ロ分配資源創(chuàng)建進(jìn)程回收PCB進(jìn)程消亡僵死耗盡睡眠暫停執(zhí)行IDI=>跟蹤結(jié)束等待事件;跟蹤調(diào)度——一ロ分配資源創(chuàng)建進(jìn)程回收PCB進(jìn)程消亡僵死耗盡睡眠暫停執(zhí)行IDI=>跟蹤結(jié)束等待事件;就緒事件發(fā)生,喚醒圖2.3Linux系統(tǒng)進(jìn)程狀態(tài)及轉(zhuǎn)換示意圖圖2.3同時(shí)也記錄了一個(gè)進(jìn)程在整個(gè)生命周期的變化過程。從圖的左下方開始看,系統(tǒng)在某種特定的情況下,響應(yīng)某個(gè)要求,首先分配各種資源,創(chuàng)建ー個(gè)新的進(jìn)程,進(jìn)程進(jìn)入就緒隊(duì)列。所有的進(jìn)程必須在就緒之后,才有資格競(jìng)爭(zhēng)CPU,進(jìn)入運(yùn)行狀態(tài)。這樣,進(jìn)程的整個(gè)生命周期中,大致的轉(zhuǎn)換路徑總是沿著三個(gè)閉合回路進(jìn)行。就緒狀態(tài)和執(zhí)行狀態(tài)形成第一個(gè)回路。進(jìn)程進(jìn)入就緒態(tài),放入可執(zhí)行隊(duì)列等待,一旦被調(diào)度函數(shù)選中,就切換現(xiàn)場(chǎng),進(jìn)入運(yùn)行狀態(tài),等自己的時(shí)間片耗盡之后,馬上保護(hù)現(xiàn)場(chǎng),讓出CPU,轉(zhuǎn)入就緒狀態(tài),等待新的調(diào)度。執(zhí)行狀態(tài)、等待狀態(tài)和就緒狀態(tài)形成第二個(gè)回路。處于執(zhí)行狀態(tài)的進(jìn)程,有時(shí)需要等待某個(gè)事件或某種資源的發(fā)生,這時(shí),繼續(xù)占有CPU也無法開展エ作,就轉(zhuǎn)入等待狀態(tài),CPU由下ー個(gè)被調(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)成第三個(gè)回路。當(dāng)接收到某種特殊的信號(hào),比如SIGSTOP(Linux的停止信號(hào))時(shí),處于執(zhí)行狀態(tài)的進(jìn)程放棄CPU,保護(hù)現(xiàn)場(chǎng)之后,進(jìn)入暫停狀態(tài),直到獲得另外一個(gè)特殊的信號(hào)オ進(jìn)入就緒狀態(tài)。ー個(gè)處于執(zhí)行狀態(tài)的進(jìn)程調(diào)用退出函數(shù)exit之后,進(jìn)程就會(huì)進(jìn)入僵死狀態(tài),這種狀態(tài)下,進(jìn)程釋放了PCB之外的所有系統(tǒng)資源。也就是說,它在系統(tǒng)中只留下這個(gè)進(jìn)程的一個(gè)PCB。僵死進(jìn)程的父進(jìn)程通過PCB了解到該進(jìn)程所處的狀態(tài)后,采取相應(yīng)的處理措施,回收PCB,這個(gè)進(jìn)程就完成了它的使命,從僵死走向徹底消亡,上圖右上方的虛箭頭表示了這種結(jié)局。進(jìn)程控制進(jìn)程控制,是指對(duì)系統(tǒng)中的全部進(jìn)程實(shí)施有效的管理,使得進(jìn)程能夠及時(shí)創(chuàng)建、撤銷,正確地完成進(jìn)程各狀態(tài)之間的轉(zhuǎn)換,使得多個(gè)進(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)建原語用于建立一個(gè)新的進(jìn)程,這個(gè)新進(jìn)程可以由內(nèi)核調(diào)用進(jìn)程創(chuàng)建原語建立,也可以由父進(jìn)程執(zhí)行進(jìn)程創(chuàng)建原語生成一個(gè)子進(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í)、進(jìn)程正文段起始地址、資源清單等。(2)撤銷原語當(dāng)一個(gè)進(jìn)程完成了指定的任務(wù)或由于某種錯(cuò)誤導(dǎo)致異常終止時(shí),要撤銷這個(gè)進(jìn)程以便釋放進(jìn)程占用的資源。進(jìn)程撤銷原語根據(jù)調(diào)用者提供的信息,找到指定的進(jìn)程,回收其占用的資源和PCB。(3)阻塞原語當(dāng)正在運(yùn)行的進(jìn)程需要等待某ー事件,由自己調(diào)用阻塞原語把自己阻塞起來成為等待狀態(tài)。阻塞原語主要完成保護(hù)CPU現(xiàn)場(chǎng)的工作,即首先中斷處理機(jī)保存該進(jìn)程的CPU現(xiàn)場(chǎng),然后把被阻塞的進(jìn)程置為等待狀態(tài),插入到相應(yīng)的等待隊(duì)列,最后轉(zhuǎn)入進(jìn)程調(diào)度程序,從就緒隊(duì)列中選擇ー個(gè)進(jìn)程投入運(yùn)行。(4)喚醒原語當(dāng)處于等待狀態(tài)的進(jìn)程所等待的事件出現(xiàn)時(shí),由發(fā)現(xiàn)者進(jìn)程調(diào)用喚醒原語喚醒被阻塞的進(jìn)程。進(jìn)程控制原語由系統(tǒng)執(zhí)行。同時(shí),操作系統(tǒng)還提供了一些用于進(jìn)程控制的系統(tǒng)調(diào)用和操作命令,用戶可以通過程序或者命令的方式控制進(jìn)程。進(jìn)程約束現(xiàn)代操作系統(tǒng)中,程序并發(fā)執(zhí)行,多個(gè)進(jìn)程各自獨(dú)立地運(yùn)行,同時(shí)競(jìng)爭(zhēng)和共享系統(tǒng)中有限的資源,這種競(jìng)爭(zhēng)與合作構(gòu)成了系統(tǒng)進(jìn)程之間的約束關(guān)系。每個(gè)進(jìn)程獨(dú)立地申請(qǐng)和釋放系統(tǒng)資源,把申請(qǐng)某ー類資源的進(jìn)程稱為該類資源的消費(fèi)者,把釋放同類資源的進(jìn)程稱為該類資源的生產(chǎn)者,就得到描述進(jìn)程約束關(guān)系的一般模型:生產(chǎn)者一消費(fèi)者問題,也稱為有界緩沖區(qū)問題。比較簡(jiǎn)單的情況,兩進(jìn)程共享一個(gè)長(zhǎng)度為N(N>0)的有界緩沖區(qū),ー個(gè)進(jìn)程Pp往緩沖區(qū)中送數(shù)據(jù),是生產(chǎn)者,另ー個(gè)進(jìn)程Pc從緩沖區(qū)中讀取數(shù)據(jù),是消費(fèi)者,如圖2.4,下面來討論它們間的約束關(guān)系。有界緩沖區(qū)有界緩沖區(qū)|匚>Pp,生產(chǎn)者發(fā)送數(shù)據(jù)Pc,Pp,生產(chǎn)者發(fā)送數(shù)據(jù)圖2.4簡(jiǎn)單的生產(chǎn)者一消費(fèi)者問題首先,生產(chǎn)者進(jìn)程Pp和消費(fèi)者進(jìn)程Pc共享同一個(gè)有界緩沖區(qū),對(duì)這個(gè)緩沖區(qū)的操作必須是獨(dú)占的。這種不允許多個(gè)并發(fā)進(jìn)程交叉執(zhí)行的資源稱為臨界資源,臨界的程序段資源稱為臨界部分或臨界區(qū)。臨界資源是由于不同并發(fā)進(jìn)程共享某個(gè)資源造成的,不可能通過增加資源的方法解決。這種因?yàn)楣蚕砟畅`公有資源而引起的在臨界資源內(nèi)不允許并發(fā)進(jìn)程交叉執(zhí)行的現(xiàn)象,稱為進(jìn)程間的間接約束。由于對(duì)臨界資源的共享,而產(chǎn)生了臨界區(qū)問題。對(duì)于有著臨界區(qū)問題的并行進(jìn)程之間必須互斥,以保證不會(huì)同時(shí)進(jìn)入臨界區(qū)。其次,對(duì)生產(chǎn)者進(jìn)程Pp和消費(fèi)者進(jìn)程Pc訪問共享有界緩沖區(qū)的順序有嚴(yán)格的要求。具體來講,這種限制為:(1)消費(fèi)者進(jìn)程Pc要接收數(shù)據(jù)時(shí),有界緩沖區(qū)必須至少有一個(gè)單元是滿的;(2)生產(chǎn)者進(jìn)程Pp要發(fā)送數(shù)據(jù)時(shí),有界緩沖區(qū)必須至少有一個(gè)單元是空的。這樣存在ー組相互獨(dú)立的并發(fā)進(jìn)程,各自的執(zhí)行結(jié)果互為對(duì)方的執(zhí)行條件,從而限制各進(jìn)程執(zhí)行速度的過程,稱為進(jìn)程間的直接制約。存在直接制約關(guān)系,相互發(fā)送消息進(jìn)行互相合作、互相等待,各自按照一定的速度向前推進(jìn)的過程稱為同步。消費(fèi)者進(jìn)程和生產(chǎn)者進(jìn)程之間因?yàn)楣蚕砭彌_區(qū),相互競(jìng)爭(zhēng)而間接制約,具有互斥關(guān)系,同時(shí)相互以對(duì)方的運(yùn)行結(jié)果為條件而直接制約,也具有同步的關(guān)系,是一對(duì)同時(shí)具有競(jìng)爭(zhēng)和合作的進(jìn)程。在并發(fā)系統(tǒng)中,進(jìn)程之間相互制約,具有同步和互斥是相當(dāng)普遍的現(xiàn)象。這種進(jìn)程之間的相互關(guān)系,依靠單個(gè)進(jìn)程自身的力量是無法解決的,必須以進(jìn)程間的相互通信為基礎(chǔ),互相發(fā)送信息,才能協(xié)調(diào)解決。具體的同步、互斥實(shí)現(xiàn)方案有很多種,分別基于不同的通信方式。進(jìn)程通信進(jìn)程間通信是協(xié)調(diào)解決多個(gè)進(jìn)程之間的約束關(guān)系,實(shí)現(xiàn)進(jìn)程共同進(jìn)展的關(guān)鍵技術(shù),是多道系統(tǒng)中控制進(jìn)程并發(fā)執(zhí)行必不可少的機(jī)制。進(jìn)程間的通信有兩種方式:ー是互相發(fā)送少量的控制信息,一般只傳遞ー個(gè)或者幾個(gè)字節(jié)的數(shù)據(jù),進(jìn)程利用這些簡(jiǎn)單的信息,實(shí)現(xiàn)互斥和同步,控制運(yùn)行速度,這種簡(jiǎn)單的通信方式被稱為進(jìn)程間的低級(jí)通信;另外一種方式稱為進(jìn)程間的高級(jí)通信,基本不涉及進(jìn)程執(zhí)行速度控制,用來在進(jìn)程之間傳遞大量的信息,由于這種通信方式主要用于交換信息,因此,在開發(fā)本地進(jìn)程間通信的同時(shí),也為遠(yuǎn)程進(jìn)程間的通信,和計(jì)算機(jī)網(wǎng)絡(luò)的開發(fā)及控制奠定了基礎(chǔ)。1.進(jìn)程通信類型按照通信進(jìn)程雙方的地位,可以把進(jìn)程通信分為:主從式、會(huì)話式、消息或郵箱機(jī)制以及共享存儲(chǔ)區(qū)四種類型。(1)主從式主進(jìn)程一方在整個(gè)通信過程中處于絕對(duì)的控制地位,它可以直接控制從進(jìn)程的動(dòng)作,自由地使用從進(jìn)程的資源和數(shù)據(jù)。(2)會(huì)話式一方進(jìn)程提供服務(wù),另外一方進(jìn)程在得到服務(wù)方的許可之后,可以使用其提供的服務(wù)。在通信過程中,雙方的連接關(guān)系固定,客戶進(jìn)程提出服務(wù)請(qǐng)求,服務(wù)進(jìn)程根據(jù)情況控制服務(wù)的狀態(tài)和內(nèi)容。(3)消息或郵箱機(jī)制通信雙方具有平等的地位,和現(xiàn)實(shí)生活中的郵件類似。通信雙方通過緩沖區(qū)或郵箱存放被傳送的數(shù)據(jù),不需要建立雙方直接的連接關(guān)系。申請(qǐng)通信的發(fā)起方進(jìn)程不管接收方進(jìn)程的狀態(tài),把信息直接送入雙方共享的緩沖區(qū)(或者郵箱)中,接收進(jìn)程在合適的時(shí)機(jī)去讀取緩沖區(qū)(或者郵箱)以接收信息。(4)共享存儲(chǔ)區(qū)共享存儲(chǔ)區(qū)通信方式中,通信雙方進(jìn)程共享內(nèi)存中的一段存儲(chǔ)空間,共同操作這個(gè)存儲(chǔ)區(qū),達(dá)到數(shù)據(jù)共享的目的。通信過程中,數(shù)據(jù)一直存放在共享存儲(chǔ)區(qū)中,不需要移動(dòng),因此特別適用于大量數(shù)據(jù)的傳遞。2.Linux系統(tǒng)的進(jìn)程通信Linux系統(tǒng)提供了多種通信機(jī)制,利用這些機(jī)制,可以方便地進(jìn)行進(jìn)程之間的相互協(xié)調(diào),實(shí)現(xiàn)進(jìn)程的互斥和同步。(1)信號(hào)(signal)信號(hào)屬于Linux系統(tǒng)的低級(jí)通信,主要用于在進(jìn)程之間傳遞控制信號(hào)。信號(hào)可以發(fā)給ー個(gè)或多個(gè)進(jìn)程,可以是由某個(gè)進(jìn)程發(fā)出,也可以由鍵盤中斷產(chǎn)生,還可以是由shell程序向其子進(jìn)程發(fā)送任務(wù)控制命令時(shí)產(chǎn)生。進(jìn)程在某些系統(tǒng)錯(cuò)誤環(huán)境下也會(huì)有信號(hào)產(chǎn)生。除了兩個(gè)信號(hào)外,進(jìn)程可以忽略這些信號(hào)中的絕大部分,這兩個(gè)信號(hào)是引起進(jìn)程終止執(zhí)行的SIGSTOP信號(hào)和引起進(jìn)程退出的SIGKILL信號(hào)。至于其他信號(hào),進(jìn)程可以選擇處理它們的具體方式。信號(hào)沒有固有的相對(duì)優(yōu)先級(jí)。并不是系統(tǒng)中每個(gè)進(jìn)程都可以向所有其他進(jìn)程發(fā)送信號(hào),只有核心和超級(jí)用戶具有此權(quán)限。普通進(jìn)程只能向具有相同uid和gid的進(jìn)程或者在同一進(jìn)程組中的進(jìn)程發(fā)送信號(hào)。信號(hào)是通過設(shè)置taskstmct結(jié)構(gòu)中signal域里的某一位來產(chǎn)生的。如果進(jìn)程沒有阻塞信號(hào)并且處于可中斷的等待狀態(tài),則可以將其狀態(tài)改成mmiing,若確認(rèn)進(jìn)程還處在運(yùn)行隊(duì)列中,就可以通過信號(hào)喚醒它。⑵管道(pipe)管道是UNIX操作系統(tǒng)傳統(tǒng)的進(jìn)程通信技術(shù)。Linux管道通信包括無名管道和有名管道兩種,通過文件系統(tǒng)來實(shí)現(xiàn)。管道也是ー種特殊的文件類型,實(shí)際上是通過文件系統(tǒng)的高速緩沖實(shí)現(xiàn)的。兩個(gè)進(jìn)程通過管道進(jìn)行通信時(shí),兩個(gè)進(jìn)程分別進(jìn)行讀和寫操作,都指向緩沖區(qū)中同樣的物理單元,ー個(gè)進(jìn)程寫入數(shù)據(jù),另ー個(gè)進(jìn)程從緩沖區(qū)中讀取數(shù)據(jù),從而實(shí)現(xiàn)信息傳遞。管道方式只能按照先進(jìn)先出方式單向傳遞信息。管道方式可以用來進(jìn)行大規(guī)模的數(shù)據(jù)傳遞。モマ!x]、、ゴrT2//),/-'ジ5^デいジ尸產(chǎn)戸p產(chǎn)r?T??ス(3)SYSTEMV進(jìn)程間通信信號(hào)量、消息隊(duì)列和共享內(nèi)存是UNIX/Limix系統(tǒng)常用的通信方式。消息隊(duì)列用來在進(jìn)程之間傳遞分類的格式化數(shù)據(jù),共享內(nèi)存方式可以使不同進(jìn)程共同訪問ー塊虛擬存儲(chǔ)空間,通過對(duì)該存儲(chǔ)區(qū)的共同操作來實(shí)現(xiàn)數(shù)據(jù)傳遞,信號(hào)量主要用于進(jìn)程之間的同步控制,通常和共享內(nèi)存共同使用。這三種方式在系統(tǒng)中是作為一個(gè)整體實(shí)現(xiàn)的。共享內(nèi)存是這三種方式中通信效率最高的,它在進(jìn)程的虛擬空間中進(jìn)行,而且不需要數(shù)據(jù)的移動(dòng)也可以實(shí)現(xiàn)大規(guī)模的數(shù)據(jù)傳遞。????????????????mSlTYPR.ES.S. ????????????????mSlTYPR.ES.S. (4)套接字(socket套接字是用來通過網(wǎng)絡(luò)實(shí)現(xiàn)運(yùn)行于不同計(jì)算機(jī)上的進(jìn)程之間通信的機(jī)制。它可以實(shí)現(xiàn)數(shù)據(jù)的雙向規(guī)模傳遞,是整個(gè)網(wǎng)絡(luò)通信的基礎(chǔ)。具體的原理和實(shí)現(xiàn)與網(wǎng)絡(luò)協(xié)議等有關(guān),不做具體的介紹。2.2.7死鎖死鎖,是指所有并發(fā)進(jìn)程都擁有部分資源,同時(shí)都在等待其他進(jìn)程擁有的資源,而且在得到對(duì)方資源之前不會(huì)釋放自己占有的資源,所有進(jìn)程都進(jìn)入永久等待狀態(tài)而無法運(yùn)行的情況。死鎖是并發(fā)進(jìn)程約束關(guān)系處理不當(dāng)造成的最嚴(yán)重的后果,是對(duì)系統(tǒng)資源極大的浪費(fèi),必須設(shè)法避免。死鎖出現(xiàn)的根本原因是系統(tǒng)資源的有限性。并發(fā)進(jìn)程競(jìng)爭(zhēng)資源,調(diào)度不當(dāng),就可能出現(xiàn)死鎖的情況,因此必須采取適當(dāng)?shù)拇胧﹣硐梨i。產(chǎn)生死鎖的必要條件有四個(gè):并發(fā)進(jìn)程之間是互斥關(guān)系,每個(gè)進(jìn)程必須獨(dú)占某個(gè)系統(tǒng)資源;進(jìn)程占有的資源在未結(jié)束使用之前,不能被強(qiáng)行剝奪,只能由該進(jìn)程自己釋放;進(jìn)程需要的資源采用部分分配的方式,在等待新資源的同時(shí),繼續(xù)占有已分配的資源;各占有資源的進(jìn)程形成環(huán)路,每ー個(gè)進(jìn)程已獲得的資源同時(shí)被下一個(gè)進(jìn)程請(qǐng)求。解決死鎖的方案就是破壞死鎖產(chǎn)生的必要條件。方法分為預(yù)防、回避、檢測(cè)恢復(fù)三種。預(yù)防指采取某種策略,控制并發(fā)進(jìn)程對(duì)資源的請(qǐng)求,保證死鎖的四個(gè)必要條件在系統(tǒng)運(yùn)行的任何時(shí)刻都無法滿足。避免指系統(tǒng)采取某種算法,對(duì)資源使用情況進(jìn)行預(yù)測(cè),使資源分配盡可能合理,避免死鎖的發(fā)生。這兩種方法需要大量的系統(tǒng)開銷,而且系統(tǒng)的資源也無法得到充分的利用。因此,一般系統(tǒng)都采取檢測(cè)恢復(fù)的方法,這種方法是在死鎖發(fā)生之后,根據(jù)系統(tǒng)情況,檢測(cè)死鎖發(fā)生的位置和原因,使用外力,重新分配資源,破壞死鎖發(fā)生的條件,系統(tǒng)就可以從死鎖狀態(tài)恢復(fù)正常運(yùn)行,這樣的方法只要使用少量的系統(tǒng)資源,尤其是CPU時(shí)間就可以排除死鎖。2.3線程多道處理系統(tǒng)中,進(jìn)程是系統(tǒng)調(diào)度和資源分配的基本單位,計(jì)算機(jī)的CPU不停地在不同進(jìn)程之間切換,進(jìn)程切換現(xiàn)場(chǎng)稱為進(jìn)程上下文,每一次切換過程,系統(tǒng)都要對(duì)換出進(jìn)程的上下文做詳細(xì)記錄,然后恢復(fù)換入進(jìn)程的上下文。因此,系統(tǒng)的進(jìn)程管理過程要耗費(fèi)相當(dāng)多的系統(tǒng)資源和CPU時(shí)間,尤其是對(duì)于需要頻繁進(jìn)程切換的任務(wù)。針對(duì)進(jìn)程切換的時(shí)間和資源耗費(fèi)問題,為了減少系統(tǒng)進(jìn)程切換的時(shí)間,提高整個(gè)系統(tǒng)的效率,引入了線程的概念。2.3.1線程的概念線程是在一個(gè)進(jìn)程內(nèi)的基本調(diào)度單位。線程可以看作是ー個(gè)執(zhí)行流,擁有記錄自己狀態(tài)和運(yùn)行現(xiàn)場(chǎng)的少量數(shù)據(jù)(棧段和上下文),但沒有單獨(dú)的代碼段和數(shù)據(jù)段,而是與其他線程共享。多個(gè)線程共享一個(gè)進(jìn)程內(nèi)部的各種資源,分別按照不同的路徑執(zhí)行,同時(shí)線程也是一個(gè)基本調(diào)度單位,可以在ー個(gè)進(jìn)程內(nèi)部進(jìn)行線程切換,現(xiàn)場(chǎng)保護(hù)工作量小。一方面通過共享進(jìn)程的基本資源而減輕系統(tǒng)開銷,另一方面提高了現(xiàn)場(chǎng)切換的效率,因此,線程也被稱為輕權(quán)進(jìn)程或輕量級(jí)進(jìn)程。許多流行的多任務(wù)操作系統(tǒng)基本都支持線程。舞涉淳曲磁?^^按照系統(tǒng)的管理策略,線程可以分為用戶級(jí)線程和系統(tǒng)級(jí)線程(內(nèi)核級(jí)線程)兩種基本類型。用戶級(jí)線程指不需要內(nèi)核支持,在用戶程序中實(shí)現(xiàn)的線程都需要用戶程序自己完成。系統(tǒng)級(jí)線程由內(nèi)核完成線程的調(diào)度并提供相應(yīng)的系統(tǒng)調(diào)用,用戶程序可以通過這些接口函數(shù)對(duì)線程進(jìn)行一定的控制和管理。用戶級(jí)線程不需要額外的內(nèi)核開銷,一般只要提供ー個(gè)線程庫(kù)即可,剩下的工作就主要由用戶自己負(fù)責(zé)了。但是由于用戶級(jí)線程與系統(tǒng)內(nèi)核無關(guān),當(dāng)ー個(gè)進(jìn)程因1/O而被調(diào)度程序切換為等待狀態(tài)時(shí),屬于該進(jìn)程的某個(gè)執(zhí)行線程可能仍然處于執(zhí)行狀態(tài)。系統(tǒng)級(jí)線程的調(diào)度由內(nèi)核完成,不需要更多用戶干預(yù),但要占用更多的系統(tǒng)開銷,效率相對(duì)低ー些。線程也是系統(tǒng)中動(dòng)態(tài)變化的實(shí)體,它描述程序的運(yùn)行活動(dòng),在內(nèi)存中需要記錄。線程的記錄信息要保證系統(tǒng)能夠準(zhǔn)確地進(jìn)行線程切換。在線程的生命周期里,線程作為ー個(gè)基本的執(zhí)行單位而存在,不斷地在執(zhí)行和停止的狀態(tài)之間轉(zhuǎn)換。線程的基本狀態(tài)是執(zhí)行、就緒和等待。線程的同步是ー個(gè)相當(dāng)關(guān)鍵的問題。線程之間的通信相對(duì)容易,而線程間的同步問題需要更仔細(xì)地對(duì)待,特別是用戶級(jí)線程,這個(gè)問題相當(dāng)突出。2.3.2線程和進(jìn)程進(jìn)程是操作系統(tǒng)資源分配和系統(tǒng)調(diào)度的基本單位,每一個(gè)進(jìn)程都有自己獨(dú)立的地址空間和各種資源,線程也是一種系統(tǒng)調(diào)度的基本單位,多個(gè)線程可以共享一個(gè)進(jìn)程的資源,在存儲(chǔ)方面,線程占用的資源更少。進(jìn)程的調(diào)度主要由操作系統(tǒng)完成,而線程根據(jù)其類型的不同,可以由系統(tǒng)調(diào)度(內(nèi)核級(jí)線程),也可以由用戶進(jìn)行調(diào)度(用戶級(jí)線程)。進(jìn)程調(diào)度的過程中要進(jìn)行切換,切換現(xiàn)場(chǎng)的保護(hù)與恢復(fù)要求對(duì)進(jìn)程上下文做完整的記錄,要消耗一定的存儲(chǔ)資源和處理機(jī)時(shí)間;線程共享進(jìn)程的資源,可以在進(jìn)程內(nèi)部切換,不涉及資源保存和內(nèi)存地址變換等操作,可以節(jié)約大量的空間和時(shí)間資源。因止匕,對(duì)于切換頻繁的工作任務(wù),多線程方式比多進(jìn)程方式可以提供更高的響應(yīng)速度。多個(gè)線程共享同一進(jìn)程的資源,線程相互間通訊容易。而進(jìn)程間通訊一般必須要通過系統(tǒng)提供的進(jìn)程間通訊機(jī)制。進(jìn)程和線程都是用來描述程序的運(yùn)行活動(dòng),是存在于系統(tǒng)存儲(chǔ)區(qū)中的動(dòng)態(tài)實(shí)體,都有自己的狀態(tài),整個(gè)生命周期都在不同的狀態(tài)之間切換。2.3.3Linux系統(tǒng)的線程Linux可以同時(shí)支持內(nèi)核級(jí)線程(也稱為系統(tǒng)級(jí)線程)和用戶級(jí)線程。Linux的系統(tǒng)級(jí)線程在表示格式、管理調(diào)度等方面與進(jìn)程沒有嚴(yán)格的區(qū)分,都是當(dāng)作進(jìn)程來統(tǒng)ー對(duì)待。Linux系統(tǒng)級(jí)線程和進(jìn)程的區(qū)別主要在于資源管理方面,線程可以共享父進(jìn)程的部分資源(執(zhí)行上下文)。在Linux系統(tǒng)中,線程共享資源的類型是可以控制的,系統(tǒng)調(diào)用clone里有五種形式的clone:CLONE-VM(存儲(chǔ)空間),CLONE-FILES(文件描述表),CLONE-FD(文件系統(tǒng)信息),CLONE-SIGHAND(信號(hào)控缶」表),CLONE-PID(進(jìn)程號(hào))。Linux的內(nèi)核級(jí)線程和其他操作系統(tǒng)的內(nèi)核實(shí)現(xiàn)不同。大多數(shù)操作系統(tǒng)單獨(dú)定義描述線程的數(shù)據(jù)結(jié)構(gòu),采用獨(dú)立的線程管理方式,提供專門的線程調(diào)度,這些都增加了內(nèi)核和調(diào)度程序的復(fù)雜性。而在Linux中,將線程定義為“執(zhí)行上下文”,它實(shí)際只是進(jìn)程的另外一個(gè)執(zhí)行上下文而已,和進(jìn)程采用同樣的表示、管理、調(diào)度方式。這樣,Linux內(nèi)核并不需要區(qū)分進(jìn)程和線程,只需要一個(gè)進(jìn)程ノ線程數(shù)組,而且調(diào)度程序也只有進(jìn)程的調(diào)度程序,內(nèi)核的實(shí)現(xiàn)相對(duì)簡(jiǎn)單得多,而且節(jié)約系統(tǒng)的用于管理方面的時(shí)間開銷。但是,Linux系統(tǒng)使用相對(duì)復(fù)雜的進(jìn)程控制塊來記錄信息,而線程本身的控制信息很少,完全可以采用相當(dāng)簡(jiǎn)單的線程控制塊數(shù)據(jù)結(jié)構(gòu),這就造成了內(nèi)存空間的一定浪費(fèi)。ー個(gè)值得注意的問題是,在Linux系統(tǒng)中,專門有一種稱為kernelthreads的線程,直譯為內(nèi)核線程,它和我們這里討論的系統(tǒng)級(jí)線程(kernellevelthreads)在Linux系統(tǒng)中是兩個(gè)完全不同的概念,它們的區(qū)別,將在4.3節(jié)“Linux進(jìn)程調(diào)度”中詳細(xì)介紹。Linux支持POSIX標(biāo)準(zhǔn)定義的線程(pthreads),提供用戶級(jí)線程支持。利用這樣的線程庫(kù)函數(shù),用戶可以方便地創(chuàng)建、調(diào)度和撤銷線程,也可以實(shí)現(xiàn)線程間通信,而且這些線程還可以映射為系統(tǒng)級(jí)線程,由系統(tǒng)調(diào)度執(zhí)行。實(shí)現(xiàn)用戶級(jí)線程創(chuàng)建的函數(shù)^pthread-create〇2.4小結(jié)進(jìn)程是現(xiàn)代操作系統(tǒng)的核心概念,它用來描述程序執(zhí)行的過程,是實(shí)現(xiàn)多道操作系統(tǒng)的基礎(chǔ)。和進(jìn)程聯(lián)系密切的概念是程序、作業(yè)和線程,正確地區(qū)分和理解這些概念,有助于正確地理解和認(rèn)識(shí)計(jì)算機(jī)操作系統(tǒng)本身。Linux系統(tǒng)中基本沒有區(qū)分進(jìn)程和線程,它們都使用相同的描述方法,使用相同的調(diào)度和管理策略。描述進(jìn)程的靜態(tài)數(shù)據(jù)是進(jìn)程控制塊PCB。在Linux等多道操作系統(tǒng)中,程序是并發(fā)執(zhí)行的,進(jìn)程的個(gè)數(shù)總是多于系統(tǒng)CPU的個(gè)數(shù),宏觀上所有進(jìn)程同時(shí)都在運(yùn)行,微觀上這些進(jìn)程輪流使用CPU,在執(zhí)行、等待和就緒等基本狀態(tài)之間轉(zhuǎn)換,直到執(zhí)行完成。習(xí)題2-I什么是作業(yè)?簡(jiǎn)述Linux系統(tǒng)作業(yè)的概念。2-2作業(yè)、程序和進(jìn)程有什么區(qū)別?2-3進(jìn)程能不能理解為由偽處理機(jī)執(zhí)行的ー個(gè)程序?為什么?2-4什么是進(jìn)程間的互斥和同步?2-5并發(fā)進(jìn)程間的制約有哪幾種?引起的原因分別是什么?2-6Linux系統(tǒng)中的線程有哪幾類?分別是如何描述和管理的?2-7訪問Internet,了解Linux系統(tǒng)進(jìn)程控制塊的現(xiàn)狀,有哪些改進(jìn),你認(rèn)為改進(jìn)方案如何?暮玄自1臓暮玄自1臓‘儂UNlVEBSiTYPR,3.43.5習(xí)題第3章存儲(chǔ)管理虛擬存儲(chǔ)器內(nèi)存管理方式80386段頁(yè)機(jī)制Linux存儲(chǔ)管理小結(jié)每一個(gè)要運(yùn)行的程序,必須首先進(jìn)入內(nèi)存,然而,每一臺(tái)計(jì)算機(jī)的內(nèi)存容量都是有限而寶貴的。存儲(chǔ)管理的任務(wù)是方便用戶使用存儲(chǔ)資源,在有限的物理空間內(nèi)使更多的用戶進(jìn)程高效地獲得和使用盡可能多的存儲(chǔ)空間,從而提高系統(tǒng)的整體性能?,F(xiàn)代操作系統(tǒng)中普遍采用基于虛擬存儲(chǔ)器的概念來統(tǒng)ー管理內(nèi)存和外存,實(shí)現(xiàn)邏輯上的大容量存儲(chǔ)空間。本章首先介紹虛擬存儲(chǔ)器的基本概念及使用虛擬存儲(chǔ)器的依據(jù)和出發(fā)點(diǎn)ーー局部性原理,即在程序的運(yùn)行過程中,總是集中地訪問某ー個(gè)程序段。根據(jù)這樣的原理,可以把物理內(nèi)存按照一定的規(guī)則劃分為小部分,每次只裝入某個(gè)進(jìn)程必要的一部分內(nèi)容就開始運(yùn)行,在運(yùn)行過程中,再根據(jù)需要裝入新的內(nèi)容。不同的劃分規(guī)則形成不同的存儲(chǔ)管理技術(shù),我們簡(jiǎn)單介紹分區(qū)、頁(yè)式、段式和段頁(yè)式管理的基本思想。接著介紹Intel80386硬件存儲(chǔ)管理機(jī)制,最后學(xué)習(xí)Linux系統(tǒng)在這種硬件平臺(tái)的基本存儲(chǔ)管理機(jī)制。3.1 虛擬存儲(chǔ)器3.1 虛擬存儲(chǔ)器計(jì)算機(jī)系統(tǒng)的存儲(chǔ)器分為內(nèi)存(主存)和外存(硬盤)。內(nèi)存的價(jià)格昂貴,速度高,存儲(chǔ)容量有限;外存價(jià)格便宜,速度慢,存儲(chǔ)容量很大,適合于存放大量數(shù)據(jù)。為了使更多的用戶進(jìn)程合理、充分地使用存儲(chǔ)資源,操作系統(tǒng)統(tǒng)ー管理內(nèi)存和外存,即把內(nèi)存中暫時(shí)不用的內(nèi)容放在硬盤上,內(nèi)存中就可以騰出一部分空間,可以從硬盤裝入其他迫切需要的內(nèi)容。因此,從效果上看,計(jì)算機(jī)系統(tǒng)好像為用戶提供了一個(gè)其存儲(chǔ)容量比實(shí)際主存大得多的存儲(chǔ)器。人們稱這個(gè)存儲(chǔ)器為虛擬存儲(chǔ)器。局部性原理實(shí)驗(yàn)證明,在幾乎所有進(jìn)程的執(zhí)行過程中,某ー個(gè)特定的時(shí)間段中,CPU不是隨機(jī)地訪問整個(gè)程序或數(shù)據(jù),而是集中地訪問程序或數(shù)據(jù)的某ー個(gè)部分。進(jìn)程的這種訪問特性稱為局部性原理。與CPU訪問該局部?jī)?nèi)的數(shù)據(jù)和代碼的次數(shù)相比,局部段的變化很緩慢,正是基于這樣的原理,我們オ有可能實(shí)現(xiàn)虛擬存儲(chǔ)管理。把進(jìn)程的所有內(nèi)容劃分為ー個(gè)個(gè)小的部分,首先只把系統(tǒng)所必需的部分?jǐn)?shù)據(jù)裝入內(nèi)存,其余部分就放在外存中,開始運(yùn)行之后,再把所需要的其他部分換入內(nèi)存,同時(shí)把不再需要的部分從內(nèi)存中換到硬盤或者清除掉。當(dāng)然,與之相配合,實(shí)際的內(nèi)存也要?jiǎng)澐譃閷?duì)應(yīng)的小部分。這種內(nèi)外存之間的數(shù)據(jù)交換對(duì)用戶進(jìn)程來講是透明的。從用戶進(jìn)程的角度來看,系統(tǒng)好像提供了一個(gè)很大的內(nèi)存ー樣,整個(gè)進(jìn)程都能裝進(jìn)去而且正常運(yùn)行,這種邏輯上的大容量存儲(chǔ)空間就可以稱為虛擬存儲(chǔ)器。實(shí)際上,是操作系統(tǒng)的存儲(chǔ)管理起了作用,用多次內(nèi)外存數(shù)據(jù)交換的時(shí)間換來了大容量的并不真正存在的(虛擬的)內(nèi)存。因此,可以想象,訪問虛擬存儲(chǔ)器的速度要比訪問真正內(nèi)存的速度要慢。虛擬地址和虛擬地址空間內(nèi)存中同時(shí)存在多個(gè)進(jìn)程,每個(gè)進(jìn)程的地址都是以〇地址作為起始地址的虛擬地址空間,這個(gè)虛地址空間可以是線性的(ー維的),也可以是多維的,這要取決于系統(tǒng)采用的存儲(chǔ)管理方式。進(jìn)程中的每ー個(gè)指令和數(shù)據(jù)在這樣的虛地址空間中都有一個(gè)惟ー確定的地址,即虛擬地址。每ー個(gè)進(jìn)程都具有各自獨(dú)立的虛擬地址空間,而整個(gè)系統(tǒng)只有一個(gè)物理地址空間。任何ー個(gè)要執(zhí)行的進(jìn)程,都必須進(jìn)入真正的內(nèi)存中,在內(nèi)存的物理空間中存在,這就需要在虛擬地址空間和物理地址空間之間建立適當(dāng)?shù)挠成潢P(guān)系。通過這種映射關(guān)系,逐部分地把存在于虛擬地址空間中的進(jìn)程要執(zhí)行的/&fr『T『廠?Iリト)}'ケ<i^yドf2戶;、/,FPr^rr?/Tr?J^M部分放在物理地址空間中,而其他暫時(shí)不執(zhí)行的部分放在外部存儲(chǔ)器中,內(nèi)外存動(dòng)態(tài)地傳遞數(shù)據(jù),最終完成整個(gè)進(jìn)程所執(zhí)行的任務(wù)。這種映射,也稱為地址變換,是操作系統(tǒng)在硬件的配合下實(shí)現(xiàn)的。系統(tǒng)中的每ー個(gè)進(jìn)程,都有一個(gè)帷ー的地址映射關(guān)系,也就是說,虛擬地址空間到物理地址空間是ー個(gè)多對(duì)ー的映射關(guān)系。這樣,不同的進(jìn)程有不同的虛擬地址空間和映射變換,可以方便地實(shí)現(xiàn)進(jìn)程之間的存儲(chǔ)保護(hù),避免數(shù)據(jù)和程序遭受其他進(jìn)程無意或者惡意的訪問,同時(shí),它們都映射到惟ー的物理空間,可以通過多個(gè)進(jìn)程同時(shí)映射同一個(gè)物理地址的方式實(shí)現(xiàn)數(shù)據(jù)和程序的共享。3.2 內(nèi)存管理方式3.2 內(nèi)存管理方式虛擬存儲(chǔ)的每一個(gè)要運(yùn)行的程序,都必須首先進(jìn)入內(nèi)存,但是,每一臺(tái)計(jì)算機(jī)的內(nèi)存容量都是有限而寶貴的。管理技術(shù),通常是基于局部性原理的,即把整個(gè)進(jìn)程的虛擬地址空間劃分為小的部分,同時(shí)把內(nèi)存也劃分為小的部分,在虛擬地址空間和物理地址空間之間建立特定的映射關(guān)系,進(jìn)程的內(nèi)容分批分期進(jìn)入內(nèi)存中特定的位置,其余部分在外存中,在需要的時(shí)候再傳遞到內(nèi)存,用內(nèi)存和外存的統(tǒng)ー管理來實(shí)現(xiàn)內(nèi)存擴(kuò)充。在虛擬存儲(chǔ)技術(shù)的發(fā)展過程中,使用了不同的地址空間劃分方法和映射關(guān)系,這些不同的劃分和映射對(duì)應(yīng)于不同的存儲(chǔ)管理方式,本節(jié)介紹幾種能夠?qū)崿F(xiàn)虛擬存儲(chǔ)的地址空間劃分方式。3.2.I頁(yè)把進(jìn)程的虛擬地址空間劃分為相等大小的部分,每個(gè)部分稱為頁(yè)(page),同時(shí)把物理內(nèi)存空間也按照員的大小劃分為小的部分,稱為頁(yè)面(pageframe,也稱為頁(yè)架或頁(yè)框)。對(duì)于80386體系,頁(yè)和頁(yè)面的大小都為4K字節(jié)。在頁(yè)和頁(yè)面之間建立—映射關(guān)系,連續(xù)的ー維虛擬地址空間可以分別存放在不同物理空間中,因此,物理存儲(chǔ)中,每個(gè)頁(yè)面內(nèi)部地址連續(xù),而頁(yè)面之間的地址可以是不連續(xù)的。頁(yè)和頁(yè)面之間的映射關(guān)系記錄在ー個(gè)表格中,這樣的表稱為頁(yè)表。每ー個(gè)進(jìn)程使用惟ー的頁(yè)表,頁(yè)表的每ー項(xiàng)數(shù)據(jù)稱為頁(yè)表項(xiàng),表示虛擬空間中某ー頁(yè)和實(shí)際物理空間中某ー頁(yè)面的對(duì)應(yīng)關(guān)系,頁(yè)表也存儲(chǔ)在物理空間內(nèi),如圖3.1所示。暮玄自1臓‘儂UNlVEBSiTYPR,頁(yè)號(hào)(虛擬)頁(yè)架號(hào)(物理)0719253-10レ—142536\789頁(yè)架號(hào)(物理)頁(yè)號(hào)(虛擬)圖3.1頁(yè)式管理:頁(yè)表(左)及相應(yīng)的頁(yè)、頁(yè)面對(duì)應(yīng)關(guān)系(右)從上圖可以看出,連續(xù)的ー維虛擬空間經(jīng)過變換,映射到物理空間中不連續(xù)的頁(yè)面中。利用分頁(yè)機(jī)制實(shí)現(xiàn)虛擬存儲(chǔ)管理稱為頁(yè)式存儲(chǔ)管理。管理過程中,內(nèi)外存的數(shù)據(jù)傳遞是以頁(yè)為單位。頁(yè)式管理采用請(qǐng)求調(diào)頁(yè)或者預(yù)調(diào)頁(yè)技術(shù)實(shí)現(xiàn)內(nèi)外存的統(tǒng)一管理,內(nèi)存中同時(shí)只存放少量經(jīng)常執(zhí)行或者即將執(zhí)行的頁(yè),而其他不經(jīng)常使用或暫時(shí)不會(huì)執(zhí)行的頁(yè),存放在外存中,等需要的時(shí)候再調(diào)入內(nèi)存。利用分頁(yè)技術(shù)將一維連續(xù)虛擬空間劃分為ー個(gè)個(gè)頁(yè),進(jìn)程的虛擬地址由兩個(gè)部分組成:頁(yè)號(hào)P和頁(yè)內(nèi)地址(偏移量)Wo這兩個(gè)部分的虛擬地址經(jīng)過地址變換后,映射到物理內(nèi)存的對(duì)應(yīng)單元。具體的地址變換過程如圖3.2所示。四??イ?1■ユエY■,三鮑頁(yè)號(hào)尸頁(yè)內(nèi)偏移印虛四??イ?1■ユエY■,三鮑頁(yè)號(hào)尸頁(yè)內(nèi)偏移印虛妝地址頁(yè)架號(hào)F物理偏移卬頁(yè)表長(zhǎng)度頁(yè)表起始地址頁(yè)表控制寄存器頁(yè)號(hào)頁(yè)菜號(hào)■1*?。??,??,?PF???虛擬地址空間! 頁(yè)表 | 物理內(nèi)存圖3.2頁(yè)式內(nèi)存管理地址變換示意圖操作系統(tǒng)為每ー個(gè)進(jìn)程維護(hù)ー個(gè)獨(dú)立的頁(yè)表,進(jìn)程正在執(zhí)行的時(shí)候,頁(yè)表信息記錄在頁(yè)表控制寄存器中,系統(tǒng)根據(jù)寄存器的值得到該進(jìn)程對(duì)應(yīng)頁(yè)表的地址,同時(shí)利用頁(yè)號(hào),就可以得到該頁(yè)對(duì)應(yīng)的頁(yè)表項(xiàng)。查找頁(yè)表,獲得了頁(yè)表所映射的頁(yè)面號(hào),由頁(yè)面號(hào)和頁(yè)內(nèi)地址,就可以直接找到內(nèi)存中的對(duì)應(yīng)存儲(chǔ)單元。在整個(gè)變換過程中,需要兩次訪問物理內(nèi)存,第一次是查找頁(yè)表,第二次是獲取數(shù)據(jù)。為了提高效率,硬件一般提供ー個(gè)高速的聯(lián)想寄存器,構(gòu)成一個(gè)快表(translationlookasidebuffer),把當(dāng)前進(jìn)程中經(jīng)常使用的頁(yè)表項(xiàng)放在快表中,地址變換過程中,首先訪冋快表,如果該員表項(xiàng)存在于快表中,就可以直接得到對(duì)應(yīng)的頁(yè)面號(hào),如果不在快表中,再去查找頁(yè)表得到頁(yè)面號(hào),快表的訪問速度要比內(nèi)存快得多,這樣就可以提高內(nèi)存的訪問速度。采用頁(yè)式管理,實(shí)現(xiàn)了進(jìn)程的程序和數(shù)據(jù)非連續(xù)存放,對(duì)內(nèi)存和外存統(tǒng)ー管理,得到更大的虛擬存儲(chǔ)空間,可以同時(shí)容納和運(yùn)行更多的進(jìn)程,有利于系統(tǒng)整體性能的提高。缺點(diǎn)是增加了系統(tǒng)開銷,而且需要一定的硬件支持。由于虛擬空間是連續(xù)的,整個(gè)進(jìn)程按照一維地址順序排列,同一個(gè)程序段在分頁(yè)的過程中,可能分別位于不同的頁(yè)中,代碼和數(shù)據(jù)的共享比較困難。3.2.2段段式管理的基本思想是把整個(gè)程序按照邏輯結(jié)構(gòu)劃分為不同的段,每個(gè)段可以是ー個(gè)函數(shù)(過程)或者數(shù)據(jù),有自己的名稱,段大小是不相等的,段與段之間不存在順序關(guān)系。這樣,進(jìn)程具有一個(gè)二維的虛擬空間。內(nèi)存的管理以段為單位,把正在執(zhí)行的段放在內(nèi)存中,其他段暫時(shí)放在外存中,當(dāng)需要執(zhí)行時(shí)再傳遞到內(nèi)存中。這樣,也可以實(shí)現(xiàn)大容量的虛擬存儲(chǔ)段式管理中,進(jìn)程的虛擬地址是二維的,由段號(hào)和段內(nèi)偏移地址構(gòu)成。與頁(yè)式管理的區(qū)別在于,段號(hào)是不連續(xù)的,段的大小是可變的。在二維虛擬空間與物理空間之間需要建立ーー映射關(guān)系,即地址變換,這種變換關(guān)系記錄在ー個(gè)稱為段表的表格中,系統(tǒng)為每ー個(gè)進(jìn)程維護(hù)ー張段表,通過查找段表,就可以得到虛擬地址所對(duì)應(yīng)的物理單元。段式存儲(chǔ)管理的優(yōu)點(diǎn)在于使用了大小可變的虛擬地址空間劃分方法,按照程序的固有邏輯關(guān)系來分段,便于進(jìn)程之間存儲(chǔ)共享。但是,地址變換關(guān)系更為復(fù)雜,需要更多的硬件支持,實(shí)現(xiàn)起來更為麻煩,同時(shí)也帶來了更大的系統(tǒng)開銷。3.2.3段頁(yè)段頁(yè)式存儲(chǔ)管理,綜合利用段式和頁(yè)式管理的思想,把整個(gè)二維虛擬空間先分段,然后在段內(nèi)分頁(yè)。以頁(yè)為最小的存儲(chǔ)管理單位來實(shí)現(xiàn)虛擬存儲(chǔ)。一方面可以按照程序的邏輯關(guān)系來劃分進(jìn)程空間的段,另一方面使用頁(yè)來存放每ー個(gè)段的內(nèi)容,內(nèi)外存交換以統(tǒng)一格式和大小的頁(yè)來進(jìn)行。這種管理模式下,虛擬地址要包括三個(gè)部分:段號(hào)、頁(yè)號(hào)和頁(yè)內(nèi)偏移地址,地址變換也要經(jīng)過兩層次映射才能夠?qū)崿F(xiàn),首先從二維虛擬空間映射到ー個(gè)線性虛擬空間,然后再?gòu)木€性空間映射到物理空間??梢韵胂?整個(gè)變換過程更為復(fù)雜,需要大量的硬件支持和系統(tǒng)開銷。3.3 803863.3 80386段頁(yè)機(jī)制上一節(jié),我們介紹了不同的存儲(chǔ)管理方法:頁(yè)式、段式和段頁(yè)式。這些方法的依據(jù)都是局部性原理,區(qū)別在于存儲(chǔ)空間的劃分和映射方法。這些管理方法都需要一定的硬件支持。本節(jié),針對(duì)Linux系統(tǒng)的主要平臺(tái)之一Intel80386(簡(jiǎn)稱1386)系統(tǒng),介紹該系統(tǒng)的段頁(yè)式硬件支持機(jī)制。3.3.1實(shí)模式與保護(hù)模式80386是Intel公司推出的32位CISC芯片,此后,該公司又相繼推出80486、Pentium(P5)>PentiumPro.PH、PHI等ー系列向下兼容的32位芯片。本節(jié)討論的特點(diǎn)是針對(duì)以1386為代表的整個(gè)芯片系歹リ。1386有兩種工作模式,實(shí)地址模式和虛擬地址模式,后者又稱保護(hù)模式。實(shí)地址模式與早期的8086兼容,不能啟用分頁(yè)機(jī)制,不區(qū)分特權(quán)級(jí),分段機(jī)制也受到限制,直接尋址方式,只能尋址1MB。1386的保護(hù)模式支持分段機(jī)制,整個(gè)虛擬空間可以劃分為16K個(gè)段,每個(gè)段的大小可變,最大能夠達(dá)到4GB,每個(gè)段可以提供獨(dú)立的段內(nèi)保護(hù),支持二級(jí)分頁(yè)機(jī)制,每個(gè)頁(yè)面4KB,提供段頁(yè)式存儲(chǔ)管理的硬件支持。同時(shí),在同一個(gè)任務(wù)內(nèi)部,還提供4種(0?3)保護(hù)特權(quán)級(jí),某ー級(jí)特權(quán)i只可以訪問所有其他大于等于這ー特權(quán)級(jí)(>i)的程序段。3.3.2地址空間在1386體系結(jié)構(gòu)中,提供段頁(yè)式存儲(chǔ)管理的硬件支持,和內(nèi)存管理有關(guān)的地址空間包括邏輯地址空間、線性地址空間和物理地址空間,在存儲(chǔ)過程中,要經(jīng)過相對(duì)獨(dú)立的兩級(jí)地址變換。第一級(jí)使用分段機(jī)制,把包含段地址和段內(nèi)偏移地址的二維虛擬地址空間轉(zhuǎn)換為ー個(gè)線性地址空間(也是虛擬地址空間),第二級(jí)使用分頁(yè)機(jī)制,把線性地址空間轉(zhuǎn)換為物理地址空間。這種轉(zhuǎn)換關(guān)系可以用圖3.3來描述。UAUNI拿B:線性地址空阿物理地址空間虛擬地址空間UAUNI拿B:線性地址空阿物理地址空間虛擬地址空間圖3.3地址映射關(guān)系示意圖虛擬地址空間到線性地址空間的轉(zhuǎn)換關(guān)系由段描述符表(簡(jiǎn)稱段表)來描述,段表的每ー個(gè)數(shù)據(jù)項(xiàng)記錄ー個(gè)段到線性地址的關(guān)系,段表存放在線性地址空間中。線性地址空間到物理空間的轉(zhuǎn)換關(guān)系由頁(yè)表描述,頁(yè)表存放在物理地址空間中。每個(gè)虛擬地址空間(16K個(gè)段)可以分為相等的兩個(gè)部分,一半稱為全局虛擬地址空間,由全局段描述符表(GlobalDescriptorLabel,GDT)映射,另一半稱為局部虛擬地址空間,由局部段描述符表(LocalDescriptorLabel,LDT)映射。系統(tǒng)中所有進(jìn)程共享一個(gè)全局段表(GDT),而每ー個(gè)進(jìn)程都有自己的局部段表(LDT)。當(dāng)進(jìn)程發(fā)生切換時(shí),GDT不變,而LDT更新為正在執(zhí)行進(jìn)程的LDT,因此,所有進(jìn)程共享GDT所映射的物理地址空間,每ー個(gè)進(jìn)程都有自己?jiǎn)为?dú)的地址空間(由LDT描述)〇線性地址空間劃分為大小相等的頁(yè),每頁(yè)為4KB,與之對(duì)應(yīng)的物理地址空間劃分為大小相等的頁(yè)面,頁(yè)面的大小也是4KB。1386體系結(jié)構(gòu)采用二級(jí)分頁(yè)機(jī)制,線性地址到物理地址的映射使用一個(gè)二級(jí)頁(yè)表,二級(jí)表中的第一級(jí)稱為頁(yè)目錄,每個(gè)頁(yè)目錄項(xiàng)指向一個(gè)二級(jí)表,這個(gè)二級(jí)表就是ー個(gè)頁(yè)表,每ー個(gè)表項(xiàng)記錄該表對(duì)應(yīng)的表架的基地址,這個(gè)基地址和偏移量一起就構(gòu)成整個(gè)物理地址。3.4 Linux存儲(chǔ)管理3.4 Linux存儲(chǔ)管理Linux系統(tǒng)本身采用段頁(yè)式存儲(chǔ)管理,使用最小限度的段機(jī)制和三級(jí)分頁(yè)機(jī)制。在1386保護(hù)模式下,系統(tǒng)可以獲得大容量的虛擬存儲(chǔ),并且在各進(jìn)程之間實(shí)現(xiàn)有效的存儲(chǔ)共享和保護(hù)。段頁(yè)設(shè)置Linux系統(tǒng)最低限度地使用1386體系的分段機(jī)制,把整個(gè)虛擬地址空間直接映射為線性地址空間,ー個(gè)虛擬空間只包含ー個(gè)段,段的大小為4GB。也就是說,ー個(gè)進(jìn)程最大可以占有4GB的空間。Linux2.2.16及以前的版本,在全局段表(GDT)中,每ー個(gè)進(jìn)程(每一個(gè)虛擬地址空間)有兩個(gè)靜態(tài)的表項(xiàng),其中一項(xiàng)是進(jìn)程的任務(wù)狀態(tài)段(TaskStatusSegment,TSS),這項(xiàng)記錄著進(jìn)程切換過程中的CPU現(xiàn)場(chǎng)狀態(tài),另外一項(xiàng)是局部段表(LDT),LDT項(xiàng)是這個(gè)進(jìn)程對(duì)應(yīng)的局部段表的入口。而每個(gè)進(jìn)程的局部段表中只有三個(gè)表項(xiàng),ー個(gè)空表項(xiàng)、ー個(gè)用戶數(shù)據(jù)段和一個(gè)用戶代碼段,用戶數(shù)據(jù)和代碼都從地址0開始,大小為3GB,稱為用戶空間。所有進(jìn)程的3GB?4GB線性空間,都由系統(tǒng)共享,存放系統(tǒng)數(shù)據(jù)段和系統(tǒng)代碼段,稱為內(nèi)核空間。Linux系統(tǒng)使用1386提供的四級(jí)保護(hù)機(jī)制中的兩級(jí),0級(jí)由系統(tǒng)內(nèi)核使用,而3級(jí)由用戶程序使用。Linux內(nèi)核存儲(chǔ)在內(nèi)核空間。用戶進(jìn)程有各自的虛擬地址空間,都使用從。?3GB的線性空間,而內(nèi)核空間映射到每一個(gè)用戶線性空間的3GB?4GB的地方,由所有進(jìn)程共享。根據(jù)硬件提供的保護(hù)機(jī)制,處于內(nèi)核空間的內(nèi)核代碼可以訪問正在執(zhí)行進(jìn)程的用戶空間。用戶空間的代碼只能訪問本空間的內(nèi)容,不能直接訪問內(nèi)核空間的內(nèi)容,用戶進(jìn)程只能通過中斷或者系統(tǒng)調(diào)用訪問內(nèi)核空間,這時(shí),觸發(fā)硬件的特權(quán)級(jí)轉(zhuǎn)換(由3級(jí)轉(zhuǎn)換為〇級(jí)),操作系統(tǒng)轉(zhuǎn)入內(nèi)核空間中執(zhí)行,執(zhí)行完畢后,依靠硬件設(shè)置實(shí)現(xiàn)再次切換,重新進(jìn)入用戶空間。用戶空間之間除了特定的共享空間之外,不可以相互訪問,這就比較方便地實(shí)現(xiàn)了存儲(chǔ)共享和保護(hù)。整個(gè)線性空間通過分頁(yè)的方式映射到物理空間。每頁(yè)大小為4KB,因此整個(gè)4GB的線性空間可以分為1K(1024)個(gè)頁(yè)(page),Linux系統(tǒng)采用三級(jí)分頁(yè)機(jī)制,對(duì)頁(yè)建立三級(jí)索引,分別稱為頁(yè)目錄(pagedirectory)頁(yè)中間目錄(pagemiddledirectory)和頁(yè)表(pagetable)〇由于1386體系結(jié)構(gòu)的E宣缶リ,在1386平臺(tái)上的Linux系統(tǒng)采用兩級(jí)頁(yè)索引,頁(yè)目錄和頁(yè)中間目錄合二為ー。地址映射Linux系統(tǒng)的虛擬空間分為連續(xù)的段,分別為用戶空間和內(nèi)核空間,直接映射到線性空間中。在地址變換過程中,主要考慮線性空間到物理空間的映射關(guān)系。在1386平臺(tái)上的Linux系統(tǒng)采用兩級(jí)頁(yè)索引,為頁(yè)目錄和頁(yè)表。線性空間的頁(yè)和物理空間的基本單位頁(yè)面(pageframe)之間存在對(duì)應(yīng)關(guān)系,這種關(guān)系用頁(yè)表(pagetable)來描述,每個(gè)頁(yè)在頁(yè)表中占ー項(xiàng),每ー項(xiàng)為4字節(jié),要描述整個(gè)線性空間,頁(yè)表要4MB。把所有頁(yè)表也劃分為4KB為單位的頁(yè),共有1K個(gè)這樣的頁(yè),這些頁(yè)的地址采用頁(yè)目錄(pagedirectory)來記錄,頁(yè)目錄的每ー項(xiàng)描述巧可尸]ッ〉' ,)/、ド"F尸?2y''z產(chǎn);、Fr存放頁(yè)表的ー個(gè)頁(yè)與實(shí)際頁(yè)面的對(duì)應(yīng)關(guān)系,每ー項(xiàng)也占用4字節(jié)。這樣,描述整個(gè)線性地址空間需要的頁(yè)目錄占用ー頁(yè)。線性地址由三個(gè)部分組成,分別為頁(yè)目錄索引、頁(yè)表索引和頁(yè)內(nèi)偏移地址。第一部分頁(yè)目錄索引描述要訪問地址在頁(yè)目錄表中的位置,通過這個(gè)索引,就可以得到ー個(gè)記錄頁(yè)表的內(nèi)存單元;第二部分頁(yè)表索引描述待訪問地址在頁(yè)表中的位置,通過查找頁(yè)表,就得到待訪問地址所在的頁(yè)面;第三個(gè)部分頁(yè)內(nèi)偏移地址,描述待訪問地址相對(duì)于頁(yè)面基地址的偏移量。根據(jù)這三部分資料,就可以訪問到內(nèi)存中相應(yīng)的內(nèi)容。整個(gè)線性地址包括32位,其中頁(yè)暮玄自1暮玄自1臓‘儂UNlVEBSiTYPR,目錄索引和頁(yè)表索引各占10位,尋址范圍為1K,正好是頁(yè)表和頁(yè)目錄表的大小,而頁(yè)內(nèi)偏移地址占12位,尋址范圍為4K,等于頁(yè)的大小。這種地址變換可以參看圖3.4。四??イ?1■ユエ丫?,三鮑學(xué)出腕線性地址四??イ?1■ユエ丫?,三鮑學(xué)出腕線性地址圖3.4Linux在1386平臺(tái)的地址變換從上面的描述可以看到,要訪問內(nèi)存中的某ー內(nèi)容,通過地址變換,首先查找頁(yè)目錄表,接著查找頁(yè)表,最后才能訪問到真正存放的數(shù)據(jù),整個(gè)過程要三次訪問物理內(nèi)存,因此,記錄ー個(gè)進(jìn)程中經(jīng)常訪問頁(yè)的地址的快表(translationlookasidebuffer)是必不可少的。地址變換過程中,首先訪問快表,如果該頁(yè)表項(xiàng)存在于快表中,就可以直接得到對(duì)應(yīng)的頁(yè)面號(hào),如果不在快表中,再去查找頁(yè)目錄表和頁(yè)表。共享與保護(hù)Linux系統(tǒng)的每ー個(gè)進(jìn)程擁有4GB的虛擬空間,這個(gè)空間也就是線性空間,在1386系統(tǒng)下,對(duì)應(yīng)為1K個(gè)大小為4KB的頁(yè)。其中〇?767個(gè)頁(yè)對(duì)應(yīng)的3GB空間為用戶空間。而3GB?4GB的區(qū)域映射為系統(tǒng)空間。實(shí)際上,整個(gè)物理內(nèi)存被映射到從3G(OxcOOOOOOO)開始的一段線性空間中,在啟動(dòng)過程中,這個(gè)區(qū)域的頁(yè)目錄和頁(yè)表首先建立,也就是說,整個(gè)物理內(nèi)存從啟動(dòng)開始就處于內(nèi)核態(tài),由系統(tǒng)所控制。所有物理內(nèi)存可以由內(nèi)核頁(yè)目錄和內(nèi)核頁(yè)表來尋址,這種關(guān)系是固定不變的,而且對(duì)于每ー個(gè)虛擬空間都相同,這ー方面保證了系統(tǒng)對(duì)物理內(nèi)存的快速訪問和有效控制,另一方面也保證了所有進(jìn)程可以共享系統(tǒng)空間。進(jìn)程對(duì)系統(tǒng)空間的共享是在嚴(yán)格的限制下進(jìn)行的,這種限制利用了1386提供的特權(quán)級(jí)保護(hù)機(jī)制。進(jìn)程的虛擬空間包括了系統(tǒng)(內(nèi)核)空間和用戶空間兩個(gè)部分,它們分別處于不同的特權(quán)級(jí)。內(nèi)核空間特權(quán)級(jí)為0,進(jìn)程執(zhí)行這個(gè)空間的指令,稱為處于內(nèi)核態(tài)(或者系統(tǒng)態(tài));用戶空間的特權(quán)級(jí)為3,進(jìn)程執(zhí)行這個(gè)空間的指令,稱為處于用戶態(tài)。用戶態(tài)和核心態(tài)是同一進(jìn)程的兩種不同運(yùn)行模式,進(jìn)程在用戶態(tài)和核心態(tài)執(zhí)行時(shí)分別訪問位于用戶空間和核心空間的堆棧和數(shù)據(jù)結(jié)構(gòu)。處于內(nèi)核態(tài)的進(jìn)程可以訪問同一進(jìn)程的用戶空間,反之則不可以訪問。やア!t} J'/-yvi野1產(chǎn)y*Ppz>fア0"ア?^^^"ー個(gè)進(jìn)程可以在這兩種不同的特權(quán)級(jí)之間切換,用戶態(tài)通過中斷或函數(shù)調(diào)用就可以轉(zhuǎn)入系統(tǒng)態(tài),執(zhí)行內(nèi)核空間的指令。而從系統(tǒng)態(tài)切換到用戶態(tài),則需要一定的硬件支持。在進(jìn)程建立之后,首先建立頁(yè)目錄,然后系統(tǒng)根據(jù)實(shí)際需要,動(dòng)態(tài)地分配一部分物理內(nèi)存,建立用戶頁(yè)表、頁(yè)表項(xiàng)以及相應(yīng)的頁(yè)目錄項(xiàng),進(jìn)程在用戶空間中將根據(jù)這些值來尋址,訪問物理內(nèi)存。在獲得一部分內(nèi)存之后,用戶進(jìn)程即可以開始執(zhí)行,執(zhí)行的過程中,當(dāng)進(jìn)程訪問到還沒有映射在內(nèi)存中的頁(yè)時(shí),進(jìn)程發(fā)出頁(yè)面請(qǐng)求,操作系統(tǒng)オ根據(jù)需要把放在外存中的頁(yè)的內(nèi)容傳送到內(nèi)存,同時(shí)建立內(nèi)存頁(yè)面與進(jìn)程頁(yè)的映射關(guān)系。每個(gè)進(jìn)程虛擬空間中的0~3GB分別采用不同的映射關(guān)系,映射到不同的物理空間,虛擬空間之間是不可以互相訪問的,這就起到對(duì)進(jìn)程內(nèi)的數(shù)據(jù)和程序保護(hù)的作用。進(jìn)程之間的共享是必不可少的,如果我們同時(shí)開兩個(gè)vi的編輯窗口,它們都運(yùn)行同樣的程序代碼,分別屬于兩個(gè)不同的進(jìn)程,對(duì)應(yīng)于不同的編輯文本(操作數(shù)據(jù)),如果分別給兩個(gè)進(jìn)程開兩塊存儲(chǔ)空間,存放同樣的程序代碼,顯然是對(duì)有限內(nèi)存資源的極大浪費(fèi),不同的進(jìn)程共享使用相同的內(nèi)存代碼是最好的解決辦法。Linux進(jìn)程間的共享是通過把不同虛擬空間中不同的頁(yè)映射到物理空間中同一頁(yè)面來實(shí)現(xiàn)的,參看圖3.5〇頁(yè)日求UAUNI線性地址空間海;報(bào)項(xiàng):生絶:頁(yè)表分頁(yè)頁(yè)日錄頁(yè)頁(yè)日求UAUNI線性地址空間海;報(bào)項(xiàng):生絶:頁(yè)表分頁(yè)頁(yè)日錄頁(yè)表分頁(yè)線性地址》澗圖3.5Linux頁(yè)面共享結(jié)構(gòu)示意圖在圖3.5中,兩個(gè)進(jìn)程分別擁有自己的頁(yè)目錄和頁(yè)表,而頁(yè)表中,對(duì)應(yīng)于不同進(jìn)程的頁(yè)號(hào)指向內(nèi)存中同樣的頁(yè)面,這樣,同一個(gè)物理頁(yè)面映射為不同虛擬空間中不同的頁(yè),兩個(gè)進(jìn)程都可以根據(jù)自己的地址映射關(guān)系訪問同一塊內(nèi)存,實(shí)現(xiàn)了內(nèi)存的共享。這樣的共享方式實(shí)現(xiàn)簡(jiǎn)單,易于理解,也不占額外的物理內(nèi)存,但是,一旦共享頁(yè)面的狀態(tài)或者內(nèi)容發(fā)生變化,所有共享該頁(yè)面的進(jìn)程的頁(yè)表都要修改,這就需要多次訪問內(nèi)存,影響系統(tǒng)的效率。Linux系統(tǒng)還采用保護(hù)技術(shù),實(shí)現(xiàn)進(jìn)程用戶空間內(nèi)部不同存儲(chǔ)段之間的保護(hù)。在系統(tǒng)運(yùn)行期間,進(jìn)程之間存儲(chǔ)共享可以節(jié)約大量的存儲(chǔ)空間,同時(shí)可以提高系統(tǒng)的整體效率,但是,共享必須在保證安全的前提下進(jìn)行,這就需要必要的保護(hù)措施。虛擬空間劃分為系統(tǒng)空間和用戶空間,按照一定的映射規(guī)則與物理空間建立聯(lián)系,系統(tǒng)多個(gè)進(jìn)程之間共享整個(gè)系統(tǒng)空間,多個(gè)用戶進(jìn)程也可以共享一段物理內(nèi)存。在Linux系統(tǒng)中,用戶空間和系統(tǒng)空間的共享、不同進(jìn)程用戶空間之間的共享以及進(jìn)程用戶空間的虛擬存儲(chǔ)段,都可以得到有效的保護(hù)。3.4.4分配與回收系統(tǒng)開始運(yùn)行時(shí),整個(gè)物理內(nèi)存都映射到內(nèi)核空間,由內(nèi)核根據(jù)需要進(jìn)行物理內(nèi)存頁(yè)面的分配或釋放。用戶進(jìn)程建立時(shí),分配相應(yīng)的內(nèi)存頁(yè)面并建立用戶進(jìn)程虛擬空間與所分配頁(yè)面的映射關(guān)系,在進(jìn)程執(zhí)行過程中,還要針對(duì)實(shí)際情況,動(dòng)態(tài)地分配和回收頁(yè)面,進(jìn)程進(jìn)入僵死狀態(tài)后,除了進(jìn)程控制塊(PCB)所占據(jù)的頁(yè)面之外的所有內(nèi)存都釋放,最后PCB釋放,進(jìn)程終止。因此,物理頁(yè)面的分配和釋放機(jī)制及其相關(guān)數(shù)據(jù)結(jié)構(gòu)是操作系統(tǒng)虛擬存儲(chǔ)管理的關(guān)鍵部分。在執(zhí)行過程中,每ー個(gè)進(jìn)程要記錄自己使用的所有頁(yè)面以及它們的映射關(guān)系(頁(yè)表和頁(yè)目錄),這些信息以指針的形式記錄在進(jìn)程的PCB中。同時(shí),系統(tǒng)對(duì)所有內(nèi)存的使用情況也要做精確的記錄,這是內(nèi)存進(jìn)一步分配和回收的依據(jù)。.空閑頁(yè)面表示Linux主要采用Buddy(伙伴)算法有效分配和釋放物理頁(yè)面。系統(tǒng)的頁(yè)面分配和回收都是以2的k次幕(0<k<NR-MEM-LISTS-l,整數(shù))個(gè)頁(yè)面為單位,稱為頁(yè)塊,也就是說以1頁(yè)、2頁(yè),直至リ2NR?MEM-LISTS」頁(yè)大小的頁(yè)塊為單位連續(xù)分配。具體來講,對(duì)于1386系統(tǒng),在2.2.16版本中,NR-MEM?LISTS默認(rèn)值等于10,在文件mm/page?alloc.c中定義,每個(gè)頁(yè)面大小固定(為4KB),所以,內(nèi)存分配的最小單位是4KB,最大為2MB(29x4KB)〇Linux的空閑物理頁(yè)面分配采用鏈表和位圖結(jié)合的記錄方法。系統(tǒng)定義了一個(gè)稱為free-area的數(shù)組,數(shù)組的大小為NR-MEM?LISTS。free-area數(shù)組的每ー個(gè)元素都包含一個(gè)空閑頁(yè)塊雙向鏈表的頭指針和一個(gè)位圖map,描述某ー種頁(yè)塊的空閑情況。每ー個(gè)數(shù)組元素對(duì)應(yīng)的鏈表,記錄2k大小頁(yè)塊的信息,k為數(shù)組元素的下標(biāo)。具體來講,第一個(gè)元素(下標(biāo)為0)描述單個(gè)空閑頁(yè)的信息,第二個(gè)元素(下標(biāo)為1)則描述以2個(gè)頁(yè)為ー個(gè)塊的空閑頁(yè)塊,第三個(gè)元素(下標(biāo)為2)描述以4個(gè)頁(yè)為ー個(gè)塊的頁(yè)塊信息。free?area數(shù)組的元素記錄雙向鏈表的頭指針,而雙向鏈表的每個(gè)節(jié)點(diǎn)包含空閑頁(yè)塊的起始物理頁(yè)幀編號(hào)。free-area數(shù)組的元素中包含的位圖map記錄這種頁(yè)塊的具體分配使用情況,位圖中的某一位置L則表示對(duì)應(yīng)的頁(yè)塊被使用。這樣,所有單個(gè)空閑頁(yè)面組成的雙向鏈表掛在free?area數(shù)組的0號(hào)元素之后,所有2k頁(yè)面大小的空閑塊組成的雙向鏈表掛在free-area數(shù)組的k號(hào)元素之后,同時(shí),每ー個(gè)空閑塊的使用情況可以通過對(duì)應(yīng)的位圖描述。這種關(guān)系示意性地描述在圖3.6的左半部分。map———空閑塊frc^aiva圜1空map———空閑塊frc^aiva圜1空閑貞01使用頁(yè)圖3.6Linux系統(tǒng)空閑內(nèi)存示意圖在圖3.6中,如果物理內(nèi)存中某一部分的空閑情況如圖右半部分所示,free-area數(shù)組的0號(hào)元素描述大小為1頁(yè)的空閑頁(yè)塊,那么第8號(hào)頁(yè)面就是free-area數(shù)組的。號(hào)元素所對(duì)應(yīng)的雙向鏈表的頭接點(diǎn)。同理,第5號(hào)和第〇號(hào)頁(yè)面分別是free?area數(shù)組的1號(hào)元素和2號(hào)元素所對(duì)應(yīng)的雙向鏈表的頭接點(diǎn)。free-area數(shù)組的k號(hào)元素所對(duì)應(yīng)的第N位為1,則表明該元素對(duì)應(yīng)的鏈表中第N個(gè)頁(yè)塊是空閑的,這個(gè)頁(yè)塊的大小就是2k個(gè)頁(yè)面。從圖中也可以看到,free-area數(shù)組的各元素所記錄的頁(yè)塊大小各不相同,從小到大依次是兩倍的關(guān)系,同時(shí)對(duì)應(yīng)用來記錄頁(yè)塊分配情況的位圖大小也各不相同,free-area數(shù)組元素號(hào)越大,頁(yè)塊越大,頁(yè)塊的數(shù)目就越小,而相應(yīng)的位圖也越小。.頁(yè)面分配與回收Linux采用Buddy算法來分配和回收物理頁(yè)面,每次處理都是以2k(0<k<NR-MEM-LISTS4,整數(shù))個(gè)頁(yè)面為單位。分配頁(yè)面采用最先適應(yīng)算法,當(dāng)要分配ー塊內(nèi)存時(shí),首先確定需要內(nèi)存的大小,如果需要的內(nèi)存在2k到2k+l(0<k<NR-MEM-LISTS-L整數(shù))個(gè)頁(yè)面大小之間時(shí),系統(tǒng)要為它分配的頁(yè)面就是2k+l個(gè),系統(tǒng)在free-area數(shù)組中搜索從第k+1個(gè)元素對(duì)應(yīng)的雙向鏈表中開始搜索,找不到時(shí)再搜索第k+2個(gè)元素對(duì)應(yīng)的雙向鏈表,直到找到大于或等于要求尺寸的最小塊的信息。如果找到的空閑塊正好是2k+l個(gè)頁(yè)面時(shí),直接從free-area刪除該塊,返回首地址,如果找到的空閑塊大于所需要的頁(yè)面,則把空閑塊一分為二,前半部分插入free-area數(shù)組前ー個(gè)元素所指的鏈表中,取后半部分,如果后半部分還大,繼續(xù)對(duì)半劃分,直到分得的后半部分等于需要的頁(yè)面為止。頁(yè)面分配之后,對(duì)應(yīng)的各位圖的位也要相應(yīng)設(shè)置。Linux采用的這種分配算法稱為最先適應(yīng)算法。隨著頁(yè)塊的不斷分配,系統(tǒng)的內(nèi)存逐步被劃分為一個(gè)個(gè)小的塊,這些塊有些正在使用,而另外一部分則是空閑塊,但是連續(xù)可用的塊卻越來越少,這種情況稱為內(nèi)存的碎片化。因此,物理頁(yè)塊使用完之后要及時(shí)回收,而在回收空閑塊的同時(shí),還應(yīng)當(dāng)將小的空閑頁(yè)塊重新組合成大的頁(yè)塊。Linux系統(tǒng)回收空閑塊時(shí),根據(jù)位圖表對(duì)應(yīng)的值判斷回收塊相鄰位置的頁(yè)塊是否空閑,如果和回收的頁(yè)塊大小相等的相鄰頁(yè)塊剛好是空閑的,則可以把這兩個(gè)頁(yè)塊組合成一個(gè)大的頁(yè)塊,這ー過程一直繼續(xù),直到這個(gè)大頁(yè)塊的相鄰塊不等于這個(gè)塊或者正在使用為止,這時(shí)還要修改對(duì)應(yīng)的位圖值,并把這個(gè)大的頁(yè)塊插入到free-area數(shù)組對(duì)應(yīng)元素所指的鏈表中。Linux采用的Buddy算法可以實(shí)現(xiàn)內(nèi)存的快速分配和回收,同時(shí)也能夠有效地處理內(nèi)存碎片化問題,總體效率比較高。但是,它對(duì)內(nèi)存的快速分配是建立在內(nèi)存需求量是2的整數(shù)累個(gè)頁(yè)面的基礎(chǔ)上的,如果很不巧,我們需要的內(nèi)存量是33KB,根據(jù)Buddy算法,在1386系統(tǒng)中,實(shí)際分配的是16個(gè)連續(xù)的頁(yè)面(64KB),大約50%的內(nèi)存就浪費(fèi)掉Jo 暮玄自1暮玄自1臓‘儂UNlVEBSiTYPR,在整個(gè)分配過程中,這樣隱性的內(nèi)存浪費(fèi)量是相當(dāng)驚人的。因此,可以說,這種算法內(nèi)存分配和回收的高效率是通過犧牲系統(tǒng)內(nèi)存資源的利用率換來的。3.5小結(jié)Linux操作系統(tǒng)可以統(tǒng)ー管理內(nèi)存和外存,實(shí)現(xiàn)邏輯上的大容量虛擬存儲(chǔ)空間。利用這樣的技術(shù),系統(tǒng)有限的物理存儲(chǔ)區(qū)域中可以存放更多的進(jìn)程,這些進(jìn)程輪流使用處理機(jī),實(shí)現(xiàn)系統(tǒng)整體效率的大幅度提高。進(jìn)程的執(zhí)行過程中,某ー個(gè)特定的時(shí)間段中,CPU總是集中地訪問程序或數(shù)據(jù)的某ー個(gè)部分,這種規(guī)律稱為局部性原理,這個(gè)原理是虛擬存儲(chǔ)實(shí)現(xiàn)的依據(jù)。根據(jù)這一原理,把進(jìn)程的虛擬空間劃分為ー個(gè)個(gè)小的部分,首先只把系統(tǒng)所必需的部分?jǐn)?shù)據(jù)裝入內(nèi)存,其余部分就放在外存中,開始運(yùn)行之后,再根據(jù)進(jìn)程執(zhí)行情況把所需要的其他部分換入內(nèi)存,同時(shí)把不再需要的部分從內(nèi)存中換到硬盤或者清除掉。與這樣的方式相配合,物理內(nèi)存也劃分為對(duì)應(yīng)的小部分。不同的虛擬空間和物理空間劃分方法得到不同的存儲(chǔ)管理方法,常用的能夠?qū)崿F(xiàn)虛擬存儲(chǔ)的劃分方法有頁(yè)式、段式和段頁(yè)式。頁(yè)式管理把虛擬空間和物理空間劃分為大小相等的部分,分別稱為頁(yè)和頁(yè)面,以頁(yè)和頁(yè)面為單位進(jìn)行存儲(chǔ)管理;段式管理把虛擬空間按照程序固有的邏輯關(guān)系劃分為大小不等的段,每ー個(gè)段對(duì)應(yīng)程序的ー個(gè)邏輯單位,以段為單位進(jìn)行存儲(chǔ)管理;段頁(yè)式管理對(duì)虛擬空間先分段,再分頁(yè),最小單位是頁(yè),同時(shí)具有段式和頁(yè)式管理的優(yōu)點(diǎn),但是整個(gè)管理的系統(tǒng)開銷增大,而且還需要有硬件的支持。—B ヽ以1386為代表的向下兼容的一系列芯片在保護(hù)模式下,提供段頁(yè)式存儲(chǔ)管理的硬件支持。ー個(gè)虛擬空間可以劃分為16個(gè)段,最大的段可以達(dá)到4GB,同時(shí)支持分頁(yè)功能,頁(yè)面大小為4K,提供兩級(jí)頁(yè)表。同時(shí)提供0~3四個(gè)特權(quán)級(jí),對(duì)不同特權(quán)級(jí)運(yùn)行的進(jìn)程實(shí)現(xiàn)保護(hù)。Linux最低限度地使用1386系統(tǒng)的分段機(jī)制,使用〇(系統(tǒng)級(jí))和3(用戶級(jí))兩個(gè)特權(quán)級(jí)。每個(gè)虛擬空間是線性的,大小為4GB,分成用戶空間O~3GB和系統(tǒng)空間3GB?4GB兩個(gè)部分。所有系統(tǒng)空間都映射到同一段物理內(nèi)存,實(shí)現(xiàn)系統(tǒng)段共享,操作系統(tǒng)位于系統(tǒng)空間,以0級(jí)特權(quán)運(yùn)行,用戶進(jìn)程位于用戶空間,以3級(jí)特權(quán)運(yùn)行,使用頁(yè)目錄、頁(yè)表這兩級(jí)分頁(yè)機(jī)制。利用1386提供的硬件機(jī)制,Linux系統(tǒng)可以方便地實(shí)現(xiàn)系統(tǒng)空間和用戶空間之間、不同進(jìn)程用戶空間之間以及同一進(jìn)程用戶空間不同虛擬存儲(chǔ)段之間的共享和保護(hù)。Linux系統(tǒng)的空閑物理內(nèi)存的管理采取Buddy算法,管理內(nèi)存的最小單位是2的整數(shù)次幕個(gè)頁(yè)面大小,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度民營(yíng)醫(yī)院?jiǎn)T工安全生產(chǎn)教育與責(zé)任合同4篇
- 二零二五年度嬰幼兒奶粉進(jìn)口清關(guān)及倉(cāng)儲(chǔ)物流服務(wù)合同
- 二零二五年度民法典物權(quán)編在遺產(chǎn)繼承中的法律咨詢合同4篇
- 2025年度個(gè)人農(nóng)業(yè)生產(chǎn)經(jīng)營(yíng)質(zhì)押擔(dān)保貸款合同3篇
- 課題申報(bào)參考:面向國(guó)家重大戰(zhàn)略需求的博士生項(xiàng)目制培養(yǎng)模式研究
- 課題申報(bào)參考:馬來西亞華人音樂之存續(xù)與中華文化認(rèn)同建構(gòu)
- 二零二五年度木工行業(yè)安全生產(chǎn)責(zé)任保險(xiǎn)合同
- 2025年度個(gè)人與公司租賃合同稅費(fèi)承擔(dān)協(xié)議4篇
- 2025版門禁控制系統(tǒng)研發(fā)與定制服務(wù)合同4篇
- 2025年度個(gè)人股權(quán)贈(zèng)與與受贈(zèng)合同范本4篇
- JBT 14588-2023 激光加工鏡頭 (正式版)
- 2024年四川省成都市樹德實(shí)驗(yàn)中學(xué)物理八年級(jí)下冊(cè)期末質(zhì)量檢測(cè)試題含解析
- 九型人格與領(lǐng)導(dǎo)力講義
- 廉潔應(yīng)征承諾書
- 2023年四川省成都市中考物理試卷真題(含答案)
- 泵車述職報(bào)告
- 2024年山西文旅集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 恢復(fù)中華人民共和國(guó)國(guó)籍申請(qǐng)表
- 管理期貨的趨勢(shì)跟蹤策略 尋找危機(jī)阿爾法
- 瀝青化學(xué)分析試驗(yàn)作業(yè)指導(dǎo)書
- 腦出血的護(hù)理課件腦出血護(hù)理查房PPT
評(píng)論
0/150
提交評(píng)論