管程和條件變量87_第1頁
管程和條件變量87_第2頁
管程和條件變量87_第3頁
管程和條件變量87_第4頁
管程和條件變量87_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、3.4 管程3.4.1 管程和條件變量 3.4.2 3.4.3 漢森方法實(shí)現(xiàn)13.4.1什么是管程?(1)為什么要引入管程把分散在各進(jìn)程中的臨界區(qū)集中起來進(jìn)行管理 ;防止進(jìn)程有意或無意的違法同步操作, 便于用高級語言來書寫程序,也便于程序正確性驗(yàn)證。 2什么是管程?(2)管程是由局部于自己的若干公共變量及其說明和所有訪問這些公共變量的過程所組成的軟件模塊 3管程有以下屬性共享性:安全性:互斥性:4管程的基本形式TYPE = MONITOR ; define ; use ; procedure (); begin ; end; procedure (); begin ; end; begin ;

2、 end;5管程的結(jié)構(gòu)condition c1wait(c1)condition cn wait(cn)Urgent queue signal局部數(shù)據(jù)條件變量過程1過程k出口初始化代碼入口管程等待調(diào)用的進(jìn)程隊(duì)列管程等待區(qū)域6管程的示例TYPE SSU = MONITOR var busy : boolean; nobusy : semaphore; define require, return; use wait, signal; procedure require; begin if busy then wait(nobusy); /*調(diào)用進(jìn)程加入等待隊(duì)列*/ busy := ture; e

3、nd; procedure return; begin busy := false; signal(nobusy); /*從等待隊(duì)列中釋放進(jìn)程*/ end; begin /*管程變量初始化*/ busy := false; end;7管程的條件變量(1)條件變量:當(dāng)調(diào)用管程過程的進(jìn)程無法運(yùn)行時(shí),用于阻塞進(jìn)程的一種信號量同步原語wait:當(dāng)一個(gè)管程過程發(fā)現(xiàn)無法繼續(xù)時(shí),它在某些條件變量condition上執(zhí)行wait,這個(gè)動作引起調(diào)用進(jìn)程阻塞8管程的條件變量(2)另一個(gè)進(jìn)程可以通過對其伙伴在等待的同一個(gè)條件變量condition上執(zhí)行同步原語signal操作來喚醒等待進(jìn)程。條件變量與P、V操作中信

4、號量的區(qū)別? 9管程的問題討論 使用signal釋放等待進(jìn)程時(shí),可能出現(xiàn)兩個(gè)進(jìn)程同時(shí)停留在管程內(nèi)。解決方法:執(zhí)行signal的進(jìn)程等待,直到被釋放進(jìn)程退出管程或等待另一個(gè)條件被釋放進(jìn)程等待,直到執(zhí)行signal的進(jìn)程退出管程或等待另一個(gè)條件霍爾采用了第一種辦法;漢森選擇了兩者的折衷,規(guī)定管程中的過程所執(zhí)行的signal操作是過程體的最后一個(gè)操作 10管程與進(jìn)程作比較(1)管程定義的是公用數(shù)據(jù)結(jié)構(gòu),而進(jìn)程定義的是私有數(shù)據(jù)結(jié)構(gòu);管程把共享變量上的同步操作集中起來,而臨界區(qū)卻分散在每個(gè)進(jìn)程中;管程是為管理共享資源而建立的,進(jìn)程主要是為占有系統(tǒng)資源和實(shí)現(xiàn)系統(tǒng)并發(fā)性而引入的;11管程與進(jìn)程作比較(2)管

5、程是被欲使用共享資源的進(jìn)程所調(diào)用的,管程和調(diào)用它的進(jìn)程不能并行工作,而進(jìn)程之間能并行工作,并發(fā)性是其固有特性;管程是語言或操作系統(tǒng)的成分,不必創(chuàng)建或撤銷,而進(jìn)程有生命周期,由創(chuàng)建而產(chǎn)生至撤銷便消亡。123.4.2管程實(shí)現(xiàn):Hoare方法霍爾方法使用P和V操作原語來實(shí)現(xiàn)對管程中過程的互斥調(diào)用,及實(shí)現(xiàn)對共享資源互斥使用的管理。不要求signal操作是過程體的最后一個(gè)操作,且wait和signal操作可被設(shè)計(jì)成可以中斷的過程。 13Hoare管程數(shù)據(jù)結(jié)構(gòu)(1) 1. mutex對每個(gè)管程,使用用于管程中過程互斥調(diào)用的信號量mutex(初值為1)。進(jìn)程調(diào)用管程中的任何過程時(shí),應(yīng)執(zhí)行P(mutex);進(jìn)

6、程退出管程時(shí)應(yīng)執(zhí)行V(mutex)開放管程,以便讓其他調(diào)用者進(jìn)入。為了使進(jìn)程在等待資源期間,其他進(jìn)程能進(jìn)入管程,故在wait操作中也必須執(zhí)行V(mutex),否則會妨礙其他進(jìn)程進(jìn)入管程,導(dǎo)致無法釋放資源。14Hoare管程數(shù)據(jù)結(jié)構(gòu)(2) 2. next和next-count對每個(gè)管程,引入信號量next(初值為0),凡發(fā)出signal操作的進(jìn)程應(yīng)該用P(next)掛起自己,直到被釋放進(jìn)程退出管程或產(chǎn)生其他等待條件。進(jìn)程在退出管程的過程前,須檢查是否有別的進(jìn)程在信號量next上等待,若有,則用V(next)喚醒它。next-count(初值為0),用來記錄在next上等待的進(jìn)程個(gè)數(shù)。 15Hoa

7、re管程數(shù)據(jù)結(jié)構(gòu)(3) 3. x-sem和 x-count引入信號量x-sem(初值為0),申請資源得不到滿足時(shí),執(zhí)行P(x-sem)掛起。由于釋放資源時(shí),需要知道是否有別的進(jìn)程在等待資源,用計(jì)數(shù)器x-count(初值為0)記錄等待資源的進(jìn)程數(shù)。執(zhí)行signal操作時(shí),應(yīng)讓等待資源的諸進(jìn)程中的某個(gè)進(jìn)程立即恢復(fù)運(yùn)行,而不讓其他進(jìn)程搶先進(jìn)入管程,這可以用V(x-sem)來實(shí)現(xiàn)。 16Hoare管程數(shù)據(jù)結(jié)構(gòu) 每個(gè)管程定義如下數(shù)據(jù)結(jié)構(gòu) :TYPE interf = RECORD mutex:semaphore; /*進(jìn)程調(diào)用管程過程前 使用的互斥信號量*/ next:semaphore; /*發(fā)出si

8、gnal的進(jìn)程掛起 自己的信號量*/ next_count:integer;/*在next上等待的進(jìn) 程數(shù)*/ END; 17Hoare的wait操作Procedure wait(var x_sem:semaphore,x_count:integer, IM:interf);begin x_count := x_count + 1; if IM.next_count 0 then V(IM.next); else V(IM.mutex); P(x_sem); X_count := x_count 1;end;18Hoare的signal操作procedure signal(var x_sem:

9、semaphore,x_count:integer, IM:interf);begin if x_count 0 then begin IM.next_count := IM.next_count + 1; V(x_sem); P(IM.next); IM.next_count := IM.next_count - 1; end;end;19Hoare的外部過程形式 任何一個(gè)調(diào)用管程中過程的外部過程應(yīng)組織成下列形式,確保互斥地進(jìn)入管程。P(IM.mutex); ;if IM.next_count 0 then V(IM.next); else V(IM.mutex);20霍爾方法實(shí)現(xiàn)五個(gè)哲學(xué)家

10、吃通心面問題(1)TYPE dining-philosophers = MONITORvar state : array0.4 of (thinking, hungry, eating); s : array0.4 of semaphore; s-count : array0.4 of integer; define pickup, putdown; use wait, signal;21霍爾方法實(shí)現(xiàn)五個(gè)哲學(xué)家吃通心面問題(2)procedure test(k : 0.4);beginif state(k-1) mod 5eating and statek=hungry and state(k

11、+1) mod 5eating then begin statek := eating; signal(sk, s-countk, IM); end;end; 22霍爾方法實(shí)現(xiàn)五個(gè)哲學(xué)家吃通心面問題(3)procedure pickup(i:0.4);begin statei := hungry; test(i); if stateieating then wait(si,s-counti,IM);end;23霍爾方法實(shí)現(xiàn)五個(gè)哲學(xué)家吃通心面問題(4)procedure putdown(i:0.4);begin statei := thinking; test(i-1) mod 5); test

12、(i+1) mod 5);end;begin for i := 0 to 4 do statei := thinking; end;24霍爾方法實(shí)現(xiàn)五個(gè)哲學(xué)家吃通心面問題(6)cobegin process philosopher-ibegin P(IM.mutex); call dining-philosopher.pickup(i); if IM.next-count 0 then V(IM.next); else V(IM.mutex); 吃通心面; P(IM.mutex); call dining-philosopher.putdown(i); if IM.next-count 0 t

13、hen V(IM.next); else V(IM.mutex); end;coend; 25管程實(shí)現(xiàn):漢森方法(1)漢森方法的管程中的過程所執(zhí)行的signal操作一定是過程體的最后一個(gè)操作,一個(gè)進(jìn)程當(dāng)所調(diào)用的過程執(zhí)行了signal操作后,便立即退出了管程。漢森方法使用四條原語:wait,signal,check,re1ease實(shí)現(xiàn)對管程的控制。26管程的實(shí)現(xiàn):漢森方法(2) 每個(gè)管程使用的一個(gè)數(shù)據(jù)類型:TYPE interf = RECORD intsem : semaphore; /* 開放管程的信號量 */ count1 : integer; /* 等待調(diào)用的進(jìn)程個(gè)數(shù) */ count2

14、 : integer; /* 調(diào)用了管程中的過程且不END; 處于等待狀態(tài)的進(jìn)程個(gè)數(shù) */27管程的實(shí)現(xiàn):漢森方法(3)調(diào)用查看原語check: 如果管程是開放的,則執(zhí)行這條原語后關(guān)閉管程,相應(yīng)進(jìn)程繼續(xù)執(zhí)行;如果管程是關(guān)閉的,則執(zhí)行這條原語后相應(yīng)進(jìn)程被置成等待調(diào)用狀態(tài)28管程的實(shí)現(xiàn):漢森方法(4)procedure check(var IM interf); begin if IM.count2 = 0 then IM.count2 := IM.count2 + 1; else begin IM.count1 := IM.count1 + 1; W(IM.intsem); end; end;2

15、9管程的實(shí)現(xiàn):漢森方法(5)開放原語release: 如果除了發(fā)出這條原語的進(jìn)程外,不再有調(diào)用了管程中過程但又不處于等待狀態(tài)的進(jìn)程,那么就釋放一個(gè)等待者或開放管程30管程的實(shí)現(xiàn):漢森方法(6)procedure release(var IM interf); begin IM.count2 := IM.count2 - 1; if IM.count2 = 0 and IM.count1 0 then begin IM.count1 := IM.count1 - 1; IM.count2 := IM.count2 + 1; R(IM.intsem); end; end;31管程的實(shí)現(xiàn):漢森方法(

16、7)等待原語wait: 執(zhí)行這條原語后相應(yīng)進(jìn)程被置成等待狀態(tài),同時(shí)開放管程,允許其它進(jìn)程調(diào)用管程中的過程32管程的實(shí)現(xiàn):漢森方法(8)procedure wait(var s:semaphore; var IM interf); begin s := s + 1; IM.count2 := IM.count2 1; if IM.count1 0 then begin IM.count1 := IM.count1 1; IM.count2 := IM.count2 + 1; R(IM.intsem); end; W(s); end;33管程的實(shí)現(xiàn):漢森方法(9)釋放原語signal: 執(zhí)行這條原

17、語后釋放指定等待進(jìn)程隊(duì)列中的一個(gè)進(jìn)程。如指定等待進(jìn)程隊(duì)列為空,本操作相當(dāng)于空操作34管程的實(shí)現(xiàn):漢森方法(10)procedure signal(var s:semaphore; var IM interf); begin if s 0 then begin s := s 1; IM.count2 := IM.count2 + 1; R(s); end; end;35管程的實(shí)現(xiàn):漢森方法(11) 用管程實(shí)現(xiàn)進(jìn)程同步時(shí),進(jìn)程應(yīng)按下列次序工作: 請求資源。 使用資源。 釋放資源。36漢森方法實(shí)現(xiàn)讀者寫者問題(1) 有兩組并發(fā)進(jìn)程:讀者與寫者,共享一個(gè)文件,要求:1)允許多個(gè)讀者同時(shí)執(zhí)行讀操作;2)

18、任一寫者在完成寫操作之前不允許其他讀者和寫者工作;3)寫者欲工作,要等待已存在的讀者完成讀操作,新的讀者與寫者均被拒絕37漢森方法實(shí)現(xiàn)讀者寫者問題(2)type read-writer = MONITOR var rc, wc : integer; R, W : semaphore; define start-read, end-read, start-writer, end-writer; use wait, signal, check, release;38漢森方法實(shí)現(xiàn)讀者寫者問題(3)procedure start-read; begin check(IM); if wc0 then w

19、ait(R,IM); rc := rc + 1; signal(R, IM); release(IM); end;procedure end-read;begin check(IM); rc := rc - 1; if rc=0 then signal(W,IM); release(IM);end;39漢森方法實(shí)現(xiàn)讀者寫者問題(4)procedure start-write;begin check(IM); wc := wc + 1; if rc0 or wc1 then wait(W,IM); release(IM);end;procedure end-write;begin check(I

20、M); wc := wc - 1; if wc0 then signal(W,IM); else signal(R, IM); release(IM);end; 40漢森方法實(shí)現(xiàn)讀者寫者問題(5)初始化語句begin rc := 0; wc := 0; R := 0; W := 0; end;41漢森方法實(shí)現(xiàn)讀者寫者問題(6)cobegin process readerbegin call read-writer.start-read; read; call read-writer.end-read;end; process writerbegin call read-writer.start

21、-write; write; call rear-writer.end-write;end;coend;42漢森方法實(shí)現(xiàn)蘋果橘子問題(1) 桌上有一只盤子,每次只能放入一只水果,爸爸專向盤中放蘋果,媽媽專向盤中放橘子,一個(gè)兒子專吃盤中橘子,一個(gè)女兒專吃盤中蘋果43漢森方法實(shí)現(xiàn)蘋果橘子問題(2)TYPE FMSD = MONITOR var plate : (apple, orange); full : boolean; SP, SS, SD : semaphore; define put, get; use wait, signal, check, release; 44漢森方法實(shí)現(xiàn)蘋果橘子問

22、題(3)procedure put(var fruit:(apple, orange);begin check(IM); if full then wait(SP,IM); full := true; plate := fruit; if fruit=orange then signal(SS,IM); else signal(SD,IM); release(IM);end;45漢森方法實(shí)現(xiàn)蘋果橘子問題(4)procedure get(varfruit:(apple,orange),x:plate);begin check(IM); if not full or platefruit then

23、 begin if fruit = orange then wait(SS,IM); else wait(SD,IM); end; x := plate; full := false; signal(SP, IM); release(IM);end;46漢森方法實(shí)現(xiàn)蘋果橘子問題(5)初始化語句begin full := false; SP := 0; SS := 0; SD := 0; end;47漢森方法實(shí)現(xiàn)蘋果橘子問題(6)cobegin process fatherbegin 準(zhǔn)備好蘋果; call FMSD.put(apple);end; process motherbegin 準(zhǔn)備好

24、桔子; call FMSD.put(orange);end;48漢森方法實(shí)現(xiàn)蘋果橘子問題(7) process sonbegin call FMSD.get(orange,x); 吃取到的桔子; end; process daughterbegin call FMSD.get(apple,x); 吃取到的蘋果;end;coend;49nWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$

25、qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWkThPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNb

26、K8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v

27、%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgO

28、dLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&

29、s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWkThPe

30、MaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0zs#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$

31、qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNb

32、K8G5D2A-x*u$qZnVkShPdMaF3B0y(v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%r

33、ZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK81A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5E2A+x*u$rZnWkThPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5

34、D2A-x*u$qZnWkShPdMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWl

35、ThQeMbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4Cv%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+

36、x*u$qZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論