操作系統(tǒng)多線程同步與互斥課程設(shè)計報告_第1頁
操作系統(tǒng)多線程同步與互斥課程設(shè)計報告_第2頁
操作系統(tǒng)多線程同步與互斥課程設(shè)計報告_第3頁
操作系統(tǒng)多線程同步與互斥課程設(shè)計報告_第4頁
操作系統(tǒng)多線程同步與互斥課程設(shè)計報告_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、燕山大學(xué)課程設(shè)計說明書課程設(shè)計名稱:操作系統(tǒng)題目: 多道程序緩沖區(qū)協(xié)調(diào)操作 TOC o 1-5 h z 班級 : 14計算機科學(xué)與技術(shù)1 班開發(fā)小組名稱:礪劍編碼小組課題負(fù)責(zé)人:劉課題組成員:劉14 計算機 1 班 A14 計算機1 班B14 計算機 1 班 B14 計算機1 班C課題開發(fā)日期:2016.12.19-2016.12.301.概述目的通過運用操作系統(tǒng)基本原理,解決進(jìn)程同步控制;實現(xiàn)多道程序緩沖區(qū)協(xié)調(diào)操作設(shè)計, 了解多線程的創(chuàng)建,運行原理;通過信號量機制的運用了解各線程間的協(xié)調(diào)工作機制;通過界面編程,熟練掌握可視化編程工具的能力;獨立完成項目的需求分析和總體設(shè)計、詳細(xì)設(shè)計,提升軟件

2、工程能力。主要完成的任務(wù)如下圖1所示,有多個PUT操作要不斷循環(huán)地向 Buffer1送字符數(shù)據(jù),有Move1操作不 斷地將Buffer1的數(shù)據(jù)取到 Buffer2 , Move2操作不斷地將 Buffer1的數(shù)據(jù)取到 Buffer3 , 有多個GETB作要不斷地從 Buffer2和Buffer3 中取數(shù)據(jù)。PUT MOVE GET每次操作一 個數(shù)據(jù),為了在操作的過程中要保證數(shù)據(jù)不丟失 ,每個Buffer每次只能接受一個 PU似一個 Move或一個Get。運用進(jìn)程同步和互斥機制設(shè)計一個多道程序完成上述操作。圖1 Buffer操作基本功能要求:(1)可以隨機產(chǎn)生字符數(shù)據(jù),由 put操作將數(shù)據(jù)放入

3、Buff , buffer中容量單位是字符;(2)提供良好圖形界面,顯示 Buffer的操作過程,可以暫停和繼續(xù)系統(tǒng)的執(zhí)行;(3)可以設(shè)定各Buffer的容量、PUT GET Move操作的個數(shù);(4)可以設(shè)定PUT GET Move操作的速度;(5)實時顯示每個Buffer中已放入的數(shù)據(jù)和數(shù)據(jù)個數(shù),當(dāng)前 Buffer中數(shù)據(jù)的個數(shù)和數(shù)據(jù)的內(nèi)容,空閑Buffer的空間的個數(shù);(6)實時顯示線程、進(jìn)程所處于等待(阻塞)狀態(tài)的個數(shù);(7)程序運行結(jié)束,顯示匯總數(shù)據(jù),如:總的運行時間;Buffer中數(shù)據(jù)的個數(shù);已放入BUFFER 的數(shù)據(jù)個數(shù);已取出的數(shù)據(jù)個數(shù);平均每個buffer中的數(shù)據(jù)個數(shù)。(8)能

4、夠?qū)⒚看蔚膶嶒炤斎牒蛯嶒灲Y(jié)果存儲起來,下次運行時或以后可查詢。使用的開發(fā)工具操作系統(tǒng): Window10開發(fā)語日:Java開發(fā)環(huán)境:NetBeans IDE 8.1解決的主要問題(1)界面的設(shè)計;(2)界面顯示各個 bufer的模擬put字符,move字符和get字符操作;(3)線程間的同步和互斥問題;(4)各個線程狀態(tài)的控制;(5)設(shè)置的速度、容量等參數(shù)的傳遞問題。.使用的基本概念和原理線程線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執(zhí)行。線程基本上 是輕量級的進(jìn)程,它負(fù)責(zé)在單個程序里執(zhí)行多任務(wù)。多線程通常由操作系統(tǒng)負(fù)責(zé)多個線程的調(diào)度和執(zhí)行。多線程是這樣一種機制, 它允許在程

5、序中并發(fā)執(zhí)行多個指令流, 每個指令流都稱為一個線程, 彼此間互相獨立。線程又稱為輕量級進(jìn) 程,它和進(jìn)程一樣擁有獨立的執(zhí)行控制,由操作系統(tǒng)負(fù)責(zé)調(diào)度。信號量信號量是一個在一定范圍內(nèi)變化的整形數(shù)據(jù),用來表示一種臨界資源, 線程通過信號量的值來確定自己的狀態(tài)是執(zhí)行還是掛起,各線程間也是通過信號量機制來協(xié)調(diào)運行順序一起完成任務(wù)。同步與互斥(1)進(jìn)程同步進(jìn)程同步是進(jìn)程之間直接的制約關(guān)系, 是為完成某種任務(wù)而建立的兩個或多個線程,這個線程需要在某些位置上協(xié)調(diào)他們的工作次序而等待、傳遞信息所產(chǎn)生的制約關(guān)系進(jìn)程間的直接制約關(guān)系來源于他們之間的合作。(2)進(jìn)程互斥進(jìn)程互斥是進(jìn)程之間的間接制約關(guān)系。當(dāng)一個進(jìn)程進(jìn)入臨

6、界區(qū)使用臨界資源時,另一個進(jìn)程必須等待。只有當(dāng)使用臨界資源的進(jìn)程退出臨界區(qū)后,這個進(jìn)程才會解除阻塞狀態(tài)。.總體設(shè)計基本的技術(shù)路線本課程設(shè)計使用面向?qū)ο蟮木幊陶Z言Java ,應(yīng)用Java的多線程編程技術(shù),模擬各個緩沖區(qū)之間的動作。軟件的總體結(jié)構(gòu)、模塊關(guān)系、總體流程3.2.1總體結(jié)構(gòu)3.2.2模塊關(guān)系本課程設(shè)計共創(chuàng)建 8個類,可分為三個模塊分別是界面模塊,共享資源模塊和Runnable接口類模塊。8個類分別為主界面類Main_win ,結(jié)果統(tǒng)計輸出界面 Result_win ,共享資源類 BUFFER以及實現(xiàn) Runnable 接口的 5 個類:BUFFER_PUTBUFFERT_MOVEUFFE

7、RTH_MOVE BUFFERT_GETBUFFERTH_GET各模塊關(guān)系可用下圖表示圖3模塊關(guān)系3.2.3總體流程創(chuàng)立的線程(1)據(jù)BUFFER_PUT類建立的線程體 bufferl ,通過bufferl建立兩個線程t11、t12,模擬 多個put操作。(2)據(jù) BUFFERT_MOVE 類建立的線程體buffer2 ,通過 buffer2建立兩個線程 t2,模擬move2操作。(3)據(jù)BUFFERTH_MOVE 類建立的線程體 buffer3 ,通過buffe3建立兩個線程t3,模擬 move3操作。(4)據(jù) BUFFERT_GET 類和 BUFFERTH_GET 類建立的線程體 buff

8、er4、buffer5 通過 buffer4、 buffer5建立4線程t41、t42, t51、t52模擬多個get操作。.詳細(xì)設(shè)計主要類Main_win 類(1)成員變量s:布爾型,用于控制系統(tǒng)的暫停,繼續(xù)等;starttime:loog型,開始運行的系統(tǒng)時間;endtime:loog型,結(jié)束時的系統(tǒng)時間gotime:loog型,運行總時間(2)成員方法main(String args):主函數(shù)beginActionPerformed(): 處理開始按鈕的方法 endActionPerformed(): 處理結(jié)束按鈕的方法 setokActionPerformed(): 處理參數(shù)設(shè)置開始按

9、鈕的方法 timeActionPerformed(): 處理暫停按鈕的方法 cotinueActionPerformed(): 處理繼續(xù)按鈕的方法 datasaveActionPerformed(): 處理保存數(shù)據(jù)按鈕的方法 ( 3)主要構(gòu)件JTextArea:see1、see2、see3,用于顯示模擬 3個 buffer 的 put, move, get動作;JButton:begin 、 end 、 setok 、 time 、 cotinue、 datasave;JTextField: empty1 、 empty2、 empty3、 full1 、 full2 、 full3 ,實時顯

10、示各個buffer 已用或剩余空間;JTextField:room1、room2、room3, ms2、ms3, gs2、gs3,用于設(shè)置各個參數(shù)。4.1.2BUFFER 類( 1)成員變量或?qū)ο螅簆rivate final char buffer1 = new charMain_win.r1棧1的空間由設(shè)定的參數(shù)決定private final char buffer2 = new charMain_win.r2棧2的空間由設(shè)定的參數(shù)決定棧 3 的空間由設(shè)定的參數(shù)決定用作角標(biāo)或指針private final char buffer3 = new charMain_win.r3 public i

11、nt index1 = 0,index2=0,index3=0;private int EmptyFirst,EmptySecond,EmptyThird 剩余空間 private static int fullFirst,fullSecond,fullThird 當(dāng)前字符數(shù)private static int putnum1=0,putnum2=0,putnum3=0 共放入數(shù)量private static int getnum1=0,getnum2=0,getnum3=0 共取出數(shù)量static FileWriter data static BufferedWriter datawrite

12、rstatic String da=new String1000數(shù)據(jù)保存所用變量、對象static String x=new StringMain_win.r1static String y=new StringMain_win.r2static String z=new StringMain_win.r3由于buffer i口為char,不能添加到 JTextField、JTextArea,而String類型能,所以設(shè)置 String口類型數(shù)組,經(jīng)轉(zhuǎn)化使char轉(zhuǎn)化為String型,以將字符添加到各個JTextField、JTextArea。( 2)成員方法具體實現(xiàn)各同步互斥動作的synch

13、ronized 成員方法:put()、 move1()、 move2()、 get2()、get3();模擬過程顯示到主界面的成員方法:showPush1()、 showPush2()、 showPush3()、 showPop1()、showPop2()、 showPop3();顯示數(shù)據(jù)到統(tǒng)計結(jié)果界面的resulewin() 方法 ;保存數(shù)據(jù)的datasave(訪法。Runnable 接口類Runnable 接口類有五個,分另為:BUFFER_PUT、BUFFERT_MOVE、BUFFERTH_MOVE、 BUFFERT_GET 和 BUFFERTH_GET 類。每個類中成員對象有priva

14、te BUFFER buff 用于調(diào)用 BUFFER 類中的synchronized成員方法,以及使用 BUFFER類中共享的變量,實現(xiàn)進(jìn)程同步與互斥。Resulr_win 類主要構(gòu)件:JTextArea resultarea顯示最終統(tǒng)計結(jié)果。進(jìn)程操作所用原語sleep():導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的notify方法或notifyAll方法喚醒。wait():在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)。該線程不丟失任何監(jiān)視器的所屬權(quán)notify():選擇一個wait狀態(tài)線程進(jìn)行通知,并使它獲得該對象上的鎖。BUFFER模塊內(nèi)部流程Put線程run()BUFFER.p

15、ut()run()showPush1()產(chǎn)生字符BUFFER.get(),pwZshowPush|2: 3()Buffer2 或 3 減少howPop2、3() 一個字符 showPop1()字符顯示在主界面+ Buffer1中一個字 符消失,Buffer2 或3增加一個字符字符顯示在主界面字符顯示在主界面圖5 BUFFER內(nèi)部流程. 核心代碼BUFFER 類由于move(), get()各有兩組,此處只給出一組的代碼;showPush(),showPop()函數(shù)共三組,三組類似,因此這里也只給出一組。package javaapplication7;import java.awt.*;imp

16、ort java.awt.event.*;import static javaapplication7.Result_win.resultarea;import javax.swing.*;import java.io.*;/* autho* r a101269*/class BUFFER棧的空間由設(shè)定的參數(shù)決定 棧的空間由設(shè)定的參數(shù)決定 棧的空間由設(shè)定的參數(shù)決定private final char buffer1 = new charMain_win.r1;/ private final char buffer2 = new charMain_win.r2;/ private final c

17、har buffer3 = new charMain_win.r3;/ static String x=new StringMain_win.r1;static String y=new StringMain_win.r2;static String z=new StringMain_win.r3;public int index1 = 0,index2=0,index3=0;private int EmptyFirst,EmptySecond,EmptyThird;/ 剩余空間private static int fullFirst,fullSecond,fullThird;/ 當(dāng)前字符數(shù)p

18、rivate static int putnum1=0,putnum2=0,putnum3=0; / 共放入數(shù)量 private static int getnum1=0,getnum2=0,getnum3=0; / 共取出數(shù)量 static FileWriter data;/ 數(shù)據(jù)保存static BufferedWriter datawriter;public synchronized void put()char c=a;對c初始化boolean suspended=Main_win.s;/suspended 為 TRUE 則等待,為FALSE 執(zhí)行if (suspended = tru

19、e)try this.wait();catch (InterruptedException e) if(index1 = buffer1.length)/ 堆棧已滿,不能壓棧trythis.wait();/ 等待,直到有數(shù)據(jù)出棧 catch(InterruptedException e)if(index1=0&index1buffer1.length-1)this.notify();/ 通知其他線程把數(shù)據(jù)出棧,喚醒一個wait 的線程c = (char)(Math.random()*26 + A);/隨機產(chǎn)生26 個字母buffer1index1 = c;/ 數(shù)據(jù)入棧xindex1=Strin

20、g.valueOf(c);fullFirst=index1+1;EmptyFirst=buffer1.length-fullFirst;showPush1(c,index1);/ 調(diào)用界面顯示入棧程序Main_win.full1.setText(String.valueOf(fullFirst);/int 轉(zhuǎn) StringMain_win.empty1.setText(String.valueOf(EmptyFirst);history.his.append(buffer1 put 進(jìn)字符 :+xindex1+n);index1+;/ 指針向上移動 putnum1+;public synchr

21、onized void move2()boolean suspended=Main_win.s;if (suspended = true)try this.wait();catch (InterruptedException e) if(index1=buffer2.length-1)/ 堆棧無數(shù)據(jù)或滿,不能出棧try this.wait();/ 等待其他線程把數(shù)據(jù)入棧catch(InterruptedException e)if(index10&index1=0&index20&index2=buffer2.length)this.notify();/ 通知其他線程入棧index2-;cha

22、r c = buffer2index2;yindex2=String.valueOf(c);fullSecond=index2;EmptySecond=buffer2.length-fullSecond;showPop2(c,index2);/ 調(diào)用界面顯示出棧程序Main_win.full2.setText(String.valueOf(fullSecond);/int 轉(zhuǎn) StringMain_win.empty2.setText(String.valueOf(EmptySecond);history.his.append(buffer2 中字符 +yindex2+ 被 getn); ge

23、tnum2+;public static void showPush1(char c,int index)/字符顯示在主界面String s=String.valueOf(c);Main_win.see1.append(s+n);public static void showPop1(char c,int index) int i;xindex=;Main_win.see1.setText();for(i=0;i=index;i+) if(xi!=)Main_win.see1.append(xi+n);/see1 置空后重新添加原來除move 掉的字符 public static void r

24、esulewin()/最后運行時間,放入取出數(shù)目等顯示在Result_winResult_win.resultarea.setText();Result_win.resultarea.append( 運行總時間:+ Main_win.gotime+ms+n);Result_win.resultarea.append(buffer1Result_win.resultarea.append(buffer1Result_win.resultarea.append(buffer1Result_win.resultarea.append(buffer2Result_win.resultarea.appe

25、nd(buffer2Result_win.resultarea.append(buffer2Result_win.resultarea.append(buffer3Result_win.resultarea.append(buffer3Result_win.resultarea.append(buffer3 放入總數(shù):+String.valueOf(putnum1)+n);取出總數(shù):+String.valueOf(getnum1)+n);目前數(shù)目:+String.valueOf(fullFirst)+n);放入總數(shù):+String.valueOf(putnum2)+n);取出總數(shù):+Strin

26、g.valueOf(putnum2)+n);目前數(shù)目:+String.valueOf(fullSecond)+n);放入總數(shù):+String.valueOf(putnum3)+n);取出總數(shù):+String.valueOf(putnum3)+n);目前數(shù)目:+String.valueOf(fullThird)+n);public static void datasave()/ 保存數(shù)據(jù)tryFile f=new File(C:Usersa101269Desktop,datasave.txt);data=new FileWriter(f);datawriter = new BufferedWri

27、ter(data);String str=history.his.getText();datawriter.append(str);datawriter.flush();datawriter.close();data.close();catch (IOException e) Runnable 接口類Runnable 接口類有五個,分別為: BUFFER_PUT 、 BUFFERT_MOVE 、 BUFFERTH_MOVE 、BUFFERT_GET 和 BUFFERTH_GET 類。各個類類似,因此此處只給出BUFFER_PUT 類的BUFFER 線程代碼。class BUFFER_PUT i

28、mplements Runnable/ private BUFFER buff;/ 生成的字母都保存到同步堆棧中int i;public BUFFER_PUT(BUFFER a)buff = a;public void run()for(i=0;i200;i+)buff.put();/ 把字母入棧tryThread.sleep(int)(Main_win.p1);/ 每產(chǎn)生一個字母后線程就隨即睡眠一段時間catch(InterruptedException e) /suspended 為 TRUE 等待,即暫停Mainwin 類package javaapplication7;import j

29、ava.awt.*;import java.awt.event.*;import javax.swing.*;/* author a101269*/public class Main_win extends javax.swing.JFrame /* Creates new form Bufferwin*/static int p1,m2,m3,g2,g3,r1,r2,r3;static boolean s = false;static long starttime;static long endtime;static long gotime;public Main_win() setTitl

30、e( 生產(chǎn)者消費者問題);initComponents();private void beginActionPerformed(java.awt.event.ActionEvent evt) new history().setVisible(true);starttime=System.currentTimeMillis();see1.setText();see2.setText();see3.setText();full1.setText();full2.setText();full3.setText();empty1.setText();empty2.setText();empty3.se

31、tText();waitnum.setText();BUFFER buff = new BUFFER();Runnable buffer1 = new BUFFER_PUT(buff);Runnable buffer2 = new BUFFERT_MOVE(buff);Runnable buffer3 = new BUFFERTH_MOVE(buff);Runnable buffer4 = new BUFFERT_GET(buff);Runnable buffer5 = new BUFFERTH_GET(buff);Thread t11 = new Thread(buffer1);Thread

32、 t12 = new Thread(buffer1);Thread t2 = new Thread(buffer2);Thread t3 = new Thread(buffer3);Thread t41 = new Thread(buffer4);Thread t42 = new Thread(buffer4);Thread t51 = new Thread(buffer5);Thread t52 = new Thread(buffer5);t11.start();t12.start();t2.start();t3.start();t41.start();t51.start();t42.sta

33、rt();t52.start();/ TODO add your handling code here:private void endActionPerformed(java.awt.event.ActionEvent evt) s = true;endtime=System.currentTimeMillis();gotime=endtime-starttime;BUFFER buff = new BUFFER();new Result_win().setVisible(true);/ TODO add your handling code here: buff.resulewin();/

34、 結(jié)束,顯示運行結(jié)果private void datasaveActionPerformed(java.awt.event.ActionEvent evt) BUFFER buff = new BUFFER();buff.datasave();JOptionPane.showMessageDialog(this, 保 存 成 功 ,JOptionPane.W ARNING_MESSAGE);/ TODO add your handling code here:private void setokActionPerformed(java.awt.event.ActionEvent evt) if

35、(ps1.getText().equals()|ms2.getText().equals()|ms3.getText().equals()|gs2.getText().equals()|gs3.getText().equals()|room1.getText().equals()|room2.getText().equals()|room3.getText().equals()JOptionPane.showMessageDialog(this, 有 未 填 項 , 提 醒 ,JOptionPane.WARNING_MESSAGE);elser1 = Integer.parseInt(room

36、1.getText();r2 = Integer.parseInt(room2.getText();r3 = Integer.parseInt(room3.getText();p1 = Integer.parseInt(ps1.getText();m2 = Integer.parseInt(ms2.getText();m3 = Integer.parseInt(ms3.getText();g2 = Integer.parseInt(gs2.getText();g3 = Integer.parseInt(gs3.getText();JOptionPane.showMessageDialog(th

37、is, 設(shè) 置 成 功 ,JOptionPane.W ARNING_MESSAGE);/ 參數(shù)設(shè)置/ / TODO add your handling code here:private void timeActionPerformed(java.awt.event.ActionEvent evt) s = true;/ TODO add your handling code here:/ 暫停private void cotinueActionPerformed(java.awt.event.ActionEvent evt) s = false; / TODO add your handli

38、ng code here:/繼續(xù)public static void main(String args) java.awt.EventQueue.invokeLater(new Runnable() public void run() new Main_win().setVisible(true););Result_win 類與 history 類Result_win 類與 history 類均為界面代碼,在此不再附上。. 測試時出現(xiàn)過的問題及其解決方法( 1 )出現(xiàn)數(shù)組越界錯誤,解決方法,通過仔細(xì)檢查,修改了數(shù)組角標(biāo)的參數(shù)。( 2)參數(shù)設(shè)置時有文本框為空報錯,解決方法:強制要求全部參數(shù)均要設(shè)

39、置。保存實驗數(shù)據(jù)后,TXT 文件中只保存了一個字符。解決方法:重新建立一個JTextArea構(gòu)件顯示所有記錄,從這個JTextArea 中提取字符。. 軟件使用說明基本功能3000 左右,并且最好不要重復(fù)。然后程序運行后,首先設(shè)置參數(shù)。各個動作的速度設(shè)置為點擊確定。設(shè)置完成后點擊開始按鈕即可運行。需要運行的環(huán)境WindowslO 系統(tǒng); Java運行環(huán)境 JRE。安裝7.31 安裝 JRE (java runtime environment )下載JREJRE下載地址為:/ECom/EComActionServlet;jsessionid=57F14A5CCFB2FF66742DA4C0E7F

40、D5D01。壓縮包大約14M左右,下載完畢后直接安裝即可。 安裝程序打開Project-安裝程序 -install.exe雙擊安裝。運行找至|軟件所在文件夾javaapplication7src/javaapplication7/javaapplication7.jar ,雙擊運行javaapplication7.jar文件可直接運行軟件。操作啟動運行點擊【開始】按鈕可直接模擬多道程序操作,并顯示信息。暫停點擊【暫停】即可暫停所有線程。繼續(xù)點擊【繼續(xù)】即可暫停所有線程。統(tǒng)計點擊【結(jié)束并統(tǒng)計】按鈕在彈出的界面中可以查看統(tǒng)計信息參數(shù)設(shè)置在主界面參數(shù)設(shè)置處可以設(shè)置各個參數(shù)的值。保存數(shù)據(jù)點擊【實驗數(shù)據(jù)保存】按鈕在彈出的界面中可以查看統(tǒng)計信息查看操作記錄點擊【開始】按鈕自動彈出實時操作記錄,即可查看。.運行截圖8.1參數(shù)設(shè)置參數(shù)設(shè)置容量p

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論