2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  計算機與信息學院</b></p><p>  操作系統(tǒng)課程設計報告</p><p><b>  開題報告</b></p><p>  該項課程設計的意義;</p><p>  更加深入的了解讀者寫者問題的算法;</p><p>  加深對線程,進

2、程的理解;</p><p>  加深對“線程同步”概念的理解,理解并應用“信號量機制”;</p><p>  熟悉計算機對處理機的管理,了解臨界資源的訪問方式;</p><p>  了解C++中線程的實現(xiàn)方式,研讀API。</p><p><b>  課程設計的任務</b></p><p>  多

3、進程/線程編程:讀者-寫者問題。 </p><p>  設置兩類進程/線程,一類為讀者,一類為寫者;</p><p>  隨機啟動讀者或?qū)懻撸?lt;/p><p>  顯示讀者或?qū)懻邎?zhí)行狀態(tài);</p><p>  隨著進程/線程的執(zhí)行,更新顯示;</p><p>  相關原理及

4、算法描述;</p><p><b>  整體概況:</b></p><p>  該程序從大體上來分只有兩個模塊,即“讀者優(yōu)先”和“寫者優(yōu)先”模塊.</p><p><b>  讀者優(yōu)先:</b></p><p>  如果沒有寫者正在操作,則讀者不需要等待,用一個整型變量readcount記錄讀者數(shù)目

5、,用于確定是否釋放讀者線程,readcount的初值為0.當線程開始調(diào)入時.每個讀者準備讀. 等待互斥信號,保證對readcount 的訪問,修改互斥.即readcount++.而當讀者線程進行讀操作時,則讀者數(shù)目減少(readcount--).當readcout=0 時,說明所有的讀者都已經(jīng)讀完,離開臨界區(qū)喚醒寫者(LeaveCriticalSection(&RP_Write);), 釋放互斥信號(ReleaseMutex(h

6、_Mutex)).</p><p>  還需要一個互斥對象mutex來實現(xiàn)對全局變量Read_count修改時的互斥. 另外,為了實現(xiàn)寫-寫互斥,需要增加一個臨界區(qū)對象Write。當寫者發(fā)出寫請求時,必須申請臨界區(qū)對象的所有權。通過這種方法,可以實現(xiàn)讀-寫互斥,當Read_count=1時(即第一個讀者到來時),讀者線程也必須申請臨界區(qū)對象的所有權</p><p><b>  寫

7、者優(yōu)先:</b></p><p>  寫者優(yōu)先與讀者不同之處在于一旦一個寫者到來,它應該盡快對文件進行寫操作,如果有一個寫者在等待,則新到來的讀者不允許進行讀操作。為此應當填加一個整形變量write_count,用于記錄正在等待的寫者的數(shù)目,write_count的初值為0.當線程開始調(diào)入時.只允許一個寫者準備讀. 等待互斥信號,保證對write_count 的訪問,修改互斥.即write_count

8、++.而當寫者線程進行讀操作時,則相應寫者數(shù)目減少(write_count--).當write_count=0 時,說明所有的讀者都已經(jīng)讀完,離開臨界區(qū)喚醒讀者,釋放互斥信號.</p><p>  為了實現(xiàn)寫者優(yōu)先,應當填加一個臨界區(qū)對象read,當有寫者在寫文件或等待時,讀者必須阻塞在read上。</p><p><b>  開發(fā)環(huán)境;</b></p>

9、<p><b>  VC++6.0</b></p><p><b>  預期設計目標;</b></p><p>  讀者-寫者問題的讀寫操作限制(包括讀者優(yōu)先和寫者優(yōu)先)</p><p>  1.寫-寫互斥:不能有兩個寫者同時進行寫操作</p><p>  2.讀-寫互斥:不能同時有一個

10、線程在讀,而另一個線程在寫。</p><p>  3.讀-讀允許:可以有一個或多個讀者在讀。</p><p>  若讀者的優(yōu)先權比寫者高, 如果讀者申請進行讀操作時已有另一個讀者正在進行讀操作,則該讀者可直接開始讀操作.不必經(jīng)過別的操件</p><p>  若讀者的優(yōu)先權比寫者高,如果第一個寫者已經(jīng)占有了文件的時候.則別的讀者必需等待該操作完成后.才能開始讀操作.&

11、lt;/p><p>  若寫者的優(yōu)先權比讀者高, 在一個寫者提出要訪問文件時,就必須使其盡可能的得到文件,而且不用調(diào)配。</p><p>  完成課程設計的任務,實現(xiàn)讀者寫者問題的全部要求,同時可以實現(xiàn)“讀者優(yōu)先”和“寫者優(yōu)先”兩種情況,有時間的話,爭取實現(xiàn)可視化圖形界面。</p><p><b>  課程設計報告</b></p>&

12、lt;p>  課程設計任務、要求、目的;</p><p><b>  任務和要求:</b></p><p>  多進程/線程編程:讀者-寫者問題。 </p><p>  設置兩類進程/線程,一類為讀者,一類為寫者;</p><p>  隨機啟動讀者或?qū)懻撸?lt;/p&

13、gt;<p>  顯示讀者或?qū)懻邎?zhí)行狀態(tài);</p><p>  隨著進程/線程的執(zhí)行,更新顯示;</p><p><b>  目的:</b></p><p>  1 更加深入的了解讀者寫者問題的算法;</p><p>  2 加深對線程,進程的理解;</p><p>  3 加深對“

14、線程同步”概念的理解,理解并應用“信號量機制”;</p><p>  4 熟悉計算機對處理機的管理,了解臨界資源的訪問方式;</p><p>  5 了解C++中線程的實現(xiàn)方式,研讀API。</p><p><b>  原理及算法描述;</b></p><p><b>  寫者優(yōu)先原理圖:</b>&

15、lt;/p><p><b>  讀者優(yōu)先原理圖:</b></p><p><b>  算法描述:</b></p><p>  讀者優(yōu)先的附加限制:如果讀者申請進行讀操作時已有另一個讀者正在進行讀操作,則該讀者可直接開始讀操作。</p><p>  寫者優(yōu)先的附加限制:如果一個讀者申請進行讀操作時已有另一

16、個寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。</p><p><b>  開發(fā)環(huán)境;</b></p><p><b>  VC++6.0</b></p><p>  重要算法和設計思路描述;</p><p><b>  整體概況:</b>&l

17、t;/p><p>  該程序從大體上來分只有兩個模塊,即“讀者優(yōu)先”和“寫者優(yōu)先”模塊.</p><p><b>  讀者優(yōu)先:</b></p><p>  如果沒有寫者正在操作,則讀者不需要等待,用一個整型變量readcount記錄讀者數(shù)目,用于確定是否釋放讀者線程,readcount的初值為0.當線程開始調(diào)入時.每個讀者準備讀. 等待互斥信號,

18、保證對readcount 的訪問,修改互斥.即readcount++.而當讀者線程進行讀操作時,則讀者數(shù)目減少(readcount--).當readcout=0 時,說明所有的讀者都已經(jīng)讀完,離開臨界區(qū)喚醒寫者(LeaveCriticalSection(&RP_Write);), 釋放互斥信號(ReleaseMutex(h_Mutex)).</p><p>  還需要一個互斥對象mutex來實現(xiàn)對全局變量

19、Read_count修改時的互斥. 另外,為了實現(xiàn)寫-寫互斥,需要增加一個臨界區(qū)對象Write。當寫者發(fā)出寫請求時,必須申請臨界區(qū)對象的所有權。通過這種方法,可以實現(xiàn)讀-寫互斥,當Read_count=1時(即第一個讀者到來時),讀者線程也必須申請臨界區(qū)對象的所有權</p><p><b>  寫者優(yōu)先:</b></p><p>  寫者優(yōu)先與讀者不同之處在于一旦一個

20、寫者到來,它應該盡快對文件進行寫操作,如果有一個寫者在等待,則新到來的讀者不允許進行讀操作。為此應當填加一個整形變量write_count,用于記錄正在等待的寫者的數(shù)目,write_count的初值為0.當線程開始調(diào)入時.只允許一個寫者準備讀. 等待互斥信號,保證對write_count 的訪問,修改互斥.即write_count++.而當寫者線程進行讀操作時,則相應寫者數(shù)目減少(write_count--).當write_count=

21、0 時,說明所有的讀者都已經(jīng)讀完,離開臨界區(qū)喚醒讀者,釋放互斥信號.</p><p>  為了實現(xiàn)寫者優(yōu)先,應當填加一個臨界區(qū)對象read,當有寫者在寫文件或等待時,讀者必須阻塞在read上。</p><p>  程序?qū)崿F(xiàn)---數(shù)據(jù)結構;</p><p>  相關WindowsAPI說明:</p><p>  CreateThread: 創(chuàng)建

22、一個在調(diào)用進程的地址空間中執(zhí)行的線程。</p><p>  ExitThread </p><p>  Sleep: 對指定的時間間隔掛起當前的執(zhí)行線程</p><p>  CreateMutex: 創(chuàng)建有名或者無名的互斥對象</p><p>  ReleaseMutex:</p><p>  WaitForSingl

23、eObject: 當發(fā)生(1)指定對象處于信號態(tài)(2)超時 則該函數(shù)返回</p><p>  WaitForMultipleObject: 任意一個或全部指定對象處于信號態(tài)或超時間隔已過時,返回</p><p>  CreateSemapore: 創(chuàng)建一個有名或無名信號對象。</p><p>  ReleaseSemapore: </p><p&

24、gt;  InitializeCriticalSection: 初始化臨界區(qū)對象</p><p>  EnterCriticalSection: 等待指定臨界區(qū)對象的所有權。當調(diào)用線程被賦予所有權時,返回。</p><p>  LeaveCriticalSection:該函數(shù)釋放指定臨界區(qū)對象的所有權。</p><p>  程序?qū)崿F(xiàn)---程序清單;</p>

25、;<p>  #include <windows.h></p><p>  //#include <ctype.h></p><p>  //#include <stdio.h></p><p>  //#include <string.h></p><p>  //#includ

26、e <stdlib.h></p><p>  //#include <malloc.h></p><p>  #include<iostream></p><p>  using namespace std;</p><p>  #define MAX_PERSON 100 //最多100人<

27、/p><p>  #define READER 0 //讀者</p><p>  #define WRITER 1 //寫者</p><p>  #define END -1 //結束</p><p>  //#define R READER</p><p&

28、gt;  //#define W WRITER</p><p>  typedef struct </p><p><b>  {</b></p><p>  HANDLE m_hThread;//定義處理線程的句柄</p><p>  int Type;//進程類型(讀寫)</p&g

29、t;<p>  int StartTime;//開始時間</p><p>  int WorkTime;//運行時間</p><p>  int ID;//進程號</p><p><b>  }Person;</b></p><p>  Person Persons[MAX_PERSON]

30、;</p><p>  int NumOfPerson = 0;</p><p>  long CurrentTime= 0;//基本時間片數(shù)</p><p>  int PersonLists[] = {//進程隊列</p><p>  1, WRITER, 3, 5,</p><p>  2, WRIT

31、ER, 16, 5,</p><p>  3, READER, 2, 2,</p><p>  4, WRITER, 6, 5,</p><p>  5, READER, 4, 3,</p><p>  6, READER, 17,7,</p><p><b>  END,</b></p&g

32、t;<p><b>  };</b></p><p>  int NumOfReading = 0;</p><p>  int NumOfWriteRequest = 0;//申請寫進程的個數(shù)</p><p>  HANDLE ReadSemaphore;//讀者信號</p><p>  HA

33、NDLE WriteSemaphore;//寫者信號</p><p>  bool finished = false; //所有的讀完成</p><p>  //bool wfinished = false; //所有的寫完成</p><p>  void CreatePersonList(int *pPersonList);</p><p&g

34、t;  bool CreateReader(int StartTime,int WorkTime,int ID);</p><p>  bool CreateWriter(int StartTime,int WorkTime,int ID);</p><p>  DWORD WINAPI ReaderProc(LPVOID lpParam);</p><p>

35、  DWORD WINAPI WriterProc(LPVOID lpParam);</p><p>  int main()</p><p><b>  {</b></p><p>  ReadSemaphore = CreateSemaphore(NULL,1,100,NULL); </p><p>  //創(chuàng)建

36、信號量,當前可用的資源數(shù)為1,最大為100</p><p>  /*HANDLE CreateSemaphore(</p><p>  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //lpSemaphoreAttributes為安全屬性</p><p>  LONG lInitialCount,

37、 //lInitialCount為Semaphore的初始值</p><p>  LONG lMaximumCount, //lMaximumCount為最大值</p><p>  LPCTSTR lpName //lpName為Se

38、maphore對象的名字,NULL表示創(chuàng)建匿名Semaphore</p><p><b>  );*/</b></p><p>  WriteSemaphore = CreateSemaphore(NULL,1,100,NULL); //創(chuàng)建信號量,當前可用的資源數(shù)為1,最大為100</p><p>  CreatePersonList(Per

39、sonLists); // 創(chuàng)建所有讀者寫者</p><p>  cout<<"創(chuàng)建所有的讀者寫者"<<"\n...\n";</p><p>  CurrentTime = 0;</p><p>  while(true)</p><p><b>  {</b&g

40、t;</p><p>  CurrentTime++;</p><p>  Sleep(300); // 300 ms</p><p>  cout<<"當前時間 = "<<CurrentTime<<endl;</p><p>  if(finished) return 0;</p

41、><p><b>  }</b></p><p>  // return 0;</p><p><b>  }</b></p><p>  void CreatePersonList(int *pPersonLists)</p><p><b>  {</b>

42、;</p><p><b>  int i=0;</b></p><p>  int *pList = pPersonLists;</p><p><b>  bool Ret;</b></p><p>  while(pList[0] != END)</p><p>&

43、lt;b>  {</b></p><p>  switch(pList[1])</p><p><b>  {</b></p><p>  case READER:</p><p>  Ret = CreateReader(pList[2],pList[3],pList[0]);</p>

44、<p><b>  break;</b></p><p>  case WRITER:</p><p>  Ret = CreateWriter(pList[2],pList[3],pList[0]);</p><p><b>  break;</b></p><p><b> 

45、 }</b></p><p><b>  if(!Ret)</b></p><p>  printf("Create Person %d is wrong\n",pList[0]);</p><p>  pList += 4; // 尋找下一個讀者或者寫者 </p><p><b&g

46、t;  }</b></p><p><b>  }</b></p><p>  bool CreateReader(int StartTime,int WorkTime,int ID)</p><p><b>  {</b></p><p>  DWORD dwThreadID;<

47、/p><p>  if(NumOfPerson >= MAX_PERSON)</p><p>  return false;</p><p>  Person *pPerson = &Persons[NumOfPerson];</p><p>  pPerson->ID = ID;</p><p>  

48、pPerson->StartTime = StartTime;</p><p>  pPerson->WorkTime = WorkTime;</p><p>  pPerson->Type = READER;</p><p>  NumOfPerson++;</p><p><b>  // 新建進程</b

49、></p><p>  pPerson->m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID); </p><p>  /*HANDLE CreateThread(</p><p>  LPSECURITY_ATTRIBUTES lpThreadAttri

50、butes, // pointer to security attributes 安全屬性</p><p>  DWORD dwStackSize, // initial thread stack size 堆棧大小</p><p>  LPTHREAD_START_ROUTINE lpStartAddress, //

51、 pointer to thread function 函數(shù)指針</p><p>  LPVOID lpParameter, // argument for new thread</p><p>  DWORD dwCreationFlags, // creation flags</p&

52、gt;<p>  LPDWORD lpThreadId // pointer to receive thread ID</p><p><b>  );*/</b></p><p>  if(pPerson->m_hThread == NULL)</p><p>  retur

53、n false;</p><p>  return true;</p><p><b>  }</b></p><p>  bool CreateWriter(int StartTime,int WorkTime,int ID)</p><p><b>  { </b></p><

54、;p>  DWORD dwThreadID;</p><p>  if(NumOfPerson >= MAX_PERSON) </p><p>  return false;</p><p>  Person *pPerson = &Persons[NumOfPerson];</p><p>  pPerson->

55、;ID = ID;</p><p>  pPerson->StartTime = StartTime;</p><p>  pPerson->WorkTime = WorkTime;</p><p>  pPerson->Type = WRITER;</p><p>  NumOfPerson++;</p>

56、<p><b>  // 新建進程</b></p><p>  pPerson->m_hThread= CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID);</p><p>  /*HANDLE CreateThread(</p><p>  LP

57、SECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes 安全屬性</p><p>  DWORD dwStackSize, // initial thread stack size 堆棧大小</p><p>  LPTHREAD_STA

58、RT_ROUTINE lpStartAddress, // pointer to thread function 函數(shù)指針</p><p>  LPVOID lpParameter, // argument for new thread</p><p>  DWORD dwCreationFlags,

59、 // creation flags</p><p>  LPDWORD lpThreadId // pointer to receive thread ID</p><p><b>  );*/</b></p><p>  if(pPerson->m_hThread ==

60、NULL)</p><p>  return false;</p><p>  return true;</p><p><b>  }</b></p><p>  DWORD WINAPI ReaderProc(LPVOID lpParam)//讀過程</p><p><b>  {&

61、lt;/b></p><p>  Person *pPerson = (Person *)lpParam;</p><p><b>  // 等待啟動時間</b></p><p>  while(CurrentTime != pPerson->StartTime)</p><p><b>  {&l

62、t;/b></p><p>  //讀操作還沒有到達執(zhí)行時間,則等待</p><p><b>  }</b></p><p>  printf("Reader %d is Requesting ...\n",pPerson->ID);</p><p>  printf("\n\n

63、************************************************\n");</p><p><b>  //等待寫者請求</b></p><p>  //該語句在寫者優(yōu)先的時候是認為寫者優(yōu)先級高于讀者,在有寫者的時候讀者需要等候,而在讀者優(yōu)先的時候,不用判斷是否存在寫者,有讀者時即開始讀操作。</p><p

64、>  while(NumOfWriteRequest != 0)</p><p><b>  {</b></p><p>  //NumOfWriteRequest != 0 表示有寫者在等待,不能讀</p><p><b>  }</b></p><p>  //等待ReadSemaphor

65、e讀信號,即當ReadSemaphore有信號時等待結束,相當于p操作</p><p>  WaitForSingleObject(ReadSemaphore,INFINITE);</p><p>  /*DWORD WaitForMultipleObjects(</p><p>  CONST HANDLE *lpHandles, // pointer to t

66、he object-handle array</p><p>  DWORD dwMilliseconds // time-out interval in milliseconds</p><p><b>  );*/</b></p><p>  if(NumOfReading == 0)</p><p>&l

67、t;b>  {</b></p><p>  //當?shù)谝粋€讀者到了,如果WriteSemaphore信號燈滅了,說明有寫者在寫,讀者必須等待,即互斥寫操作</p><p>  WaitForSingleObject(WriteSemaphore,INFINITE); </p><p><b>  }</b></p>

68、<p>  NumOfReading++;</p><p>  //還有讀者,但是允許下一個讀進程讀取,相當于V操作</p><p>  ReleaseSemaphore(ReadSemaphore,1,NULL); </p><p>  /*BOOL ReleaseSemaphore(</p><p>  HANDLE hSe

69、maphore,//lpReleaseCount參數(shù)表示要增加的數(shù)值</p><p>  LONG lReleaseCount, //lpPreviousCount參數(shù)用于返回之前的計算值,如果不需要可以設置為NULL </p><p>  LPLONG lpPreviousCount</p><p><b>  )

70、;*/</b></p><p><b>  // 啟動讀者</b></p><p>  pPerson->StartTime = CurrentTime; </p><p>  printf("Reader %d is Reading the Critical Section...\n",pPerson-&

71、gt;ID);</p><p>  printf("\n\n************************************************\n"); </p><p>  while(CurrentTime <= pPerson->StartTime + pPerson->WorkTime)</p><p>&

72、lt;b>  {</b></p><p>  // .. 執(zhí)行讀操作</p><p><b>  }</b></p><p>  printf("Reader %d is Exit...\n",pPerson->ID);</p><p>  printf("\n\n

73、************************************************\n");</p><p>  WaitForSingleObject(ReadSemaphore,INFINITE);</p><p>  NumOfReading--;</p><p>  if(NumOfReading == 0) </p>

74、<p><b>  {</b></p><p>  ReleaseSemaphore(WriteSemaphore,1,NULL);//此時沒有讀者,可以寫</p><p><b>  }</b></p><p>  ReleaseSemaphore(ReadSemaphore,1,NULL);</p>

75、;<p>  if(pPerson->ID == 6 ) finished = true; //所有的讀寫完成</p><p>  ExitThread(0);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  D

76、WORD WINAPI WriterProc(LPVOID lpParam)</p><p><b>  {</b></p><p>  Person *pPerson = (Person *)lpParam;</p><p><b>  // 等待啟動時間</b></p><p>  while(

77、CurrentTime != pPerson->StartTime) </p><p><b>  {</b></p><p><b>  }</b></p><p>  printf("Writer %d is Requesting ...\n",pPerson->ID);</p&g

78、t;<p>  printf("\n\n************************************************\n"); </p><p>  NumOfWriteRequest++;</p><p>  //在寫者優(yōu)先的時候需要用自加來初始信號值,而在讀者優(yōu)先的時是通過讀者操作來控制信號值</p><p>

79、;  WaitForSingleObject(WriteSemaphore,INFINITE);</p><p><b>  // 啟動寫者</b></p><p>  pPerson->StartTime = CurrentTime; </p><p>  printf("Writer %d is Writting the C

80、ritical Section...\n",pPerson->ID);</p><p>  while(CurrentTime <= pPerson->StartTime + pPerson->WorkTime)</p><p><b>  {</b></p><p>  // .. 執(zhí)行寫操作</p&

81、gt;<p><b>  }</b></p><p>  printf("Writer %d is Exit...\n",pPerson->ID);</p><p>  printf("\n\n************************************************\n");</

82、p><p>  NumOfWriteRequest--;</p><p>  ReleaseSemaphore(WriteSemaphore,1,NULL);</p><p>  if(pPerson->ID == 6 ) finished = true;//所有的讀寫完成</p><p>  ExitThread(0);</p>

83、;<p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  總結;</b></p><p>  本次的操作系統(tǒng)課程設計,收獲還是很大的。讀者寫者問題是一個經(jīng)典的多線程的問題,圖書館和網(wǎng)上都有很多資料,我也看了很多這方面的資料,應該

84、說這個課程設計為我更加深入的研究開了一個很好的頭。</p><p>  驗收的老師是xx老師,他當時問我怎么保證window下p,v操作的原子性,說實在的,我一直研究的是我程序的算法和實現(xiàn),還真沒考慮過我用的底層API函數(shù)的具體特征這個問題,我武斷的認為windows底層已經(jīng)實現(xiàn)了原子性,他讓我回去再查資料,下次再驗收,還跟我講了很多他的研究生研究的課題與p,v操作有關,p,v操作的原子性至關重要。我查了很多資料

85、,還到csdn詢問了一些技術牛,雖然windows的API沒有明確說明WaitForSingleObject()(也就是windows的一種p操作)的原子性,但是在很多文獻和高手的博客中,證實了該函數(shù)的原子性。</p><p>  所以說這次課程設計不僅鍛煉了我代碼實現(xiàn)的能力,也是開拓了我的思路和想問題的方向,以及對細節(jié)的注重,再次感謝我的指導老師們,特別是xx老師對我的啟發(fā)。</p><p&

溫馨提示

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

評論

0/150

提交評論