第二章 進(jìn)程管理
2.1 進(jìn)程的基本概念
在傳統(tǒng)的操作系統(tǒng)中痊班,程序并不能獨(dú)立運(yùn)行,作為資源分配和獨(dú)立運(yùn)行的基本單位都是進(jìn)程。
2.1.1 程序的順序執(zhí)行及其特征
1、程序的順序執(zhí)行
把一個(gè)應(yīng)用程序分成若干個(gè)程序段反砌,在各程序段之間,必須按照某種先后次序順序執(zhí)行萌朱,僅當(dāng)前一操作(程序段)執(zhí)行完后,才能執(zhí)行后及操作策菜。
2晶疼、程序順序執(zhí)行時(shí)的特征
1)順序性
處理機(jī)的操作嚴(yán)格按照程序所規(guī)定的順序執(zhí)行,即每一操作必須在上一個(gè)操作結(jié)束之后開(kāi)始
2)封閉性
程序是在封閉環(huán)境下執(zhí)行的又憨,即程序運(yùn)行時(shí)獨(dú)占全機(jī)資源翠霍,資源的狀態(tài)(除初始狀態(tài)外)只有本程序才能改變它。程序一旦執(zhí)行蠢莺,其執(zhí)行結(jié)果不受外界因素影響寒匙。
3)可再現(xiàn)性
只要程序執(zhí)行是的環(huán)境和初始條件相同,當(dāng)程序重復(fù)執(zhí)行時(shí)躏将,不論它是從頭到尾不停頓的執(zhí)行锄弱,還是斷續(xù)執(zhí)行,都將獲得相同的結(jié)果
2.1.2 前趨圖
前趨圖(Precedence Graph)是一個(gè)有向無(wú)循環(huán)圖祸憋,記為DAG(Directed Acyclic Graph)会宪,用于描述進(jìn)程之間之行的前后關(guān)系。如圖:
圖中的每個(gè)節(jié)點(diǎn)可用于描述一個(gè)程序段或進(jìn)程蚯窥,乃至一條語(yǔ)句掸鹅;節(jié)點(diǎn)間的有向邊表示兩個(gè)節(jié)點(diǎn)之間存在的偏序關(guān)系(Partial Order)或者前趨關(guān)系(Precedence Relation)“→”。
→={(Pi拦赠,Pj)|Pi must complete before Pj may start}巍沙,如果(Pi,Pj)∈→荷鼠,可寫(xiě)成Pi→Pj句携,稱(chēng)Pi是Pj的直接前趨,而稱(chēng)Pj是Pi的直接后繼允乐。在前趨圖中务甥,把沒(méi)有前趨的結(jié)點(diǎn)稱(chēng)為初始結(jié)點(diǎn)(Initial Node),把沒(méi)有后繼的結(jié)點(diǎn)稱(chēng)為終止結(jié)點(diǎn)(Final Node)喳篇。此外敞临,每個(gè)結(jié)點(diǎn)還具有一個(gè)重量(Weight),用于表示該結(jié)點(diǎn)所含有的程序量或結(jié)點(diǎn)的執(zhí)行時(shí)間麸澜。在圖2-1(a)和2-1(b)中分別存在著這樣的前趨關(guān)系:
Ii→Ci→Pi? 和? S1→S2→S3
對(duì)于圖2-2(a) 所示的前趨圖挺尿,存在下述前趨關(guān)系:
?????P1→P2,P1→P3,P1→P4编矾,P2→P5熟史,P3→P5,P4→P6窄俏,P4→P7蹂匹,P5→P8,P6→P8凹蜈,P7→P9限寞,P8→P9
或表示為:
P={P1,P2仰坦,P3履植,P4,P5悄晃,P6玫霎,P7,P8妈橄,P9}→={(P1庶近,P2),(P1眷蚓,P3)拦盹,(P1,P4)溪椎,(P2普舆,P5),(P3校读,P5)沼侣,(P4,P6)歉秫,(P4蛾洛,P7),(P5雁芙,P8)轧膘,(P6,P8)兔甘,(P7谎碍,P9),(P8洞焙,P9)}
應(yīng)當(dāng)注意蟆淀,前趨圖中必須不存在循環(huán)拯啦,但在圖2-2(b)中卻有這下述的前趨關(guān)系:
S2→S3,S3→S2
顯然熔任,這種前趨關(guān)系是不可能滿(mǎn)足的褒链。
2.1.3 程序的并發(fā)執(zhí)行及其特征
1、程序的并發(fā)執(zhí)行
輸入程序在輸入第一個(gè)程序后疑苔,在計(jì)算程序?qū)υ摮绦蜻M(jìn)行計(jì)算的同時(shí)甫匹,可由輸入程序再輸入第二個(gè)程序,從而使第一個(gè)程序的計(jì)算操作可與第二個(gè)程序的輸入操作并發(fā)執(zhí)行惦费。一般來(lái)說(shuō)兵迅,輸入程序在輸入第 i+1個(gè)程序時(shí),計(jì)算程序可能正在對(duì)第 i 個(gè)程序進(jìn)行計(jì)算趁餐,而答應(yīng)程序正在打印第 i-1個(gè)程序的計(jì)算結(jié)果。
2篮绰、程序并發(fā)執(zhí)行時(shí)的特征
1)間斷性
程序在并發(fā)執(zhí)行時(shí)后雷,由于它們共享系統(tǒng)資源,以及為完成同一項(xiàng)任務(wù)而相互合作吠各,致使在這些并發(fā)執(zhí)行的程序之間臀突,形成了相互制約的關(guān)系。相互制約將導(dǎo)致并發(fā)程序具有“執(zhí)行——暫图致——執(zhí)行”這種間斷性的活動(dòng)規(guī)律候学。
2)失去封閉性
程序在并發(fā)執(zhí)行時(shí),是多個(gè)程序共享系統(tǒng)中的各種資源纵散。因而這些資源的狀態(tài)將有多個(gè)程序來(lái)改變梳码,致使程序的運(yùn)行失去了封閉性。這樣伍掀,某程序在執(zhí)行時(shí)掰茶,必然會(huì)受到其他程序的影響。
3)不可再現(xiàn)性
程序在并發(fā)執(zhí)行時(shí)蜜笤,失去了封閉性濒蒋,計(jì)算結(jié)果已與并發(fā)程序的執(zhí)行速度有關(guān),從而使程序的執(zhí)行失去了可再現(xiàn)性把兔,亦即沪伙,程序經(jīng)過(guò)多次執(zhí)行后,雖然它們執(zhí)行時(shí)的環(huán)境和初始條件相同县好,但得到的結(jié)果卻各不相同围橡。
2.1.4 進(jìn)程的特征與狀態(tài)
1、進(jìn)程的特征和定義
1)結(jié)構(gòu)特征
通常的程序是不能并發(fā)執(zhí)行的缕贡。為使程序(含數(shù)據(jù))能獨(dú)立運(yùn)行某饰,應(yīng)為之配置一進(jìn)程控制塊儒恋,即 PCB(Process Control Block):而由程序段、相關(guān)的數(shù)據(jù)段和 PCB 三部分便構(gòu)成了進(jìn)程實(shí)體黔漂。在早期的 UNIX 版本中诫尽,把這三部分總稱(chēng)為“進(jìn)程映像”。在許多情況下所說(shuō)的進(jìn)程炬守,實(shí)際上是指進(jìn)程實(shí)體牧嫉,如,所謂創(chuàng)建進(jìn)程减途,實(shí)質(zhì)上是創(chuàng)建進(jìn)程實(shí)體中的 PCB酣藻;而撤銷(xiāo)進(jìn)程,實(shí)質(zhì)上是撤銷(xiāo)進(jìn)程的 PCB鳍置。
2)動(dòng)態(tài)性
進(jìn)程的實(shí)質(zhì)是進(jìn)程實(shí)體的一次執(zhí)行過(guò)程辽剧,因此,動(dòng)態(tài)性是進(jìn)程的最基本特征税产。進(jìn)程實(shí)體有一定的生命期怕轿,而程序則只是一組有序指令的集合,并存放區(qū)某種介質(zhì)上辟拷,其本身并不具有運(yùn)動(dòng)的含義撞羽,因而是靜態(tài)的。
3)并發(fā)性
并發(fā)性是指多個(gè)進(jìn)程實(shí)體同存于內(nèi)存中衫冻,且能在一段時(shí)間內(nèi)同時(shí)運(yùn)行诀紊。并發(fā)性是進(jìn)程的重要特征,同時(shí)也成為 OS 的重要特征隅俘。引入進(jìn)程的目的也正是為了使其進(jìn)程實(shí)體能和其它進(jìn)程實(shí)體并發(fā)執(zhí)行邻奠;而程序(沒(méi)有建立 PCB)是不能進(jìn)行并發(fā)執(zhí)行的。
4)獨(dú)立性
在傳統(tǒng)的 OS 中为居,獨(dú)立性是指進(jìn)程實(shí)體是一個(gè)能獨(dú)立運(yùn)行惕澎、獨(dú)立分配資源和獨(dú)立接受調(diào)度的基本單位。凡未建立 PCB 的程序都不能作為一個(gè)獨(dú)立的單位參與運(yùn)行
5)異步性
這是指進(jìn)程按各自獨(dú)立颜骤、不可預(yù)知的速度向前推進(jìn)唧喉,或說(shuō)進(jìn)程實(shí)體按異步方式運(yùn)行。
①進(jìn)程是程序的一次執(zhí)行
②進(jìn)程是一個(gè)程序及其數(shù)據(jù)在處理機(jī)上順序執(zhí)行時(shí)所發(fā)生的活動(dòng)
③進(jìn)程是程序在一個(gè)數(shù)據(jù)集合上運(yùn)行的過(guò)程忍抽,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位
在引入了進(jìn)程實(shí)體的概念后八孝,我們可以把傳統(tǒng)的 OS 中的進(jìn)程定義為:“進(jìn)程是進(jìn)程實(shí)體的運(yùn)行過(guò)程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位”鸠项。
2干跛、進(jìn)程的三種基本狀態(tài)
1)就緒狀態(tài)
當(dāng)進(jìn)程已分配到除 CPU 以外的所有必要資源后,只要再獲得 CPU祟绊,便可立即執(zhí)行楼入,進(jìn)程這時(shí)的狀態(tài)稱(chēng)為就緒狀態(tài)哥捕。在一個(gè)系統(tǒng)中處于就緒狀態(tài)的進(jìn)程可能有多個(gè),通常將它們排成一個(gè)隊(duì)列嘉熊,稱(chēng)為就緒隊(duì)列遥赚。
2)執(zhí)行狀態(tài)
進(jìn)程已獲得 CPU,其程序正在執(zhí)行阐肤。在單處理機(jī)系統(tǒng)中凫佛,只有一個(gè)進(jìn)程處于執(zhí)行狀態(tài);在多處理機(jī)系統(tǒng)中孕惜,則有多個(gè)進(jìn)程處于執(zhí)行狀態(tài)愧薛。
3)阻塞狀態(tài)
正在執(zhí)行的進(jìn)程由于發(fā)生某事件而暫時(shí)無(wú)法繼續(xù)執(zhí)行時(shí),便放棄處理機(jī)而處于暫停狀態(tài)衫画,亦即進(jìn)程的執(zhí)行收到阻塞毫炉,把這種暫停狀態(tài)成為阻塞狀態(tài),有時(shí)也稱(chēng)為等待狀態(tài)或封鎖狀態(tài)削罩。
致使進(jìn)程阻塞的典型事件有:請(qǐng)求 I/O瞄勾,申請(qǐng)緩沖空間等。
3鲸郊、掛起狀態(tài)
1)引入掛起狀態(tài)的原因
①終端用戶(hù)的請(qǐng)求
②父進(jìn)程請(qǐng)求
③負(fù)荷調(diào)節(jié)的需要
④操作系統(tǒng)的需要
2)進(jìn)程狀態(tài)的轉(zhuǎn)換
①活動(dòng)就緒→靜止就緒
②活動(dòng)阻塞→靜止阻塞
③靜止就緒→活動(dòng)就緒
④靜止阻塞→活動(dòng)阻塞
4丰榴、創(chuàng)建狀態(tài)和終止?fàn)顟B(tài)
1)創(chuàng)建狀態(tài)
創(chuàng)建一個(gè)進(jìn)程一般要通過(guò)兩個(gè)步驟:首先货邓,為一個(gè)新進(jìn)程創(chuàng)建 PCB秆撮,并填寫(xiě)必要的管理信息;其次换况,把該進(jìn)程轉(zhuǎn)入就緒狀態(tài)并插入就緒隊(duì)列中职辨,當(dāng)一個(gè)新進(jìn)程被創(chuàng)建時(shí),系統(tǒng)已為其分配了 PCB戈二,填寫(xiě)了進(jìn)程標(biāo)識(shí)等信息舒裤,但由于該進(jìn)程所必須的資源或其他信息,如主存資源尚未分配時(shí)等觉吭,一般而言腾供,此時(shí)的進(jìn)程已擁有了自己的 PCB,但進(jìn)程自身還未進(jìn)入主存鲜滩,即創(chuàng)建工作尚未完成伴鳖,進(jìn)程還不能被調(diào)度運(yùn)行,其所處的狀態(tài)就是創(chuàng)建狀態(tài)徙硅。
引入創(chuàng)建狀態(tài)榜聂,是為了保證進(jìn)程的調(diào)度必須在創(chuàng)建工作完成后進(jìn)行,以確保對(duì)進(jìn)程控制塊操作的完整性嗓蘑。同時(shí)须肆,創(chuàng)建狀態(tài)的引入匿乃,也增加了管理的靈活性,操作系統(tǒng)可以根據(jù)系統(tǒng)性能或主存容量的限制豌汇,推遲創(chuàng)建狀態(tài)進(jìn)程的提交幢炸。對(duì)于處于創(chuàng)建狀態(tài)的進(jìn)程,獲得了其所必須的資源瘤礁,以及對(duì)其 PCB 初始化工作完成后阳懂,進(jìn)程狀態(tài)便可由創(chuàng)建狀態(tài)轉(zhuǎn)入就緒狀態(tài)。
2)終止?fàn)顟B(tài)
進(jìn)程的終止也要通過(guò)兩個(gè)步驟:首先等待操作系統(tǒng)進(jìn)行善后處理柜思,然后將其 PCB 清零岩调,并將 PCB 空間返還系統(tǒng)。當(dāng)一個(gè)進(jìn)程到達(dá)了自然結(jié)束點(diǎn)赡盘,或是出現(xiàn)了無(wú)法克服的錯(cuò)誤号枕,或是被操作系統(tǒng)所終結(jié),或是被其他有終止權(quán)的進(jìn)程所終結(jié)陨享,它將進(jìn)入終止?fàn)顟B(tài)葱淳。進(jìn)入終止?fàn)顟B(tài)的進(jìn)程以后不能再執(zhí)行,但在操作系統(tǒng)中依然保留一個(gè)記錄抛姑,其中保存狀態(tài)碼和一些計(jì)時(shí)統(tǒng)計(jì)數(shù)據(jù)赞厕,供其他進(jìn)程收集。一旦其他進(jìn)程完成了對(duì)終止?fàn)顟B(tài)進(jìn)程的信息提取之后定硝,操作系統(tǒng)將刪除該進(jìn)程皿桑。
如圖2-8所示,引進(jìn)創(chuàng)建和終止?fàn)顟B(tài)后蔬啡,在進(jìn)程狀態(tài)轉(zhuǎn)換時(shí)诲侮,相比較2-7所示的進(jìn)程五狀態(tài)而言,需要增加考慮下面的幾種情況箱蟆。
①NULL→創(chuàng)建:一個(gè)新進(jìn)程產(chǎn)生時(shí)沟绪,該進(jìn)程處于創(chuàng)建狀態(tài)。
②創(chuàng)建→活動(dòng)就緒:在當(dāng)前系統(tǒng)的性能和內(nèi)存的容量均允許的情況下空猜,完成對(duì)進(jìn)程創(chuàng)建的必要操作后绽慈,相應(yīng)的系統(tǒng)進(jìn)程將進(jìn)程的狀態(tài)轉(zhuǎn)換為活動(dòng)就緒狀態(tài)。
③創(chuàng)建→靜止就緒:考慮到系統(tǒng)當(dāng)前資源狀況和性能要求辈毯,并不分配給新建進(jìn)程所需資源坝疼,主要是主存資源,相應(yīng)的系統(tǒng)進(jìn)程將進(jìn)程狀態(tài)轉(zhuǎn)換為靜止就緒狀態(tài)漓摩,對(duì)換到外存裙士,不再參與調(diào)度,此時(shí)進(jìn)程創(chuàng)建工作尚未完成管毙。
④執(zhí)行→終止:當(dāng)一個(gè)進(jìn)程到達(dá)了自然結(jié)束點(diǎn)腿椎,或是出現(xiàn)了無(wú)法克服的錯(cuò)誤桌硫,或是被操作系統(tǒng)所終結(jié),或是被其他有終止權(quán)的進(jìn)程所終結(jié)啃炸,進(jìn)程即進(jìn)入終止?fàn)顟B(tài)铆隘。
2.1.5 進(jìn)程控制塊
1、進(jìn)程控制塊的作用
為了描述和控制進(jìn)程的運(yùn)行南用,系統(tǒng)為每個(gè)進(jìn)程定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)——進(jìn)程控制塊 PCB(Process Control Block)膀钠,它是進(jìn)程實(shí)體的一部分,是操作系統(tǒng)中最重要的記錄數(shù)據(jù)結(jié)構(gòu)裹虫。PCB 中記錄了操作系統(tǒng)所需的肿嘲、用于描述進(jìn)程的當(dāng)前情況以及控制進(jìn)程運(yùn)行的全部信息。
進(jìn)程控制塊的作用是使一個(gè)在多道程序環(huán)境下不能獨(dú)立運(yùn)行的程序(含數(shù)據(jù))筑公,成為一個(gè)能獨(dú)立運(yùn)行的基本單位雳窟,一個(gè)能與其他進(jìn)程并發(fā)執(zhí)行的進(jìn)程∠宦牛或者說(shuō)封救,OS 是根據(jù) PCB 來(lái)對(duì)并發(fā)執(zhí)行的進(jìn)程進(jìn)行控制和管理的。
在進(jìn)程的整個(gè)生命期中捣作,系統(tǒng)總是通過(guò) PCB 對(duì)進(jìn)程進(jìn)行控制的誉结,亦即,系統(tǒng)時(shí)根據(jù)進(jìn)程的 PCB 而不是任何別的什么而感知到該進(jìn)程的存在的券躁,所以說(shuō)惩坑,PCB 是進(jìn)程存在的唯一標(biāo)志。
2嘱朽、進(jìn)程控制塊中的信息
1)進(jìn)程標(biāo)識(shí)符
①內(nèi)部標(biāo)識(shí)符:在所有的操作系統(tǒng)中旭贬,都為了每一個(gè)進(jìn)程賦予了一個(gè)唯一的數(shù)字標(biāo)識(shí)符怔接,它通常是一個(gè)進(jìn)程的序號(hào)搪泳。設(shè)置內(nèi)部標(biāo)識(shí)符主要是為了方便系統(tǒng)使用。
②外部標(biāo)識(shí)符:它由創(chuàng)建者提供扼脐,通常是由字母岸军、數(shù)字組成,往往是由用戶(hù)(進(jìn)程)在訪問(wèn)該進(jìn)程時(shí)使用瓦侮。為了描述進(jìn)程的家族關(guān)系艰赞,還應(yīng)設(shè)置父進(jìn)程標(biāo)識(shí)及子進(jìn)程標(biāo)識(shí)。此外肚吏,還可以設(shè)置用戶(hù)標(biāo)識(shí)方妖,以指示擁有該進(jìn)程的用戶(hù)。
2)處理及狀態(tài)
處理機(jī)狀態(tài)信息主要是由處理機(jī)的各種寄存器中的內(nèi)容組成的罚攀。處理機(jī)在運(yùn)行時(shí)党觅,許多信息都放在寄存器中雌澄,當(dāng)處理機(jī)被中斷時(shí),所有這些信息都必須保存在 PCB 中杯瞻,以便在該進(jìn)程重新執(zhí)行時(shí)镐牺,能從斷點(diǎn)繼續(xù)執(zhí)行。這些寄存器包括:①通用寄存器魁莉,又稱(chēng)為用戶(hù)可視寄存器睬涧,它們是用戶(hù)程序可以訪問(wèn)的,用于暫存信息旗唁,在大多數(shù)處理機(jī)中畦浓,有8~32個(gè)通用寄存器,在 RISC 結(jié)構(gòu)的計(jì)算機(jī)中可超過(guò)100個(gè)检疫;②指令計(jì)數(shù)器宅粥,其中存放了要訪問(wèn)的下一條指令的地址;③程序狀態(tài)字 PSW电谣,其中含有狀態(tài)信息秽梅,如條件碼、執(zhí)行方式剿牺、中斷屏蔽標(biāo)志等企垦;④用戶(hù)棧指針,指每個(gè)用戶(hù)進(jìn)程都有一個(gè)或若干個(gè)與之相關(guān)的系統(tǒng)棧晒来,用于存放過(guò)程和系統(tǒng)調(diào)用參數(shù)及調(diào)用地址钞诡,棧指針指向該棧的棧頂。
3)進(jìn)程調(diào)度信息
在 PCB 中還存放一些與進(jìn)程調(diào)度和進(jìn)程對(duì)換有關(guān)的信息湃崩,包括:①進(jìn)程狀態(tài)荧降,指明進(jìn)程的當(dāng)前狀態(tài),作為進(jìn)程調(diào)度和對(duì)換時(shí)的依據(jù)攒读;②進(jìn)程優(yōu)先級(jí)朵诫,用于描述進(jìn)程使用處理機(jī)的優(yōu)先級(jí)別的一個(gè)整數(shù),優(yōu)先級(jí)高德進(jìn)程優(yōu)先獲得處理機(jī)薄扁;③進(jìn)程調(diào)度所需的其他信息剪返,它們與所采用的進(jìn)程調(diào)度算法有關(guān),比如邓梅,進(jìn)程已等待 CPU 的時(shí)間總和脱盲、進(jìn)程已執(zhí)行的時(shí)間總和等;④事件日缨,指進(jìn)程由執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)樽枞麪顟B(tài)所等待發(fā)生的事件钱反,即阻塞原因。
4)進(jìn)程控制信息
進(jìn)程控制信息包括:①程序和數(shù)據(jù)的地址,指進(jìn)程的程序和數(shù)據(jù)所在的內(nèi)存或外存地址面哥,以便再調(diào)度到該進(jìn)程執(zhí)行時(shí)乙各,能從 PCB 中找到其程序和數(shù)據(jù);②進(jìn)程同步和通信機(jī)制幢竹,指實(shí)現(xiàn)進(jìn)程同步和進(jìn)程通信時(shí)必須的機(jī)制耳峦,如消息隊(duì)列指針,信號(hào)量等焕毫,它們可能全部或部分地放在 PCB 中蹲坷;③資源清單,即一張列出了出 CPU 以外的邑飒、進(jìn)程所需的全部資源及已經(jīng)分配到該進(jìn)程的資源的清單循签;④鏈接指針,它給出了本進(jìn)程(PCB)所在隊(duì)列中的下一個(gè)進(jìn)程的 PCB 的首地址疙咸。
3县匠、進(jìn)程控制塊的組織方式
1)鏈接方式
把具有同一狀態(tài)的 PCB,用其中的鏈接字鏈接成一個(gè)隊(duì)列撒轮∑虻可以形成就緒隊(duì)列、若干個(gè)阻塞隊(duì)列和空白隊(duì)列等题山。對(duì)其中的就緒隊(duì)列常按進(jìn)程優(yōu)先級(jí)的高低排列兰粉,把優(yōu)先級(jí)高的進(jìn)程的 PCB 排在隊(duì)列前面。此外顶瞳,也可根據(jù)阻塞原因的不同把處于阻塞狀態(tài)的進(jìn)程的 PCB 排成等待 I/O 操作完成的隊(duì)列和等待分配內(nèi)存的隊(duì)列等玖姑。如圖:
2)索引方式
系統(tǒng)根據(jù)所有進(jìn)程的狀態(tài)建立幾張索引表。例如慨菱,就緒索引表焰络、阻塞索引表等喻圃,并把各索引表在內(nèi)的首地址記錄在內(nèi)存的一些專(zhuān)用單元中晒衩。在每個(gè)索引表的表目中扩所,記錄具有相應(yīng)狀態(tài)的某個(gè) PCB 在 PCB 表中的地址稍计。如圖:示出了索引方式的 PCB 組織。