日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统-进程

發(fā)布時(shí)間:2025/4/16 windows 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统-进程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說明: 全文大部分都是《操作系統(tǒng)-精髓與設(shè)計(jì)原理 第八版》的原文,自己做了一些刪改,使其更易于理解。

如果說操作系統(tǒng)是圍繞進(jìn)程這一概念創(chuàng)建的,有些言過其實(shí),但進(jìn)程在操作系統(tǒng)中的地位也至少是舉足輕重的。

計(jì)算機(jī)的目的是要完成任務(wù),而任務(wù)的完成需要一個(gè)或者多個(gè)進(jìn)程的執(zhí)行。操作系統(tǒng)維護(hù)了這些進(jìn)程的運(yùn)行,因?yàn)檫M(jìn)程之間不但需要配合和調(diào)度,也需要使用計(jì)算機(jī)系統(tǒng)資源(操作系統(tǒng)抽象了計(jì)算機(jī)的系統(tǒng)資源,如文件系統(tǒng),內(nèi)存,網(wǎng)絡(luò)接口等等),使用相同的資源可能就會產(chǎn)生沖突,操作系統(tǒng)就需要調(diào)節(jié)。在第5節(jié),你將看到圍繞進(jìn)程實(shí)現(xiàn)的各種不同的操作系統(tǒng)的方法。

主要內(nèi)容:

  • 操作系統(tǒng)表示和控制進(jìn)程的方式
  • 進(jìn)程狀態(tài),進(jìn)程狀態(tài)描述進(jìn)程的行為特征
  • 操作系統(tǒng)表示每個(gè)進(jìn)程的狀態(tài)所需的數(shù)據(jù)結(jié)構(gòu)
  • 操作系統(tǒng)為實(shí)現(xiàn)其目標(biāo)所需要的進(jìn)程的其他特征
  • 操作系統(tǒng)使用這些數(shù)據(jù)結(jié)構(gòu)控制進(jìn)程的方式
  • 一個(gè)例子:UNIX SVR4中的進(jìn)程模型

1.什么是進(jìn)程

可以把進(jìn)程視為由一組元素組成的實(shí)體,進(jìn)程的兩個(gè)基本元素是:

  • 程序代碼
  • 代碼關(guān)聯(lián)的數(shù)據(jù)集

如果進(jìn)程處在運(yùn)行之中,又由以下元素來表征:

  • 標(biāo)識符
  • 狀態(tài)
  • 優(yōu)先級
  • 程序計(jì)數(shù)器
  • 內(nèi)存指針:包括程序代碼和進(jìn)程相關(guān)數(shù)據(jù)指針,以及與其他進(jìn)程共享內(nèi)存塊指針
  • 上下文數(shù)據(jù): 處理器寄存器中的值
  • I/O狀態(tài)信息
  • 記賬信息:包括處理器時(shí)間總和,使用的時(shí)鐘數(shù)總和,時(shí)間限制,記賬號
  • 以上信息存放在一個(gè)稱為進(jìn)程控制塊的數(shù)據(jù)結(jié)構(gòu)中,在后面我們將會看到進(jìn)程控制塊遠(yuǎn)不止只有這些信息。進(jìn)程控制塊由操作系統(tǒng)創(chuàng)建和管理。

    進(jìn)程由程序代碼及其相關(guān)數(shù)據(jù)以及進(jìn)程控制塊組成,稱為進(jìn)程映像。

    進(jìn)程控制塊包含了進(jìn)程的充分信息,計(jì)算機(jī)中斷后,會把程序計(jì)數(shù)器和處理器寄存器保存到進(jìn)程控制塊的相應(yīng)位置,如果不修改進(jìn)程狀態(tài),再次運(yùn)行的時(shí)候,程序計(jì)數(shù)器和處理器寄存器值恢復(fù)。

    2.進(jìn)程狀態(tài)

    在本節(jié)中我們將通過對進(jìn)程狀態(tài)的描述和探索,來建立一個(gè)進(jìn)程行為模型,并為操作系統(tǒng)實(shí)現(xiàn)提供系統(tǒng)方法。

    2.1 兩狀態(tài)進(jìn)程模型:

    我們知道進(jìn)程要么正在執(zhí)行要么不在執(zhí)行,所以我們可以構(gòu)建最簡單的模型,進(jìn)程可處于兩種狀態(tài):運(yùn)行態(tài)和未運(yùn)行態(tài)。那么我們就知道了,操作系統(tǒng)必須要以某種方式來表示每個(gè)進(jìn)程,使得操作系統(tǒng)可以跟蹤到它,這里給出了一個(gè)簡單的模型:

    圖中隊(duì)列元素指向某個(gè)進(jìn)程,等待著被調(diào)度執(zhí)行。這只是最簡單的操作系統(tǒng)進(jìn)程控制模型,我們知道這樣的模型是遠(yuǎn)遠(yuǎn)不夠的,在對兩狀態(tài)模型進(jìn)行改進(jìn)之前,我們來了解一下進(jìn)程的創(chuàng)建和終止,因?yàn)闊o論使用哪種模型,進(jìn)程的生存其都是圍繞著進(jìn)程的創(chuàng)建和終止。

    關(guān)于創(chuàng)建:

    進(jìn)程的創(chuàng)建過程:

    • 將一個(gè)新進(jìn)程添加到正被管理的進(jìn)程集。
    • 操作系統(tǒng)建立管理進(jìn)程的數(shù)據(jù)結(jié)構(gòu),并在內(nèi)存中分配地址空間。

    以上兩點(diǎn)構(gòu)成了進(jìn)程的創(chuàng)建過程,詳細(xì)過程可以查看4.2。

    觸發(fā)進(jìn)程創(chuàng)建的事件:

    • 新的批處理作業(yè):磁帶或磁盤中的批處理作業(yè)控制流通常會提供給操作系統(tǒng)。當(dāng)操作系統(tǒng)準(zhǔn)備接收新工作時(shí),將讀取下一個(gè)作業(yè)控制命令。
    • 交互登錄:終端用戶登錄到系統(tǒng)
    • 為提供服務(wù)而由操作系統(tǒng)創(chuàng)建:操作系統(tǒng)可以創(chuàng)建一個(gè)進(jìn)程,代表用戶程序執(zhí)行一個(gè)功能,使用戶無須等待(如控制打印的進(jìn)程)
    • 由現(xiàn)有進(jìn)程派生:基于模塊化的考慮或開發(fā)并行性,用戶程序可以指示創(chuàng)建多個(gè)進(jìn)程

    關(guān)于終止:

    任何一個(gè)計(jì)算機(jī)都必須為進(jìn)程提供表示其完成的方法。比如用戶結(jié)束一個(gè)應(yīng)用程序,將會給操作系統(tǒng)發(fā)出一個(gè)服務(wù)請求,以終止發(fā)出請求的進(jìn)程。進(jìn)程除了正常完成終止外,還包括
    程序內(nèi)部故障條件和錯(cuò)誤導(dǎo)致進(jìn)程終止:

    • 超過時(shí)限,無可用內(nèi)存,內(nèi)存訪問超出范圍,保護(hù)系統(tǒng)資源錯(cuò)誤,算術(shù)錯(cuò)誤,I/O失敗,無效指令,特權(quán)指令,數(shù)據(jù)誤用。

    外部干涉終止:

    • 操作員或操作系統(tǒng)干涉(如出現(xiàn)死鎖),父進(jìn)程終止,父進(jìn)程請求終止子進(jìn)程。

    2.2 五狀態(tài)進(jìn)程模型(改進(jìn)一):

    如果所有進(jìn)程都做好了執(zhí)行的準(zhǔn)備,那么兩狀態(tài)進(jìn)程模型給出的排隊(duì)原則是有效的,但是我們知道

    • 有些進(jìn)程可能在阻塞等待I/O之中,
    • 使用單個(gè)隊(duì)列的話,我們不能只考慮選擇隊(duì)列中最老的進(jìn)程,而是應(yīng)該掃描這個(gè)列表,選擇未被阻塞且在隊(duì)列中時(shí)間最長的進(jìn)程

    所以我們將兩狀態(tài)進(jìn)程模型中的非運(yùn)行態(tài)分為就緒態(tài)和阻塞態(tài),此外還增加了兩個(gè)很有用的狀態(tài),他們一共組成了以下五個(gè)狀態(tài):

  • 運(yùn)行態(tài):進(jìn)程正在執(zhí)行。本章中假設(shè)計(jì)算機(jī)只有一個(gè)處理器,因此一次最多只有一個(gè)進(jìn)程處于這一狀態(tài)。
  • 就緒態(tài):進(jìn)程做好了準(zhǔn)備,只要有機(jī)會就開始執(zhí)行。
  • 阻塞/等待態(tài):進(jìn)程在某些事件發(fā)生前不能執(zhí)行,如I/O操作完成。
  • 新建態(tài):剛剛創(chuàng)建的進(jìn)程,操作系統(tǒng)還未把它加入可執(zhí)行進(jìn)程組,它通常是進(jìn)程控制塊已經(jīng)創(chuàng)建但還未加載到內(nèi)存中的新進(jìn)程。
  • 退出態(tài):操作系統(tǒng)從可執(zhí)行進(jìn)程組中釋放出的進(jìn)程,要么它自身已停止,要么它因某種原因被取消。退出態(tài)為輔助程序(可能是統(tǒng)計(jì)進(jìn)程信息或則其他功能)提供了提取信息的時(shí)間,如果信息提取完成,那么將會從系統(tǒng)刪除進(jìn)程。
  • 這里再給給出圖中未畫出的兩種狀態(tài)轉(zhuǎn)換說明:

    • 就緒->退出:為清楚起見,狀態(tài)圖中未表示這種轉(zhuǎn)換。在某些系統(tǒng)中,父進(jìn)程可在任何時(shí)刻終止一個(gè)子進(jìn)程。如果父進(jìn)程終止,那么與該父進(jìn)程相關(guān)的所有子進(jìn)程都將被終止。
    • 阻塞->退出:前一項(xiàng)給出了注釋。

    對五狀態(tài)進(jìn)程模型的再改進(jìn):

    既然有了阻塞態(tài),為了更加高效的進(jìn)行進(jìn)程調(diào)度,我們可以維護(hù)兩個(gè)隊(duì)列:就緒隊(duì)列和阻塞隊(duì)列。進(jìn)入系統(tǒng)的每個(gè)進(jìn)程都放置在就緒隊(duì)列中,當(dāng)操作系統(tǒng)選擇另一個(gè)進(jìn)程運(yùn)行時(shí),將從就緒隊(duì)列中進(jìn)行選擇。對于無優(yōu)先級的方案,這可以是一個(gè)簡單的先進(jìn)先出隊(duì)列。當(dāng)一個(gè)正在運(yùn)行的進(jìn)程被移出處理器時(shí),它根據(jù)情況要么終止,要么放置在就緒或阻塞隊(duì)列中。最后,當(dāng)一個(gè)事件發(fā)生時(shí),所有位于阻塞隊(duì)列中等待該事件的進(jìn)程都被放到就緒隊(duì)列中。

    但是這里我們可以非常容易的想到在阻塞隊(duì)列中當(dāng)一個(gè)事件發(fā)生時(shí),操作系統(tǒng)必須掃描整個(gè)阻塞隊(duì)列,搜索那些等待該事件的進(jìn)程。在大型操作系統(tǒng)中,隊(duì)列中可能有幾百甚至幾千個(gè)進(jìn)程,此時(shí)擁有多個(gè)隊(duì)列將會很有效,一個(gè)事件可以對應(yīng)一個(gè)隊(duì)列。因此,事件發(fā)生時(shí),相應(yīng)隊(duì)列中的所有進(jìn)程都將轉(zhuǎn)換到就緒態(tài)。

    依照此思想,我們還可以維護(hù)多個(gè)就緒隊(duì)列,每個(gè)優(yōu)先級一個(gè)隊(duì)列,將會帶來很大的便利。操作系統(tǒng)很容易就可確定哪個(gè)就緒進(jìn)程具有最高優(yōu)先級且等待時(shí)間最長。

    2.3 進(jìn)程掛起態(tài)的加入(改進(jìn)二)

    交換的需要
    前面介紹的三個(gè)基本狀態(tài)(就緒態(tài)、運(yùn)行態(tài)和阻塞態(tài))提供了一種為進(jìn)程行為建立模型并指導(dǎo)操作系統(tǒng)實(shí)現(xiàn)的系統(tǒng)方法。許多實(shí)際的操作系統(tǒng)都是按照這三種狀態(tài)具體構(gòu)建的。

    但是,我們可以證明向模型中增加其他狀態(tài)也是合理的。為了說明加入新狀態(tài)的好處,考慮一個(gè)未使用虛存的系統(tǒng),每個(gè)被執(zhí)行的進(jìn)程必須完全載入內(nèi)存。

    回憶可知,機(jī)器變得復(fù)雜的原因是,I/O活動(dòng)遠(yuǎn)慢于計(jì)算速度使得單道程序系統(tǒng)中的處理器大多數(shù)時(shí)間處于空閑狀態(tài)。此時(shí),內(nèi)存中保存有多個(gè)進(jìn)程,當(dāng)一個(gè)進(jìn)程被阻塞時(shí),處理器可移向另一個(gè)進(jìn)程,但由于處理器遠(yuǎn)快于I/0,會出現(xiàn)內(nèi)存中的所有進(jìn)程都在等待I/O的現(xiàn)象。因此,即便是多道程序設(shè)計(jì),處理器多數(shù)時(shí)間仍可能處于空閑狀態(tài)。

    • 解決方案之一是擴(kuò)充內(nèi)存來容納更多的進(jìn)程,但這種方法有兩個(gè)缺點(diǎn)。首先是內(nèi)存的價(jià)格問題,當(dāng)內(nèi)存大小增加到兆位及千兆位時(shí),價(jià)格也會隨之增加;其次是程序?qū)?nèi)存空間需求的增長速度要快于內(nèi)存價(jià)格的下降速度。因此,更大的內(nèi)存往往會導(dǎo)致更大的進(jìn)程而非更多的進(jìn)程。

    • 解決方案之二是交換,即把內(nèi)存中某個(gè)進(jìn)程的一部分或全部移到磁盤中。當(dāng)內(nèi)存中不存在就緒態(tài)的進(jìn)程時(shí),操作系統(tǒng)就把被阻塞的進(jìn)程換出到磁盤中的掛起隊(duì)列(suspend queue),即臨時(shí)從內(nèi)存中“踢出”的進(jìn)程隊(duì)列。操作系統(tǒng)此后要么從掛起隊(duì)列中取出另一個(gè)進(jìn)程,要么接受一個(gè)新進(jìn)程的請求,將其放入內(nèi)存運(yùn)行。

    要使用前面介紹的交換,在進(jìn)程行為模型中必須增加另一個(gè)狀態(tài):掛起態(tài)。當(dāng)內(nèi)存中的所有進(jìn)程都處于阻塞態(tài)時(shí),操作系統(tǒng)可把其中的一個(gè)進(jìn)程置為掛起態(tài),并將它轉(zhuǎn)移到磁盤,此時(shí)內(nèi)存所釋放的空間就可被調(diào)入的另一個(gè)進(jìn)程使用。操作系統(tǒng)執(zhí)行換出操作后,將進(jìn)程取到內(nèi)存中的方式有兩種:接納一個(gè)新近創(chuàng)建的進(jìn)程,或調(diào)入一個(gè)此前掛起的進(jìn)程。顯然,操作系統(tǒng)傾向于調(diào)入一個(gè)此前掛起的進(jìn)程,并為它提供服務(wù),而非增加系統(tǒng)的總負(fù)載數(shù)。

    但這一推理也帶來了一個(gè)難題,即所有已被掛起的進(jìn)程都處于阻塞態(tài)。顯然,這時(shí)把被阻塞的進(jìn)程取回內(nèi)存沒有任何意義,因?yàn)樗匀晃醋龊脠?zhí)行的準(zhǔn)備。這時(shí)的進(jìn)程狀態(tài)轉(zhuǎn)換為:

    但是,由于每個(gè)掛起的進(jìn)程最初都阻塞在某個(gè)特定的事件上,因此發(fā)行該事件時(shí),進(jìn)程將不再阻塞而可以繼續(xù)執(zhí)行,因此我們可以使用兩個(gè)掛起態(tài),分別為就緒/掛起態(tài),阻塞/掛起態(tài)。這時(shí)的進(jìn)程狀態(tài)轉(zhuǎn)換為:

    在查看包含兩個(gè)新掛起態(tài)的狀態(tài)轉(zhuǎn)換圖前,必須注意迄今為止的論述都假設(shè)未使用虛存,進(jìn)程要么都在內(nèi)存中,要么都在內(nèi)存外。使用虛存中,可能會執(zhí)行只有部分內(nèi)容在內(nèi)存中的進(jìn)程,若訪問的進(jìn)程地址不在內(nèi)存中,則將進(jìn)程的相應(yīng)部分調(diào)入內(nèi)存。使用虛存看上去不需要顯式交換,因?yàn)橥ㄟ^處理器中的存儲管理硬件,任何進(jìn)程中的任何地址都可移入或移出內(nèi)存。然而,若活動(dòng)進(jìn)程很多,且所有的進(jìn)程都有一部分在內(nèi)存中時(shí),則可能會導(dǎo)致虛存系統(tǒng)崩潰。因此,即使是在虛存系統(tǒng)中,操作系統(tǒng)也需要不時(shí)地根據(jù)執(zhí)行情況完全顯式地?fù)Q出進(jìn)程。

    這里就以下幾個(gè)狀態(tài)轉(zhuǎn)換做出說明,其余請讀者自行理解:

    • 就緒 -> 就緒/掛起:通常,操作系統(tǒng)更傾向于掛起阻塞態(tài)進(jìn)程而非就緒態(tài)進(jìn)程,因?yàn)榫途w態(tài)進(jìn)程可以立即執(zhí)行,而阻塞態(tài)進(jìn)程雖然占用了內(nèi)存空間但不能執(zhí)行。若釋放內(nèi)存來得到足夠空間的唯一方法是掛起一個(gè)就緒態(tài)進(jìn)程,則這種轉(zhuǎn)換也是必需的。 此外,若操作系統(tǒng)確信高優(yōu)先級的阻塞態(tài)進(jìn)程很快將會就緒,則它可能會選擇掛起一個(gè)低優(yōu)先級的就緒態(tài)進(jìn)程,而非一個(gè)高優(yōu)先級的阻塞態(tài)進(jìn)程。
    • 阻塞/掛起 -> 阻塞:這種轉(zhuǎn)換在設(shè)計(jì)中很少見,原因是如果一個(gè)進(jìn)程未準(zhǔn)備好執(zhí)行且不在內(nèi)存中,調(diào)入它沒有意義。但此時(shí)要考慮如下情況:一個(gè)進(jìn)程終止后,會釋放一些內(nèi)存空間,而阻塞/掛起隊(duì)列中有一個(gè)進(jìn)程的優(yōu)先級要比就緒/掛起隊(duì)列中任何進(jìn)程的優(yōu)先級都高,并且操作系統(tǒng)有理由相信阻塞進(jìn)程的事件很快就會發(fā)生。這時(shí),把阻塞進(jìn)程而非就緒進(jìn)程調(diào)入內(nèi)存是合理的。
    • 運(yùn)行 -> 就緒/掛起:通常,當(dāng)一個(gè)運(yùn)行進(jìn)程的分配時(shí)間到期后,它將轉(zhuǎn)換到就緒態(tài)。但在阻塞/掛起隊(duì)列中具有較高優(yōu)先級的進(jìn)程不再被阻塞時(shí),操作系統(tǒng)會搶占這個(gè)進(jìn)程,或直接把這個(gè)運(yùn)行進(jìn)程轉(zhuǎn)換到就緒/掛起隊(duì)形中,并釋放一些內(nèi)存空間。
    • 各種狀態(tài) -> 退出:典型情況下,一個(gè)進(jìn)程的運(yùn)行終止,要么是它已完成運(yùn)行,要么是出現(xiàn)了一些錯(cuò)誤條件。但在某些操作系統(tǒng)中,進(jìn)程可被父進(jìn)程終止,或在父進(jìn)程終止時(shí)終止。若這種情況允許,則進(jìn)程在任何狀態(tài)下都可轉(zhuǎn)換到退出態(tài)。

    以上討論的是內(nèi)存的原因來掛起進(jìn)程,實(shí)際上它還有以下以及其他多種原因來掛起進(jìn)程,因此你也可以知道使用了掛起態(tài)的更多好處:

    • 其他OS原因:操作系統(tǒng)可能掛起后臺進(jìn)程或工具程序進(jìn)程,或掛起可能會導(dǎo)致問題的進(jìn)程(如死鎖)
    • 交互式用戶請求:用戶希望掛起一個(gè)程序的執(zhí)行,以便進(jìn)行調(diào)試或關(guān)聯(lián)資源的使用
    • 定時(shí):進(jìn)程可被周期性地執(zhí)行(如記賬或系統(tǒng)監(jiān)視進(jìn)程),并在等待下一個(gè)時(shí)間間隔時(shí)掛起
    • 父進(jìn)程請求:父進(jìn)程可能會希望掛起后代進(jìn)程的執(zhí)行,以檢查或修改掛起的進(jìn)程,或協(xié)調(diào)不同后代進(jìn)程之間的行為

    以上就是我們對進(jìn)程狀態(tài)的描述,以及我們最后構(gòu)造出的五狀態(tài)+兩掛起態(tài)進(jìn)程模型。操作系統(tǒng)可以依靠這個(gè)模型來構(gòu)建系統(tǒng)。那么操作系統(tǒng)要控制進(jìn)程在這些狀態(tài)之間轉(zhuǎn)換,需要哪些信息?接下來我們就將討論這一基本問題,要控制進(jìn)程并管理資源,操作系統(tǒng)需要哪些信息,即進(jìn)程的描述。

    3.進(jìn)程描述

    3.1操作系統(tǒng)的總體控制結(jié)構(gòu)

    操作系統(tǒng)為了管理進(jìn)程和資源,必須掌握每個(gè)進(jìn)程和資源的當(dāng)前狀態(tài)。普遍采用的方法是,操作系統(tǒng)構(gòu)造并維護(hù)其管理的每個(gè)實(shí)體的信息表。圖3.11給出了這種方法的大致范圍,即操作系統(tǒng)維護(hù)的4種不同類型的表:內(nèi)存、I/O、文件和進(jìn)程。盡管不同操作系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)不同,但所有操作系統(tǒng)維護(hù)的信息基本都可以分為這4類。

    • 內(nèi)存表(memory table):用于跟蹤內(nèi)(實(shí))存和外(虛)存。內(nèi)存的某些部分為操作系統(tǒng)保留,剩余部分供進(jìn)程使用,外存中保存的進(jìn)程使用某種虛存或簡單的交換機(jī)制。內(nèi)存表必須包含如下信息:
      ○ 分配給進(jìn)程的內(nèi)存。
      ○ 分配給進(jìn)程的外存。
      ○ 內(nèi)存塊或虛存塊的任何保護(hù)屬性,如哪些進(jìn)程可以訪問某些共享內(nèi)存區(qū)域。
      ○ 管理虛存所需要的任何信息。
    • I/O表:管理計(jì)算機(jī)系統(tǒng)中的I/O設(shè)備和通道。在任意給定時(shí)刻,某個(gè)I/O設(shè)備要么可用,要么已分配給特定的進(jìn)程。正在進(jìn)行I/0操作時(shí),操作系統(tǒng)需要知道I/O操作的狀態(tài),以及作為I/O傳送的源與目標(biāo)的內(nèi)存單元。
    • 文件表:操作系統(tǒng)還會維護(hù)文件表(file table)。文件表提供關(guān)于文件是否存在、文件在外存中的位置、當(dāng)前狀態(tài)和其他屬性的信息。大部分信息(非全部信息)可能由文件管理系統(tǒng)維護(hù)和使用。此時(shí),操作系統(tǒng)僅有少許或沒有關(guān)于文件的信息;在其他操作系統(tǒng)中,文件管理的許多細(xì)節(jié)由操作系統(tǒng)本身管理。
    • 進(jìn)程表:管理進(jìn)程,也是接下來的主要內(nèi)容

    3.2 操作系統(tǒng)的進(jìn)程控制結(jié)構(gòu)

    操作系統(tǒng)在管理和控制進(jìn)程時(shí),首先要知道進(jìn)程的位置,其次要知道進(jìn)程的屬性(如進(jìn)程ID、進(jìn)程狀態(tài))。

    進(jìn)程位置

    進(jìn)程位置在處理進(jìn)程位置和屬性問題前,首先要解決一個(gè)更基本的問題:進(jìn)程的物理表示是什么?進(jìn)程最少必須包括一個(gè)或一組被執(zhí)行的程序,而與這些程序相關(guān)聯(lián)的是局部變量、全局變量和任何已定義常量的數(shù)據(jù)單元。因此,一個(gè)進(jìn)程至少應(yīng)有足夠的內(nèi)存空間來保存其的程序和數(shù)據(jù)。此外,程序的執(zhí)行通常涉及用于跟蹤過程調(diào)用和過程間參數(shù)傳遞的棧。最后,還有與每個(gè)進(jìn)程相關(guān)的許多屬性,以便操作系統(tǒng)控制該進(jìn)程。通常,屬性集稱為進(jìn)程控制塊(process control block)。程序、數(shù)據(jù)、棧和屬性的集合稱為進(jìn)程映像(process image)。這就解決了進(jìn)程的物理內(nèi)容是說明,也就才能在存儲設(shè)備上有位置這一概念。

    進(jìn)程映像的位置取決于所用的內(nèi)存管理方案。在最簡單的情形下,進(jìn)程映像保存在相鄰的內(nèi)存塊中或連續(xù)的內(nèi)存塊中。存儲塊位于外存(通常是磁盤)中,因此在操作系統(tǒng)管理進(jìn)程時(shí),其進(jìn)程映像至少應(yīng)有一部分位于內(nèi)存中。而要執(zhí)行該進(jìn)程,則必須將整個(gè)進(jìn)程映像載入內(nèi)存中或至少載入虛存中。因此,操作系統(tǒng)需要知道每個(gè)進(jìn)程在磁盤中的位置,并知道每個(gè)進(jìn)程在內(nèi)存中的位置。這在涉及到虛擬內(nèi)存的時(shí)候更加復(fù)雜。

    圖3.11(上圖)給出了位置信息的結(jié)構(gòu)。有一個(gè)主進(jìn)程表,每個(gè)進(jìn)程在主進(jìn)程表中都有一個(gè)表項(xiàng),每個(gè)表項(xiàng)至少包含一個(gè)指向進(jìn)程映像的指針。如果進(jìn)程映像包括多個(gè)塊,則這一信息直接包含在主進(jìn)程表中,或通過交叉引用內(nèi)存表中的表項(xiàng)得到。當(dāng)然,這種描述是一般性描述,不同操作系統(tǒng)會按自身的方式來組織位置信息。

    進(jìn)程屬性

    由之前的敘述我們知道,進(jìn)程屬性保存在進(jìn)程控制塊之中。這里我們就簡要的介紹操作系統(tǒng)將會用到的信息。

    進(jìn)程控制塊信息分為三類:

    • 進(jìn)程標(biāo)識信息
    • 進(jìn)程狀態(tài)信息
    • 進(jìn)程控制信息

    下圖是虛擬內(nèi)存中的進(jìn)程映像,雖然這里看起來是連續(xù)的,但是實(shí)際上可能并非如此,但是對于程序編寫者而言,這樣理解進(jìn)程的地址結(jié)構(gòu)就可以了,其他的操作系統(tǒng)會幫我們搞定。

    此外我們可以看到在進(jìn)程控制塊中還有數(shù)據(jù)結(jié)構(gòu)信息這一項(xiàng),因此,可以使用隊(duì)列實(shí)現(xiàn)進(jìn)程控制塊的鏈表,如下圖所示,當(dāng)然這種鏈表不是唯一的,例如你還可以將阻塞態(tài)的進(jìn)程分別掛到不同事件阻塞的隊(duì)列上:

    進(jìn)程控制塊的保護(hù)

    進(jìn)程控制塊的作用進(jìn)程控制塊是操作系統(tǒng)中最重要的數(shù)據(jù)結(jié)構(gòu)。每個(gè)進(jìn)程控制塊都包含操作系統(tǒng)所需進(jìn)程的所有信息。實(shí)際上,操作系統(tǒng)中的每個(gè)模塊,包括那些涉及調(diào)度、資源分配、中斷處理、性能監(jiān)控和分析的模塊,都能讀取和修改它們。我們可以說資源控制塊集合定義了操作系統(tǒng)的狀態(tài)。

    這就帶來了一個(gè)重要的設(shè)計(jì)問題。操作系統(tǒng)中的很多例程需要訪問進(jìn)程控制塊中的信息。直接訪問這些表并不困難。每個(gè)進(jìn)程都有一個(gè)唯一的ID號,它可用作進(jìn)程控制塊的指針表的索引。困難不是訪問而是保護(hù),具體表現(xiàn)為兩個(gè)問題:

    • 一個(gè)例程(如中斷處理程序)中的錯(cuò)誤可能會破壞進(jìn)程控制塊,進(jìn)而破壞系統(tǒng)對受影響進(jìn)程的管理能力。
    • 進(jìn)程控制塊結(jié)構(gòu)或語義中的設(shè)計(jì)變化可能會影響到操作系統(tǒng)中的許多模塊。

    這些問題可要求操作系統(tǒng)中的所有例程都通過一個(gè)處理程序例程來解決,即處理程序例程的任務(wù)僅是保護(hù)進(jìn)程控制塊,且是讀寫這些塊的唯一仲裁程序,而不是簡單的直接進(jìn)行讀寫。使用這類進(jìn)程時(shí),需要在性能和其他系統(tǒng)軟件對其的信任度之間進(jìn)行折中。

    4.進(jìn)程控制

    4.1 執(zhí)行模式

    大多數(shù)處理器至少支持兩種執(zhí)行模式。某些指令只能在特權(quán)模式下運(yùn)行,包括讀取或改變諸如程序狀態(tài)字之類的控制寄存器的指令、原始I/O指令和與內(nèi)存管理相關(guān)的指令。另外,部分內(nèi)存區(qū)域僅能在特權(quán)模式下訪問。

    非特權(quán)模式通常稱為用戶模式(user mode),因?yàn)橛脩舫绦蛲ǔT谠撃J较逻\(yùn)行;特權(quán)模式稱為系統(tǒng)模式(system mode)、控制模式(control mode)或內(nèi)核模式(kernel mode),內(nèi)核模式指的是操作系統(tǒng)的內(nèi)核,它是操作系統(tǒng)中包含重要系統(tǒng)功能的部分。操作系統(tǒng)內(nèi)核的典型功能是:

    典型情況下,當(dāng)用戶調(diào)用一個(gè)操作系統(tǒng)服務(wù)或中斷來觸發(fā)系統(tǒng)例程的執(zhí)行時(shí),執(zhí)行模式將被置為內(nèi)核模式;而當(dāng)從系統(tǒng)服務(wù)返回到用戶進(jìn)程時(shí),執(zhí)行模式則置為用戶模式。不同的模式可以通過CPU寄存器來指示。

    4.2進(jìn)程創(chuàng)建

    操作系統(tǒng)基于某種原因(之前說過)決定創(chuàng)建一個(gè)新進(jìn)程時(shí),會按如下步驟操作:

  • 為新進(jìn)程分配一個(gè)唯一的進(jìn)程標(biāo)識符。 此時(shí),主進(jìn)程表中會添加一個(gè)新表項(xiàng),每個(gè)進(jìn)程一個(gè)表項(xiàng)。
  • 為進(jìn)程分配空間。 這包括進(jìn)程映像中的所有元素。因此,操作系統(tǒng)必須知道私有用戶地址空間(程序和數(shù)據(jù))和用戶棧需要多少空間。默認(rèn)情況下會根據(jù)進(jìn)程的類型分配這些值,但也可在作業(yè)創(chuàng)建時(shí)基于用戶請求設(shè)置這些值。若一個(gè)進(jìn)程由另一個(gè)進(jìn)程生成,則父進(jìn)程可把所需的值作為進(jìn)程創(chuàng)建請求的一部分傳遞給操作系統(tǒng)。若任何已有的地址空間將被這個(gè)新進(jìn)程共享,則要建立正確的鏈接。最后,必須為進(jìn)程控制塊分配空間。
  • 初始化進(jìn)程控制塊。 進(jìn)程標(biāo)識部分包括進(jìn)程ID和其他相關(guān)的ID,如父進(jìn)程的ID等;處理器狀態(tài)信息部分的多數(shù)項(xiàng)目通常初始化為0,但程序計(jì)數(shù)器(置為程序入口點(diǎn))和系統(tǒng)棧指針(定義進(jìn)程棧邊界)除外。進(jìn)程控制信息部分根據(jù)標(biāo)準(zhǔn)的默認(rèn)值和該進(jìn)程請求的特性來初始化。例如,進(jìn)程狀態(tài)通常初始化為就緒或就緒/掛起。優(yōu)先級默認(rèn)情況下可設(shè)置為最低,除非顯式請求了更高的優(yōu)先級;進(jìn)程最初不擁有任何資源(I/O設(shè)備、文件),除非顯式地請求了這些資源,或繼承了父進(jìn)程的資源。
  • 創(chuàng)建或擴(kuò)充其他數(shù)據(jù)結(jié)構(gòu)。 例如,操作系統(tǒng)可因編制賬單和/或評估性能,為每個(gè)進(jìn)程維護(hù)一個(gè)記賬文件。
  • 4.3進(jìn)程切換

    表面上看,進(jìn)程切換很簡單。在某個(gè)時(shí)刻,操作系統(tǒng)中斷一個(gè)正在運(yùn)行的進(jìn)程,將另一個(gè)進(jìn)程置于運(yùn)行模式,并把控制權(quán)交給后者。然而,這會引發(fā)若干問題。首先,什么事件觸發(fā)了進(jìn)程的切換?其次,必須認(rèn)識到模式切換與進(jìn)程切換間的區(qū)別;最后,要實(shí)現(xiàn)進(jìn)程切換,操作系統(tǒng)須對其控制的各種數(shù)據(jù)結(jié)構(gòu)做些什么?

    4.3.1 控制權(quán)轉(zhuǎn)移到操作系統(tǒng)

    進(jìn)程切換可在操作系統(tǒng)從當(dāng)前正運(yùn)行進(jìn)程中獲得控制權(quán)的任何時(shí)刻發(fā)生,也就是控制權(quán)在操作系統(tǒng)手中,就可能發(fā)生進(jìn)程切換。下表給出了可能把控制權(quán)交給操作系統(tǒng)的事件。

    大多數(shù)操作系統(tǒng)都會區(qū)分兩種系統(tǒng)中斷:一種稱為中斷,另一種稱為陷阱。前者與當(dāng)前正運(yùn)行進(jìn)程無關(guān)的某種外部事件相關(guān),如完成一次I/O操作;后者與當(dāng)前正運(yùn)行進(jìn)程產(chǎn)生的錯(cuò)誤或異常條件相關(guān),如非法的文件訪問。

    中斷

    對于普通中斷(interrupt),控制權(quán)首先轉(zhuǎn)給中斷處理器,中斷處理器完成一些基本的輔助工作后,再將控制權(quán)轉(zhuǎn)給與已發(fā)生的特定中斷相關(guān)的操作系統(tǒng)例程。示例如下:

    • 時(shí)鐘中斷:操作系統(tǒng)確定當(dāng)前正運(yùn)行進(jìn)程的執(zhí)行時(shí)間是否已超過最大允許時(shí)間段【時(shí)間片(time slice),即進(jìn)程中斷前可以執(zhí)行的最大時(shí)間段】。若超過,進(jìn)程就切換到就緒態(tài),并調(diào)入另一個(gè)進(jìn)程。
    • I/O中斷:操作系統(tǒng)確定是否已發(fā)生I/O活動(dòng)。若IVO活動(dòng)是一個(gè)或多個(gè)進(jìn)程正在等待的事件,則操作系統(tǒng)就把所有處于阻塞態(tài)的進(jìn)程轉(zhuǎn)換為就緒態(tài)(阻塞/掛起態(tài)進(jìn)程轉(zhuǎn)換為就緒/掛起態(tài))。操作系統(tǒng)必須決定是繼續(xù)執(zhí)行當(dāng)前處于運(yùn)行態(tài)的進(jìn)程,還是讓具有高優(yōu)先級的就緒態(tài)進(jìn)程搶占這個(gè)進(jìn)程。
    • 內(nèi)存失效:處理器遇到一個(gè)引用不在內(nèi)存中的字的虛存地址時(shí),操作系統(tǒng)就必須從外存中把包含這一引用的內(nèi)存塊(頁或段)調(diào)入內(nèi)存。發(fā)出調(diào)入內(nèi)存塊的I/O請求后,內(nèi)存失效進(jìn)程將進(jìn)入阻塞態(tài);操作系統(tǒng)然后切換進(jìn)程,恢復(fù)另一個(gè)進(jìn)程的執(zhí)行。期望的塊調(diào)入內(nèi)存后,該進(jìn)程置為就緒態(tài)。

    陷阱

    對于陷阱(trap),操作系統(tǒng)則確定錯(cuò)誤或異常條件是否致命。致命時(shí),當(dāng)前正運(yùn)行進(jìn)程置為退出態(tài),并切換進(jìn)程;不致命時(shí),操作系統(tǒng)的動(dòng)作將取決于錯(cuò)誤的性質(zhì)和操作系統(tǒng)的設(shè)計(jì),操作系統(tǒng)可能會嘗試恢復(fù)程序,或簡單地通知用戶。操作系統(tǒng)可能會切換進(jìn)程,或繼續(xù)當(dāng)前運(yùn)行的進(jìn)程。

    系統(tǒng)調(diào)用

    最后,操作系統(tǒng)可被來自正執(zhí)行程序的系統(tǒng)調(diào)用(supervisor call)激活。例如,正運(yùn)行用戶進(jìn)程執(zhí)行了一個(gè)請求I/O操作的指令(如打開文件),這時(shí)該調(diào)用會轉(zhuǎn)移到作為操作系統(tǒng)代碼一部分的一個(gè)例程。使用系統(tǒng)調(diào)用時(shí)會將用戶進(jìn)程置為阻塞態(tài)。

    綜上所述我們知道中斷不是進(jìn)程主動(dòng)發(fā)生的,而陷阱和系統(tǒng)調(diào)用是進(jìn)程主動(dòng)產(chǎn)生的。在這里我在網(wǎng)上查閱了一些資料,這里的陷阱又像是有一點(diǎn)異常的意思在里面,而系統(tǒng)調(diào)用又使用了陷阱,總之概念似乎有點(diǎn)混淆,不過對于中斷倒是沒有異議。讀者可以結(jié)合下面這篇博客來理解陷阱和系統(tǒng)調(diào)用。
    https://www.cnblogs.com/broglie/p/5463359.html

    4.3.2 模式切換過程

    當(dāng)進(jìn)程切換的時(shí)候,需要進(jìn)行執(zhí)行模式的切換。執(zhí)行模式的切換離不開中斷。當(dāng)出現(xiàn)中斷的時(shí)候,處理器會做如下工作:

  • 將程序計(jì)數(shù)器置為中斷處理程序的開始地址。
  • 從用戶模式切換到內(nèi)核模式,以便中斷處理代碼包含特權(quán)指令。
  • 處理器現(xiàn)在繼續(xù)取指階段,并取中斷處理程序的第一條指令來服務(wù)該中斷。此時(shí),將已中斷進(jìn)程的上下文保存到已中斷程序的進(jìn)程控制塊中。

    現(xiàn)在的問題是,保存的上下文包括哪些內(nèi)容?答案是,它必須包含中斷處理程序可能改變的所有信息,以及恢復(fù)被中斷程序時(shí)所需要的所有信息。因此,必須保存稱為處理器狀態(tài)信息的進(jìn)程控制塊部分,包括程序計(jì)數(shù)器、其他處理器寄存器和棧信息。

    進(jìn)程控制塊中的其他信息如何處理?若中斷之后切換到另一個(gè)應(yīng)用程序,則需要做一些工作。但在多數(shù)操作系統(tǒng)中,中斷發(fā)生后并不一定進(jìn)行進(jìn)程切換。可能的情況是,執(zhí)行中斷處理程序后,繼續(xù)執(zhí)行正運(yùn)行的進(jìn)程。此時(shí),所要做的工作是發(fā)生中斷時(shí)保存處理器狀態(tài)信息,并在控制權(quán)返回給該程序時(shí)恢復(fù)這些信息。保存和恢復(fù)功能通常由硬件實(shí)現(xiàn)。那么需要進(jìn)程切換時(shí),就需要做以下的工作了。

    4.3.3 進(jìn)程狀態(tài)需要變化時(shí),操作系統(tǒng)所作的工作

    進(jìn)程狀態(tài)的變化顯然,模式切換與進(jìn)程切換是不同的。模式切換可在不改變運(yùn)行態(tài)進(jìn)程的狀態(tài)的情況下出現(xiàn)。此時(shí)保存上下文并在以后恢復(fù)上下文僅需很少的開銷。但是,若當(dāng)前正運(yùn)行進(jìn)程將轉(zhuǎn)換為另一狀態(tài)(就緒、阻塞等),則操作系統(tǒng)必須使環(huán)境產(chǎn)生實(shí)質(zhì)性的變化。完整的進(jìn)程切換步驟如下:

  • 保存處理器的上下文,包括程序計(jì)數(shù)器和其他寄存器。
  • 更新當(dāng)前處于運(yùn)行態(tài)進(jìn)程的進(jìn)程控制塊,包括把進(jìn)程的狀態(tài)改變?yōu)榱硪粻顟B(tài)(就緒態(tài)、阻塞態(tài)、就緒/掛起態(tài)或退出態(tài))。還須更新其他相關(guān)的字段,包括退出運(yùn)行態(tài)的原因和記賬信息。
  • 把該進(jìn)程的進(jìn)程控制塊移到相應(yīng)的隊(duì)列(就緒、在事件i處阻塞、就緒/掛起)。
  • 選擇另一個(gè)進(jìn)程執(zhí)行。
  • 更新所選進(jìn)程的進(jìn)程控制塊,包括把進(jìn)程的狀態(tài)改為運(yùn)行態(tài)。
  • 更新內(nèi)存管理數(shù)據(jù)結(jié)構(gòu)。是否需要更新取決于管理地址轉(zhuǎn)換的方式。
  • 載入程序計(jì)數(shù)器和其他寄存器先前的值,將處理器的上下文恢復(fù)為所選進(jìn)程上次退出運(yùn)行態(tài)時(shí)的上下文。
  • 因此,涉及狀態(tài)變化的進(jìn)程切換與模式切換相比,要做的工作更多。

    5.操作系統(tǒng)的實(shí)現(xiàn)

    操作系統(tǒng)有兩個(gè)特殊事實(shí):

    • 操作系統(tǒng)與普通計(jì)算機(jī)軟件以同樣的方式運(yùn)行,即它也是由處理器執(zhí)行的一個(gè)程序。
    • 操作系統(tǒng)會頻繁地釋放控制權(quán),并依賴于處理器來恢復(fù)控制權(quán)。

    如果操作系統(tǒng)僅是像其他程序那樣由處理器執(zhí)行的一組程序,那么操作系統(tǒng)是一個(gè)進(jìn)程嗎?如果是,如何控制它?這些有趣的問題使得人們提出了大量的設(shè)計(jì)方法。圖3.15中給出了當(dāng)代操作系統(tǒng)中使用的各種方法。接下來,我們一一講解。

    5.1 無進(jìn)程內(nèi)核

    在許多老操作系統(tǒng)中,傳統(tǒng)且通用的一種方法是在所有進(jìn)程外部執(zhí)行操作系統(tǒng)內(nèi)核【見圖3.15(a)】。采用這種方法時(shí),若當(dāng)前正運(yùn)行進(jìn)程被中斷或產(chǎn)生一個(gè)系統(tǒng)調(diào)用,則會保存該進(jìn)程的模式上下文,并將控制權(quán)轉(zhuǎn)交給內(nèi)核。操作系統(tǒng)本身具有控制過程調(diào)用和返回的內(nèi)存區(qū)域與系統(tǒng)棧。操作系統(tǒng)可執(zhí)行任何預(yù)期的功能,并恢復(fù)被中斷進(jìn)程的上下文,恢復(fù)中斷用戶進(jìn)程的執(zhí)行;操作系統(tǒng)也可保存進(jìn)程的模式上下文,并繼續(xù)調(diào)度和分派另一個(gè)進(jìn)程,但是否這樣做取決于中斷的原因和當(dāng)前的情況。

    無論哪種情況,關(guān)鍵都是進(jìn)程這一概念僅適用于用戶程序,而操作系統(tǒng)代碼則是在特權(quán)模式下單獨(dú)運(yùn)行的實(shí)體。

    5.2 在用戶進(jìn)程內(nèi)運(yùn)行

    較小計(jì)算機(jī)(PC、工作站)的操作系統(tǒng)通常采用另一種方法,即在用戶進(jìn)程的上下文中執(zhí)行所有操作系統(tǒng)軟件。此時(shí),操作系統(tǒng)是用戶調(diào)用的一組例程,它在用戶進(jìn)程的環(huán)境內(nèi)執(zhí)行并實(shí)現(xiàn)各種功能,如圖3.15(b)所示。任何時(shí)刻操作系統(tǒng)都管理著n個(gè)進(jìn)程映像,這些進(jìn)程映像就變成了下圖所示的樣子:

    發(fā)生中斷、陷阱或系統(tǒng)調(diào)用時(shí),處理器置于內(nèi)核模式,控制權(quán)轉(zhuǎn)交給操作系統(tǒng)。要把控制權(quán)從用戶程序轉(zhuǎn)交給操作系統(tǒng),需要保存模式上下文并切換模式,再切換到一個(gè)操作系統(tǒng)例程,但此時(shí)仍然是在當(dāng)前的用戶進(jìn)程內(nèi)繼續(xù)執(zhí)行,不需要切換進(jìn)程,只是在同一進(jìn)程中切換模式。

    操作系統(tǒng)完成操作后,需要繼續(xù)運(yùn)行當(dāng)前的進(jìn)程,則會切換模式以在當(dāng)前進(jìn)程內(nèi)恢復(fù)已中斷的程序。這種方法的關(guān)鍵優(yōu)點(diǎn)是:中斷一個(gè)用戶程序,使用某些操作系統(tǒng)例程,然后恢復(fù)用戶程序,所有這些都不會招致兩次進(jìn)程切換的懲罰。

    然而,若確認(rèn)將出現(xiàn)進(jìn)程切換而非返回到先前正執(zhí)行的程序,則控制權(quán)會傳遞給一個(gè)進(jìn)程切換例程,進(jìn)程切換例程是否在當(dāng)前進(jìn)程中執(zhí)行,則取決于系統(tǒng)的設(shè)計(jì)。然而,在某些特殊情況下,當(dāng)前進(jìn)程必須置于非運(yùn)行態(tài),而另一個(gè)進(jìn)程則指定為正運(yùn)行進(jìn)程。此時(shí),將執(zhí)行視為發(fā)生在所有進(jìn)程外部邏輯上最為方便。

    5.3 基于進(jìn)程的操作系統(tǒng)

    圖3.15(c)所示的另一種方法是把操作系統(tǒng)作為一組系統(tǒng)進(jìn)程來實(shí)現(xiàn)。類似于其他方法,該軟件是在內(nèi)核模式下運(yùn)行的內(nèi)核的一部分。但在這種情況下,主要的內(nèi)核功能被組織為獨(dú)立的進(jìn)程。同樣,此時(shí)存在一些在任何進(jìn)程之外執(zhí)行的進(jìn)行切換代碼。

    這種方法有幾個(gè)優(yōu)點(diǎn)。首先,它利用了鼓勵(lì)使用模塊化操作系統(tǒng)的程序設(shè)計(jì)原理,可使模塊間的接口最小且最簡單。其次,有些非關(guān)鍵操作系統(tǒng)功能可簡單地用獨(dú)立的進(jìn)程來實(shí)現(xiàn),例如前面提及的監(jiān)視各種資源(處理器、內(nèi)存、通道)利用率和系統(tǒng)中用戶進(jìn)程進(jìn)展?fàn)顟B(tài)的程序。因?yàn)檫@種程序不向任何活動(dòng)進(jìn)程提供特殊的服務(wù),因此只能被操作系統(tǒng)調(diào)用。作為一個(gè)進(jìn)程,這一功能可以任何指定的優(yōu)先級在分派器的控制下與其他進(jìn)程交替執(zhí)行。第三,把操作系統(tǒng)作為一組進(jìn)程來實(shí)現(xiàn)時(shí),在多處理器或多機(jī)環(huán)境中很有用,因此此時(shí)為提高性能,有些操作系統(tǒng)服務(wù)可傳送到專用的處理上執(zhí)行。

    6 UNIX SVR4 進(jìn)程管理

    UNIX System V使用了一種對用戶可見的簡單但功能強(qiáng)大的進(jìn)程機(jī)制。UNIX采用了圖3.15(b)中的模型,在該模型中操作系統(tǒng)的大部分都在用戶進(jìn)程環(huán)境內(nèi)執(zhí)行。UNIX使用了兩類進(jìn)程,即系統(tǒng)進(jìn)程和用戶進(jìn)程。系統(tǒng)進(jìn)程在內(nèi)核模式下運(yùn)行,執(zhí)行操作系統(tǒng)代碼來實(shí)現(xiàn)管理功能和內(nèi)部處理,如內(nèi)存空間的分配和進(jìn)程交換;用戶進(jìn)程則在用戶模式下運(yùn)行并執(zhí)行用戶程序和實(shí)用程序,在內(nèi)核模式下運(yùn)行并執(zhí)行屬于內(nèi)核的指令。當(dāng)產(chǎn)生異常(錯(cuò)誤)、發(fā)生中斷或用戶進(jìn)程發(fā)出系統(tǒng)調(diào)用時(shí),用戶進(jìn)程可進(jìn)入內(nèi)核模式。

    6.1 進(jìn)程狀態(tài)

    UNIX操作系統(tǒng)中共有9種進(jìn)程狀態(tài),如表3.9所示。圖3.17(基于【BACH86】中的圖形)是相應(yīng)的狀態(tài)轉(zhuǎn)換圖,它與之前的五狀態(tài)+兩掛起進(jìn)程模型類似,兩個(gè)UNIX休眠態(tài)對應(yīng)于其中的兩個(gè)阻塞態(tài)。兩個(gè)進(jìn)程模型的主要不同之處如下:

    • UNIX采用兩個(gè)運(yùn)行態(tài)表示進(jìn)程是在用戶模式下執(zhí)行還是在內(nèi)核模式下執(zhí)行。
    • UNIX區(qū)分兩種狀態(tài),即內(nèi)存中的就緒態(tài)和被搶占態(tài)。從本質(zhì)上說,它們是同一狀態(tài),如圖中它們間的虛線所示。之所以區(qū)分這兩個(gè)狀態(tài),是為了強(qiáng)調(diào)進(jìn)入被搶占狀態(tài)的方式。當(dāng)一個(gè)進(jìn)程在內(nèi)核模式下運(yùn)行(系統(tǒng)調(diào)用、時(shí)鐘中斷或I/O中斷的結(jié)果),且內(nèi)核已完成了其任務(wù)并準(zhǔn)備把控制權(quán)返回給用戶程序時(shí),就可能會出現(xiàn)搶占的時(shí)機(jī)。這時(shí),內(nèi)核可能決定搶占當(dāng)前進(jìn)程,轉(zhuǎn)而支持另一個(gè)已就緒并具有較高優(yōu)先級的進(jìn)程。在這種情況下,當(dāng)前進(jìn)程轉(zhuǎn)換為被搶占態(tài),但為了分派處理,處于被搶占態(tài)的進(jìn)程和在內(nèi)存中處理就緒態(tài)的進(jìn)程就構(gòu)成了一個(gè)隊(duì)列。只有在進(jìn)程準(zhǔn)備從內(nèi)核模式轉(zhuǎn)換到用戶模式時(shí)才可能發(fā)生搶占,進(jìn)程在內(nèi)核模式下運(yùn)行時(shí)不會被搶占,因此UNIX不適用于實(shí)時(shí)處理。

    和之前說到的五狀態(tài)+兩掛起進(jìn)程模型對應(yīng)總結(jié)如下:

    • 新建態(tài):被創(chuàng)建
    • 阻塞/掛起態(tài):休眠,被交換
    • 阻塞態(tài):休眠,并駐留內(nèi)存
    • 就緒/掛起態(tài):就緒,被交換
    • 就緒態(tài):1.就緒,并駐留內(nèi)存; 2.被搶占
    • 運(yùn)行態(tài):1.內(nèi)核運(yùn)行; 2.用戶運(yùn)行
    • 退出態(tài):僵死

    6.2 進(jìn)程描述

    UNIX中的進(jìn)程是一組相當(dāng)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)為操作系統(tǒng)提供管理進(jìn)程和分派進(jìn)程所需的全部信息。表3.10概括了進(jìn)程映像中的元素,這些元素分為三部分:用戶級上下文、寄存器上下文和系統(tǒng)級上下文。

    6.3 新進(jìn)程創(chuàng)建

    UNIX中的進(jìn)程創(chuàng)建是由內(nèi)核系統(tǒng)調(diào)用fork()實(shí)現(xiàn)的。一個(gè)進(jìn)程發(fā)出一個(gè)fork請求時(shí),操作系統(tǒng)執(zhí)行如下功能:

  • 在進(jìn)程表中為新進(jìn)程分配一個(gè)空項(xiàng)。
  • 為子進(jìn)程分配一個(gè)唯一進(jìn)程標(biāo)識符。
  • 復(fù)制父進(jìn)程的進(jìn)程映像,但共享內(nèi)存除外。
  • 增加父進(jìn)程所擁有文件的計(jì)數(shù)器,反映另一個(gè)進(jìn)程(子進(jìn)程)現(xiàn)在也擁有這些文件的事實(shí)。
  • 將子進(jìn)程置為就緒態(tài)。
  • 將子進(jìn)程的ID號返回給父進(jìn)程,將0值返回給子進(jìn)程。
  • 所以子進(jìn)程和父進(jìn)程除了進(jìn)程標(biāo)識符和共享內(nèi)存外,完全一致

    所有這些工作都在父進(jìn)程的內(nèi)核模式下完成。內(nèi)核完成這些功能后,可繼續(xù)分派器例程工作一部分的如下三種操作之一:

  • 停留在父進(jìn)程中。控制權(quán)返回到用戶模式下父進(jìn)程調(diào)用fork的位置。
  • 處理器控制權(quán)交給子進(jìn)程。子進(jìn)程開始執(zhí)行代碼,執(zhí)行點(diǎn)與父進(jìn)程相同,即在fork調(diào)用的返回處。
  • 控制權(quán)轉(zhuǎn)交給另一個(gè)進(jìn)程。父進(jìn)程和子進(jìn)程都置于就緒態(tài)。
  • 很難想象在這種創(chuàng)建進(jìn)程的方法中,父進(jìn)程和子進(jìn)程都執(zhí)行相同的代碼。區(qū)別在于:從fork調(diào)用返回時(shí),測試返回參數(shù)。若值為零,則它是子進(jìn)程,此時(shí)可轉(zhuǎn)移到相應(yīng)的用戶程序中繼續(xù)執(zhí)行;若值非零,則它是父進(jìn)程,此時(shí)繼續(xù)執(zhí)行主程序。

    兩個(gè)特殊進(jìn)程

    UNIX中有兩個(gè)獨(dú)特的進(jìn)程。進(jìn)程0是一個(gè)特殊的進(jìn)程,它是在系統(tǒng)啟動(dòng)時(shí)創(chuàng)建的。實(shí)際上,它是啟動(dòng)時(shí)加載的一個(gè)預(yù)定義數(shù)據(jù)結(jié)構(gòu),是交換程序進(jìn)程。此外,進(jìn)程0產(chǎn)生稱為初始進(jìn)程的進(jìn)程1,進(jìn)程1是系統(tǒng)中所有其他進(jìn)程的祖先。當(dāng)新的交互用戶登錄到系統(tǒng)時(shí),進(jìn)程1會為該用戶創(chuàng)建一個(gè)用戶進(jìn)程。隨后,用戶進(jìn)程創(chuàng)建構(gòu)成分支樹的子進(jìn)程,因此任何應(yīng)用程序都由一組相關(guān)的進(jìn)程組成。

    7 . 總結(jié)

    現(xiàn)代操作系統(tǒng)中最基本的構(gòu)件是進(jìn)程,操作系統(tǒng)的基本功能是創(chuàng)建、管理和終止進(jìn)程。當(dāng)進(jìn)程處于活躍狀態(tài)時(shí),操作系統(tǒng)必須設(shè)法使每個(gè)進(jìn)程都分配到處理器執(zhí)行時(shí)間,并協(xié)調(diào)它們的活動(dòng)、管理有沖突的請求、給進(jìn)程分配系統(tǒng)資源。

    關(guān)于進(jìn)程管理
    要執(zhí)行進(jìn)程管理功能,操作系統(tǒng)必須維護(hù)每個(gè)進(jìn)程的描述(或進(jìn)程映像),包括執(zhí)行進(jìn)程的地址空間和一個(gè)進(jìn)程控制塊。進(jìn)程控制塊含有操作系統(tǒng)管理進(jìn)程需要的全部信息,包括進(jìn)程的當(dāng)前狀態(tài)、分配給進(jìn)程的資源、優(yōu)先級和其他相關(guān)數(shù)據(jù)。

    關(guān)于進(jìn)程狀態(tài)
    在整個(gè)生命周期內(nèi),進(jìn)程總是在一些狀態(tài)之間轉(zhuǎn)換。最重要的狀態(tài)有就緒態(tài)、運(yùn)行態(tài)和阻塞態(tài)。就緒態(tài)進(jìn)程是指當(dāng)前未執(zhí)行但已做好執(zhí)行準(zhǔn)備的進(jìn)程,只要操作系統(tǒng)調(diào)度到它,它就會立即執(zhí)行;運(yùn)行態(tài)進(jìn)程是指當(dāng)前正被處理器執(zhí)行的進(jìn)程,在多處理器系統(tǒng)中會有多個(gè)進(jìn)程處于這種狀態(tài);阻塞態(tài)進(jìn)程是指正在等待某一事件完成(如一次I/O操作)的進(jìn)程。

    關(guān)于進(jìn)程切換
    正運(yùn)行進(jìn)程可被進(jìn)程外發(fā)生并被處理器識別的中斷事件打斷,或被執(zhí)行操作系統(tǒng)的系統(tǒng)調(diào)用打斷。不論在哪種情況下,處理器都會執(zhí)行一次模式切換,將控制權(quán)轉(zhuǎn)交給操作系統(tǒng)例程。操作系統(tǒng)完成必需的操作后,可以恢復(fù)被中斷的進(jìn)程或切換到其他進(jìn)程。

    總結(jié)

    以上是生活随笔為你收集整理的操作系统-进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。