電子科技大學(xué)《計(jì)算機(jī)操作系統(tǒng)》第2章-并發(fā)與進(jìn)程-進(jìn)程教學(xué)課件_第1頁
電子科技大學(xué)《計(jì)算機(jī)操作系統(tǒng)》第2章-并發(fā)與進(jìn)程-進(jìn)程教學(xué)課件_第2頁
電子科技大學(xué)《計(jì)算機(jī)操作系統(tǒng)》第2章-并發(fā)與進(jìn)程-進(jìn)程教學(xué)課件_第3頁
電子科技大學(xué)《計(jì)算機(jī)操作系統(tǒng)》第2章-并發(fā)與進(jìn)程-進(jìn)程教學(xué)課件_第4頁
電子科技大學(xué)《計(jì)算機(jī)操作系統(tǒng)》第2章-并發(fā)與進(jìn)程-進(jìn)程教學(xué)課件_第5頁
已閱讀5頁,還剩103頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

主要內(nèi)容調(diào)度

scheduling死鎖deadlock同步

synchronization進(jìn)程

process2.1并發(fā)與進(jìn)程并發(fā)——現(xiàn)代操作系統(tǒng)最重要的特征之一進(jìn)程——操作系統(tǒng)最重要的抽象概念之一并發(fā)基于進(jìn)程2.1.1并發(fā)概述并發(fā):兩個(gè)或多個(gè)事件在同一時(shí)間間隔內(nèi)發(fā)生事務(wù)處理系統(tǒng)數(shù)據(jù)庫(kù)管理系統(tǒng)若干應(yīng)用計(jì)算機(jī)操作系統(tǒng)應(yīng)用級(jí)并發(fā)系統(tǒng)級(jí)并發(fā)并發(fā)類型2.1.2程序的順序執(zhí)行與并發(fā)執(zhí)行順序執(zhí)行若干程序或程序段之間必須嚴(yán)格按照某種先后順序來執(zhí)行順序執(zhí)行示例程序的順序執(zhí)行語句的順序執(zhí)行

S1:a:=x+y;S2:b:=a-5;S3:c:=b+1;I1C1P1I2C2P2S1S2S32.1.2程序的順序執(zhí)行與并發(fā)執(zhí)行程序順序執(zhí)行時(shí)的特征順序性處理機(jī)的操作嚴(yán)格按照程序所規(guī)定的順序執(zhí)行。封閉性程序運(yùn)行時(shí)獨(dú)占全機(jī)資源,程序一旦開始執(zhí)行,其執(zhí)行結(jié)果不受外界因素影響??稍佻F(xiàn)性只要程序執(zhí)行時(shí)的環(huán)境和初始條件相同,都將獲得相同的結(jié)果。2.1.2程序的順序執(zhí)行與并發(fā)執(zhí)行前趨圖有向無循環(huán)圖節(jié)點(diǎn):程序段、進(jìn)程、語句邊:前趨關(guān)系P1P3P8P9P4P2P5P6P72.1.2程序的順序執(zhí)行與并發(fā)執(zhí)行并發(fā)執(zhí)行兩個(gè)或兩個(gè)以上的程序和或程序段在同一時(shí)間間隔內(nèi)同時(shí)執(zhí)行并發(fā)執(zhí)行示例2.1.2程序的順序執(zhí)行與并發(fā)執(zhí)行并發(fā)執(zhí)行示例(續(xù))有兩個(gè)并發(fā)執(zhí)行的進(jìn)程P1和P2,共享初值為1的變量x。P1對(duì)x加1,P2對(duì)x減1。加1和減1操作的指令序列分別如下所示,試問兩個(gè)操作完成后,x的值是多少?//加1操作loadR1,x//取x到寄存器R1中incR1storex,R1//將R1的內(nèi)容存入x//減1操作loadR2,x//取x到寄存器R2中decR2storex,R2//將R2的內(nèi)容存入x答案:可能為0、1或22.1.2程序的順序執(zhí)行與并發(fā)執(zhí)行程序并發(fā)執(zhí)行時(shí)的特征間斷性由于資源共享和相互合作,程序呈現(xiàn)“執(zhí)行-暫停-執(zhí)行”現(xiàn)象。失去封閉性程序本身的執(zhí)行環(huán)境受外界程序的影響。(原因?)不可再現(xiàn)性程序在并發(fā)執(zhí)行時(shí),由于失去了封閉性,導(dǎo)致不可再現(xiàn)性。2.1.2程序的順序執(zhí)行與并發(fā)執(zhí)行并發(fā)執(zhí)行的條件(Berstein)假設(shè)程序Pi所訪問的共享變量的讀集合、寫集合分別為R(Pi)、W(Pi),則任意兩個(gè)程序P1和P2可以并發(fā)執(zhí)行的條件有以下三條:

2.1.4進(jìn)程及其運(yùn)行環(huán)境引入進(jìn)程的目的使多道程序能夠正確地并發(fā)執(zhí)行,以保證程序運(yùn)行結(jié)果的可再現(xiàn)性。典型的進(jìn)程定義一個(gè)正在執(zhí)行中的程序。一個(gè)正在計(jì)算機(jī)上執(zhí)行的程序?qū)嵗?。能分配給處理器并由處理器執(zhí)行的實(shí)體。一個(gè)具有以下特征的活動(dòng)單元:一組指令序列的執(zhí)行、一個(gè)當(dāng)前狀態(tài)和相關(guān)的系統(tǒng)資源集??刹l(fā)執(zhí)行的程序在一個(gè)數(shù)據(jù)集合上的運(yùn)行過程。2.1.4進(jìn)程及其運(yùn)行環(huán)境進(jìn)程的基本特征動(dòng)態(tài)性:本質(zhì)特性一個(gè)正在計(jì)算機(jī)上執(zhí)行的程序?qū)嵗?,存在生命周期并發(fā)性:重要特性任何進(jìn)程都可以同其他進(jìn)程一起向前推進(jìn)獨(dú)立性各進(jìn)程的地址空間相互獨(dú)立,除非采用進(jìn)程間通信手段異步性按各自獨(dú)立的、不可預(yù)知的速度向前推進(jìn)結(jié)構(gòu)性

進(jìn)程=進(jìn)程控制塊(PCB)+程序段+數(shù)據(jù)段2.1.4進(jìn)程及其運(yùn)行環(huán)境進(jìn)程與程序一個(gè)正在計(jì)算機(jī)上執(zhí)行的程序?qū)嵗M(jìn)程=進(jìn)程控制塊+程序段+數(shù)據(jù)段引入進(jìn)程的目的是使多道程序能夠正確地并發(fā)執(zhí)行程序是靜態(tài)實(shí)體,進(jìn)程具有動(dòng)態(tài)性進(jìn)程與程序之間不存在一一對(duì)應(yīng)關(guān)系2.1.4進(jìn)程及其運(yùn)行環(huán)境引入進(jìn)程后帶來的挑戰(zhàn)(challenges)?空間開銷(spaceoverhead)為進(jìn)程建立數(shù)據(jù)結(jié)構(gòu)時(shí)間開銷(timeoverhead)管理和協(xié)調(diào)、跟蹤、填寫和更新有關(guān)數(shù)據(jù)結(jié)構(gòu)、切換進(jìn)程、保護(hù)現(xiàn)場(chǎng)控制復(fù)雜性(complexityofcontrol)協(xié)調(diào)多個(gè)進(jìn)程對(duì)資源的競(jìng)爭(zhēng)和共享預(yù)防、解決多個(gè)進(jìn)程因?yàn)楦?jìng)爭(zhēng)資源而出現(xiàn)的故障2.2進(jìn)程的狀態(tài)轉(zhuǎn)換進(jìn)程的動(dòng)態(tài)性進(jìn)程執(zhí)行的間斷性進(jìn)程具有多種狀態(tài)2.2.1進(jìn)程的執(zhí)行軌跡進(jìn)程在內(nèi)存中布局示例2.2.1進(jìn)程的執(zhí)行軌跡進(jìn)程的軌跡:執(zhí)行指令序列,用于描述單個(gè)進(jìn)程的行為。I/O

request3進(jìn)程并發(fā)執(zhí)行的軌跡:理解處理器的行為,如何在三個(gè)進(jìn)程間交替執(zhí)行規(guī)定:每個(gè)進(jìn)程僅允許最多連續(xù)執(zhí)行6個(gè)指令周期,之后被中斷(避免獨(dú)占)ABCdispatcherdispatcherdispatcherAC7/23/20232.2.1進(jìn)程的執(zhí)行軌跡dispatcher2.2.2兩狀態(tài)進(jìn)程模型暫停調(diào)度退出進(jìn)入未執(zhí)行未執(zhí)行執(zhí)行進(jìn)程兩狀態(tài)轉(zhuǎn)換模型進(jìn)入隊(duì)列調(diào)度退出暫停進(jìn)程兩狀態(tài)隊(duì)列模型處理器2.2.3五狀態(tài)進(jìn)程模型進(jìn)程的三種基本狀態(tài)就緒狀態(tài)

當(dāng)進(jìn)程已分配到除CPU以外的所有必要資源后,只要再獲得CPU,便可立即執(zhí)行過程。執(zhí)行狀態(tài)進(jìn)程已獲得CPU,其程序正在執(zhí)行。阻塞狀態(tài)正在執(zhí)行的進(jìn)程由于發(fā)生某事件而暫時(shí)無法繼續(xù)執(zhí)行時(shí),便放棄處理機(jī)而處于暫停狀態(tài),把這種暫停狀態(tài)稱為阻塞狀態(tài),有時(shí)也稱為等待狀態(tài)。2.2.3五狀態(tài)進(jìn)程模型進(jìn)程的三種基本狀態(tài)及其轉(zhuǎn)換就緒阻塞執(zhí)行時(shí)間片完進(jìn)程調(diào)度事件發(fā)生事件等待2.2.3五狀態(tài)進(jìn)程模型三種基本狀態(tài)的思考狀態(tài)轉(zhuǎn)換是否可逆?進(jìn)程主動(dòng)完成狀態(tài)轉(zhuǎn)換,還是被動(dòng)完成?進(jìn)程狀態(tài)是否唯一?時(shí)間片用完是否是進(jìn)程由執(zhí)行變?yōu)榫途w的唯一原因?在單處理機(jī)系統(tǒng)中,是否可以有多個(gè)進(jìn)程處于執(zhí)行狀態(tài)?在多處理機(jī)系統(tǒng)中,是否可以有多個(gè)進(jìn)程處于執(zhí)行狀態(tài)?三種狀態(tài)是否是進(jìn)程的全部可能狀態(tài)?2.2.3五狀態(tài)進(jìn)程模型進(jìn)程的五種狀態(tài)執(zhí)行狀態(tài)、阻塞狀態(tài)、就緒狀態(tài)新建狀態(tài)OS已完成為創(chuàng)建一進(jìn)程所必要的工作已構(gòu)造了進(jìn)程標(biāo)識(shí)符;已創(chuàng)建了管理進(jìn)程所需的表格但還沒有允許執(zhí)行該進(jìn)程(尚未同意)因?yàn)橘Y源有限,OS所需的關(guān)于該進(jìn)程的信息保存在主存中的進(jìn)程表中,但進(jìn)程自身還未進(jìn)入主存,也沒有為與這個(gè)程序相關(guān)的數(shù)據(jù)分配空間,程序保留在輔存中。終止?fàn)顟B(tài)它不再有執(zhí)行資格表格和其它信息暫時(shí)保留2.2.3五狀態(tài)進(jìn)程模型進(jìn)程五狀態(tài)轉(zhuǎn)換模型分派/調(diào)度接納事件等待時(shí)間片用完新建阻塞執(zhí)行就緒終止事件發(fā)生完成2.2.3五狀態(tài)進(jìn)程模型阻塞隊(duì)列和就緒隊(duì)列

單阻塞隊(duì)列單就緒隊(duì)列多阻塞隊(duì)列單就緒隊(duì)列2.2.3五狀態(tài)進(jìn)程模型單阻塞隊(duì)列、單就緒隊(duì)列

接納就緒隊(duì)列分派/調(diào)度處理機(jī)完成時(shí)間片完等待事件阻塞隊(duì)列事件發(fā)生2.2.3五狀態(tài)進(jìn)程模型多阻塞隊(duì)列、單就緒隊(duì)列

時(shí)間片完等待事件1阻塞隊(duì)列1事件1發(fā)生接納

就緒隊(duì)列分派/調(diào)度完成處理機(jī)阻塞隊(duì)列2阻塞隊(duì)列n等待事件2等待事件n事件2發(fā)生事件n發(fā)生2.2.4進(jìn)程的掛起狀態(tài)多個(gè)進(jìn)程競(jìng)爭(zhēng)內(nèi)存資源時(shí)可能導(dǎo)致下列現(xiàn)象內(nèi)存資源緊張

如何在有限的內(nèi)存中裝入盡量多的進(jìn)程?無就緒進(jìn)程,處理機(jī)空閑

I/O操作速度遠(yuǎn)低于CPU計(jì)算速度,導(dǎo)致所有進(jìn)程阻塞,該如何處理?2.2.4進(jìn)程的掛起狀態(tài)對(duì)換技術(shù)(Swapping)

內(nèi)存中分沒有就緒進(jìn)程或內(nèi)存空間非常緊張時(shí),系統(tǒng)將一個(gè)或多個(gè)進(jìn)程的全部或部程序和數(shù)據(jù)從內(nèi)存中換出到磁盤,以騰出部分內(nèi)存空間。進(jìn)程被交換到外存,狀態(tài)可能變?yōu)閽炱馉顟B(tài)掛起狀態(tài)使執(zhí)行的進(jìn)程暫停執(zhí)行,靜止下來,不再參與CPU的競(jìng)爭(zhēng),我們把這種靜止?fàn)顟B(tài)稱為掛起狀態(tài)。2.2.4進(jìn)程的掛起狀態(tài)進(jìn)程掛起的原因進(jìn)程全部阻塞,處理機(jī)空閑系統(tǒng)負(fù)荷過重,內(nèi)存空間緊張操作系統(tǒng)的需要,操作系統(tǒng)可能需要掛起后臺(tái)進(jìn)程或一些服務(wù)進(jìn)程,或某些可能導(dǎo)致系統(tǒng)故障的進(jìn)程。終端用戶的請(qǐng)求父進(jìn)程請(qǐng)求2.2.4進(jìn)程的掛起狀態(tài)被掛起進(jìn)程的特征不能立即執(zhí)行掛起條件獨(dú)立于阻塞條件使之掛起的進(jìn)程:自身、OS、父進(jìn)程激活掛起進(jìn)程的進(jìn)程:實(shí)施掛起操作的進(jìn)程2.2.4進(jìn)程的掛起狀態(tài)阻塞與掛起阻塞與否:進(jìn)程是否等待事件掛起與否:進(jìn)程是否被換出內(nèi)存四種狀態(tài)組合就緒:進(jìn)程在內(nèi)存,準(zhǔn)備執(zhí)行阻塞:進(jìn)程在內(nèi)存,等待事件就緒/掛起:進(jìn)程在外存,只要調(diào)入內(nèi)存并獲得CPU即可執(zhí)行阻塞/掛起:進(jìn)程在外存,等待事件有掛起狀態(tài)的轉(zhuǎn)換模型2.2.3進(jìn)程的掛起狀態(tài)接納激活掛起激活分派/調(diào)度接納事件等待時(shí)間片用完新建阻塞執(zhí)行就緒終止事件發(fā)生阻塞/掛起掛起就緒/掛起完成事件發(fā)生掛起2.3操作系統(tǒng)對(duì)進(jìn)程的控制操作系統(tǒng)內(nèi)核控制結(jié)構(gòu)進(jìn)程控制2.3.1操作系統(tǒng)內(nèi)核內(nèi)核的概念一些與硬件緊密相關(guān)、基本的、公共的、運(yùn)行頻率較高的模塊,以及關(guān)鍵性數(shù)據(jù)結(jié)構(gòu)等常駐內(nèi)存,便于提高操作系統(tǒng)運(yùn)行效能的這部分軟件,稱為操作系統(tǒng)的內(nèi)核。用戶通過系統(tǒng)調(diào)用訪問操作系統(tǒng)的功能,這些功能最終都通過操作系統(tǒng)內(nèi)核實(shí)現(xiàn)。不同操作系統(tǒng)對(duì)內(nèi)核的定義和功能范圍的設(shè)定是不同的。通常而言,操作系統(tǒng)內(nèi)核的功能可以概括為資源管理功能和支撐功能。2.3.1操作系統(tǒng)內(nèi)核資源管理功能進(jìn)程管理進(jìn)程創(chuàng)建和終止、調(diào)度、狀態(tài)轉(zhuǎn)換、同步和通信、管理PCB等。存儲(chǔ)管理為進(jìn)程分配內(nèi)存空間、實(shí)現(xiàn)內(nèi)存保護(hù)和對(duì)換功能以及對(duì)內(nèi)存分段、分頁管理等。I/O設(shè)備管理

I/O緩沖區(qū)的管理,為進(jìn)程分配I/O通道和設(shè)備等。2.3.1操作系統(tǒng)內(nèi)核支撐功能中斷處理中斷處理既是內(nèi)核的基本功能,也是整個(gè)操作系統(tǒng)賴以活動(dòng)的基礎(chǔ),操作系統(tǒng)的一切重要活動(dòng)最終都依賴于中斷。時(shí)鐘管理操作系統(tǒng)的很多功能都依賴于時(shí)鐘,如時(shí)間片控制等。原語操作由若干機(jī)器指令構(gòu)成用以完成特定功能的一個(gè)過程在執(zhí)行中不可分割——原子操作操作系統(tǒng)內(nèi)核的功能大都通過執(zhí)行各種原語操作實(shí)現(xiàn)統(tǒng)計(jì)、監(jiān)測(cè)功能2.3.2操作系統(tǒng)控制結(jié)構(gòu)操作系統(tǒng)是資源的管理者采用表格(或數(shù)據(jù)結(jié)構(gòu))來記載各資源的信息,從而實(shí)現(xiàn)對(duì)資源的管理、維護(hù)、更新等。操作系統(tǒng)控制表的通用結(jié)構(gòu)

進(jìn)程文件設(shè)備內(nèi)存進(jìn)程n……進(jìn)程2進(jìn)程1內(nèi)存表I/O表文件表進(jìn)程映像1進(jìn)程映像2進(jìn)程映像n……主進(jìn)程表2.3.3進(jìn)程的構(gòu)成及進(jìn)程的組織進(jìn)程的構(gòu)成(進(jìn)程映像)

程序段+數(shù)據(jù)段+進(jìn)程控制塊(PCB)在某些系統(tǒng)中,當(dāng)進(jìn)程創(chuàng)建另一進(jìn)程后,父子進(jìn)程就以某種形式繼續(xù)保持關(guān)聯(lián)。如UNIX中,進(jìn)程與其所有子女及后裔共同組成一個(gè)進(jìn)程組。在Windows中,沒有進(jìn)程層次的概念,所有進(jìn)程都是地位相等的。2.3.4進(jìn)程控制塊PCB標(biāo)示符狀態(tài)優(yōu)先級(jí)程序計(jì)數(shù)器內(nèi)存指針上下文數(shù)據(jù)I/O狀態(tài)信息記賬信息…進(jìn)程控制塊的作用進(jìn)程存在的唯一標(biāo)志;PCB(processcontrolblock)常駐內(nèi)存進(jìn)程控制塊中的信息標(biāo)識(shí)、處理機(jī)狀態(tài),進(jìn)程調(diào)度信息,進(jìn)程控制信息2.3.4進(jìn)程控制塊PCB進(jìn)程控制塊中的信息進(jìn)程標(biāo)示符:唯一地標(biāo)識(shí)一個(gè)進(jìn)程內(nèi)部標(biāo)識(shí)符操作系統(tǒng)為每個(gè)進(jìn)程賦予的一個(gè)唯一整數(shù),便于系統(tǒng)控制外部標(biāo)識(shí)符由創(chuàng)建者提供,通常是由字母、數(shù)字組成,往往是由用戶(進(jìn)程)在訪問該進(jìn)程時(shí)使用。2.3.4進(jìn)程控制塊PCB進(jìn)程控制塊中的信息(續(xù))處理機(jī)狀態(tài)信息:主要是由處理器的各種寄存器中的內(nèi)容組成的通用寄存器(用戶可視寄存器)

暫存信息指令計(jì)數(shù)器要訪問的下一條指令的地址程序狀態(tài)字PSW狀態(tài)信息,如條件碼、執(zhí)行方式、中斷屏蔽標(biāo)志等用戶棧指針存放過程和系統(tǒng)調(diào)用參數(shù)及調(diào)用地址2.3.4進(jìn)程控制塊PCB進(jìn)程控制塊中的信息(續(xù))進(jìn)程調(diào)度信息:與進(jìn)程調(diào)度和進(jìn)程對(duì)換有關(guān)的信息進(jìn)程狀態(tài)

指明進(jìn)程的當(dāng)前狀態(tài)進(jìn)程優(yōu)先級(jí)

進(jìn)程使用戶理器的優(yōu)先級(jí)別進(jìn)程調(diào)度所需的其它信息如進(jìn)程已等待CPU的時(shí)間總和、進(jìn)程已執(zhí)行的時(shí)間總和等;事件

指進(jìn)程由執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)樽枞麪顟B(tài)所等待發(fā)生的事件,即阻塞原因。2.3.4進(jìn)程控制塊PCB進(jìn)程控制塊中的信息(續(xù))其它信息程序和數(shù)據(jù)的地址

指進(jìn)程的程序和數(shù)據(jù)所在的內(nèi)存或外存地址進(jìn)程同步和通信機(jī)制

指實(shí)現(xiàn)進(jìn)程同步和進(jìn)程通信時(shí)必需的機(jī)制,如消息隊(duì)列指針、信號(hào)量等。資源清單進(jìn)程所需的全部資源及已經(jīng)分配到該進(jìn)程的資源的清單鏈接指針2.3.4進(jìn)程控制塊PCB進(jìn)程控制塊的組織方式索引方式鏈接方式單一隊(duì)列多級(jí)隊(duì)列2.3.4進(jìn)程控制塊PCB索引方式系統(tǒng)根據(jù)所有進(jìn)程的狀態(tài)建立幾張索引表。2.3.4進(jìn)程控制塊PCB鏈接方式通過鏈接指針將PCB塊連接起來,形成隊(duì)列。單一隊(duì)列所有PCB塊連接成一個(gè)隊(duì)列PCB1RunningPCB2ReadyPCBnBlcoked…2.3.4進(jìn)程控制塊PCB鏈接方式——多級(jí)隊(duì)列相同狀態(tài)的PCB塊連接成一個(gè)隊(duì)列2.3.5PCB實(shí)例Linux操作系統(tǒng)中采用task_struct來表示進(jìn)程控制塊\include\linux\sched.h2.3.6操作系統(tǒng)內(nèi)核級(jí)安全:執(zhí)行模式模式為了實(shí)現(xiàn)操作系統(tǒng)內(nèi)核級(jí)安全,由硬件提供CPU特權(quán)保護(hù)方式,稱為模式。模式分類單模式無論是用戶程序,還是系統(tǒng)程序都采用一種模式。多模式

多種CPU保護(hù)級(jí)別2.3.6操作系統(tǒng)內(nèi)核級(jí)安全:執(zhí)行模式雙模式系統(tǒng)模式(系統(tǒng)態(tài)、系統(tǒng)控制模式、內(nèi)核模式、管態(tài))具有較高的特權(quán)運(yùn)行系統(tǒng)特定的指令,包括讀/寫控制寄存器的指令、基本I/O指令以及與存儲(chǔ)器管理有關(guān)的指令等,而且特定的內(nèi)存區(qū)域也只能在系統(tǒng)模式下訪問。內(nèi)核模式下的處理器及其指令、寄存器和內(nèi)存受到完全控制和保護(hù)。用戶模式(用戶態(tài)、目態(tài))具有較低的特權(quán)用戶程序一般運(yùn)行在用戶模式2.3.6操作系統(tǒng)內(nèi)核級(jí)安全:執(zhí)行模式模式切換系統(tǒng)模式和用戶模式之間的相互轉(zhuǎn)換模式的思考模式切換是否會(huì)必然導(dǎo)致進(jìn)程狀態(tài)的改變?否,如系統(tǒng)調(diào)用進(jìn)程切換是否會(huì)導(dǎo)致模式切換的發(fā)生?

不一定2.3.7操作系統(tǒng)對(duì)進(jìn)程的控制進(jìn)程控制創(chuàng)建和撤銷進(jìn)程,并對(duì)進(jìn)程在整個(gè)生命期中各狀態(tài)的轉(zhuǎn)換進(jìn)行有效控制。實(shí)現(xiàn)方式進(jìn)程控制一般是由OS的內(nèi)核中的一組原語來實(shí)現(xiàn)的2.3.7.1進(jìn)程的創(chuàng)建與撤銷引起創(chuàng)建進(jìn)程的典型事件用戶登錄為終端用戶建立一進(jìn)程作業(yè)調(diào)度(不是進(jìn)程調(diào)度)為被調(diào)度的作業(yè)建立進(jìn)程提供服務(wù)如要打印時(shí)建立打印進(jìn)程應(yīng)用請(qǐng)求由應(yīng)用程序建立多個(gè)進(jìn)程2.3.7.1進(jìn)程的創(chuàng)建與撤銷創(chuàng)建進(jìn)程的步驟給新進(jìn)程分配一個(gè)唯一的進(jìn)程標(biāo)識(shí)符為進(jìn)程分配空間初始化進(jìn)程控制塊初始化標(biāo)識(shí)信息初始化處理機(jī)狀態(tài)信息如使程序計(jì)數(shù)器指向程序的入口地址,使棧指針指向棧頂?shù)瘸跏蓟M(jìn)程調(diào)度信息如設(shè)置進(jìn)程的狀態(tài)、優(yōu)先級(jí)。建立鏈接,將之插入就緒或就緒/掛起鏈表。建立或擴(kuò)充其它數(shù)據(jù)結(jié)構(gòu)2.3.7.1進(jìn)程的創(chuàng)建與撤銷引起進(jìn)程終止的事件正常結(jié)束:如exit,halt,logoff異常結(jié)束:外界干預(yù):系統(tǒng)員kill進(jìn)程父進(jìn)程終止父進(jìn)程請(qǐng)求越界錯(cuò)誤保護(hù)錯(cuò)非法指令特權(quán)指令錯(cuò)運(yùn)行超時(shí)等待超時(shí)算術(shù)運(yùn)算錯(cuò)、被0除I/O故障2.3.7.1進(jìn)程的創(chuàng)建與撤銷進(jìn)程終止過程根據(jù)被終止進(jìn)程的標(biāo)識(shí)符找到其PCB,讀出該進(jìn)程的狀態(tài)。若該進(jìn)程為執(zhí)行狀態(tài),則終止其執(zhí)行,調(diào)度下一個(gè)就緒進(jìn)程執(zhí)行。若該進(jìn)程還有子孫進(jìn)程,還應(yīng)將其所有子孫進(jìn)程予以終止,以防他們成為不可控的進(jìn)程將該進(jìn)程所擁有的全部資源,或者歸還給其父進(jìn)程,或者歸還給系統(tǒng)。將被終止進(jìn)程(它的PCB)從所在隊(duì)列(或鏈表)中移出,等待其他程序來搜集信息2.3.7.2進(jìn)程的阻塞與喚醒引起進(jìn)程阻塞的事件請(qǐng)求系統(tǒng)服務(wù)而得不到滿足時(shí),如向系統(tǒng)請(qǐng)求打印。啟動(dòng)某種操作而需同步時(shí):如該操作和請(qǐng)求該操作的進(jìn)程需同步運(yùn)行(即非異步操作)。新數(shù)據(jù)尚未到達(dá):如進(jìn)程A寫,進(jìn)程B讀,則A未寫,完B不能讀。無新工作可做。2.3.7.2進(jìn)程的阻塞與喚醒進(jìn)程阻塞過程正在執(zhí)行的進(jìn)程,當(dāng)發(fā)現(xiàn)上述某事件時(shí),由于無法繼續(xù)執(zhí)行,于是進(jìn)程便通過調(diào)用阻塞原語block()把自己阻塞。把進(jìn)程控制塊中的現(xiàn)行狀態(tài)由“執(zhí)行”改為阻塞,并將PCB插入阻塞隊(duì)列。調(diào)度程序?qū)⑻幚頇C(jī)分配給另一就緒進(jìn)程,并進(jìn)行切換。2.3.7.2進(jìn)程的阻塞與喚醒進(jìn)程喚醒過程當(dāng)被阻塞進(jìn)程所期待的事件出現(xiàn)時(shí),則由有關(guān)進(jìn)程(比如,用完并釋放了該I/O設(shè)備的進(jìn)程)調(diào)用喚醒原語wakeup(),將等待該事件的進(jìn)程喚醒。喚醒原語執(zhí)行的過程是:首先把被阻塞的進(jìn)程從等待該事件的阻塞隊(duì)列中移出,將其PCB中的現(xiàn)行狀態(tài)由阻塞改為就緒,然后再將該P(yáng)CB插入到就緒隊(duì)列中。2.3.7.3進(jìn)程的掛起與激活進(jìn)程的掛起當(dāng)出現(xiàn)了引起進(jìn)程掛起的事件時(shí),系統(tǒng)將利用掛起原語suspend()將指定進(jìn)程掛起。掛起原語的執(zhí)行過程首先檢查被掛起進(jìn)程的狀態(tài),若處于就緒狀態(tài),便將其改為就緒/掛起;對(duì)于處于阻塞狀態(tài)的進(jìn)程,則將之改為阻塞/掛起。2.3.7.3進(jìn)程的掛起與激活進(jìn)程的激活當(dāng)發(fā)生激活進(jìn)程的事件時(shí),則可將在外存上處于就緒/掛起狀態(tài)的進(jìn)程換入內(nèi)存。激活原語的執(zhí)行過程系統(tǒng)利用激活原語active()將指定進(jìn)程激活;激活原語先將進(jìn)程從外存調(diào)入內(nèi)存,檢查該進(jìn)程的現(xiàn)行狀態(tài),若是就緒/掛起,便將之改為就緒;若為阻塞/掛起,便將之改為阻塞。2.3.7.4進(jìn)程切換進(jìn)程切換調(diào)度另一個(gè)就緒進(jìn)程占用處理器執(zhí)行進(jìn)程的上下文

進(jìn)程執(zhí)行現(xiàn)場(chǎng)進(jìn)程切換步驟保存處理器上下文環(huán)境,包括程序計(jì)數(shù)器和其它寄存器更新當(dāng)前處于運(yùn)行狀態(tài)進(jìn)程的進(jìn)程控制塊將進(jìn)程的進(jìn)程控制塊移至相應(yīng)隊(duì)列(就緒、阻塞等)選擇另一進(jìn)程執(zhí)行更新其進(jìn)程控制塊信息恢復(fù)被選擇進(jìn)程的上下文環(huán)境2.3.8UNIX進(jìn)程控制fork():創(chuàng)建一個(gè)新進(jìn)程exec():執(zhí)行一個(gè)可執(zhí)行程序exit():終止sleep():暫停一段時(shí)間pause():暫停并等待信號(hào)wait():等待子進(jìn)程暫?;蚪K止kill():發(fā)送信號(hào)到某個(gè)或一組進(jìn)程ptrace():設(shè)置執(zhí)行斷點(diǎn)(breakpoint),允許父進(jìn)程控制子進(jìn)程的運(yùn)行2.3.8UNIX進(jìn)程控制fork()作用

創(chuàng)建一個(gè)新進(jìn)程調(diào)用格式

pid=fork()在調(diào)用fork()之后,父進(jìn)程和子進(jìn)程均在下一條語句上繼續(xù)運(yùn)行。父、子進(jìn)程的fork返回值不同在子進(jìn)程中返回時(shí),pid為0;在父進(jìn)程中返回時(shí),pid為所創(chuàng)建的子進(jìn)程的標(biāo)識(shí)。2.3.8UNIX進(jìn)程控制fork()創(chuàng)建子進(jìn)程之后,執(zhí)行返回父進(jìn)程,或調(diào)度切換到子進(jìn)程或其他進(jìn)程。fork創(chuàng)建一個(gè)新進(jìn)程(子進(jìn)程),除了子進(jìn)程標(biāo)識(shí)符和其PCB結(jié)構(gòu)中的某些特性參數(shù)不同之外,子進(jìn)程是父進(jìn)程的精確復(fù)制。父、子進(jìn)程的運(yùn)行是無關(guān)的,所以運(yùn)行順序也不固定。若要求父子進(jìn)程運(yùn)行順序一定,則要用到進(jìn)程間的通信。2.3.8UNIX進(jìn)程控制main(){pid_tval;printf(“PID…\n”);val=fork();

if(val!=0)printf(“parent…\n”);

elseprintf(“child…\n”);}父進(jìn)程main(){pid_tval;printf(“PID…\n”);val=fork();

if(val!=0)printf(“parent…\n”);

elseprintf(“child…\n”);}父進(jìn)程main(){pid_tval;printf(“PID…\n”);val=fork();

if(val!=0)printf(“parent…\n”);

elseprintf(“child…\n”);}子進(jìn)程分裂執(zhí)行繼續(xù)執(zhí)行繼續(xù)執(zhí)行2.3.8UNIX進(jìn)程控制fork()調(diào)用例子(1)#include<stdio.h>#Include<sys/types.h>#include<unistd.h>voidmain(void){printf(“Hello\n”);

fork();printf(“Bye\n”);}運(yùn)行結(jié)果HelloByeBye2.3.8UNIX進(jìn)程控制fork()調(diào)用例子(2)#include<stdio.h>#Include<sys/types.h>#include<unistd.h>voidmain(void){if(fork()==0)printf(“IntheCHILDprocess\n”);elseprintf(“InthePARENTprocess\n”);}程序的運(yùn)行無法保證輸出順序,輸出順序依賴于內(nèi)核所用的調(diào)度算法2.3.8UNIX進(jìn)程控制fork()調(diào)用例子(3)voidmain(void){inti;staticcharbuffer[10];if(fork()==0)strcpy(buffer,“Child\n”);elsestrcpy(buffer,“Parent\n”);

for(i=0;i<5;++i){

sleep(1);write(1,buffer,sizeof(buffer));}}2.3.8UNIX進(jìn)程控制fork()調(diào)用例子(4)#include<stdio.h>#include<sys/types.h>#include<unistd.h>intglobal=4;voidmain(void){intpid;

intvari=5;printf(“beforefork\n”);if((pid=fork())<0){printf(“forkerror\n”);exit(0);}elseif(pid==0){global++;vari--;}printf(“global=%d,vari=%d\n”,global,vari);}父進(jìn)程:global=?,vari=?

子進(jìn)程:global=?,vari=?2.3.8UNIX進(jìn)程控制子進(jìn)程只能這么用么?Question2.3.8UNIX進(jìn)程控制子進(jìn)程如何執(zhí)行一個(gè)新的程序?

通過exec()調(diào)用族,加載新的程序文本子進(jìn)程可以擁有自己的可執(zhí)行代碼,即用一個(gè)新進(jìn)程覆蓋調(diào)用進(jìn)程。參數(shù)包括新進(jìn)程對(duì)應(yīng)的文件和命令行參數(shù)。成功調(diào)用時(shí),不再返回;否則,返回出錯(cuò)原因。2.3.8UNIX進(jìn)程控制六種exec調(diào)用格式:各種調(diào)用的區(qū)別在于參數(shù)的處理方法不同,常用的格式有:intexecvp(constchar*file,char*constargv[])intexeclp(constchar*file,constchar*arg,...,(char*)0)在大多數(shù)程序中,系統(tǒng)調(diào)用fork和exec是結(jié)合在一起使用的。父進(jìn)程生成一個(gè)子進(jìn)程,然后通過調(diào)用exec覆蓋該子進(jìn)程2.3.8UNIX進(jìn)程控制輸出分別是什么fork失敗父進(jìn)程:子進(jìn)程:execv失敗父進(jìn)程:子進(jìn)程:execv成功父進(jìn)程:子進(jìn)程:intglobal=0;voidmain(){

if((child=fork())<0){

/*創(chuàng)建失敗*/}elseif(child==0){

if(execv(B...)<0){/*加載失敗*/

global+=1;

}else{

global+=2;

}

}else{

global+=3;

}printf(“global=%d”,global)}0無313依賴B2.4線程進(jìn)程回顧進(jìn)程的兩個(gè)特點(diǎn)資源所有權(quán):一個(gè)進(jìn)程包括一個(gè)保存進(jìn)程映像的虛地址空間,擁有對(duì)資源的控制或所有權(quán)。調(diào)度/執(zhí)行的基本單位:一個(gè)具有狀態(tài)和優(yōu)先級(jí),可被被操作系統(tǒng)調(diào)度并分派的實(shí)體。有沒有改進(jìn)之處?2.4.1進(jìn)程與線程線程的誕生為區(qū)分這兩個(gè)特點(diǎn),調(diào)度并分派的部分通常稱為線程或輕量級(jí)進(jìn)程(lightweightprocess,LWP),而資源所有權(quán)的部分通常稱為進(jìn)程。傳統(tǒng)的每個(gè)進(jìn)程中只有一個(gè)線程在執(zhí)行(沒有考慮線程的概念),稱作單線程進(jìn)程。2.4.1進(jìn)程與線程線程的發(fā)展進(jìn)程是擁有資源和獨(dú)立運(yùn)行的基本單位。20世紀(jì)80年代中期,提出了比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位——線程(Threads)試圖用它來提高系統(tǒng)內(nèi)程序并發(fā)執(zhí)行的程度,從而可進(jìn)一步提高系統(tǒng)的吞吐量。20世紀(jì)90年代后,多處理機(jī)系統(tǒng)得到迅速發(fā)展,線程能比進(jìn)程更好地提高程序的并行執(zhí)行程度,充分地發(fā)揮多處理機(jī)的優(yōu)越性。2.4.1進(jìn)程與線程線程的優(yōu)勢(shì)減少并發(fā)執(zhí)行時(shí)的時(shí)空開銷,進(jìn)程的創(chuàng)建、撤消、切換較費(fèi)時(shí)空,因它既是調(diào)度單位,又是資源擁有者。線程是系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,其基本上不擁有系統(tǒng)資源,只有少量資源(PC,寄存器,棧),共享其所屬進(jìn)程所擁有的全部資源。2.4.1進(jìn)程與線程線程的屬性輕型實(shí)體除了一點(diǎn)必不可少的資源(如線程控制塊TCB、程序計(jì)數(shù)器、寄存器和堆棧)外,線程基本上不擁有系統(tǒng)的資源。獨(dú)立調(diào)度和分派的基本單位可并發(fā)執(zhí)行同一個(gè)進(jìn)程中的多個(gè)線程以及不同進(jìn)程中的多個(gè)線程均可并發(fā)執(zhí)行。共享資源同一個(gè)進(jìn)程中的各線程可以共享該進(jìn)程所擁有的全部資源,如進(jìn)程的地址空間、已打開的文件、定時(shí)器和信號(hào)量等。2.4.2進(jìn)程與線程的關(guān)系單進(jìn)程、單線程單進(jìn)程、多線程多進(jìn)程、每個(gè)進(jìn)程一個(gè)線程多進(jìn)程、每個(gè)進(jìn)程多個(gè)線程2.4.2進(jìn)程與線程的關(guān)系進(jìn)程與線程的比較概念調(diào)度并發(fā)性擁有資源系統(tǒng)開銷概念進(jìn)程是程序在一個(gè)數(shù)據(jù)集合上運(yùn)行的過程,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。線程是進(jìn)程中的一個(gè)實(shí)體,是獨(dú)立調(diào)度和分派的基本單位。調(diào)度傳統(tǒng)操作系統(tǒng)中,進(jìn)程既是擁有資源的基本單位,又是獨(dú)立調(diào)度的基本單位。引入線程的操作系統(tǒng)中,線程是獨(dú)立調(diào)度的基本單位。進(jìn)程是資源擁有的基本單位,故可以顯著地提高系統(tǒng)的并發(fā)程度。同一進(jìn)程中的線程間切換不會(huì)引起進(jìn)程切換,但當(dāng)一個(gè)進(jìn)程中的線程切換到另一進(jìn)程中的線程時(shí),將會(huì)引起進(jìn)程切換。2.4.2進(jìn)程與線程的關(guān)系并發(fā)性進(jìn)程之間可以并發(fā)執(zhí)行同屬于一個(gè)進(jìn)程的多個(gè)線程之間,亦可并發(fā)執(zhí)行引入線程的操作系統(tǒng)具有更好的并發(fā)性,能更有效地使用系統(tǒng)資源和提高系統(tǒng)吞吐量。擁有的資源進(jìn)程是擁有資源的獨(dú)立單位,有權(quán)申請(qǐng)系統(tǒng)的各類資源。線程除了擁有很少的私有資源以外,但可以和進(jìn)程內(nèi)的其它線程共享其所屬進(jìn)程的資源。資源比較線程:線程控制塊、程序計(jì)數(shù)器、寄存器和堆棧等進(jìn)程:地址空間、全局變量、打開文件、子進(jìn)程等2.4.2進(jìn)程與線程的關(guān)系系統(tǒng)開銷操作系統(tǒng)管理進(jìn)程的開銷顯著地大于管理線程所需的開銷。進(jìn)程切換的開銷也遠(yuǎn)大于線程切換的開銷。由于同一進(jìn)程中的多個(gè)線程具有相同的地址空間,使它們之間的同步和通信也比較容易。有些類型的線程切換、同步和通信都無需操作系統(tǒng)內(nèi)核的干預(yù)。2.4.2進(jìn)程與線程的關(guān)系關(guān)于線程的思考在支持多線程的系統(tǒng)中,進(jìn)程P創(chuàng)建的若干線程可以共享的資源有:進(jìn)程P的代碼段進(jìn)程P打開的文件進(jìn)程P的全局變量進(jìn)程P中某線程的棧指針進(jìn)程P中某線程的局部變量2.4.2進(jìn)程與線程的關(guān)系2.4.3多線程并發(fā)單線程

每個(gè)進(jìn)程中只有一個(gè)線程在執(zhí)行(沒有明確線程的概念)多線程在單個(gè)進(jìn)程中執(zhí)行多個(gè)線程的能力單進(jìn)程、單線程單進(jìn)程、多線程多進(jìn)程、每個(gè)進(jìn)程一個(gè)線程多進(jìn)程、每個(gè)進(jìn)程多個(gè)線程2.4.3多線程并發(fā)單線程和多線程模式

2.4.3多線程并發(fā)線程的基本狀態(tài)就緒狀態(tài)執(zhí)行狀態(tài)阻塞狀態(tài)線程一般不具有掛起狀態(tài)一個(gè)進(jìn)程可以創(chuàng)建和撤消一個(gè)或多個(gè)線程,同一進(jìn)程中的多個(gè)線程可并發(fā)執(zhí)行。2.4.3多線程并發(fā)線程的基本操作派生(Spawn)

當(dāng)系統(tǒng)創(chuàng)建一個(gè)進(jìn)程時(shí),同時(shí)也為該進(jìn)程派生一個(gè)線程,同一進(jìn)程中的線程可以再派生其它線程。阻塞(Block)當(dāng)線程需要等待某事件時(shí),它將被阻塞,釋放處理機(jī)執(zhí)行其它線程。解除阻塞(Unblock)當(dāng)線程的阻塞事件發(fā)生,其狀態(tài)轉(zhuǎn)換為就緒,并插入到就緒隊(duì)列,等待調(diào)度執(zhí)行。結(jié)束(Finish)線程執(zhí)行完畢,釋放其私有資源。2.4.4線程的類型線程類型:依據(jù)線程是否對(duì)內(nèi)核透明用戶級(jí)線程內(nèi)核級(jí)線程混合線程2.4.4線程的類型用戶級(jí)線程線程的創(chuàng)建、撤銷和切換等操作全部由應(yīng)用程序完成操作系統(tǒng)內(nèi)核不知道線程的存在,仍以進(jìn)程為調(diào)度單位Infomix支持用戶級(jí)線程P線程庫(kù)用戶空間內(nèi)核空間2.4.4線程的類型用戶級(jí)線程的優(yōu)點(diǎn)線程的管理和控制僅在用戶級(jí)進(jìn)行,切換開銷小調(diào)度更靈活線程庫(kù)獨(dú)立于系統(tǒng)內(nèi)核用戶級(jí)線程的缺點(diǎn)用戶級(jí)線程中的系統(tǒng)調(diào)用常常會(huì)引起線程及整個(gè)進(jìn)程阻塞,削弱了線程的并發(fā)性難以利用多處理技術(shù)內(nèi)核級(jí)線程線程的創(chuàng)建、撤銷和切換等操作由系統(tǒng)內(nèi)核完成操作系統(tǒng)以線程為調(diào)度單位Windows2000/XP、Linux和OS/2等操作系統(tǒng)采用了內(nèi)核級(jí)線程技術(shù)用戶空間內(nèi)核空間P2.4.4線程的類型內(nèi)核級(jí)線程的優(yōu)點(diǎn)內(nèi)核可以同時(shí)把同一個(gè)進(jìn)程的多個(gè)線程調(diào)度到多個(gè)處理器如果進(jìn)程中的一個(gè)線程被阻塞(包括頁面故障),內(nèi)核可以調(diào)度同一進(jìn)程中的其他線程內(nèi)核例程也可以是多線程的內(nèi)核級(jí)線程的缺點(diǎn)同一進(jìn)程中線程切換需在內(nèi)核中完成,開銷大在內(nèi)核中創(chuàng)建和撤銷線程的代價(jià)大2.4.4線程的類型混合線程線程的創(chuàng)建、撤銷、調(diào)度和同步等操作在用戶級(jí)應(yīng)用程序中完成多個(gè)用戶級(jí)線程被影射到一個(gè)或較少的某些內(nèi)核級(jí)線程Solaris操作系統(tǒng)采用了混合線程模式PP線程庫(kù)用戶空間內(nèi)核空間2.4.4線程的類型用戶級(jí)、內(nèi)核級(jí)、混合線程模式的比較P線程庫(kù)用戶空間內(nèi)核空間(a)用戶級(jí)線程:用戶級(jí)線程用戶空間內(nèi)核空間P(b)內(nèi)核級(jí)線程:內(nèi)核級(jí)線程PP線程庫(kù)用戶空間內(nèi)核空間(c)混合模式P:進(jìn)程2.4.4線程的類型2.4.5Posix線程線程調(diào)用描述Pthread_create創(chuàng)建一個(gè)線程Pthread_exit結(jié)束調(diào)用的線程Pthread_join等待一個(gè)特定的線程退出Pthread_yield釋放CPU來運(yùn)行另外一個(gè)線程Pthread_attr_init創(chuàng)建并初始化一個(gè)線程的屬性結(jié)構(gòu)Pthread_attr_destroy刪除一個(gè)線程的屬性結(jié)構(gòu)作業(yè)與Project作業(yè)

1.論述程序、進(jìn)程、線程的區(qū)別與聯(lián)系

2.論述進(jìn)程控制塊(PCB)的作用、存儲(chǔ)內(nèi)容

3.論述進(jìn)程的基本特征

4.以圖為例,分析五狀態(tài)進(jìn)程模型

5.為什么引入掛起狀態(tài),其與阻塞狀態(tài)的本質(zhì)區(qū)別是什么

6.論述進(jìn)程切換與模式切換的區(qū)別Projecct2使用fork()、exec()函數(shù)編寫進(jìn)程創(chuàng)建測(cè)試程序,并嘗試?yán)斫?、分析fork()的內(nèi)核實(shí)現(xiàn)提交信箱:os_leeyj163

在Linux內(nèi)核中,供用戶創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用fork()函

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論