第2章進(jìn)程的描述與控制_第1頁(yè)
第2章進(jìn)程的描述與控制_第2頁(yè)
第2章進(jìn)程的描述與控制_第3頁(yè)
第2章進(jìn)程的描述與控制_第4頁(yè)
第2章進(jìn)程的描述與控制_第5頁(yè)
已閱讀5頁(yè),還剩95頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

計(jì)算機(jī)操作系統(tǒng)主講:四川大學(xué)計(jì)算機(jī)學(xué)院

劉循第2章進(jìn)程的描述與控制隨著多道系統(tǒng)的出現(xiàn),進(jìn)程是資源分配和處理器調(diào)度的基本單位,是操作系統(tǒng)中最活躍的因素。操作系統(tǒng)并發(fā)性、共享性、虛擬性和異步性的體現(xiàn)。操作系統(tǒng)為進(jìn)程分配資源,控制進(jìn)程狀態(tài)的變化,協(xié)調(diào)進(jìn)程之間的關(guān)系,完成進(jìn)程之間的切換。進(jìn)程管理屬于處理器管理范疇,是操作系統(tǒng)的重要功能。為了避免進(jìn)程切換使得系統(tǒng)付出的開(kāi)銷過(guò)大,現(xiàn)代操作系統(tǒng)在進(jìn)程的基礎(chǔ)上又引入了“線程”的概念,用線程代替進(jìn)程成為處理器調(diào)度的基本單位。第2章進(jìn)程的描述與控制本章的主要內(nèi)容如下:

進(jìn)程描述進(jìn)程控制前趨圖與進(jìn)程

UNIX操作系統(tǒng)的進(jìn)程描述與控制

線程的描述與控制

Solaris操作系統(tǒng)中的線程2.1進(jìn)程描述2.1.1進(jìn)程概念和特征1.進(jìn)程的概念

進(jìn)程的定義:進(jìn)程是可并發(fā)執(zhí)行的、具有獨(dú)立功能的程序在一定數(shù)據(jù)集合上的一次執(zhí)行過(guò)程,是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。從進(jìn)程的定義可以歸納出對(duì)進(jìn)程的理解如下:進(jìn)程是程序運(yùn)行過(guò)程進(jìn)程是以異步為主要特征并具有“活力”的過(guò)程操作系統(tǒng)需要用數(shù)據(jù)結(jié)構(gòu)描述進(jìn)程進(jìn)程是資源分配的單位進(jìn)程的運(yùn)行軌跡是可以控制進(jìn)程與程序不同2.進(jìn)程的特征結(jié)構(gòu)性進(jìn)程包含有描述進(jìn)程信息的數(shù)據(jù)結(jié)構(gòu)和運(yùn)行在進(jìn)程上的程序。操作系統(tǒng)用進(jìn)程控制塊描述和記錄進(jìn)程的動(dòng)態(tài)變化過(guò)程。進(jìn)程的數(shù)據(jù)結(jié)構(gòu)包含進(jìn)程控制塊、程序塊和代碼塊。動(dòng)態(tài)性進(jìn)程是程序在數(shù)據(jù)集合上的一次執(zhí)行過(guò)程,具有生命周期,由創(chuàng)建而產(chǎn)生,由調(diào)度而運(yùn)行,由結(jié)束而消亡,是一個(gè)動(dòng)態(tài)推進(jìn)的過(guò)程。并發(fā)性在同一段時(shí)間內(nèi),若干個(gè)進(jìn)程可以共享一個(gè)處理器。進(jìn)程的并發(fā)性能夠改進(jìn)系統(tǒng)的資源利用率,提高計(jì)算機(jī)的效率。2.1進(jìn)程描述(續(xù))獨(dú)立性在操作系統(tǒng)管理上,進(jìn)程是一個(gè)獨(dú)立的資源分配單位,進(jìn)程可以在創(chuàng)建時(shí)獲取資源,也可以在運(yùn)行過(guò)程中獲取資源。操作系統(tǒng)為進(jìn)程分配各種資源,如處理器和內(nèi)存地址空間等。異步性在計(jì)算機(jī)環(huán)境中,處理器的數(shù)量總是小于進(jìn)程的數(shù)量,多個(gè)進(jìn)程被強(qiáng)制分享同一個(gè)處理器,進(jìn)程以交替方式被處理器執(zhí)行。進(jìn)程的這種執(zhí)行方式為異步性。

2.1進(jìn)程描述(續(xù))2.1.2進(jìn)程的基本狀態(tài)及轉(zhuǎn)換進(jìn)程作為操作系統(tǒng)中的活躍元素,總是不斷的向前推進(jìn),是一個(gè)動(dòng)態(tài)過(guò)程。1.進(jìn)程的三個(gè)基本狀態(tài)就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)。進(jìn)程的三個(gè)基本狀態(tài)之間的轉(zhuǎn)換,可用最基本的三態(tài)模型來(lái)描述,如圖2.1所示。2.1進(jìn)程描述(續(xù))I/O或事件完成中斷調(diào)度等待I/O或事件運(yùn)行狀態(tài)就緒狀態(tài)阻塞狀態(tài)圖2.1進(jìn)程的三個(gè)基本狀態(tài)及其轉(zhuǎn)換就緒狀態(tài)(ready)

進(jìn)程在內(nèi)存中已經(jīng)具備執(zhí)行的條件,等待分配處理器。一旦被分配處理器,進(jìn)程立刻執(zhí)行。一個(gè)進(jìn)程在創(chuàng)建后處于就緒狀態(tài)。如果一個(gè)系統(tǒng)有多個(gè)進(jìn)程都處于就緒狀態(tài),這些處于就緒狀態(tài)的進(jìn)程以隊(duì)列方式進(jìn)行組織,這樣的隊(duì)列為就緒隊(duì)列。運(yùn)行狀態(tài)(running)

進(jìn)程已經(jīng)被分配處理器并正在執(zhí)行。在單處理器系統(tǒng)中,一個(gè)時(shí)刻只有一個(gè)進(jìn)程處于運(yùn)行狀態(tài)。阻塞狀態(tài)(blocked)當(dāng)正在運(yùn)行的進(jìn)程由于發(fā)生某事件,如:請(qǐng)求并等待輸入/輸出過(guò)程的完成、等待進(jìn)程通信之間的進(jìn)程到來(lái)或進(jìn)程同步之間的進(jìn)程到來(lái)等,而受到阻塞不能繼續(xù)執(zhí)行時(shí),便需要放棄處理器,從運(yùn)行狀態(tài)轉(zhuǎn)換到阻塞狀態(tài)。如果一個(gè)系統(tǒng)中有多個(gè)進(jìn)程都處于阻塞狀態(tài),這些進(jìn)程被組織成隊(duì)列形式,稱為阻塞隊(duì)列。阻塞狀態(tài)也稱為等待(waiting)狀態(tài)。2.1進(jìn)程描述(續(xù))進(jìn)程狀態(tài)之間的轉(zhuǎn)換有如下幾種形式:就緒狀態(tài)→運(yùn)行狀態(tài)當(dāng)處理器空閑時(shí),操作系統(tǒng)的進(jìn)程調(diào)度程序會(huì)從就緒隊(duì)列中選中一個(gè)就緒進(jìn)程并分配給處理器,此時(shí),進(jìn)程的狀態(tài)便從就緒狀態(tài)轉(zhuǎn)換到運(yùn)行狀態(tài)。運(yùn)行狀態(tài)→阻塞狀態(tài)當(dāng)正在運(yùn)行的進(jìn)程由于需要等待某些事件的發(fā)生時(shí),其狀態(tài)需要從運(yùn)行狀態(tài)轉(zhuǎn)換為阻塞狀態(tài)。阻塞狀態(tài)→就緒狀態(tài)當(dāng)處于阻塞狀態(tài)的進(jìn)程,由于等待的事件到來(lái)而不需要再等待時(shí),進(jìn)程狀態(tài)便從阻塞狀態(tài)轉(zhuǎn)換到就緒狀態(tài)。運(yùn)行狀態(tài)→就緒狀態(tài)正被處理運(yùn)行的進(jìn)程會(huì)被其他進(jìn)程中斷,如運(yùn)行的時(shí)間片到其他進(jìn)程的優(yōu)先級(jí)高等,而放棄處理器,進(jìn)程狀態(tài)從運(yùn)行狀態(tài)轉(zhuǎn)換到就緒狀態(tài),等待被再次調(diào)度。2.1進(jìn)程描述(續(xù))2.1進(jìn)程描述(續(xù))進(jìn)程的基本狀態(tài)是對(duì)進(jìn)程動(dòng)態(tài)過(guò)程的簡(jiǎn)單描述。為了更加詳細(xì)的描述進(jìn)程狀態(tài),需要考慮進(jìn)程的創(chuàng)建和終止兩個(gè)狀態(tài)。具有創(chuàng)建和終止?fàn)顟B(tài)的進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換如圖2.2所示。圖2.2具有創(chuàng)建和結(jié)束狀態(tài)的進(jìn)程狀態(tài)及其轉(zhuǎn)換確認(rèn)事件或I/O完成中斷調(diào)度等待事件或I/O終止運(yùn)行狀態(tài)新建狀態(tài)就緒狀態(tài)阻塞狀態(tài)終止?fàn)顟B(tài)新建狀態(tài)

新建狀態(tài)是指操作系統(tǒng)創(chuàng)建進(jìn)程時(shí),進(jìn)程所處的狀態(tài)。進(jìn)程新建成功后即轉(zhuǎn)入就緒狀態(tài),在就緒進(jìn)程隊(duì)列中排隊(duì)。操作系統(tǒng)創(chuàng)建進(jìn)程需要為進(jìn)程分配資源。因此,操作系統(tǒng)將根據(jù)系統(tǒng)的性能和內(nèi)存容量的情況決定是否創(chuàng)建新的進(jìn)程。如果系統(tǒng)性能較差或內(nèi)存容量受到限制,不能為新進(jìn)程分配資源,則操作系統(tǒng)會(huì)發(fā)出創(chuàng)建新進(jìn)程失敗的響應(yīng)或?qū)?chuàng)建新進(jìn)程的工作推遲。終止?fàn)顟B(tài)

進(jìn)程達(dá)到了結(jié)束點(diǎn)或進(jìn)程出現(xiàn)了嚴(yán)重的錯(cuò)誤時(shí),會(huì)被操作系統(tǒng)終止或被其他有終止權(quán)的進(jìn)程終止。進(jìn)入終止?fàn)顟B(tài)的進(jìn)程不再被執(zhí)行,等待操作系統(tǒng)完成進(jìn)程終止處理。當(dāng)操作系統(tǒng)完成進(jìn)程終止處理后,操作系統(tǒng)會(huì)刪除進(jìn)程,收回進(jìn)程所占用的資源。2.1進(jìn)程描述(續(xù))2.1.3具有掛起功能的進(jìn)程狀態(tài)和轉(zhuǎn)換1.進(jìn)程掛起及掛起的原因

“掛起”是把內(nèi)存中暫時(shí)不能或不需要運(yùn)行的進(jìn)程從內(nèi)存對(duì)換到外存,從而引起進(jìn)程狀態(tài)變化的過(guò)程。進(jìn)程可以在就緒狀態(tài)被掛起,也可以在阻塞狀態(tài)被掛起,還可以在運(yùn)行狀態(tài)被掛起。引起進(jìn)程掛起的原因是多方面的,引起進(jìn)程掛起的主要原因有以下幾點(diǎn)。(1)系統(tǒng)資源的需要當(dāng)系統(tǒng)中所有的進(jìn)程均處于阻塞狀態(tài)時(shí),沒(méi)有就緒進(jìn)程,處理器處于空閑。如果這時(shí)內(nèi)存空間已經(jīng)被進(jìn)程占滿,不能裝入更多的進(jìn)程,需要將內(nèi)存中處于阻塞狀態(tài)的進(jìn)程掛起,對(duì)換到外存上,讓出內(nèi)存空間接納新創(chuàng)建的進(jìn)程。2.1進(jìn)程描述(續(xù))(2)調(diào)節(jié)競(jìng)爭(zhēng)或消除故障的需要操作系統(tǒng)在檢查進(jìn)程運(yùn)行中競(jìng)爭(zhēng)資源的情況時(shí),或在系統(tǒng)出現(xiàn)故障使某些功能受到破壞時(shí),為了解決進(jìn)程的資源競(jìng)爭(zhēng)或消除系統(tǒng)故障,操作系統(tǒng)需要掛起某些對(duì)資源競(jìng)爭(zhēng)的進(jìn)程或懷疑引起系統(tǒng)故障的進(jìn)程,將進(jìn)程對(duì)換到外存。(3)終端用戶的需要終端用戶可以直接操作自己的程序。當(dāng)程序員需要調(diào)試、檢查和修改自己的程序時(shí),可以要求掛起與程序相對(duì)應(yīng)的進(jìn)程,暫停進(jìn)程的推進(jìn)。(4)父進(jìn)程的需要父進(jìn)程對(duì)自己的子進(jìn)程實(shí)施控制、修改和檢查時(shí),需要掛起自己的子進(jìn)程,暫停子進(jìn)程的推進(jìn)。(5)調(diào)節(jié)進(jìn)程的需要某些定期執(zhí)行的進(jìn)程,如系統(tǒng)監(jiān)控進(jìn)程、日志進(jìn)程等,在執(zhí)行時(shí)間未到而需要等待時(shí),可以將進(jìn)程掛起,對(duì)換到外存,從而減輕內(nèi)存負(fù)擔(dān)。當(dāng)執(zhí)行時(shí)間到時(shí),再將這些進(jìn)程激活換入到內(nèi)存。2.1進(jìn)程描述(續(xù))在操作系統(tǒng)中引入進(jìn)程掛起后,進(jìn)程的狀態(tài)發(fā)生了變化。進(jìn)程的狀態(tài)有:新建狀態(tài)、就緒狀態(tài)、掛起就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)、掛起阻塞狀態(tài)、結(jié)束狀態(tài),如圖2.3所示。2.1進(jìn)程描述(續(xù))圖2.3引入掛起后的進(jìn)程狀態(tài)轉(zhuǎn)換I/O或事件完成掛起激活確認(rèn)掛起激活I(lǐng)/O或事件完成確認(rèn)阻塞狀態(tài)掛起阻塞狀態(tài)就緒狀態(tài)掛起就緒狀態(tài)終止I/O或事件等待調(diào)度中斷運(yùn)行狀態(tài)結(jié)束新建狀態(tài)如果就緒狀態(tài)的進(jìn)程被掛起,則進(jìn)程的狀態(tài)轉(zhuǎn)換為掛起就緒狀態(tài)。處于掛起就緒狀態(tài)的進(jìn)程一旦被激活,從掛起就緒狀態(tài)轉(zhuǎn)換為就緒狀態(tài)。如果阻塞狀態(tài)的進(jìn)程被掛起,則進(jìn)程的狀態(tài)轉(zhuǎn)換為掛起阻塞狀態(tài)。如果掛起阻塞狀態(tài)的進(jìn)程被激活,則進(jìn)程的狀態(tài)轉(zhuǎn)換為阻塞狀態(tài)。如果掛起阻塞狀態(tài)的進(jìn)程到阻塞的事件或I/O過(guò)程完成,被喚醒,則進(jìn)程的狀態(tài)轉(zhuǎn)換為掛起就緒狀態(tài),仍然被掛起。引入掛起后,當(dāng)進(jìn)程新建后,如果內(nèi)存足夠,則進(jìn)入就緒狀態(tài);如果沒(méi)有足夠的內(nèi)存空間,則轉(zhuǎn)入到掛起就緒狀態(tài)。所有被掛起的進(jìn)程只有被激活后才能由外存到內(nèi)存,只有處于就緒狀態(tài)的進(jìn)程才有可能被處理器運(yùn)行。2.1進(jìn)程描述(續(xù))

2.1.4進(jìn)程的描述1.進(jìn)程控制塊(ProcessControlBlock,PCB)進(jìn)程控制塊是對(duì)進(jìn)程本質(zhì)屬性的描述,是操作系統(tǒng)管理進(jìn)程所需要的基本信息。進(jìn)程控制塊中的信息:(1)進(jìn)程標(biāo)志信息

每個(gè)進(jìn)程都有兩種標(biāo)志符:內(nèi)部標(biāo)志符和外部標(biāo)志符。內(nèi)部標(biāo)志符是操作系統(tǒng)為進(jìn)程設(shè)置的一個(gè)唯一數(shù)字標(biāo)志,操作系統(tǒng)管理進(jìn)程時(shí)使用進(jìn)程的內(nèi)部標(biāo)志符。外部標(biāo)志符由字母和數(shù)字組成,是進(jìn)程創(chuàng)建者提供的進(jìn)程名。用戶訪問(wèn)進(jìn)程時(shí)使用進(jìn)程的外部標(biāo)志。進(jìn)程創(chuàng)建時(shí),用戶給出進(jìn)程的外部標(biāo)志,操作系統(tǒng)給出進(jìn)程的內(nèi)部標(biāo)志。2.1進(jìn)程描述(續(xù))(2)處理機(jī)狀態(tài)信息處理機(jī)狀態(tài)信息是處理機(jī)的通用寄存器、指令寄存器、程序狀態(tài)字寄存器和用戶堆棧指針寄存器中的內(nèi)容。(3)進(jìn)程調(diào)度信息進(jìn)程狀態(tài)、進(jìn)程優(yōu)先級(jí)、進(jìn)程的等待時(shí)間、進(jìn)程的執(zhí)行時(shí)間、與進(jìn)程狀態(tài)變化相關(guān)的事件等都包含在進(jìn)程調(diào)度信息中,是操作系統(tǒng)進(jìn)行進(jìn)程調(diào)度的依據(jù)。(4)進(jìn)程控制信息操作系統(tǒng)控制進(jìn)程需要的信息包括:程序和數(shù)據(jù)地址、進(jìn)程同步和通信機(jī)制信息、進(jìn)程的資源清單和鏈接指針。

當(dāng)操作系統(tǒng)創(chuàng)建進(jìn)程時(shí),系統(tǒng)為進(jìn)程分配進(jìn)程控制塊。進(jìn)程控制塊的初始信息在進(jìn)程創(chuàng)建時(shí)寫(xiě)入,在進(jìn)程的動(dòng)態(tài)變化過(guò)程中不斷被刷新。當(dāng)進(jìn)程終止時(shí),操作系統(tǒng)回收進(jìn)程控制塊。2.1進(jìn)程描述(續(xù))2.進(jìn)程控制塊的組織形式(1)鏈接方式系統(tǒng)在每個(gè)進(jìn)程控制塊的首部和尾部設(shè)置鏈接指針,將處于相同狀態(tài)的進(jìn)程的進(jìn)程控制塊,分別通過(guò)首部和尾部指針鏈接在一起,形成鏈接隊(duì)列,這樣的隊(duì)列稱為進(jìn)程隊(duì)列。操作系統(tǒng)保留每個(gè)隊(duì)列的起始指針。處于就緒狀態(tài)的進(jìn)程,其進(jìn)程控制塊被鏈接成就緒隊(duì)列;處于阻塞狀態(tài)的進(jìn)程,其進(jìn)程控制塊被鏈接成阻塞隊(duì)列。在進(jìn)程控制塊的鏈接隊(duì)列中,系統(tǒng)可以按照進(jìn)程等待時(shí)間的長(zhǎng)短進(jìn)行鏈接,可以將等待時(shí)間長(zhǎng)的進(jìn)程的進(jìn)程控制塊排在鏈接隊(duì)列的前面;系統(tǒng)也可以按照進(jìn)程的優(yōu)先級(jí)或進(jìn)程需要執(zhí)行時(shí)間的長(zhǎng)短對(duì)其進(jìn)行鏈接。處于相同狀態(tài)的進(jìn)程,還可以組織成多個(gè)隊(duì)列。如處于阻塞狀態(tài)的進(jìn)程,可以按照等待事件的不同類型,組織成不同的阻塞隊(duì)列。2.1進(jìn)程描述(續(xù))進(jìn)程控制塊的鏈接分為單向鏈接和雙向鏈接兩種形式。進(jìn)程控制塊的雙向鏈接形式如圖2.4所示。2.1進(jìn)程描述(續(xù))圖2.4進(jìn)程控制塊的鏈接形式當(dāng)進(jìn)程的狀態(tài)發(fā)生變化時(shí),進(jìn)程從原來(lái)的進(jìn)程控制塊鏈接隊(duì)列中退出,進(jìn)入新?tīng)顟B(tài)所對(duì)應(yīng)的進(jìn)程控制塊鏈接隊(duì)列。以鏈接方式組織進(jìn)程控制塊的主要優(yōu)點(diǎn)是直觀,體現(xiàn)了進(jìn)程的本身特性,如等待時(shí)間的長(zhǎng)短、優(yōu)先級(jí)的高低、需要處理時(shí)間的長(zhǎng)短,為進(jìn)程調(diào)度算法的實(shí)施提供了方便。以鏈接方式組織進(jìn)程控制塊的主要缺點(diǎn)是如果進(jìn)程狀態(tài)發(fā)生變化,則鏈接隊(duì)列需要作相應(yīng)的調(diào)整,進(jìn)程控制塊中的首部和尾部指針需要改變。2.1進(jìn)程描述(續(xù))(2)索引方式索引方式是根據(jù)進(jìn)程的狀態(tài)分別建立進(jìn)程索引表,如就緒進(jìn)程索引表、阻塞進(jìn)程索引表,如圖2.5所示。索引表中的進(jìn)程控制塊指針指向進(jìn)程控制塊。操作系統(tǒng)將每個(gè)索引表的首地址放到硬件寄存器中,通過(guò)硬件寄存器可以快速得到每個(gè)索引表的首地址。圖2.5PCB索引組織方式2.1進(jìn)程描述(續(xù))索引表中的進(jìn)程控制塊指針指向進(jìn)程控制塊。操作系統(tǒng)將每個(gè)索引表的首地址放到硬件寄存器中,通過(guò)硬件寄存器可以快速得到每個(gè)索引表的首地址。進(jìn)程控制塊的索引方式與鏈接方式比較,索引方式最明顯的優(yōu)點(diǎn)如下:(1)通過(guò)索引表可以快速得到進(jìn)程控制塊地址,不

需要像鏈接方式一樣,從鏈?zhǔn)椎芥溛膊檎?;?)如果進(jìn)程狀態(tài)變化,不需要修改進(jìn)程控制塊的鏈接

指針,只需要增加或刪除索引表中的記錄。

索引方式的缺點(diǎn)為:索引表本身需要占用內(nèi)存空間,

搜索索引表需要時(shí)間。2.1進(jìn)程描述(續(xù))3.進(jìn)程的內(nèi)存映像進(jìn)程的內(nèi)存映像是進(jìn)程在內(nèi)存中的組成,包括如下內(nèi)容:進(jìn)程程序塊進(jìn)程程序塊為執(zhí)行的程序代碼,規(guī)定了進(jìn)程一次運(yùn)行需要完成的功能。進(jìn)程數(shù)據(jù)塊進(jìn)程運(yùn)行時(shí)的全局變量、局部變量和常量等的存儲(chǔ)區(qū)以及開(kāi)辟的工作區(qū)。系統(tǒng)或用戶堆棧每個(gè)進(jìn)程捆綁的系統(tǒng)/用戶堆棧,用來(lái)解決過(guò)程調(diào)用或系統(tǒng)調(diào)用時(shí)的信息存儲(chǔ)和參數(shù)傳遞。進(jìn)程控制塊進(jìn)程的標(biāo)志信息、處理機(jī)狀態(tài)信息、進(jìn)程調(diào)度信息、進(jìn)程控制信息。2.1進(jìn)程描述(續(xù))3.進(jìn)程的內(nèi)存映像用戶進(jìn)程在虛擬存儲(chǔ)中的組織形式如圖2.6所示。2.1進(jìn)程描述(續(xù))進(jìn)程標(biāo)識(shí)信息處理機(jī)狀態(tài)信息、進(jìn)程調(diào)度信息進(jìn)程控制信息用戶堆棧用戶私有地址空間(代碼、數(shù)據(jù))共享地址空間進(jìn)程控制塊圖2.6用戶進(jìn)程在虛擬內(nèi)存中的組織4.進(jìn)程的上下文

進(jìn)程的物理實(shí)體和支持進(jìn)程運(yùn)行的環(huán)境合稱為進(jìn)程上下文(processcontext)。進(jìn)程上下文包括:用戶級(jí)上下文(user-levelcontext)用戶級(jí)上下文由進(jìn)程的正文區(qū)、數(shù)據(jù)區(qū)、用戶棧區(qū)和共享存儲(chǔ)區(qū)組成,在編譯目標(biāo)文件時(shí)生成,占據(jù)進(jìn)程的虛擬地址空間。進(jìn)程的正文區(qū)是只讀的程序指令,數(shù)據(jù)區(qū)存放的是程序運(yùn)行時(shí)所需要的數(shù)據(jù),用戶棧區(qū)用來(lái)完成處理器運(yùn)行時(shí)的過(guò)程調(diào)用和返回、參數(shù)傳遞等。共享內(nèi)存區(qū)是與其它進(jìn)程共享的部分。系統(tǒng)級(jí)上下文(system-levelcontext)系統(tǒng)級(jí)上下文是由進(jìn)程控制塊、內(nèi)存管理信息、進(jìn)程環(huán)境塊和系統(tǒng)堆棧等組成的進(jìn)程地址空間。2.1進(jìn)程描述(續(xù))寄存器上下文(registercontext)。寄存器上下文由程序狀態(tài)寄存器、各類控制寄存器、地址寄存器、通用寄存器和用戶棧指針等組成。

當(dāng)一個(gè)進(jìn)程被系統(tǒng)調(diào)度而占有處理器時(shí),會(huì)發(fā)生處理器在新老進(jìn)程之間切換,切換的內(nèi)容是進(jìn)程上下文,進(jìn)程運(yùn)行是在進(jìn)程的上下文中執(zhí)行的。2.1進(jìn)程描述(續(xù))2.2進(jìn)程控制2.2.1進(jìn)程創(chuàng)建

操作系統(tǒng)為一個(gè)程序構(gòu)建一個(gè)進(jìn)程控制塊并分配地址空間后,就創(chuàng)建了一個(gè)進(jìn)程。操作系統(tǒng)創(chuàng)建進(jìn)程主要步驟如下:(1)命名進(jìn)程:為進(jìn)程設(shè)置進(jìn)程標(biāo)志符;(2)從PCB集合中為新進(jìn)程申請(qǐng)一個(gè)空白PCB;(3)確定進(jìn)程的優(yōu)先級(jí);(4)為進(jìn)程的程序段、數(shù)據(jù)段和用戶棧分配內(nèi)存空間;如果進(jìn)程中需要共享某

個(gè)已在內(nèi)存的程序段,則必須建立共享程序段的鏈接指針。(5)為進(jìn)程分配除內(nèi)存外的其他各種資源。2.2進(jìn)程控制(續(xù))2.2.1進(jìn)程創(chuàng)建(續(xù))

(6)初始化進(jìn)程控制塊,將進(jìn)程的初始化信息寫(xiě)入進(jìn)程控制塊。(7)如果就緒隊(duì)列能夠接納新創(chuàng)建的進(jìn)程,則將新進(jìn)程插入到就緒隊(duì)列。(8)通知操作系統(tǒng)的其他管理模塊,如記賬程序、性能監(jiān)控程序等。2.2進(jìn)程控制(續(xù))2.2.1進(jìn)程創(chuàng)建(續(xù))

(6)初始化進(jìn)程控制塊,將進(jìn)程的初始化信息寫(xiě)入進(jìn)程控制塊。(7)如果就緒隊(duì)列能夠接納新創(chuàng)建的進(jìn)程,則將新進(jìn)程插入到就緒隊(duì)列。(8)通知操作系統(tǒng)的其他管理模塊,如記賬程序、性能監(jiān)控程序等。

在操作系統(tǒng)中,進(jìn)行資源管理和系統(tǒng)控制的進(jìn)程為系統(tǒng)進(jìn)程,系統(tǒng)進(jìn)程執(zhí)行系統(tǒng)代碼,在操作系統(tǒng)生成時(shí)創(chuàng)建。系統(tǒng)進(jìn)程承擔(dān)系統(tǒng)資源分配和管理,運(yùn)行在系統(tǒng)空間。用戶進(jìn)程是用戶為了完成自己的任務(wù)而創(chuàng)建的進(jìn)程,用戶進(jìn)程執(zhí)行用戶代碼,運(yùn)行在用戶空間。2.2進(jìn)程控制(續(xù))引起進(jìn)程的創(chuàng)建的事件:操作系統(tǒng)初始化當(dāng)操作系統(tǒng)啟動(dòng)時(shí),通常會(huì)創(chuàng)建若干進(jìn)程,特別是一些常駐系統(tǒng)的進(jìn)程。這些進(jìn)程有的運(yùn)行在系統(tǒng)的前臺(tái),供用戶交互;有的運(yùn)行在后臺(tái),完成某些專門(mén)的功能。如網(wǎng)絡(luò)服務(wù)器中的電子郵件服務(wù)進(jìn)程,如果沒(méi)有郵件需要處理,則進(jìn)入休眠狀態(tài);如果郵件到來(lái),則該進(jìn)程被喚醒,處理接收到的郵件。提供用戶服務(wù)當(dāng)運(yùn)行中的程序需要某種服務(wù)時(shí),系統(tǒng)專門(mén)創(chuàng)建一個(gè)進(jìn)程來(lái)提供所需要的服務(wù),如打印文件、屏幕輸出等。分時(shí)系統(tǒng)用戶登錄當(dāng)用戶在終端鍵入登錄命令后,系統(tǒng)將為該終端用戶建立一個(gè)進(jìn)程。2.2進(jìn)程控制(續(xù))用戶請(qǐng)求系統(tǒng)創(chuàng)建新進(jìn)程在交互式系統(tǒng)中,用戶用鍵盤(pán)鍵入命令或用鼠標(biāo)點(diǎn)擊,則可以創(chuàng)建新進(jìn)程。如在Windows操作系統(tǒng)中,用戶可以用鍵盤(pán)運(yùn)行多個(gè)程序,或用鼠標(biāo)打開(kāi)多個(gè)窗口。每個(gè)程序或每個(gè)窗口對(duì)應(yīng)一個(gè)新的進(jìn)程。執(zhí)行創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用正在運(yùn)行的進(jìn)程由于程序自身需要可以用系統(tǒng)調(diào)用創(chuàng)建新進(jìn)程。一個(gè)正在運(yùn)行的進(jìn)程,如果需要處理與其相關(guān)卻又相互獨(dú)立的事件,可以用系統(tǒng)調(diào)用來(lái)創(chuàng)建一個(gè)新的進(jìn)程來(lái)完成這樣的事件。如UNIX操作系統(tǒng)中父進(jìn)程用系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程,子進(jìn)程協(xié)同父進(jìn)程完成同一任務(wù)。批處理作業(yè)的初始化和調(diào)度用戶提交批處理作業(yè),當(dāng)操作系統(tǒng)能夠提供資源時(shí),作業(yè)調(diào)度程序按照一定的算法,從批處理作業(yè)清單中調(diào)度某個(gè)作業(yè)并裝入內(nèi)存,為作業(yè)分配必要的資源,創(chuàng)建作業(yè)的進(jìn)程。2.2進(jìn)程控制(續(xù))在許多操作系統(tǒng)中,把創(chuàng)建進(jìn)程的進(jìn)程稱為父進(jìn)程,被創(chuàng)建的新進(jìn)程稱為子進(jìn)程。一個(gè)父進(jìn)程可以創(chuàng)建多個(gè)子進(jìn)程,一個(gè)子進(jìn)程只能屬于一個(gè)父進(jìn)程。從本質(zhì)上講,操作系統(tǒng)中能夠存在的最大進(jìn)程數(shù)受到系統(tǒng)內(nèi)存大小的限制。為了系統(tǒng)穩(wěn)定,大多數(shù)操作系統(tǒng)都能夠設(shè)置最大進(jìn)程數(shù),多用戶操作系統(tǒng)允許在用戶之間調(diào)節(jié)各用戶的最大進(jìn)程數(shù)。2.2進(jìn)程控制(續(xù))2.2.2進(jìn)程的結(jié)束

進(jìn)程的結(jié)束從進(jìn)程結(jié)構(gòu)中消除進(jìn)程,將系統(tǒng)分配給進(jìn)程的資源歸還給系統(tǒng)。進(jìn)程結(jié)束的原因可歸納如下:進(jìn)程正常結(jié)束當(dāng)進(jìn)程需要處理的事件已經(jīng)完成,則進(jìn)程正常結(jié)束。進(jìn)程設(shè)置有結(jié)束標(biāo)志,操作系統(tǒng)識(shí)別進(jìn)程結(jié)束標(biāo)志后,結(jié)束進(jìn)程。用于進(jìn)程結(jié)束的標(biāo)志有批處理作業(yè)中的“halt”,多用戶系統(tǒng)中的“l(fā)ogoff”,用戶程序中的“end”等。操作異常退出在一般情況下進(jìn)程執(zhí)行了非法指令,如執(zhí)行了特權(quán)指令、除零和操作數(shù)溢出等引起的算術(shù)錯(cuò)誤,會(huì)導(dǎo)致進(jìn)程異常結(jié)束。時(shí)間指標(biāo)超限引起的進(jìn)程異常結(jié)束進(jìn)程運(yùn)行時(shí)間超過(guò)所分配的最大時(shí)間限制,等待時(shí)間超過(guò)了所設(shè)定的最大等待時(shí)間,會(huì)導(dǎo)致進(jìn)程異常結(jié)束。2.2進(jìn)程控制(續(xù))多個(gè)進(jìn)程之間競(jìng)爭(zhēng)資源多個(gè)進(jìn)程由于相互競(jìng)爭(zhēng)資源,發(fā)生沖突,使得進(jìn)程被中止而異常結(jié)束。進(jìn)程之間競(jìng)爭(zhēng)的資源可能是硬件或軟件資源。內(nèi)存的使用出錯(cuò)內(nèi)存資源有限,如果內(nèi)存不足,或者內(nèi)存越界錯(cuò)誤,或者對(duì)內(nèi)存共享區(qū)的非法使用都可能發(fā)生進(jìn)程異常結(jié)束。父進(jìn)程結(jié)束在有的操作系統(tǒng)中,父進(jìn)程結(jié)束,會(huì)引起父進(jìn)程下的子進(jìn)程結(jié)束。操作系統(tǒng)終止操作系統(tǒng)終止會(huì)使操作系統(tǒng)中的所有進(jìn)程結(jié)束。2.2進(jìn)程控制(續(xù))進(jìn)程結(jié)束過(guò)程以下三步。(1)通過(guò)結(jié)束進(jìn)程的標(biāo)志符,在進(jìn)程控制塊隊(duì)列中找到

結(jié)束進(jìn)程的進(jìn)程控制塊,根據(jù)進(jìn)程控制塊中的信息,

將進(jìn)程所擁有的資源歸還給父進(jìn)程或操作系統(tǒng)。(2)將結(jié)束進(jìn)程從進(jìn)程隊(duì)列中撤銷,將進(jìn)程控制塊歸還

到進(jìn)程控制塊集合中。(3)如果結(jié)束的進(jìn)程有子進(jìn)程,進(jìn)程結(jié)束相對(duì)比較復(fù)雜。有些操作系統(tǒng)中,如果父進(jìn)程結(jié)束,其相應(yīng)的子進(jìn)程也自動(dòng)結(jié)束;些操作系統(tǒng)中,父進(jìn)程結(jié)束對(duì)子進(jìn)程沒(méi)有明顯的影響,父進(jìn)程結(jié)束后,會(huì)將子進(jìn)程交給系統(tǒng)進(jìn)程管理。2.2進(jìn)程控制(續(xù))

2.2.3進(jìn)程阻塞和喚醒

進(jìn)程阻塞是進(jìn)程的一種自主行為,是進(jìn)程為了等待某事件的發(fā)生,或等待輸入/輸出操作的完成,而自己調(diào)用系統(tǒng)原語(yǔ)使得自己放棄處理器,進(jìn)入阻塞隊(duì)列中等待。進(jìn)程阻塞需要完成如下工作:(1)停止進(jìn)程在處理器中執(zhí)行,保存現(xiàn)場(chǎng)信息到進(jìn)程的進(jìn)程控制塊中。(2)修改進(jìn)程控制塊中的進(jìn)程狀態(tài)等相關(guān)內(nèi)容,并將進(jìn)程控制塊加入到相應(yīng)阻塞進(jìn)程的進(jìn)程控制塊隊(duì)列中。(3)進(jìn)程調(diào)度程序轉(zhuǎn)入其他進(jìn)程調(diào)度。2.2進(jìn)程控制(續(xù))當(dāng)?shù)却氖录絹?lái)或等待的輸入/輸出操作完成時(shí),會(huì)產(chǎn)生一個(gè)中斷,激活操作系統(tǒng)。在操作系統(tǒng)的控制下阻塞的進(jìn)程被喚醒。被喚醒的進(jìn)程其進(jìn)程狀態(tài)由阻塞轉(zhuǎn)換為就緒。喚醒進(jìn)程的主要工作是修改進(jìn)程控制塊中的狀態(tài),將進(jìn)程控制塊轉(zhuǎn)入到就緒進(jìn)程的進(jìn)程控制塊隊(duì)列。

進(jìn)程的阻塞和喚醒雖然是一對(duì)相反的操作,但是發(fā)生這兩個(gè)操作的主體和客體卻有區(qū)別。進(jìn)程阻塞是進(jìn)程的自我行為,主體和客體是同一進(jìn)程;進(jìn)程喚醒是被動(dòng)行為,是當(dāng)前處于阻塞狀態(tài)的進(jìn)程被其它進(jìn)程喚醒,主體和客體是兩個(gè)不同的進(jìn)程。如果某個(gè)進(jìn)程因?yàn)槟撤N原因而調(diào)用阻塞原語(yǔ)進(jìn)入阻塞時(shí),只有與其相關(guān)的處于非阻塞狀態(tài)的進(jìn)程調(diào)用喚醒原語(yǔ)將阻塞進(jìn)程喚醒。2.2進(jìn)程控制(續(xù))

2.2.4進(jìn)程的掛起和激活處于阻塞狀態(tài)、就緒狀態(tài)和運(yùn)行狀態(tài)的進(jìn)程都可以被掛起根據(jù)進(jìn)程掛起前的狀態(tài)決定掛起后的狀態(tài)。如果進(jìn)程被掛起,進(jìn)程的進(jìn)程控制塊中的信息要修改,進(jìn)程上下文被放到外存。如果進(jìn)程掛起的時(shí)間到或者內(nèi)存資源充足時(shí),系統(tǒng)或有關(guān)進(jìn)程,特別是進(jìn)程同步中的原語(yǔ)操作,會(huì)激活被掛起的進(jìn)程。激活進(jìn)程的主要工作是將進(jìn)程上下文從外存調(diào)入內(nèi)存,修改進(jìn)程控制塊信息并調(diào)入內(nèi)存,修改進(jìn)程控制塊中的進(jìn)程狀態(tài),并按照進(jìn)程狀態(tài)將進(jìn)程控制塊排入到相應(yīng)的進(jìn)程隊(duì)列。2.2進(jìn)程控制(續(xù))2.2.5執(zhí)行的模式內(nèi)核是操作系統(tǒng)中核心功能的集合,包括如下功能:進(jìn)程管理進(jìn)程管理主要為進(jìn)程的創(chuàng)建和終止、進(jìn)程的調(diào)度和分派、進(jìn)程轉(zhuǎn)換、進(jìn)程的同步和進(jìn)程通信的支持組成。存儲(chǔ)器管理存儲(chǔ)器管理主要為分配和回收存儲(chǔ)器空間、內(nèi)存保護(hù)和兌換、虛擬存儲(chǔ)器管理。設(shè)備管理設(shè)備管理為緩沖區(qū)管理、I/O控制方式、設(shè)備驅(qū)動(dòng)程序、設(shè)備分配、設(shè)備獨(dú)立性功能模塊。支持功能支持功能主要為中斷處理、時(shí)鐘管理、原語(yǔ)操作。2.2進(jìn)程控制(續(xù))2.2.5執(zhí)行的模式操作系統(tǒng)的主要功能是處理器管理、存儲(chǔ)器管理、設(shè)備管理、文件管理和用戶接口,而內(nèi)核涵蓋了操作系統(tǒng)主要功能中的大部分。為了對(duì)操作系統(tǒng)和操作系統(tǒng)中的關(guān)鍵數(shù)據(jù)進(jìn)行保護(hù),避免用戶程序?qū)Σ僮飨到y(tǒng)的破壞,將處理器運(yùn)行分為與操作系統(tǒng)有關(guān)的模式和與用戶程序有關(guān)的模式。2.2進(jìn)程控制(續(xù))與操作系統(tǒng)有關(guān)的模式包括系統(tǒng)模式(systemmode)、控制模式(controlmode)和內(nèi)核模式(kernalmode),是較高特權(quán)模式。與用戶有關(guān)的模式是較低特權(quán)模式,用戶程序只能在這樣的級(jí)別執(zhí)行。在內(nèi)核模式下,系統(tǒng)軟件對(duì)處理器和所有指令、寄存器、存儲(chǔ)器擁有全部控制權(quán),而用戶模式不需要這樣的控制權(quán)。在系統(tǒng)中設(shè)置了一個(gè)標(biāo)志位顯示當(dāng)前處理器所處的模式,該標(biāo)志位因系統(tǒng)對(duì)事件的響應(yīng)改變,如果用戶程序中調(diào)用了操作系統(tǒng)服務(wù),則處理器的模式會(huì)從用戶模式變?yōu)閮?nèi)核模式,在從操作系統(tǒng)服務(wù)中回到一般的用戶程序后,處理器的模式又從內(nèi)核模式變?yōu)橛脩裟J健?.2進(jìn)程控制(續(xù))2.2.6操作系統(tǒng)的運(yùn)行

操作系統(tǒng)是軟件,需要處理器運(yùn)行,與普通程序不同,操作系統(tǒng)需要控制處理器運(yùn)行。操作系統(tǒng)的運(yùn)行有下面三種方式。(1)在進(jìn)程以外運(yùn)行在許多早期的操作系統(tǒng)中,操作系統(tǒng)內(nèi)核會(huì)在進(jìn)程以外運(yùn)行,操作系統(tǒng)有自己的內(nèi)存區(qū)和系統(tǒng)棧。如果當(dāng)前正在運(yùn)行的進(jìn)程發(fā)生中斷或執(zhí)行系統(tǒng)調(diào)用,則保留進(jìn)程的處理器狀態(tài),內(nèi)核得到控制權(quán),操作系統(tǒng)按照自己的棧情況,在自己的內(nèi)存區(qū)中運(yùn)行。在操作系統(tǒng)的操作完成后,會(huì)恢復(fù)中斷的進(jìn)程繼續(xù)執(zhí)行或調(diào)用其他的進(jìn)程運(yùn)行。進(jìn)程的概念只適合用戶程序,操作系統(tǒng)代碼在特權(quán)模式下作為一個(gè)獨(dú)立的實(shí)體運(yùn)行。2.2進(jìn)程控制(續(xù))(2)在用戶進(jìn)程中運(yùn)行在小型計(jì)算機(jī)或微型計(jì)算機(jī)的操作系統(tǒng)中將所有的操作系統(tǒng)軟件作為用戶進(jìn)程的內(nèi)容執(zhí)行。操作系統(tǒng)作為供用戶程序調(diào)用的功能集合,在用戶進(jìn)程環(huán)境下執(zhí)行。在任何時(shí)刻,操作系統(tǒng)都管理若干個(gè)進(jìn)程映像,每個(gè)進(jìn)程映像不僅包括進(jìn)程控制塊、進(jìn)程對(duì)應(yīng)的程序、數(shù)據(jù)和相關(guān)的堆棧,還包括供操作系統(tǒng)內(nèi)核程序使用的程序和數(shù)據(jù)、堆棧等。操作系統(tǒng)的程序和數(shù)據(jù)處于共享地址空間,可由所有用戶進(jìn)程共享。在用戶程序執(zhí)行中,如果發(fā)生了中斷或系統(tǒng)調(diào)用,正在執(zhí)行的進(jìn)程的上下文被保存并發(fā)生上下文切換,但是,處理器的運(yùn)行仍然在當(dāng)前用戶進(jìn)程的內(nèi)部,沒(méi)有發(fā)生用戶進(jìn)程的切換,上下文的切換在同一進(jìn)程內(nèi)部發(fā)生。在中斷完成或系統(tǒng)調(diào)用結(jié)束后,當(dāng)前進(jìn)程中的上下文被恢復(fù),處理器仍然執(zhí)行當(dāng)前進(jìn)程。在用戶進(jìn)程中運(yùn)行操作系統(tǒng)程序的優(yōu)點(diǎn)是不會(huì)帶來(lái)兩個(gè)進(jìn)程切換的開(kāi)銷。2.2進(jìn)程控制(續(xù))(3)作為獨(dú)立進(jìn)程運(yùn)行將操作系統(tǒng)作為系統(tǒng)進(jìn)程的集合來(lái)實(shí)現(xiàn),操作系統(tǒng)內(nèi)核部分的軟件在內(nèi)核模式下執(zhí)行,作為獨(dú)立進(jìn)程進(jìn)行組織。在這種情況下,只有少部分操作系統(tǒng)代碼會(huì)執(zhí)行在所有進(jìn)程外。操作系統(tǒng)作為獨(dú)立進(jìn)程運(yùn)行的優(yōu)點(diǎn)是易于實(shí)現(xiàn)操作系統(tǒng)的模塊化。在多處理器或多計(jì)算機(jī)環(huán)境下,能夠使一些操作系統(tǒng)的服務(wù)轉(zhuǎn)移到其它的處理器中,提高了操作系統(tǒng)性能。2.3前

圖前趨圖是為了更好的描述多個(gè)進(jìn)程之間的關(guān)系而引入的無(wú)循環(huán)方向圖,如圖2.7所示。節(jié)點(diǎn)用于表示一個(gè)進(jìn)程或一段程序,節(jié)點(diǎn)之間用一個(gè)有方向的線段相連方向表示所連接的節(jié)點(diǎn)之間的前趨和后繼關(guān)系,被指向的節(jié)點(diǎn)為后繼節(jié)點(diǎn),離開(kāi)箭頭的節(jié)點(diǎn)是前趨節(jié)點(diǎn)。如果用

表示前趨與后繼,則Pi為前趨節(jié)點(diǎn),Pj為后繼節(jié)點(diǎn)。前趨圖中節(jié)點(diǎn)之間不存在循環(huán)關(guān)系。圖2.7前趨圖表示P5P6P0P1P2P3P4例:有S1、S2、S3、S4四條語(yǔ)句,S1:a:=x+4S2:b:=y+8S3:c:=a+bS4:d:=a+c將S1、S2、S3、S4四條語(yǔ)句分別看成前趨圖中的節(jié)點(diǎn),則語(yǔ)句關(guān)系用前趨圖表示如圖2.8所示。圖2.8前趨圖表示2.3前

圖例:有7個(gè)進(jìn)程,P0,P1,P2,P3,P4,P5,P6,用前趨圖表示如圖2.9所示。前趨圖描述了進(jìn)程之間的復(fù)雜關(guān)系。

借助于前趨圖,可以分析進(jìn)程之間的運(yùn)行關(guān)系,特別是并發(fā)環(huán)境下進(jìn)程之間的關(guān)系。圖2.9多個(gè)進(jìn)程的前趨圖表示2.3前

圖2.4UNIX操作系統(tǒng)的進(jìn)程描述和控制2.4.1UNIX操作系統(tǒng)的進(jìn)程狀態(tài)不同的操作系統(tǒng),根據(jù)實(shí)際描述進(jìn)程的需要可以定義進(jìn)程的各種狀態(tài)。在UNIX操作系統(tǒng)中,進(jìn)程的狀態(tài)及狀態(tài)轉(zhuǎn)換關(guān)系如圖2.10所示。

圖2.10UNIX的進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換2.4.1UNIX操作系統(tǒng)的進(jìn)程狀態(tài)

UNIX有9個(gè)進(jìn)程狀態(tài)。(1)創(chuàng)建狀態(tài):進(jìn)程的初始狀態(tài),進(jìn)程未進(jìn)入就緒狀態(tài)之前的情形。(2)內(nèi)存就緒狀態(tài):進(jìn)程已具備執(zhí)行條件,等待系統(tǒng)調(diào)度程序調(diào)度進(jìn)程執(zhí)行。(3)換出就緒狀態(tài):為了節(jié)約內(nèi)存,將處于內(nèi)存就緒狀態(tài)的進(jìn)程換出到外存,相當(dāng)于進(jìn)程的掛起就緒狀態(tài)。換出就緒進(jìn)程需要換入內(nèi)存,成為內(nèi)存就緒狀態(tài)后才能被調(diào)度執(zhí)行。(4)核心態(tài)執(zhí)行:處于執(zhí)行狀態(tài)的進(jìn)程,此時(shí)進(jìn)程執(zhí)行的是操作系統(tǒng)核心程序。如果用戶程序中出現(xiàn)系統(tǒng)調(diào)用,則系統(tǒng)調(diào)用部分切換到核心態(tài)下執(zhí)行。(5)用戶態(tài)執(zhí)行:處于執(zhí)行狀態(tài)的進(jìn)程,此時(shí)執(zhí)行的是用戶程序。(6)內(nèi)存睡眠狀態(tài):與進(jìn)程阻塞狀態(tài)對(duì)應(yīng),進(jìn)程在內(nèi)存中等待輸入/輸出操作的完成或等待事件的發(fā)生。內(nèi)存睡眠狀態(tài)的進(jìn)程被喚醒后轉(zhuǎn)換為內(nèi)存就緒狀態(tài)。2.4.1UNIX操作系統(tǒng)的進(jìn)程狀態(tài)

(7)換出睡眠狀態(tài):相當(dāng)于進(jìn)程的掛起阻塞狀態(tài)。將處于睡眠狀態(tài)的進(jìn)程換出到外存,當(dāng)進(jìn)程被喚醒后處于換出就緒狀態(tài)。(8)被搶占狀態(tài):當(dāng)用戶進(jìn)程完成系統(tǒng)調(diào)用從核心態(tài)返回用戶態(tài)時(shí),被另一個(gè)進(jìn)程搶占,從核心態(tài)返回的用戶進(jìn)程置于被搶占狀態(tài)。處于被搶占狀態(tài)的進(jìn)程與處于內(nèi)存就緒狀態(tài)的進(jìn)程相同,都是等待再次被調(diào)度執(zhí)行,因此在圖2.10中用虛線將內(nèi)存就緒狀態(tài)與被搶占狀態(tài)連接起來(lái)。如果進(jìn)程處于內(nèi)核模式,則不能被搶占。從這一點(diǎn)來(lái)講,UNIX操作系統(tǒng)不適合實(shí)時(shí)處理。(9)僵死狀態(tài):也稱為進(jìn)程結(jié)束狀態(tài)。處于該狀態(tài)的進(jìn)程已不存在,但會(huì)在其父進(jìn)程中留下進(jìn)程的結(jié)束碼及計(jì)時(shí)統(tǒng)計(jì)信息等。當(dāng)進(jìn)程需要正常結(jié)束時(shí),可以用系統(tǒng)調(diào)用exit進(jìn)入僵死狀態(tài)。當(dāng)進(jìn)程需要異常結(jié)束時(shí),可以接收軟中斷信號(hào)進(jìn)入僵死狀態(tài)。僵死狀態(tài)是進(jìn)程的最后狀態(tài)。2.4.2UNIX操作系統(tǒng)進(jìn)程的描述和控制

1.UNIX操作系統(tǒng)的進(jìn)程描述UNIX操作系統(tǒng)進(jìn)程描述的數(shù)據(jù)結(jié)構(gòu)包括進(jìn)程控制塊、用戶級(jí)上下文、系統(tǒng)級(jí)上下文和寄存器上下文。用戶級(jí)上下文由進(jìn)程的正文、數(shù)據(jù)、用戶棧和共享存儲(chǔ)區(qū)組成,占據(jù)進(jìn)程的虛地址空間。系統(tǒng)級(jí)上下文由進(jìn)程表項(xiàng)、U區(qū)、進(jìn)程區(qū)表和系統(tǒng)棧組成。進(jìn)程表由進(jìn)程控制塊組成,每個(gè)進(jìn)程控制塊占據(jù)進(jìn)程表的一個(gè)表項(xiàng)。每個(gè)進(jìn)程的系統(tǒng)級(jí)上下文中都有指向進(jìn)程表項(xiàng)的指針,通過(guò)該指針得到每個(gè)進(jìn)程的進(jìn)程控制塊。U區(qū)存放的是進(jìn)程表項(xiàng)的擴(kuò)充信息,有進(jìn)程表項(xiàng)指針、用戶標(biāo)志符、信號(hào)句柄數(shù)組、控制終端、錯(cuò)誤域、返回值、I/O參數(shù)、文件參數(shù)、用戶文件描述表和限制值。進(jìn)程區(qū)表定義進(jìn)程的虛地址到物理地址的映射,即通常意義的頁(yè)表或段表。系統(tǒng)棧是進(jìn)程在核心態(tài)執(zhí)行時(shí)使用的棧。寄存器上下文由程序狀態(tài)寄存器、各類控制寄存器、地址寄存器、通用寄存器和用戶棧指針等組成。2.4.2UNIX操作系統(tǒng)進(jìn)程的描述和控制(續(xù))2.UNIX操作系統(tǒng)的進(jìn)程控制(1)進(jìn)程創(chuàng)建在UNIX操作系統(tǒng)中用系統(tǒng)調(diào)用fork創(chuàng)建新進(jìn)程。系統(tǒng)調(diào)用fork運(yùn)行在內(nèi)核模式,其步驟為:為新進(jìn)程在進(jìn)程表中分配一個(gè)表項(xiàng),即構(gòu)建進(jìn)程控制塊;為新進(jìn)程分配一個(gè)唯一的進(jìn)程標(biāo)志符pid;通過(guò)拷貝父進(jìn)程的進(jìn)程映像來(lái)創(chuàng)建一個(gè)新進(jìn)程,新進(jìn)程獲得其父進(jìn)程地址空間的一份拷貝;將新進(jìn)程的進(jìn)程狀態(tài)等信息寫(xiě)入進(jìn)程表中相應(yīng)的進(jìn)程表項(xiàng);增加與該進(jìn)程相關(guān)聯(lián)的文件表和索引節(jié)點(diǎn)表的引用數(shù),并將創(chuàng)建的新進(jìn)程的進(jìn)程標(biāo)志返回給父進(jìn)程,收到父進(jìn)程返回的信號(hào)則標(biāo)志新進(jìn)程創(chuàng)建完畢。新進(jìn)程創(chuàng)建后拷貝其父進(jìn)程的上下文,新進(jìn)程可以使用父進(jìn)程的當(dāng)前目錄和根目錄以及已打開(kāi)的文件,當(dāng)然,文件的引用計(jì)數(shù)要加1。由于父進(jìn)程創(chuàng)建子進(jìn)程時(shí)希望子進(jìn)程結(jié)束后能把控制返回給父進(jìn)程,所以子進(jìn)程不能覆蓋父進(jìn)程給予的控制區(qū)。在UNIX操作系統(tǒng)中可以用系統(tǒng)調(diào)用exec創(chuàng)建子進(jìn)程,與系統(tǒng)調(diào)用fork創(chuàng)建子進(jìn)程不同,exec創(chuàng)建的子進(jìn)程會(huì)完全覆蓋父進(jìn)程的上下文,父進(jìn)程在子進(jìn)程創(chuàng)建成功后自動(dòng)消失,不會(huì)出現(xiàn)父進(jìn)程與子進(jìn)程并發(fā)的情況。(2)終止進(jìn)程當(dāng)進(jìn)程的任務(wù)完成后,為了收回進(jìn)程所占用的系統(tǒng)資源和減少父進(jìn)程的負(fù)擔(dān),可以用系統(tǒng)調(diào)用exit來(lái)實(shí)現(xiàn)進(jìn)程的自我終止。進(jìn)程的自我終止可以在正常情況下,也可以在異常情況下。2.4.2UNIX操作系統(tǒng)進(jìn)程的描述和控制(續(xù))(2)終止進(jìn)程當(dāng)進(jìn)程的任務(wù)完成后,為了收回進(jìn)程所占用的系統(tǒng)資源和減少父進(jìn)程的負(fù)擔(dān),可以用系統(tǒng)調(diào)用exit來(lái)實(shí)現(xiàn)進(jìn)程的自我終止。進(jìn)程的自我終止可以在正常情況下,也可以在異常情況下。系統(tǒng)調(diào)用exit的步驟如下:關(guān)閉進(jìn)程的軟中斷信號(hào);如果進(jìn)程是與控制終端相連的進(jìn)程組組長(zhǎng),則向本組進(jìn)程發(fā)出掛起信號(hào);關(guān)閉所有打開(kāi)的文件;釋放進(jìn)程的上下文、當(dāng)前目錄;記錄進(jìn)程運(yùn)行時(shí)的統(tǒng)計(jì)信息;進(jìn)程狀態(tài)轉(zhuǎn)換為進(jìn)入僵死狀態(tài);2.4.2UNIX操作系統(tǒng)進(jìn)程的描述和控制(續(xù))將未結(jié)束的子進(jìn)程交給系統(tǒng)進(jìn)程收容,使這些子進(jìn)程成為系統(tǒng)進(jìn)程的合法子進(jìn)程;保留進(jìn)程表項(xiàng),通知并等待父進(jìn)程;父進(jìn)程發(fā)回信息,釋放進(jìn)程所占用的資源。

在子進(jìn)程和父進(jìn)程的終止關(guān)系上系統(tǒng)調(diào)用wait起著非常特殊的作用。當(dāng)父進(jìn)程要自我終止時(shí),系統(tǒng)調(diào)用wait將自己掛起,如果父進(jìn)程無(wú)子進(jìn)程,系統(tǒng)調(diào)用wait會(huì)返回一個(gè)出錯(cuò)碼,父進(jìn)程自我結(jié)束。如果父進(jìn)程的子進(jìn)程已進(jìn)入僵死狀態(tài),則系統(tǒng)調(diào)用wait的結(jié)果是收回子進(jìn)程的進(jìn)程表項(xiàng),并將子進(jìn)程的執(zhí)行時(shí)間加到父進(jìn)程的執(zhí)行時(shí)間上。如果子進(jìn)程不能結(jié)束,則父進(jìn)程等待子進(jìn)程終止,接收子進(jìn)程的返回狀態(tài)和返回參數(shù)。2.4.2UNIX操作系統(tǒng)進(jìn)程的描述和控制(續(xù))2.4.3UNIX操作系統(tǒng)的多級(jí)進(jìn)程關(guān)系

在進(jìn)程之間的關(guān)系上,UNIX按照多層次結(jié)構(gòu)方式組織進(jìn)程。一個(gè)進(jìn)程可以再創(chuàng)建新進(jìn)程,構(gòu)成父進(jìn)程和子進(jìn)程之間的關(guān)系。創(chuàng)建的新進(jìn)程為子進(jìn)程,原來(lái)的進(jìn)程為父進(jìn)程。每個(gè)子進(jìn)程只有一個(gè)父進(jìn)程,每個(gè)父進(jìn)程可以創(chuàng)建多個(gè)子進(jìn)程。多級(jí)進(jìn)程結(jié)構(gòu),如圖2.11所示。圖2.11UNIX多級(jí)進(jìn)程結(jié)構(gòu)2.4.3UNIX操作系統(tǒng)的多級(jí)進(jìn)程關(guān)系(續(xù))在進(jìn)程結(jié)構(gòu)的最上層進(jìn)程是進(jìn)程標(biāo)志(PID)為0的進(jìn)程,其主要任務(wù)是完成進(jìn)程調(diào)度,也稱為scheduled(或sched)進(jìn)程。所有的進(jìn)程都是在scheduled進(jìn)程下向下生成的多級(jí)進(jìn)程。進(jìn)程scheduled通過(guò)系統(tǒng)調(diào)用fork創(chuàng)建進(jìn)程標(biāo)識(shí)(PID)為1的初始化進(jìn)程init。初始化進(jìn)程init通過(guò)系統(tǒng)調(diào)用exec生成駐守在機(jī)器上的進(jìn)程:logger、update、cron、lpsched和getty進(jìn)程集等。其中,getty進(jìn)程集負(fù)責(zé)監(jiān)視每個(gè)終端上的用戶注冊(cè)情況,準(zhǔn)備接收用戶登錄。如果操作系統(tǒng)承擔(dān)有網(wǎng)絡(luò)服務(wù)功能,則駐守進(jìn)程還包含網(wǎng)絡(luò)服務(wù)進(jìn)程httpd、sendmail、ftp等。由于exec系統(tǒng)調(diào)用創(chuàng)建新進(jìn)程后,父進(jìn)程便會(huì)消失。因此,最終init進(jìn)程消失,而scheduled進(jìn)程一直存在于操作系統(tǒng)中,工作時(shí)被喚醒,不工作時(shí)處于睡眠狀態(tài)。2.5線程的描述與控制

2.5.1線程及其特征1.線程進(jìn)程作為資源分配和調(diào)度的單位給并發(fā)環(huán)境下的程序設(shè)計(jì)帶來(lái)了如下問(wèn)題:進(jìn)程切換需要系統(tǒng)付出的開(kāi)銷大在進(jìn)程創(chuàng)建時(shí),操作系統(tǒng)需要為進(jìn)程構(gòu)建進(jìn)程控制塊,分配內(nèi)存和各種設(shè)備,以進(jìn)程為單位進(jìn)行調(diào)度;在進(jìn)程撤銷時(shí),必須將進(jìn)程的進(jìn)程控制塊和所占用的全部資源回收。因此,進(jìn)程的創(chuàng)建、撤銷和進(jìn)程切換需要系統(tǒng)付出的代價(jià)太高。進(jìn)程切換是進(jìn)程上下文的切換。如果切換的兩個(gè)進(jìn)程之間有公共的地址空間和可共享的數(shù)據(jù),則沒(méi)有必要將兩個(gè)進(jìn)程的上下文完全切換。2.5線程的描述與控制

2.5.1線程及其特征1.線程

進(jìn)程通信的代價(jià)高進(jìn)程通信需要通信進(jìn)程之間或通信進(jìn)程與操作系統(tǒng)之間的信息傳遞,代價(jià)高。如果運(yùn)行的是同一個(gè)作業(yè),需要有輸入/輸出處理和計(jì)算處理,分別將輸入/輸出處理和計(jì)算處理用兩個(gè)獨(dú)立的進(jìn)程并發(fā)完成。這兩個(gè)進(jìn)程之間通過(guò)進(jìn)程通信來(lái)傳遞數(shù)據(jù)時(shí),不能利用同一作業(yè)的程序和數(shù)據(jù)共享的優(yōu)勢(shì)。進(jìn)程的并發(fā)度不高進(jìn)程切換和通信都需要付出較大的系統(tǒng)開(kāi)銷,降低了系統(tǒng)的并發(fā)度。2.5.1線程及其特征(續(xù))

在進(jìn)程的基礎(chǔ)上需要提出新的并發(fā)機(jī)制,需要將進(jìn)程作為資源分配的單位和調(diào)度單位分離開(kāi)來(lái),讓進(jìn)程只作為資源分配的單位,而用新的概念—線程,作為調(diào)度的基本單位。引入線程后,系統(tǒng)的并發(fā)程度更高。

線程是操作系統(tǒng)進(jìn)程中能夠獨(dú)立執(zhí)行的實(shí)體,是進(jìn)程的組成部分,是處理器調(diào)度的基本單位。在一個(gè)進(jìn)程中允許多個(gè)并發(fā)執(zhí)行的線程,同一進(jìn)程的線程共享進(jìn)程獲得的內(nèi)存空間和資源,但不獨(dú)立擁有進(jìn)程資源。2.5.1線程及其特征(續(xù))2.線程的特征線程作為在操作系統(tǒng)中存在的實(shí)體有如下特征:并發(fā)性共享性動(dòng)態(tài)性結(jié)構(gòu)性線程是操作系統(tǒng)中的基本調(diào)度和分派單位,線程具有唯一的標(biāo)志符和線程控制塊。線程控制塊中包含有線程的一切私有信息。2.5.1線程及其特征(續(xù))線程與進(jìn)程的特征比較:進(jìn)程和線程都具有并發(fā)性、異步性、結(jié)構(gòu)性;不同的是進(jìn)程具有獨(dú)立性,是獨(dú)立的資源分配和調(diào)度單位,而線程具有共享性,所有屬于同一進(jìn)程的線程共享進(jìn)程的資源;進(jìn)程中包含有程序運(yùn)行的管理信息,即指令代碼、全局?jǐn)?shù)據(jù)和I/O狀態(tài)數(shù)據(jù)等;線程中包含有程序的執(zhí)行信息,即CPU寄存器信息、用戶棧和內(nèi)核棧信息、局部變量、過(guò)程調(diào)用參數(shù)、返回值等各線程的私有部分的信息。2.5.1線程及其特征(續(xù))一個(gè)進(jìn)程中可以只有一個(gè)線程,該線程可以完全使用進(jìn)程的所有資源,如圖2.12所示。一個(gè)進(jìn)程中可以有多個(gè)線程,多個(gè)線程共享進(jìn)程的所有資源,如圖2.13所示。圖2.12單線程進(jìn)程圖2.13多線程進(jìn)程例如,在Windows系統(tǒng)中進(jìn)行Word文檔編輯時(shí),為了避免突然斷電或系統(tǒng)崩潰,每隔一定的時(shí)間字處理程序會(huì)在磁盤(pán)上自動(dòng)保存整個(gè)文件。如果采用單線程實(shí)現(xiàn)該應(yīng)用,則處理程序存盤(pán)時(shí),用戶的鍵盤(pán)和鼠標(biāo)命令就會(huì)被忽略,系統(tǒng)性能較差。如果讓鍵盤(pán)和鼠標(biāo)命令中斷磁盤(pán)備份,則中斷程序設(shè)計(jì)會(huì)很復(fù)雜。如果采用三個(gè)線程實(shí)現(xiàn)該應(yīng)用,一個(gè)線程用于與用戶交互,接收用戶的鍵盤(pán)和鼠標(biāo)操作,一個(gè)線程用于處理文檔的格式,一個(gè)線程用于周期性地寫(xiě)磁盤(pán)備份,則這三個(gè)線程操作在相同的用戶地址空間共享公共數(shù)據(jù)。訪問(wèn)的是相同的數(shù)據(jù),避免了數(shù)據(jù)的不一致性。如果采用三個(gè)進(jìn)程代替三個(gè)線程,則三個(gè)進(jìn)程在各自的文件上工作,三個(gè)進(jìn)程對(duì)應(yīng)的文件很難保持一致性??梢?jiàn),同一進(jìn)程的多個(gè)線程共享進(jìn)程的資源和地址空間,這是線程的一個(gè)非常突出的優(yōu)勢(shì),也是很多應(yīng)用程序采用線程實(shí)現(xiàn)的主要原因。2.5.1線程及其特征(續(xù))2.5.2線程的狀態(tài)與控制

多線程技術(shù)主要用于多處理器系統(tǒng)下,特別是近年來(lái)多核技術(shù)的出現(xiàn),在每個(gè)獨(dú)立的處理器核上獨(dú)立執(zhí)行線程的代碼流,符合現(xiàn)代操作系統(tǒng)的思想,使得系統(tǒng)的性能大大提高。

由于線程不是資源的擁有單位,因此,與進(jìn)程掛起相關(guān)的狀態(tài),對(duì)線程不具有意義。因?yàn)槿绻粋€(gè)進(jìn)程被掛起并被換出內(nèi)存,則進(jìn)程的所有線程由于共享進(jìn)程的地址空間,也必須全部換出內(nèi)存,所以,掛起操作引起的狀態(tài)變化是進(jìn)程級(jí)狀態(tài)變化,不作為線程狀態(tài)變化。線程的狀態(tài)有:新建狀態(tài)、就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)、結(jié)束狀態(tài)。2.5.2線程的狀態(tài)與控制

對(duì)于線程的阻塞狀態(tài),有兩種實(shí)現(xiàn)方法。一種實(shí)現(xiàn)方法認(rèn)為,只要有線程申請(qǐng)系統(tǒng)資源或線程之間相互通信,或由于其他事件而阻塞,相應(yīng)線程的進(jìn)程也進(jìn)入阻塞狀態(tài),這樣,進(jìn)程的所有線程都進(jìn)入阻塞狀態(tài),而不管是否有的線程會(huì)處于就緒狀態(tài);另一種實(shí)現(xiàn)方法認(rèn)為,只要有線程申請(qǐng)系統(tǒng)資源而阻塞,不會(huì)將相應(yīng)線程的進(jìn)程阻塞。這樣,進(jìn)程的所有線程,只要有線程處于就緒狀態(tài),則仍然有機(jī)會(huì)被調(diào)度。

在這兩種方法中,后面一種方法更具有靈活性,系統(tǒng)的性能更優(yōu)。2.5.2線程的狀態(tài)與控制(續(xù))線程的狀態(tài)及狀態(tài)變化如圖2.14所示。圖2.14線程狀態(tài)及其轉(zhuǎn)換確認(rèn)事件或I/O完成中斷調(diào)度等待事件或I/O終止運(yùn)行狀態(tài)新建狀態(tài)就緒狀態(tài)阻塞狀態(tài)終止?fàn)顟B(tài)2.5.2線程的狀態(tài)與控制(續(xù))在一個(gè)進(jìn)程中的多個(gè)線程并發(fā)執(zhí)行,由于這些并發(fā)執(zhí)行的線程之間共享進(jìn)程的所有資源,線程之間的切換在進(jìn)程內(nèi)部進(jìn)行,線程切換比獨(dú)立的進(jìn)程切換更加快速,開(kāi)銷也更小。在一個(gè)進(jìn)程中創(chuàng)建一個(gè)線程比單獨(dú)創(chuàng)建一個(gè)進(jìn)程所需要的存儲(chǔ)器開(kāi)銷和時(shí)間開(kāi)銷更小。在同一進(jìn)程的線程之間通信的效率比單獨(dú)進(jìn)程之間通信的效率更高。系統(tǒng)中線程的并發(fā)程度比進(jìn)程更高。屬于不同進(jìn)程中的多個(gè)線程并發(fā)執(zhí)行,由于線程之間不存在資源共享,這些線程之間在線程切換上,在創(chuàng)建新線程上,在相互通信上,在資源分配上,和獨(dú)立進(jìn)程之間一樣,沒(méi)有多大的優(yōu)勢(shì)。2.5.3線程庫(kù)

在支持線程的操作系統(tǒng)中,通過(guò)線程庫(kù)實(shí)現(xiàn)對(duì)線程的控制。線程庫(kù)提供了一系列的操作原語(yǔ)和應(yīng)用程序接口來(lái)支持多線程的運(yùn)行,包括線程創(chuàng)建、線程撤銷、線程激活、線程結(jié)束、線程之間的通信、線程之間的同步與互斥等。線程庫(kù)分為運(yùn)行在用戶空間的線程庫(kù)、運(yùn)行在內(nèi)核空間的線程庫(kù)和Java線程庫(kù)。2.5.3線程庫(kù)(續(xù))1.運(yùn)行在用戶空間的線程庫(kù)運(yùn)行在用戶空間中的線程庫(kù),為應(yīng)用程序的開(kāi)發(fā)和運(yùn)行提供支撐環(huán)境。由于完全運(yùn)行在用戶空間,這些線程庫(kù)由一般的單線程管理,與操作系統(tǒng)內(nèi)核隔離。運(yùn)行在用戶空間的線程庫(kù)具有如下優(yōu)點(diǎn):在內(nèi)核之外,不使用內(nèi)核資源,節(jié)省了內(nèi)核資源。在內(nèi)核之外,總是運(yùn)行在用戶空間,運(yùn)行時(shí)不需要用戶態(tài)與核心態(tài)之間的切換,運(yùn)行開(kāi)銷小,效率。運(yùn)行時(shí)與操作系統(tǒng)內(nèi)核沒(méi)有關(guān)系,可以按照應(yīng)用程序的需要選擇線程調(diào)度算法。所選擇的線程調(diào)度算法與操作系統(tǒng)的調(diào)度算法無(wú)關(guān),能夠運(yùn)行在任何操作系統(tǒng)上。運(yùn)行在用戶空間的線程庫(kù)存在的缺點(diǎn)如下:當(dāng)一個(gè)線程執(zhí)行系統(tǒng)調(diào)用時(shí),不僅該線程本身被阻塞,而且該線程所在進(jìn)程的所有線程都被阻塞,降低了系統(tǒng)的效率;在多處理器系統(tǒng)環(huán)境下,如果每個(gè)線程分別被指定在一個(gè)特定的處理器上并發(fā)運(yùn)行,一個(gè)線程阻塞會(huì)使得所有線程都阻塞,則多個(gè)處理器都空閑,處理器的效率降低。2.5.3線程庫(kù)(續(xù))2.運(yùn)行在內(nèi)核空間的線程庫(kù)運(yùn)行在操作系統(tǒng)內(nèi)核空間中的線程庫(kù),由內(nèi)核管理。在內(nèi)核中既要保存進(jìn)程的數(shù)據(jù)結(jié)構(gòu),又要建立、保存和維護(hù)線程的數(shù)據(jù)結(jié)構(gòu)以及每個(gè)線程的入口。因此,對(duì)內(nèi)核線程庫(kù),以應(yīng)用程序編程接口方式提供給多線程應(yīng)用程序編程者。內(nèi)核線程庫(kù)的優(yōu)點(diǎn)如下:能夠調(diào)度同一進(jìn)程的多個(gè)線程在不同處理器中并發(fā)運(yùn)行,在多處理器環(huán)境下,充分發(fā)揮了多個(gè)處理器并行工作的能力;如果某一線程阻塞,內(nèi)核不但能夠調(diào)度同一進(jìn)程的其它線程占有處理器,而且能夠調(diào)度其他進(jìn)程中的線程占用處理器,提高了處理器的效率。內(nèi)核線程庫(kù)的缺點(diǎn)為:對(duì)同一進(jìn)程,如果線程的控制權(quán)從一個(gè)線程傳遞到另一個(gè)線程,線程需要從用戶態(tài)到核心態(tài),再?gòu)暮诵膽B(tài)到用戶態(tài)進(jìn)行模式切換,系統(tǒng)開(kāi)銷較大。2.5.3線程庫(kù)(續(xù))

3.Java線程庫(kù)Java線程庫(kù)是一種用于高級(jí)語(yǔ)言的線程庫(kù),該線程庫(kù)提供了線程的創(chuàng)建和管理。所有的Java程序至少可以由一個(gè)單線程構(gòu)成。Java線程庫(kù)提供給程序開(kāi)發(fā)者在一個(gè)程序中創(chuàng)建和操作更多線程的機(jī)會(huì)。Java線程庫(kù)中的線程控制有創(chuàng)建線程、阻塞線程、喚醒線程、停止線程等API函數(shù)調(diào)用。通過(guò)各種線程控制函數(shù)的調(diào)用,實(shí)現(xiàn)線程各種狀態(tài)之間的轉(zhuǎn)換。2.5.4線程的實(shí)現(xiàn)線程的實(shí)現(xiàn)有三種方式:在操作系統(tǒng)內(nèi)核實(shí)現(xiàn)的內(nèi)核級(jí)線程(KernelLevelThread,KLT),如Windows2000/XP,OS/2等;在用戶空間實(shí)現(xiàn)的用戶級(jí)線程(UserLevelThread,ULT),如Java的線程庫(kù)等;同時(shí)支持兩種線程的混合式線程實(shí)現(xiàn),如Solaris系統(tǒng)。圖2.15線程實(shí)現(xiàn)方式線程庫(kù)用戶級(jí)線程用戶空間內(nèi)核空間P進(jìn)程內(nèi)核級(jí)線程用戶空間內(nèi)核空間P進(jìn)程混合式線程內(nèi)核空間P線程庫(kù)P進(jìn)程用戶空間線程實(shí)現(xiàn)方式如圖2.15所示。2.5.4線程的實(shí)現(xiàn)1.內(nèi)核級(jí)線程實(shí)現(xiàn)在完全內(nèi)核級(jí)線程環(huán)境中,線程管理的全部工作由操作系統(tǒng)內(nèi)核在內(nèi)核空間實(shí)現(xiàn)。內(nèi)核為應(yīng)用程序開(kāi)發(fā)者提供了一個(gè)應(yīng)用程序設(shè)計(jì)接口API,如Windows操作系統(tǒng),DigitalUNIX操作系統(tǒng),Solaris操作系統(tǒng)和OS/2操作系統(tǒng)都為應(yīng)用程序使用內(nèi)核級(jí)線程提供了應(yīng)用程序接口API,除了API函數(shù)調(diào)用外,應(yīng)用程序區(qū)不需要有任何線程管理的其他代碼。應(yīng)用程序通過(guò)調(diào)用API函數(shù),實(shí)現(xiàn)線程的創(chuàng)建和控制管理。當(dāng)應(yīng)用程序執(zhí)行時(shí),內(nèi)核根據(jù)應(yīng)用程序中的函數(shù)調(diào)用完成相應(yīng)的線程創(chuàng)建和控制管理。內(nèi)核為整個(gè)進(jìn)程及進(jìn)程中的所有線程維護(hù)現(xiàn)場(chǎng)信息。內(nèi)核建立和維護(hù)進(jìn)程的進(jìn)程控制塊(PCB),線程控制塊(TCB),內(nèi)核的調(diào)度是在線程的基礎(chǔ)上進(jìn)行的。2.5.4線程的實(shí)現(xiàn)2.5.4線程的實(shí)現(xiàn)(續(xù))內(nèi)核級(jí)線程實(shí)現(xiàn)的主要優(yōu)點(diǎn)如下:(1)在多處理器上,內(nèi)核能夠同時(shí)調(diào)度同一進(jìn)程的多個(gè)線程并行執(zhí)行;(2)如果進(jìn)程中的一個(gè)線程阻塞,內(nèi)核能夠調(diào)度同一進(jìn)程的其它線程占有處理器;(3)內(nèi)核級(jí)線程的數(shù)據(jù)結(jié)構(gòu)和堆棧均較小,內(nèi)核級(jí)線程的切換快,提高了處理器的效率;(4)內(nèi)核級(jí)線程自身可以用多線程技術(shù)實(shí)現(xiàn),提高了系統(tǒng)的并行性和執(zhí)行速度。內(nèi)核級(jí)線程實(shí)現(xiàn)的主要缺點(diǎn):應(yīng)用程序的線程運(yùn)行在用戶空間,而線程調(diào)度和管理在內(nèi)核空間,即使是同一進(jìn)程運(yùn)行,當(dāng)對(duì)線程的控制需要從一個(gè)線程傳送到另一個(gè)線程時(shí),也要經(jīng)過(guò)用戶態(tài)到核心態(tài),再?gòu)膬?nèi)核態(tài)到用戶態(tài)的模式切換,系統(tǒng)開(kāi)銷較大。2.用戶級(jí)線程實(shí)現(xiàn)在完全用戶級(jí)線程環(huán)境中,線程管理的全部工作由應(yīng)用程序在用戶空間實(shí)現(xiàn),內(nèi)核不知道線程的存在。用戶級(jí)線程由用戶空間運(yùn)行的用戶級(jí)線程庫(kù)實(shí)現(xiàn),任何應(yīng)用程序通過(guò)線程庫(kù)進(jìn)行程序設(shè)計(jì)。用戶級(jí)線程庫(kù)是線程運(yùn)行的支撐環(huán)境。當(dāng)一個(gè)應(yīng)用程序提交給操作系統(tǒng)后,操作系統(tǒng)首先為該應(yīng)用程序建立一個(gè)內(nèi)核管理進(jìn)程,該進(jìn)程在用戶級(jí)線程庫(kù)環(huán)境下開(kāi)始運(yùn)行時(shí),用戶級(jí)線程庫(kù)為進(jìn)程創(chuàng)建一個(gè)線程。當(dāng)進(jìn)程處于運(yùn)行狀態(tài)時(shí),運(yùn)行這個(gè)唯一線程。該線程通過(guò)調(diào)用用戶級(jí)線程庫(kù)創(chuàng)建新線程,新線程創(chuàng)建成功并處于就緒狀態(tài)。同一進(jìn)程的線程之間切換在用戶空間實(shí)現(xiàn),內(nèi)核并不知道用戶空間線程的活動(dòng)。內(nèi)核只是以進(jìn)程為單位,實(shí)現(xiàn)進(jìn)程狀態(tài)的轉(zhuǎn)換。2.5.4線程的實(shí)現(xiàn)(續(xù))用戶級(jí)線程實(shí)現(xiàn)具有如下優(yōu)點(diǎn):(1)線程切換不需要內(nèi)核特權(quán)方式。因?yàn)?,所有線程管理的數(shù)據(jù)結(jié)構(gòu)均在單個(gè)進(jìn)程的用戶空間中,管理線程切換的線程庫(kù)也運(yùn)行在用戶空間。進(jìn)程對(duì)線程的管理不需要切換到內(nèi)核方式,節(jié)省了切換的時(shí)間和內(nèi)核資源。(2)用戶級(jí)線程根據(jù)應(yīng)用程序的需要選擇進(jìn)程調(diào)度算法,而線程庫(kù)的線程調(diào)度算法與進(jìn)程調(diào)度算法無(wú)關(guān)。(3)內(nèi)核在支持用戶級(jí)線程上不需要任何改變,用戶級(jí)線程能夠運(yùn)行在任何操作系統(tǒng)上。用戶級(jí)線程庫(kù)是可以被所有系統(tǒng)共享的應(yīng)用級(jí)實(shí)用程序,許多現(xiàn)代操作系統(tǒng)和程序開(kāi)發(fā)語(yǔ)言都提供了用戶級(jí)線程庫(kù),如Windows2000/XP操作系統(tǒng)。雖然傳統(tǒng)的UNIX操作系統(tǒng)不支持多線程,但是,現(xiàn)在已有多個(gè)UNIX操作系統(tǒng)支持用戶線程庫(kù),如Solaris操作系統(tǒng)。另外,支持用戶級(jí)線程庫(kù)的操作系統(tǒng)還有Mach的C線程。2.5.4線程的實(shí)現(xiàn)(續(xù))2.5.4線程的實(shí)現(xiàn)(續(xù))用戶級(jí)線程庫(kù)的主要缺點(diǎn):如果一個(gè)線程被阻塞,則該線程所在進(jìn)程的所有線程都將被阻塞,不能選擇其他進(jìn)程的線程運(yùn)行,使得處理器處于空閑,浪費(fèi)了處理器資源;系統(tǒng)在進(jìn)程調(diào)度時(shí)分配給進(jìn)程的處理器時(shí)間需要由所有的線程分享,如果系統(tǒng)有多個(gè)處理器,也不能實(shí)現(xiàn)在一個(gè)進(jìn)程中的線程并行執(zhí)行。2.5.4線程的實(shí)現(xiàn)(續(xù))3.混合式線程的實(shí)現(xiàn)在有些操作系統(tǒng)中實(shí)現(xiàn)了用戶級(jí)線程和內(nèi)核級(jí)線程兩種方式的組合,即提供了混合式線程的實(shí)現(xiàn),如Solaris操作系統(tǒng)。在混合式線程實(shí)現(xiàn)中,不但內(nèi)核支持內(nèi)核級(jí)線程的建立、調(diào)度和管理,而且允許用戶應(yīng)用程序建立、調(diào)度和管理用戶級(jí)線程。在混合式線程實(shí)現(xiàn)中,同一個(gè)進(jìn)程的多個(gè)線程可以同時(shí)在不同處理器上并行執(zhí)行。如果一個(gè)線程阻塞,同屬于一個(gè)進(jìn)程的其他線程仍然可以處于就緒狀態(tài),等待被調(diào)度。一個(gè)應(yīng)用程序的多個(gè)用戶級(jí)線程可以被映射成多個(gè)內(nèi)核級(jí)線程,為了達(dá)到較好效果,程序員可以根據(jù)應(yīng)用程序需要和計(jì)算機(jī)的配置情況調(diào)節(jié)內(nèi)核級(jí)線程數(shù)目。因此,如果設(shè)計(jì)恰當(dāng),混合式線程既可以具備內(nèi)核級(jí)線程實(shí)現(xiàn)的優(yōu)點(diǎn),又可以具備用戶級(jí)線程實(shí)現(xiàn)的優(yōu)點(diǎn)。2.5.5線程模型

用戶級(jí)線程與內(nèi)核級(jí)線程之間的關(guān)系可以有三種模型表示:1.一對(duì)一模型一對(duì)一模型將一個(gè)用戶級(jí)線程映射到一個(gè)核心級(jí)線程,如圖2.16所示。每創(chuàng)建一個(gè)用戶級(jí)線程,需要?jiǎng)?chuàng)建一個(gè)內(nèi)核級(jí)線程與之對(duì)應(yīng)。如果一個(gè)線程阻塞,系統(tǒng)允許調(diào)度另一個(gè)線程運(yùn)行。多處理器系統(tǒng)可以實(shí)現(xiàn)多個(gè)線程并行執(zhí)行,系統(tǒng)效率較高。缺點(diǎn)是每創(chuàng)建一個(gè)用戶級(jí)線程,則需要?jiǎng)?chuàng)建一個(gè)內(nèi)核級(jí)線程,系統(tǒng)的線程數(shù)目較多,開(kāi)銷較大,在實(shí)現(xiàn)中應(yīng)該限制系統(tǒng)的線程數(shù)。目前,Windows2000/XP、OS/2都實(shí)現(xiàn)了這類模型。2.5.5線程模型

2.多對(duì)一模型

多對(duì)一模型將多個(gè)用戶級(jí)線程映射到一個(gè)內(nèi)核級(jí)線程,如圖2.17所示,多個(gè)用戶級(jí)線程屬于一個(gè)進(jìn)程,運(yùn)行在進(jìn)程的用戶空間,對(duì)線程的管理和調(diào)度也在用戶空間完成,只有當(dāng)用戶線程需要訪問(wèn)內(nèi)核時(shí),才將其映射到一個(gè)內(nèi)核線程上,但每次只允許一個(gè)線程映射。該模型的優(yōu)點(diǎn)是線程管理等都在用戶空間完成,節(jié)約系統(tǒng)資源。缺點(diǎn)是如果一個(gè)線程阻塞,屬于同一個(gè)進(jìn)程的所有線程都阻塞,在多處理器系統(tǒng)中,一個(gè)進(jìn)程的多個(gè)線程無(wú)法并行執(zhí)行,系統(tǒng)效率低。3.多對(duì)多模型

多對(duì)多模型將多個(gè)用戶級(jí)線程映射到多個(gè)內(nèi)核級(jí)線程,如圖2.18所示。為了節(jié)約系統(tǒng)資源,與用戶級(jí)線程對(duì)應(yīng)的內(nèi)核級(jí)線程數(shù)不會(huì)超過(guò)用戶級(jí)線程數(shù)。內(nèi)核級(jí)線程數(shù)可以通過(guò)特殊應(yīng)用或特殊機(jī)器指定。一個(gè)應(yīng)用程序在多處理器系統(tǒng)中分配內(nèi)核級(jí)線程數(shù)可以多于單處理器系統(tǒng)。2.5.5線程模型

2.5.5線程模型

圖2.16一對(duì)一模型用戶級(jí)線程內(nèi)核級(jí)線程用戶級(jí)線程圖2.17多對(duì)一模型內(nèi)核級(jí)線程用戶級(jí)線程圖2.18多對(duì)多模型對(duì)多對(duì)一模型來(lái)講,雖然允許用戶創(chuàng)建盡可能多的線程,但是,由于內(nèi)核一次只允許調(diào)度一個(gè)線程,所以,多對(duì)一模型下線程不能實(shí)現(xiàn)真正并發(fā)。對(duì)一對(duì)一模型來(lái)講,雖然允許并發(fā)的程度很大,但是,應(yīng)用程序的開(kāi)發(fā)者卻需要十分小心,這是因?yàn)橐粋€(gè)用戶級(jí)線程對(duì)應(yīng)一個(gè)內(nèi)核級(jí)線程,而系統(tǒng)不允許創(chuàng)建太多的線程。對(duì)多對(duì)多模型來(lái)講,吸取了多對(duì)一和一對(duì)一模型的優(yōu)點(diǎn),克服了它們的缺點(diǎn),既可以讓?xiě)?yīng)用程序開(kāi)發(fā)者創(chuàng)建較多的用戶級(jí)線程,又能夠使與用戶級(jí)線程對(duì)應(yīng)的內(nèi)核級(jí)線程有很高的并發(fā)性;當(dāng)一個(gè)線程阻塞時(shí),操作系統(tǒng)內(nèi)核能夠調(diào)度另一個(gè)線程運(yùn)行。目前,Solaris操作系統(tǒng)、DigitalUNIX操作系統(tǒng)和IRIX操作系統(tǒng)都支持多對(duì)多模型。2.5.5線程模型

2.6Solaris操作系統(tǒng)線程

2.6.1Solaris系統(tǒng)中的進(jìn)程與線程Solaris操作系統(tǒng)是SUN公司開(kāi)發(fā)的UNIX操作系統(tǒng)。該操作系統(tǒng)與普通UNIX系統(tǒng)最大的不同是除了支持進(jìn)程外,還支持線程。在Solaris系統(tǒng)中,除傳統(tǒng)進(jìn)程外,還存在輕量級(jí)進(jìn)程(LightWeightProcess,LWP),一個(gè)輕量級(jí)進(jìn)程表示一個(gè)或多個(gè)用戶級(jí)線程映射到一個(gè)內(nèi)核級(jí)線程。輕量級(jí)進(jìn)程與內(nèi)核級(jí)線程對(duì)應(yīng),由內(nèi)核獨(dú)立調(diào)度,可以在多個(gè)處理器上并行執(zhí)行。Solaris系統(tǒng)支持的線程實(shí)現(xiàn)為用戶級(jí)和內(nèi)核級(jí)兩種方式。2.6Solaris操作系統(tǒng)線程

2.6.1Solaris系統(tǒng)中的進(jìn)程與線程用戶級(jí)為用戶級(jí)線程,內(nèi)核級(jí)為輕量進(jìn)程和內(nèi)核級(jí)線程。用戶級(jí)線程是一個(gè)純用戶級(jí)的概念,占用用戶地址空間,用戶集線程的運(yùn)行由輕量進(jìn)程實(shí)現(xiàn),內(nèi)核向用戶程序提供輕量進(jìn)程,不提供內(nèi)核級(jí)線程。用戶程序不知道內(nèi)核級(jí)線程,只知道輕量進(jìn)程和用戶級(jí)線程。每個(gè)進(jìn)程可以創(chuàng)建許多用戶級(jí)線程而不占用內(nèi)核資源。一個(gè)進(jìn)程中可以設(shè)計(jì)一個(gè)或多個(gè)輕量進(jìn)程,在一個(gè)輕量進(jìn)程上又可設(shè)計(jì)一個(gè)或多個(gè)用戶級(jí)線程。輕量進(jìn)程的數(shù)據(jù)結(jié)構(gòu)存在于所屬的進(jìn)程地址空間中。一個(gè)輕量進(jìn)程與一個(gè)內(nèi)核級(jí)線程綁定,輕量進(jìn)程與內(nèi)核級(jí)線程是一一對(duì)應(yīng)的,內(nèi)核級(jí)線程的數(shù)據(jù)結(jié)構(gòu)存在于內(nèi)核地址空間中。2.6.1Solaris系統(tǒng)中的進(jìn)程與線程(續(xù))

進(jìn)程、輕量進(jìn)程、用戶級(jí)線程、內(nèi)核級(jí)線程之間的關(guān)系如圖2.19所示。圖2.19Solaris系統(tǒng)實(shí)體2.6.1Solaris系統(tǒng)中的進(jìn)程與線程(續(xù))輕量進(jìn)程處于用戶空間與內(nèi)核空間之間,每個(gè)輕量進(jìn)程都與一個(gè)內(nèi)核級(jí)線程綁定,所有的用戶級(jí)線程通過(guò)輕量進(jìn)程與內(nèi)核級(jí)線程連接。進(jìn)程1表示的是多個(gè)用戶級(jí)線程與多個(gè)輕量進(jìn)程的對(duì)應(yīng);一個(gè)用戶級(jí)線程與一個(gè)輕量進(jìn)程對(duì)應(yīng),該輕量進(jìn)程綁定在一個(gè)處理器上。進(jìn)程2表示一個(gè)沒(méi)有并發(fā)線程的傳統(tǒng)單線程進(jìn)程。進(jìn)程3表示線程與輕量進(jìn)程一對(duì)一捆綁,內(nèi)核進(jìn)程并行機(jī)制可見(jiàn),一個(gè)用戶級(jí)線程阻塞,同一進(jìn)程的其余用戶級(jí)線程可以運(yùn)行。進(jìn)程4表示多個(gè)用戶級(jí)線程映射到一個(gè)輕量進(jìn)程上。進(jìn)程5表示多個(gè)用戶級(jí)線程映射到多個(gè)輕量進(jìn)程上。2.6.1Solaris系統(tǒng)中的進(jìn)程與線程(續(xù))每個(gè)輕量進(jìn)程需要連接到內(nèi)核級(jí)線程上,才能做到每個(gè)用戶級(jí)線程通過(guò)輕量進(jìn)程與內(nèi)核級(jí)線程連接,實(shí)現(xiàn)用戶級(jí)線程與內(nèi)核之間的通信。多個(gè)用戶級(jí)線程可以共用一個(gè)輕量進(jìn)程,但只有連接到當(dāng)前輕量進(jìn)程的用戶級(jí)線程才能與內(nèi)核通信,其余的用戶級(jí)線程將被阻塞,等待連接輕量進(jìn)程。一個(gè)輕量進(jìn)程在不同用戶級(jí)線程之間切換時(shí),只是數(shù)據(jù)結(jié)構(gòu)的切換,時(shí)間開(kāi)銷遠(yuǎn)小于內(nèi)核級(jí)線程之間的切換時(shí)間開(kāi)銷。

2.6.1Solaris系統(tǒng)中的進(jìn)程與線程(續(xù))輕量進(jìn)程主要用于Solaris操作系統(tǒng)對(duì)屏幕窗口的切換上。對(duì)一個(gè)以窗口形式提供用戶使用的操作系統(tǒng)而言,屏幕上的窗口切換通常很頻繁。一般情況下,用戶雖然會(huì)同時(shí)打開(kāi)許多窗口,但同一時(shí)刻真正活躍的窗口不是很多。Solaris操作系統(tǒng)用一組用戶級(jí)線程來(lái)表達(dá)窗口系統(tǒng),用一個(gè)或少量幾個(gè)輕量進(jìn)程來(lái)支持這組用戶級(jí)線程,所以,Solaris系統(tǒng)窗口之間切換時(shí)系統(tǒng)付出的開(kāi)銷很小,切換的速度也很快。如果一個(gè)計(jì)算需要很快地并行應(yīng)用,可以用一個(gè)輕量進(jìn)程連接一個(gè)用戶級(jí)線程,減少用戶線程的切換,加快對(duì)應(yīng)用的處理。Solaris系統(tǒng)可以做到靈活的分配處理器和將一個(gè)應(yīng)用綁定到特殊的處理器,從而滿足特殊需要。2.6.2Solaris系統(tǒng)中的線程狀態(tài)一般的線程狀態(tài)有創(chuàng)建、就緒、阻塞、運(yùn)行和結(jié)束。但是,在Solaris系統(tǒng)中,由于引入了輕量進(jìn)程,線程狀態(tài)與一般線程狀態(tài)有一定的區(qū)別。用戶級(jí)線程的執(zhí)行由線程庫(kù)管理。如果用戶級(jí)線程沒(méi)有綁定到一個(gè)指定的輕量進(jìn)程上,則多個(gè)用戶級(jí)線程可以共享輕量進(jìn)程,用戶級(jí)線程可處于的狀態(tài)為:可運(yùn)行、活躍、睡眠和停止。輕量進(jìn)程可處于的狀態(tài)為:可運(yùn)行態(tài)、運(yùn)行態(tài)、阻塞態(tài)、停止態(tài)。用戶級(jí)線程與輕量進(jìn)程的狀態(tài)及轉(zhuǎn)換分別如圖2.20和圖2.21所示。2.6.2Solaris系統(tǒng)中的線程狀態(tài)圖2.20Solaris系統(tǒng)線程狀態(tài)及轉(zhuǎn)換剝奪喚醒睡眠態(tài)可運(yùn)行態(tài)活躍態(tài)停止態(tài)繼續(xù)掛起停止停止停

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論