天津科技大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第1頁
天津科技大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第2頁
天津科技大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第3頁
天津科技大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第4頁
天津科技大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2015-2016學(xué)年第一學(xué)期計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級:學(xué)號:姓名:日期:實(shí)驗(yàn)一Windows多線程【開發(fā)語言及實(shí)現(xiàn)平臺或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【實(shí)驗(yàn)?zāi)康摹窟M(jìn)一步理解操作系統(tǒng)的并發(fā)性;了解Windows線程創(chuàng)建方法,并通過查閱資料理解各參數(shù)的含義;了解多線程程序設(shè)計(jì)方法,并進(jìn)行簡單應(yīng)用?!緦?shí)驗(yàn)要求】逐程序進(jìn)行簡要分析、運(yùn)行各程序并仔細(xì)閱讀注釋;查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用方法和參數(shù)含義;完成實(shí)驗(yàn)報(bào)告。【實(shí)驗(yàn)結(jié)果與分析】1-1.cpp程序運(yùn)行1-1.cpp結(jié)果:■2"F:衣檔2S■實(shí)驗(yàn)讀貯拿詵程mainthreadisrunningPressanykeytocortinue將main函數(shù)中注釋掉的Sleep語句讓其可用,運(yùn)行結(jié)果為:threadisirunningthyeadli弓runningPre".-snykeytocoritinue

分析原因:Sleep(0)的作用為語句可觀察線程1和主線程并發(fā)執(zhí)行。輸出結(jié)果“mainthreadisrunning/threadlisrunning”。沒有添加的線程1運(yùn)行結(jié)束只輸出“mainthreadisrunning”。(2)1-2.cpp程序運(yùn)行1-2.cpp結(jié)果:■Z卞農(nóng)檔25實(shí)臥實(shí)醫(yī)一券述程2訪陽\1-2心已”bnairiithreadisrunning1pnainthreadisrunning2bnairiithreadisrunning4pnainthreadisrunningGbnairiithreadisrunning7nnainthreadisrunning8bnairiithreadisrunning9nnainthreadisrunningL0unainithreadisrunrilingLIpnainthreadisrunningL2uhairtthreadismiming13nnainthreadisrunningL4bnaitithreadisrunrking15pnainthreadisrunningLGbnaiDithreadisrunriling4thr&ad2isrunning5”nainthreadisrunriling2thr&adlisrunning3hreadlisrunning19hrsad.1isrunning20bnainthresdisrunning17hr&ad2isrunning18PressanykeyTocontinue分析原因:1-2.cpp文件使用的是時(shí)間片輪轉(zhuǎn)方法調(diào)度的主線程、線程1、線程2?因此不需要sleep語句就可將主線程調(diào)度。因?yàn)樵趦蓚€(gè)線程中存在共享變量,因此執(zhí)行結(jié)果出現(xiàn)不可再現(xiàn)性。(3)1-3.cpp程序運(yùn)行1-3.cpp結(jié)果:>''F:5宴驗(yàn)'宴驗(yàn)一辜連程W亡bug\1-3(tickets).exe1hjainthreadiwrunningpnainT-hreadisrjnniEgthreadlisselltickets:40anykeytoco'ntimie

將main函數(shù)中注釋掉的Sleep語句讓其可用,運(yùn)行結(jié)果為:亙:?F:佼檔實(shí)驗(yàn)肉宰城程-3(tick亡⑸心己‘luaintbreadisrunningniAinthreadisrunningthread1isselltickets::40threadlisselltickets::38threadlisselltickets::37threadlissei1tickets:36threadlisselltickets:35threadlisselltickets:34tlireadlisselltickets:33threadlissei1tickets32threadlisselltickets::31threadlisselltickets:30tlireadlisselltickets:29thread2isselltickets:39threadsisselltickets:27tliread2isselltickets:2Gtliread2isselltickets:25thread?isselltickets:24thread2isselltickets:23tliread2isselltickets:22thread2issei1tickets::21thread2isselltickets:20thread?isselltickets:19thread2isselltickets18thread2issei1tickets:17threadsisselltickets:16thread2isselltickets:15thread2isselltickets14thread2issei1ticl<Ets:131■ ■ H? 3b ■_II; H 將兩個(gè)子函數(shù)中注釋掉的Sleep語句讓其可用,運(yùn)行結(jié)果:U'F:咬檔實(shí)驗(yàn)\實(shí)驗(yàn)一^H\Debug\1-3(tickets].exenpnainthreadisrunningihreadlissellthreadU'F:咬檔實(shí)驗(yàn)\實(shí)驗(yàn)一^H\Debug\1-3(tickets].exenpnainthreadisrunningihreadlissellthread1issei1thread2iisellthread^is3ellthread2issellihreadlissellthreadsi?sei1thread2issellihreadlissellrhread2issei1threadsiisellthread]i-sei'thread^issellLhreadSissellthread]i-sei1ticke1t£:40tickets:40tickets:39tickets:38tickets:38:icketi;;37tickets:36tickets!36Lickett;:35tickets:34tickets:34tickets:33tickets:32ticka1tE:32tickets:31tthheread2asseils1tickeckets:s:3029tthheread.2asseilssolitickeckets:s:3029rhread2isse工tickets:28thread^iisellLicketis:28thread]isselltickets:27thread^isselltickets:26ihread2isL;ell:icketis:26thread1issei1tickets:25thread2iirhread2issellLithetis:1isselltickets:2324se1'tithets:Lissellticketsthread2iirhread2is分析原因:加入兩個(gè)sleep(1)后,有可能到threadlisselltickets:時(shí)間片就停了,tickets沒一,還可以運(yùn)行thread2isselltickets:"〈〈tickets—也就是說tickets變?yōu)?,返回再運(yùn)行threadlisselltickets時(shí)就賣0號票了?!緦?shí)驗(yàn)思考及總結(jié) :加入循環(huán),使得兩個(gè)進(jìn)程可以交替執(zhí)行。Sleep是阻塞線程函數(shù)。它會在當(dāng)前語句阻塞一段時(shí)間,參數(shù)是以1/1000秒為單位的。線程也有父子關(guān)系。父進(jìn)程退出后子進(jìn)程也會退出。不可再現(xiàn)性:兩個(gè)進(jìn)程同時(shí)邁出同一部步,兩個(gè)進(jìn)程中存在共享變量。實(shí)驗(yàn)二Windows線程同步機(jī)制【開發(fā)語言及實(shí)現(xiàn)平臺或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【實(shí)驗(yàn)?zāi)康摹苛私釽indows線程同步機(jī)制;了解互斥體,并通過查閱資料理解互斥體對象的使用方法;了解事件,并通過查閱資料理解事件對象的使用方法;了解關(guān)鍵區(qū),并通過查閱資料理解關(guān)鍵區(qū)對象的使用方法;了解信號量,并通過查閱資料理解信號量對象的使用方法;⑹利用Windows線程同步機(jī)制,模擬生產(chǎn)者消費(fèi)者問題?!緦?shí)驗(yàn)要求】逐程序進(jìn)行簡要分析、運(yùn)行各程序并仔細(xì)閱讀注釋;查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用方法和參數(shù)含義;完成實(shí)驗(yàn)報(bào)告?!緦?shí)驗(yàn)結(jié)果與分析】(1)2-1(mutex).cpp程序運(yùn)行2-l(mutex).cpp結(jié)果:

1"F:破檔驗(yàn)驗(yàn)二日步'Debug\2-1(nnJtex).exethread!sellticket::40threadlsellticket::40maintbreadisrunningthread!selltickst::39thread?sellticket::38thread!sei1ticket::37thread2sellticket::36thread!sellticket::35thieadEsellticket::34thread!sei1tic:ket:33thread2sellticket:32thread!sellticket:31threadssellticket:30thread!sellticket;29thread2sellticket:28threadlsellticket:27thread?sei1ticket:26thread!sellticket:25thread?sellticket:24thread!sei1ticket:23thread2sellticket;22thread!sellticket:21thread^sellticket:20thread!sei1:19thread2sellticket:18thread!sellticket:17threadssellticket:16thread!sellticket;15thread2sellticket:14將兩個(gè)子函數(shù)中注釋掉的Sleep語句讓其可用,運(yùn)行結(jié)果:12'F:切紐實(shí)鈦實(shí)臉二[^\Detug\2-1(mutexj.exe-mainthreadis:runningthreadlsei1ticket::40thread^sellticket:39tlireadlsellticket:38tbreadssellticket:37threadlsellticket:36thread^sellticket:35threadlsellticket:34thread.2sellticket:33■threadlsellticket:32thread?sellticket:31threadlsei1ticket:30thread2sellticket:29tlireadlselltick巳t:28■thread.2selltick巳t:27threadlsellticket:26thread.2sellticket:25threadlsellticket:24thread.2sellticket:23threadlsellticket:22thread2sei1ticket::21threadlsei1ticket:20tlireadSsellticket:19tlireadlsellticket:18■thread.2sellticket:17threadlsellticket:16thrcad.2sellticket:15threadl£?11ticket:14thread2£911ticket:132-2(event).cpp程序運(yùn)行2-2(event).cpp結(jié)果:ticket:40ticket:39ticket:38ticket:37ticket:36ticket:35■ticketticket:40ticket:39ticket:38ticket:37ticket:36ticket:35■ticket:34■ticket:33ticket:32■ticket:31ticket:30ticket:29ticket:28ticket:27ticket:26ticket:25ticket:24ticket:23ticket:22ticket:21ticket:20ticket:19ticket:13tiuket:]7tiuket:16ticket:15ticket:14ticket:13U"F:該檔宴驗(yàn)'盛驗(yàn)二^\Debug\2-2fevent].exenpainthreadisrunningthread!sei1thread2s?l1threadlsellthread2sei1rthreadlsei1rthread2sellrthreadlsei1rthread2sellthreadlsellrthread2sellthreadlsellthreadssellthreadlsei1threadssei1threadlsei1threadSsei1threadlsei1threadSsei1threadlsei1thread2sellthreadlsellthread2sei1threadlsellthread2sei1threadlsei1thread2sellthreadlsei1thread2sei1將兩個(gè)子函數(shù)中注釋掉的Sleep語句讓其可用,運(yùn)行結(jié)果:

■'"巳丈檔\0綏驗(yàn)迄5驗(yàn)二同佗阻nt)?/mtiinthread:isrunningthreadlsellticket:40t:iread?sellticket:39■tar^adlsoilticket:38thread^sellticket:37thrcadlsellticket-:36■taroad2sellticket-:35■tarcadlsellticker:34thread2selltic殳航:33tareadlselltic除匸:32■taread2sellticker:31threadlsellticket:30thread?sei1ticket:291.:irecit]lsellticket:28thread?sellticket:27t:ireadlsellticket:26taread2sellticket:25threadlsellticket:24thread2sellticket-:23taroadlsellticker:22threadssellticket:2itarcadlselltic殳航:20thread^sellticker:19thread1sellticket:18thread?sellticket:17sei1ticket:16thread2sei1ticket:15sei1ticket:14thread^sellticket:132-3(critical_section).cpp程序運(yùn)行2-3(critical_section).cpp結(jié)果:4040393837363534333231302928212625242322212019181.716151413III'F:懐圖05實(shí)驗(yàn)偎驗(yàn)二同涉\D亡bug\2-3Kritiel,亡dzicmMxHmainthreadisrunningthreadlsellticket:threadlsellticket:tin^?adlsei1ticket:tbread1se]1ticket:threadlsellticket:threadlselltiuket■:thread1sellticket::thrsadlsellticket:thr^adlsellticket:tine^adlsei1ticket:tbread1se]1tiuket;threadlselltiuket:thread1selltiuket:threadlsellticket:threadlsellticket:threadlsellticket:tin^?adlsei1ticket:tbread1se]1ticket:threadlsellticket:threadlsellticket■:thread1sellticker:thrsadlsellticket:thr^adlsellticket:tinsei1ticket:tbread1se]1tiuket;threadlselltiuket:thread1selltiuket:threadlselltiukec:將兩個(gè)子函數(shù)中注釋掉的Sleep語句讓其可用,運(yùn)行結(jié)果:

■7"F:\^\OS^:\^^ra^\Debdg\2-3(critical_sectioni.exemainthreadisrunningthreadlsellticket:40thr&ad2sellticket:39threadlsellticket:33thread2selltiuk巳t:37threadlsei1ticket:36thread2sellticket:35threadlselltieket:34Lliread2sellticket:33threadlsei1tinket:32thread2sellticket::31threadlselltiuket:30Lhread2sellticket:29threadlsei1ticket:23thread2sellticket:27threadlselltieket:26Lhread2sellticket:25threadlsei1ticket:24thr?ad2selltieket:23threadlsellticket:22Lliiead2sellticket:21threadlsellticket:2Dthr?ad2selltiukot:19threadlsellticket:18Lliiead2sellticket:17threadlsellticket:ISthread2sellticket:15threadlsellticket:14thread2sei1tinket:13r”r- i■■- 2 A分析原因:2-l(mutex).cpp、2-2(event).cpp、2-3(critical_section).cpp的處理方式相同,不會出現(xiàn)銷售出0號票的情況原因相同:修改之前,在指定暫停的時(shí)間Sleep(lOOO)內(nèi),threadl和thread2隨機(jī)售票,出現(xiàn)多種情況;將兩個(gè)子函數(shù)中注釋掉的Sleep(1)語句讓其可用后,threadl和thread2交替售票,即threadl在其暫停的時(shí)間Sleep(1)內(nèi),thread2獲得了對共享對象hMutex的所有權(quán),開始售票,同理當(dāng)thread2在其暫停的時(shí)間Sleep⑴內(nèi),threadl獲得了對共享對象hMutex的所有權(quán),開始售票,這樣threadl和thread2就實(shí)現(xiàn)了交替售票,不會出現(xiàn)銷售出0號票的情況。2-4(Producer_Consumer).cpp程序運(yùn)行2-4(Producer_Consumer).cpp結(jié)果:E下:\文檔\。5實(shí)驗(yàn)\實(shí)驗(yàn)二同歩\Detiug吃吃弭mainthreadisrunningProducerisrunning:1Consmn&risrunning:1Hressanykeytocontinue將兩個(gè)子函數(shù)中注釋掉的while語句讓其可用,運(yùn)行結(jié)果:■J下:說檔怕S實(shí)驗(yàn)\實(shí)驗(yàn)二HW)ebug\2-4<ProducerConsumeO-exe"mainthreadisrunningProducerismiming::1卩roducerisrunnirg::7Consumerisrunning::2Producerisrunning::2Consumerisrunning::?Producerisrunning::2Conzumerisrunning::2Producerisrunning:2Consumerisrunning:2Producerismiming:2Consumerisrunning:2Producerisrunning:2Conzuinerisrunning:2Producerisrunning:2Consuinerisrunning:2Producerismiming:2Consumerisrunning:2卩reducerisrunnirg:TConsumerisrunning:2Producerisrunning:2Consumerisrunnirg:7Producerisrunning:2Consumerisrunning:2卩reducerisrunnirg:?Consumerisrunning:2Producerisrunning:2Consumerisrunnirg:TProducerisrunning:2分析原因:修改之前,在指定暫停時(shí)間sleep(20)內(nèi),producer和consumer只能執(zhí)行一次;將兩個(gè)子函數(shù)中注釋掉的while語句讓其可用后‘producer和consumer在指定暫停時(shí)間sleep(20)內(nèi),隨機(jī)循環(huán)獲得共享對象的所有權(quán),進(jìn)行生產(chǎn)或消費(fèi),從而出現(xiàn)多種結(jié)果。2-4(Producer_Consumer)l.cpp程序運(yùn)行2-4(Producer_Consumer)1.cpp結(jié)果:

<2"F:該檔實(shí)驗(yàn)\實(shí)驗(yàn)二^\Debug\2-^(ProdiJcer_Consume01,exentnainthreadisrunningmainthreadisrunningProducer1isrunning::1ProduceTlisrurning::2Consumer!isrunning::2卩roducer2isrurning::2ProduceTlisrurning::3Consumer2isrunning::3Producer2isrurning::3Consumer1isrunning:3ProduceTlisrurning:3Consumer2isrunning;;3Producer^13rurning:3Consumer1isrurning3Producer1isrurning:3ConsumeT2isrurning:3Pi'odLicer2匕rurniiig:3ConsumeTlisrurning:3Producer1isrunning;:3Conjumer^13rurning:3ProduceT2irunning:3ConsumeTlisrurning:3Producer1isrurning:3Consumer2isrurning:3Producersisrurning:3Consumer1isrunning:3ProduceTlisrurning:3GonsLimer2isrunning;:3ProduceT2isrurning:3Lh卜2— \& 【實(shí)驗(yàn)思考及總結(jié) :Sleep(lO)使當(dāng)前線程放棄目前的時(shí)間片,并且在10ms內(nèi)不會被再次調(diào)度。進(jìn)程也有父子關(guān)系。父進(jìn)程退出后子進(jìn)程也會退出。線程之間的同步使用一些核心對象:如thread,process,evnet,mutex,semaphore.。在線程之間使用等待函數(shù)如WaitForSingleObjects,WaitForMultipleObjects.等待函數(shù)使用核心對象的handle作為參數(shù),如果handle被激發(fā),則執(zhí)行下一步。handle被激發(fā)的條件:(handle是一段內(nèi)存指針,為了掩藏內(nèi)部實(shí)現(xiàn)而做的一個(gè)類型轉(zhuǎn)化指針)激發(fā): 資源未被占用。未激發(fā): 資源正在被占用。eg:thread,process被終止,則激發(fā)。event:要通過它的API來手動激發(fā),是最靈活的激發(fā)方式,可被所有線程使用。mutex:沒被任何線程所擁有,則激發(fā)。實(shí)驗(yàn)三Windows線程通信【開發(fā)語言及實(shí)現(xiàn)平臺或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【實(shí)驗(yàn)?zāi)康摹苛私釽indow線程通信方法;了解匿名管道,并通過查閱資料理解匿名管道的使用方法;了解命名管道,并通過查閱資料理解命名管道的使用方法;【實(shí)驗(yàn)要求】逐程序進(jìn)行簡要分析、運(yùn)行各程序并仔細(xì)閱讀注釋;查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用方法和參數(shù)含義;完成實(shí)驗(yàn)報(bào)告。【實(shí)驗(yàn)結(jié)果與分析】(1)匿名管道:先編譯Child工程,然后運(yùn)行Parent工程,再在Parent中創(chuàng)建管道和子進(jìn)程,然后雙方即可通過管道通信。如下圖所示:

(2)命名管道:Server和Client各自運(yùn)行,再在Server中創(chuàng)建命名管道,然后在Client中連接管道,最后雙方即可通過管道通信。如下圖所示:注:相關(guān)代碼卷View.蟲p中(3)(實(shí)驗(yàn)三選做題目):在客戶端輸入數(shù)據(jù)a和b,然后發(fā)送到服務(wù)器并計(jì)算a+b,然后把計(jì)算結(jié)果發(fā)送到客戶端。可以多個(gè)客戶端與同一個(gè)服務(wù)器并行通信。相關(guān)代碼:客戶端://CDlg.cpp:implementationfile//#include"stdafx.h"#include"C.h"#include"CDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE.#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public:CAboutDlg();//DialogData〃{{AFX_DATA(CAboutDlg)enum{IDD=IDD_ABOUTBOX};//}}AFX_DATA//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)//{{AFX_MSG_MAP(CAboutDlg)//Nomessagehandlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CCDlgdialogCCDlg::CCDlg(CWnd*pParent/*=NULL*/):CDialog(CCDlg::IDD,pParent){//{{AFX_DATA_INIT(CCDlg)//NOTE:theClassWizardwilladdmemberinitializationhere//}}AFX_DATA_INIT//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);voidCCDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCDlg)//NOTE:theClassWizardwilladdDDXandDDVcallshere//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCDlg,CDialog)//{{AFX_MSG_MAP(CCDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CCDlgmessagehandlersBOOLCCDlg::OnInitDialog(){CDialog::OnInitDialog();//Add"About..."menuitemtosystemmenu.//IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//Settheiconforthisdialog.Theframeworkdoesthisautomatically//whentheapplication'smainwindowisnotadialogSetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE); //Setsmallicon//TODO:AddextrainitializationherereturnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCCDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==IDM_ABOUTBOX){CAboutDlgdlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID,lParam);}}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCCDlg::OnPaint(){if(IsIconic()){CPaintDCdc(this);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);//CentericoninclientrectangleintcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//Drawtheicondc.DrawIcon(x,y,m_hIcon);}else{CDialog::OnPaint();}}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCCDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}服務(wù)端://SDlg.cpp:implementationfile//#include"stdafx.h"#include"S.h"#include"SDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public:CAboutDlg();//DialogData//{{AFX_DATA(CAboutDlg)enum{IDD=IDD_ABOUTBOX};//}}AFX_DATA//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)//{{AFX_MSG_MAP(CAboutDlg)//Nomessagehandlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CSDlgdialogCSDlg::CSDlg(CWnd*pParent/*=NULL*/):CDialog(CSDlg::IDD,pParent){//{{AFX_DATA_INIT(CSDlg)//NOTE:theClassWizardwilladdmemberinitializationhere//}}AFX_DATA_INIT//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);voidCSDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CSDlg)//NOTE:theClassWizardwilladdDDXandDDVcallshere//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CSDlg,CDialog)//{{AFX_MSG_MAP(CSDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CSDlgmessagehandlersBOOLCSDlg::OnInitDialog(){CDialog::OnInitDialog();//Add"About..."menuitemtosystemmenu.//IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//Settheiconforthisdialog.Theframeworkdoesthisautomatically//whentheapplication'smainwindowisnotadialogSetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE); //Setsmallicon//TODO:AddextrainitializationherereturnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCSDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==IDM_ABOUTBOX){CAboutDlgdlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID,lParam);}}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCSDlg::OnPaint(){if(IsIconic()){CPaintDCdc(this);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);//CentericoninclientrectangleintcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//Drawtheicondc.DrawIcon(x,y,m_hIcon);}else{CDialog::OnPaint();}}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCSDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}運(yùn)行結(jié)果如下圖:Kt-O-JkL曲|CSnY?rt)lg■+jSnrv^r■ciwcvb:f?ri*UB?*Vil47rDnl>*t-rfxch-an|K-(U-at-aEniu?gr4|#i)m^lafj Banguip*i.)?/H^AFi^DA7/MTE?MrCci■昭沖臨小燈mil-addWindDM<-?L15//JJHFi.lWiift.fflPEftlriHE器wbE■AFiCj?rw^Dlgl.ttialag}ffl_W_5V5CI*?iH)4l>E4I_WPAIHlqUEFIrtUi[CDI^)M-lM-DESTt*T()(HlULIC暉啊IDQECI[怔》DnfcHLT2zEl?l[twnu-ri^-E^flvriu-C#tS9£V??Hmu{FAl-££)?iF4pSyrfitlHiut-IM"kcniwiCEtriajFtrMhwtMrnu;SCrM+iCWnU.LtMStrlAftlt^i_ABVVlHKt£If(SftHAbQUtltaJ.f5fsKrntt-J*wrndHe?w(^_.EEraS!DR>EFSf5*nqi-^?wrndHe?v(.]Dt?_wrBnKP5-tr4boutHe??);//Srtt*+icnnF皆this4i-?l?q. >**FrjwH<r*dorstsisautnn*ti<-allu]~hBaak-diJIthi<\、~FandinFl]-ixL~X~F“dznF 2~\F^znJiaE/"■KiHcrn【實(shí)驗(yàn)思考及總結(jié)】(1)在VC++6.0中open已經(jīng)編譯好的程序,選擇所有文件,線程之間通信的兩個(gè)基本問題是互斥和同步。線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的消息,當(dāng)它沒有得到另一個(gè)線程的消息時(shí)應(yīng)等待,直到消息到達(dá)時(shí)才被喚醒。線程互斥是指對于共享的操作系統(tǒng)資源(指的是廣義的"資源",而不是Windows的.res文件,譬如全局變量就是一種共享資源),在各線程訪問時(shí)的排它性。當(dāng)有若干個(gè)線程都要使用某一共享資源時(shí),任何時(shí)刻最多只允許一個(gè)線程去使用,其它要使用該資源的線程必須等待,直到占用資源者釋放該資源。線程互斥是一種特殊的線程同步。(2)互斥和同步對應(yīng)著線程間通信發(fā)生的兩種情況:1)當(dāng)有多個(gè)線程訪問共享資源而不使資源被破壞時(shí);2)當(dāng)一個(gè)線程需要將某個(gè)任務(wù)已經(jīng)完成的情況通知另外一個(gè)或多個(gè)線程時(shí)。(3)在WIN32中,同步機(jī)制主要有以下幾種:事件(Event);信號量(semaphore);互斥量(mutex);臨界區(qū)(Criticalsection)。(4)全局變量因?yàn)檫M(jìn)程中的所有線程均可以訪問所有的全局變量,因而全局變量成為Win32多線程通信的最簡單方式。實(shí)驗(yàn)四銀行家算法模擬【開發(fā)語言及實(shí)現(xiàn)平臺或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2003【實(shí)驗(yàn)?zāi)康摹浚?)進(jìn)一步理解利用銀行家算法避免死鎖的問題;(2)在了解和掌握銀行家算法。(3)理解和掌握安全序列、安全性算法【實(shí)驗(yàn)內(nèi)容】(1)編寫安全性算法;(2)編寫銀行家算法,并編制銀行家算法通用程序,將調(diào)試結(jié)果顯示在計(jì)算機(jī)屏幕上,再檢測和筆算的一致性?!驹创a】#include<iostream.h>#include<string.h>#defineM3 //資源的種類數(shù)#defineN5 //進(jìn)程的個(gè)數(shù)voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);//統(tǒng)一的輸出格式boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);boolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);voidmain(){inti,j;//當(dāng)前可用每類資源的資源數(shù)intiAvailable[M]={3,3,2};//系統(tǒng)中N個(gè)進(jìn)程中的每一個(gè)進(jìn)程對M類資源的最大需求intiMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};〃iNeed[N][M]每一個(gè)進(jìn)程尚需的各類資源數(shù)〃iAllocation[N][M]為系統(tǒng)中每一類資源當(dāng)前已分配給每一進(jìn)程的資源數(shù)intiNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//進(jìn)程名charcName[N]={'a','b','c','d','e'};boolbExitFlag=true; //退出標(biāo)記charch; //接收選擇是否繼續(xù)提出申請時(shí)傳進(jìn)來的值boolbSafe; //存放安全與否的標(biāo)志〃計(jì)算iNeed[N][M]的值for(i=0;i<N;i++)for(j=0;j<M;j++)iNeed[i][j]=iMax[i][j]-iAllocation[i][j];//輸出初始值output(iMax,iAllocation,iNeed,iAvailable,cName);//判斷當(dāng)前狀態(tài)是否安全bSafe=safety(iAllocation,iNeed,iAvailable,cName);//是否繼續(xù)提出申請while(bExitFlag){coutvv"\n"vv"繼續(xù)提出申請?\ny為是;n為否。\n";cin>>ch;switch(ch){case'y'://coutvv"調(diào)用銀行家算法";bSafe=banker(iAllocation,iNeed,iAvailable,cName);if(bSafe) //安全,則輸出變化后的數(shù)據(jù)output(iMax,iAllocation,iNeed,iAvailable,cName);break;case'n':coutvv"退出。\n";bExitFlag=false;break;default:coutvv"輸入有誤,請重新輸入:\n";}}}//輸出voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){inti,j;coutvv"\n\tMax\tAllocation\tNeed\tAvailable"vvendl;coutvv"\tABC\tABC\tABC\tABC"vvendl;for(i=0;ivN;i++){coutvvcName[i]vv"\t";for(j=0;jvM;j++)coutvviMax[i][j]vv"";coutvv"\t";for(j=0;jvM;j++)cout<<iAllocation[i][j]<<"";cout<<"\t";for(j=0;j<M;j++)cout<<iNeed[i][j]<<"";cout<<"\t";cout<<"";//Available只需要輸出一次if(i==0)for(j=0;j<M;j++)cout<<iAvailable[j]<<"";cout<<endl;}}〃安全性算法,進(jìn)行安全性檢查;安全返回true,并且輸出安全序列,不安全返回false,并輸出不安全的提示;boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){inti,j,flag,x=0;charName[N];intWork[M];boolFinish[N];for(j=0;j<M;j++)Work[j]=iAvailable[j];for(i=0;i<N;i++)Finish[i]=false;while(true){flag=0;for(i=0;i<N;i++){if(Finish[i]==false&&Work[0]>=iNeed[i][0]&&Work[1]>=iNeed[i][1]&&Work[2]>=iNeed[i][2]){for(j=0;j<M;j++){Work[j]+=iAllocation[i][j];}Finish[i]=true;flag++;Name[x++]=cName[i];}}for(i=0;i<N;i++)if(Finish[i]==false){i=i;break;}}if(i==5){cout<<"\n";coutvv"當(dāng)前時(shí)刻系統(tǒng)的一個(gè)安全序列為:";for(x=0;x<N;x++)cout<<Name[x]<<"";cout<<"\n";returntrue;}if(flag==0){coutvv"無安全序列";returnfalse;}}returntrue;}〃安全返回true,不安全返回falseboolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){intiMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};inti,j,Request[M],check[M];boolf=true;charx;while(f){coutvv"請輸入進(jìn)程名:";cin>>x;for(i=0;ivN;i++)if(cName[i]==x){i=i;break;}if(i==5)coutvv"\n您輸入的進(jìn)程名有誤!請重新輸入";elsef=false;}coutvv"請輸入申請各類資源數(shù)量:\n";for(j=0;j<M;j++)cin>>Request[j];for(j=0;j<M;j++){check[j]=Request[j]+iAllocation[i][j];}for(j=0;j<M;j++){if((iMax[i][j]-check[j])<0){coutvv"\n資源申請超過最大需求量!!!\n";returnfalse;}}for(j=0;j<M;j++){if((iAvailable[j]-Request[j])<0){cout<<"\n不能滿足進(jìn)程!?。n";returnfalse;}}for(j=0;j<M;j++){iAvailable[j]-=Request[j];iAllocation[i][j]+=Request[j];iNeed[i][j]-=Request[j];}safety(iAllocation,iNeed,iAvailable,cName);returntrue;}

【實(shí)驗(yàn)結(jié)果與分析】■'"F:懐檔\O政那實(shí)蹩四銀行彖耳法2出陽\銀行謔法Stu^nt}心『MBA

ABC

7 5 32 MBA

ABC

7 5 32 29 0 22 匸 23 3NeedAB

7 41260

014 3C22011AvailciuleABC3 3 2為前時(shí)劇強(qiáng)紡的一個(gè)安全序列為:bde繼續(xù)提出屮請?y為是:n沖否.y諸輸入進(jìn)程名:a請輸入中清各類資源數(shù)雖;332無安全序列■"卜;檔實(shí)牌冥適□銀行^S\Debug\^疔杲亙選時(shí)朝別旳心己‘I請輸入申請各類資源數(shù)量^332尤安2序列t:d73924Max55t:d73924Max552023C3227AllocationA夕400103320C3021941604Need彳12013C

D2011AvailableABC000繼線提出申請?”為島虹為否「佝輸入進(jìn)程名:請輸入申請各盜資源數(shù)量土555資源申話超迂最大需求量??!【實(shí)驗(yàn)思考及總結(jié)】銀行家算法的安全算法不唯一,我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請資源時(shí),要測試該進(jìn)程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請資源時(shí),先測試該進(jìn)程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進(jìn)程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,若能滿足則按當(dāng)前的申請量分配資源,否則也要推遲分配。實(shí)驗(yàn)五頁面置換算法模擬【開發(fā)語言及實(shí)現(xiàn)平臺或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2003【實(shí)驗(yàn)?zāi)康摹窟M(jìn)一步理解利用頁面調(diào)度算法實(shí)現(xiàn)虛擬內(nèi)存的問題;通過模擬實(shí)現(xiàn)請求頁式存儲管理的幾種基本頁面置換算法,了解虛擬存儲技術(shù)的特點(diǎn)。掌握虛擬存儲請求頁式存儲管理中幾種基本頁面置換算法的基本思想和實(shí)現(xiàn)過程,并比較它們的效率。了解頁面大小和內(nèi)存實(shí)際容量對命中率的影響?!緦?shí)驗(yàn)內(nèi)容】在了解和掌握頁面調(diào)度算法的基礎(chǔ)上,編制先進(jìn)先出的算法(FIFO)、最近最少使用算法(LRU)、最佳淘汰算法(OPT)等各種頁面置換算法。將調(diào)試結(jié)果顯示在計(jì)算機(jī)屏幕上,再檢測和筆算的一致性。理解和掌握命中率的問題會使用某種編程語言?!驹创a】#include<iostream>#defineM3#defineN20usingnamespacestd;structblock{intiPageNum; //物理塊里存儲的頁面號intiBlockFlag; 〃在三種算法中用到的標(biāo)記。例如在FIFO中為在內(nèi)存中的時(shí)間};//算法模擬移位寄存器原理voidFIFO(intiTempPage[N],intflag[N],blockmyBlock[M]);voidOptimal(intiTempPage[N],intflag[N],blockmyBlock[M]);voidLRU(intiTempPage[N],intflag[N],blockmyBlock[M]);intPageNum(intarray[]);voidmain(){blockmyBlock[M];intiPageString[N]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//頁面引用串intflag[N]; //缺頁標(biāo)記;1為缺頁,0為不缺頁,在統(tǒng)計(jì)缺頁次數(shù)時(shí)用inti;boolbExitFlag=true; //退出標(biāo)記charch; //接收選擇算法時(shí)傳進(jìn)來的值while(bExitFlag){coutvv"\n"vv"請選擇頁面置換算法:\n";coutvv"f:FIFO置換算法\to:OPT置換算法\tl:LRU置換算法\tx:退出置換算法程序.\n";cin>>ch;//初始化數(shù)據(jù)if((ch=='f')||(ch=='o')||(ch=='l')){for(i=0;i<N;i++)flag[i]=0; //初始化缺頁標(biāo)記為0,即不缺頁}switch(ch){case'f':coutvv"FIFO置換算法的結(jié)果是:\n";FIFO(iPageString,flag,myBlock);〃用PageNum(flag)統(tǒng)計(jì)缺頁次數(shù)cout<<"\n缺頁次數(shù)為"vvPageNum(flag)vvendl;break;case'o':coutvv"OPT置換算法的結(jié)果是:\n";Optimal(iPageString,flag,myBlock);cout<<"\n缺頁次數(shù)為"vvPageNum(flag)vvendl;break;case'l':coutvv"LRU置換算法的結(jié)果是:\n";LRU(iPageString,flag,myBlock);cout<<"\n缺頁次數(shù)為"vvPageNum(flag)vvendl;break;case'x':coutvv"退出置換算法。\n";bExitFlag=false;break;default:coutvv"輸入有誤,請重新選擇置換算法:\n";}}}//對數(shù)組中的數(shù)累加,用來統(tǒng)計(jì)缺頁次數(shù)時(shí)用intPageNum(intarray[]){intnum=0;for(intj=0;j<N;j++)num=num+array[j];returnnum;}//定位函數(shù),在最佳算法中用于定位;//定位物理塊中的某一個(gè)頁面在引用串中還未訪問串中頁面的位置intallocate(intiPage,intiLoc,intiTempPage[N]){inti;for(i=iLoc;i<N;i++){if(iPage==iTempPage[i])returni;}〃永遠(yuǎn)不再訪問的頁面位置假定為NreturnN;}//找數(shù)組中最大值所在的下標(biāo),返回最大值在數(shù)組中的位置(下標(biāo)),三種算法中都用到intmax(blockarray[M]){intj,loc;inttemp=array[0].iBlockFlag;loc=0;for(j=1;j<M;j++){if(temp<array[j].iBlockFlag){temp=array[j].iBlockFlag;loc=j;}returnloc;}//輸出數(shù)據(jù)voidoutput(intiPage,intflag,blockmyBlock[M],intblockNum){intj;//如果缺頁則輸出缺頁標(biāo)志,否則不輸出if(flag==1)cout<<"\n"<<flag;elsecout<<"\n";cout<<"\t"<<iPage;for(j=0;j<blockNum;j++)cout<<"\t"<<myBlock[j].iPageNum;}//初始化物理塊的內(nèi)容,因任一種算法在物理塊內(nèi)容為空時(shí),結(jié)果都一樣的//同時(shí)將目前物理塊中的內(nèi)容輸出voidInitialBlock(intiTempPage[N],intflag[N],blockmyBlock[M]){inti;for(i=0;i<M;i++){//初始化物理塊的內(nèi)容,因任一種算法在物理塊內(nèi)容為空時(shí),結(jié)果都一樣的myBlock[i].iPageNum=iTempPage[i];〃myBlock[i].iBlockFlag的值:0為最后進(jìn)來的,數(shù)越大表示進(jìn)來的越早//在最佳置換算法中則初始化此值沒有意義myBlock[i].iBlockFlag=(M-1)-i;flag[i]=1; //此時(shí)為缺頁}//輸出coutvv"\n缺頁\t引用串\t物理塊l\t物理塊2\t物理塊3";for(i=0;i<M;i++)output(iTempPage[i],flag[i],myBlock,i+l);}//FIFO置換算法voidFIFO(intiTempPage[N],intflag[N],blockmyBlock[M]){inti,j,k,loc;//初始化物理塊的內(nèi)容,因任一種算法在物理塊內(nèi)容為空時(shí),結(jié)果都一樣的//同時(shí)將目前物理塊中的內(nèi)容輸出InitialBlock(iTempPage,flag,myBlock);//從引用串中的第4個(gè)頁面開始for(i=3;i<N;i++){for(j=0;j<M;j++){//物理塊中存在if(myBlock[j].iPageNum==iTempPage[i]){//模擬移位寄存器for(k=0;k<M;k++)myBlock[k].iBlockFlag++;flag[i]=0;break;}}//物理塊中不存在if(j==M){//查找最先進(jìn)來的頁面,也就是block中iBlockFlag最大的物理塊loc=max(myBlock);myBlock[loc].iPa

溫馨提示

  • 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

提交評論