操作系統(tǒng)課程設(shè)計(jì)報(bào)告實(shí)踐報(bào)告_第1頁
操作系統(tǒng)課程設(shè)計(jì)報(bào)告實(shí)踐報(bào)告_第2頁
操作系統(tǒng)課程設(shè)計(jì)報(bào)告實(shí)踐報(bào)告_第3頁
操作系統(tǒng)課程設(shè)計(jì)報(bào)告實(shí)踐報(bào)告_第4頁
操作系統(tǒng)課程設(shè)計(jì)報(bào)告實(shí)踐報(bào)告_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

-.z*停車場有50個(gè)停車位,有車子要進(jìn)來停車,先看看有沒有空車位,如果有,就進(jìn)來停車,車位減一,假設(shè)沒有空車位就在停車場外面的便道上等待,參加等待隊(duì)列。每當(dāng)有車子從停車場駛出,看看便道上有沒有等待停車的車子,如果有就允許在等待隊(duì)列最前端的車子進(jìn)來停車,假設(shè)便道上沒有車子等待的話,停車場空車位增加。**總體設(shè)計(jì)****程序流程圖****具體設(shè)計(jì)**定義car:package.ly;publicclassCar{}停車場管理系統(tǒng)OS的實(shí)現(xiàn):package.ly.os;importjava.util.ArrayList;importjava.util.Scanner;publicclassOS{ staticBooleanmute*;//用來做互斥鎖 staticBooleanfull;//判斷是否為滿 staticBooleanempty;//判斷是否為空 staticfinalintNUMBER=50;//車庫的總?cè)萘?staticintnowNumber;//車庫當(dāng)前的汽車數(shù)目 staticinteNumber=60;//設(shè)定入庫的線程數(shù)目 staticintleaveNumber=45;//設(shè)定出庫的線程數(shù)目 staticArrayList<Integer>eThread;//要入庫的線程集合 staticArrayList<Integer>leaveThread;//要出庫的線程集合 staticScannersc=newScanner(System.in);//承受輸入字符的類 /** *讓一輛車進(jìn)入車庫,占一個(gè)空車位,是消費(fèi)者 */ staticpublicvoide(){ if(mute*==false&&full==false){ mute*=true;//重要?。。≡趫?zhí)行時(shí)要先上鎖,執(zhí)行完后再解鎖 nowNumber++; intn=(int)(Math.random()*(eThread.size()));//得到0~size-1的隨機(jī)數(shù) eThread.remove(n);//隨機(jī)挑選一個(gè)線程來占用資源,進(jìn)入車庫。同時(shí)減少了一個(gè)入庫的線程 mute*=false;//解開互斥鎖 } elseif(mute*==true){ System.out.println("存在互斥鎖,無法進(jìn)展操作"); } elseif(full==true){ System.out.println("車庫滿了,無法入庫"); } if(nowNumber==NUMBER){//入庫操作完畢后,判斷是否已經(jīng)滿了 full=true; } } /** *讓一輛車離開車庫,釋放一個(gè)空車位,是生產(chǎn)者 */staticpublicvoidleave(){ if(mute*==false&&empty==false){ mute*=true;//重要?。?!在執(zhí)行時(shí)要先上鎖,執(zhí)行完后再解鎖 nowNumber--; intn=(int)(Math.random()*(leaveThread.size()));//得到0~size-1的隨機(jī)數(shù) leaveThread.remove(n);//隨機(jī)挑選一個(gè)線程來釋放資源,離開車庫 mute*=false;//解開互斥鎖 } elseif(mute*==true){ System.out.println("存在互斥鎖,無法進(jìn)展操作"); } elseif(empty==true){ System.out.println("車庫空了,無法出庫"); } if(nowNumber==0){//出庫操作完畢后,判斷是否已經(jīng)空了 empty=true; } } /** *主進(jìn)程產(chǎn)生的一個(gè)操作控制,隨機(jī)喚醒生產(chǎn)者或是消費(fèi)者 */ staticpublicvoidstart(){ intcontrol=sc.ne*tInt();//接收到輸入的操作碼,根據(jù)1,2來判斷操作。 switch(control){ case1: e();//入庫操作,看看有沒有入庫的 //還沒想好怎么弄 break; case2: leave();//有車離開車庫了,通知入庫的進(jìn)程,看看有沒有等待的車輛,有則入庫 e(); break; default: break; } } /** *paramargs */ publicstaticvoidmain(String[]args){ //TODO自動(dòng)生成的方法存根 eThread=newArrayList<Integer>(); leaveThread=newArrayList<Integer>(); for(inti=1;i<=eNumber;i++){ eThread.add(i); } for(inti=1;i<=leaveNumber;i++){ leaveThread.add(i); } //newOS().start(); }}**測試結(jié)果**可定義車庫內(nèi)初始有幾輛車,默認(rèn)為0:入庫:出庫:當(dāng)車庫內(nèi)停車數(shù)為0時(shí),出庫進(jìn)程被休眠〔假設(shè)車庫滿則入庫進(jìn)程休眠〕:實(shí)驗(yàn)九虛擬存儲(chǔ)器管理實(shí)驗(yàn)?zāi)康睦斫馓摂M存儲(chǔ)器概念。掌握分頁式存儲(chǔ)管理地址轉(zhuǎn)換盒缺頁中斷。實(shí)驗(yàn)內(nèi)容與根本要求模擬分頁式存儲(chǔ)管理中硬件的地址轉(zhuǎn)換和產(chǎn)生缺頁中斷。分頁式虛擬存儲(chǔ)系統(tǒng)是把作業(yè)信息的副本存放在磁盤上,當(dāng)作業(yè)被選中時(shí),可把作業(yè)的開場幾頁先裝入主存且啟動(dòng)執(zhí)行。為此,在為作業(yè)建立頁表時(shí),應(yīng)說明哪些頁已在主存,哪些頁尚未裝入主存。作業(yè)執(zhí)行時(shí),指令中的邏輯地址指出了參加運(yùn)算的操作存放的頁號和單元號,硬件的地址轉(zhuǎn)換機(jī)構(gòu)按頁號查頁表,假設(shè)該頁對應(yīng)標(biāo)志為“1〞,則表示該頁已在主存,這時(shí)根據(jù)關(guān)系式“絕對地址=塊號×塊長+單元號〞計(jì)算出欲的主存單元地址。如果塊長為2的冪次,則可把塊號作為高地址局部,把單元號作為低地址局部,兩者拼接而成絕對地址。假設(shè)的頁對應(yīng)標(biāo)志為“0〞,則表示該頁不在主存,這時(shí)硬件發(fā)“缺頁中斷〞信號,有操作系統(tǒng)按該頁在磁盤上的位置,把該頁信息從磁盤讀出裝入主存后再重新執(zhí)行這條指令。設(shè)計(jì)一個(gè)“地址轉(zhuǎn)換〞程序來模擬硬件的地址轉(zhuǎn)換工作。當(dāng)?shù)捻撛谥鞔鏁r(shí),則形成絕對地址,但不去模擬指令的執(zhí)行,而用輸出轉(zhuǎn)換后的地址來代替一條指令的執(zhí)行。當(dāng)?shù)捻摬辉谥鞔鏁r(shí),則輸出“*該頁頁號〞,表示產(chǎn)生了一次缺頁中斷。用先進(jìn)先出頁面調(diào)度算法處理缺頁中斷。FIFO頁面調(diào)度算法總是淘汰該作業(yè)中最先進(jìn)入主存的那一頁,因此可以用一個(gè)數(shù)組來表示該作業(yè)已在主存的頁面。假定作業(yè)被選中時(shí),把開場的m個(gè)頁面裝入主存,則數(shù)組的元素可定為m個(gè)。實(shí)驗(yàn)內(nèi)容分頁式存儲(chǔ)管理和先進(jìn)先出頁面調(diào)度算法原理。分頁式存儲(chǔ)管理的根本思想是把內(nèi)存空間分成大小相等、位置固定的假設(shè)干個(gè)小分區(qū),每個(gè)小分區(qū)稱為一個(gè)存儲(chǔ)塊,簡稱塊,并依次編號為0,1,2,3,……,n塊,每個(gè)存儲(chǔ)塊的大小由不同的系統(tǒng)決定,一般為2的n次冪,如1KB,2KB,4KB等,一般不超過4KB。而把用戶的邏輯地址空間分成與存儲(chǔ)塊大小相等的假設(shè)干頁,依次為0,1,2,3,……,m頁。當(dāng)作業(yè)提出存儲(chǔ)分配請求時(shí),系統(tǒng)首先根據(jù)存儲(chǔ)塊大小把作業(yè)分成假設(shè)干頁。每一頁可存儲(chǔ)在內(nèi)存的任意一個(gè)空白塊內(nèi)。此時(shí),只要建立起程序的邏輯頁和內(nèi)存的存儲(chǔ)塊之間的對應(yīng)關(guān)系,借助動(dòng)態(tài)地址重定位技術(shù),原本連續(xù)的用戶作業(yè)在分散的不連續(xù)存儲(chǔ)塊中,就能夠正常投入運(yùn)行。先進(jìn)先出頁面調(diào)度算法根據(jù)頁面進(jìn)入內(nèi)存的時(shí)間先后選擇淘汰頁面,先進(jìn)入內(nèi)存的頁面先淘汰,后進(jìn)入內(nèi)存的后淘汰。本算法實(shí)現(xiàn)時(shí)需要將頁面按進(jìn)入內(nèi)存的時(shí)間先后組成一個(gè)隊(duì)列,每次調(diào)度隊(duì)首頁面予以淘汰。程序流程圖1、地址轉(zhuǎn)換程序流程圖開場開場取一條指令取指令中的頁號查頁表該頁標(biāo)志=1.形成絕對地址輸出絕對地址輸出“*〞頁號表示發(fā)生缺頁中斷有后續(xù)指令.完畢取下一條指令YYNN2、FIFO頁面置換算法程序流程圖開場開場取一條指令取指令中的頁號查頁表該頁標(biāo)志=1.形成絕對地址是內(nèi)存指令.置該頁修改標(biāo)志為1輸出絕對地址有后繼指令.取下一條指令完畢當(dāng)前頁是否被更新.將該頁更新標(biāo)志置為0置換出當(dāng)前頁輸出被置換出去的頁面顯示被調(diào)入的頁面設(shè)置被調(diào)入頁面的相關(guān)屬性修改頁表YYYYN〔產(chǎn)生缺頁中斷〕NNN模擬FIFO頁面調(diào)度模擬硬件地址轉(zhuǎn)換程序及其注釋*include<cstdio>*include<cstring>*defineSizeOfPage100*defineSizeOfBlock128*defineM4//主存中放4個(gè)頁面structinfo//頁表信息構(gòu)造體{ boolflag;//頁標(biāo)志,1表示該頁已在主存,0表示該頁不在主存 longblock;//塊號 longdisk;//在磁盤上的位置 booldirty;//更新標(biāo)志}pagelist[SizeOfPage];longpo;//隊(duì)列標(biāo)記longP[M];//假設(shè)內(nèi)存中最多允許M個(gè)頁面voidinit_e*1(){ memset(pagelist,0,sizeof(pagelist));//內(nèi)存空間初始化 /*分頁式虛擬存儲(chǔ)系統(tǒng)初始化*/ pagelist[0].flag=1; pagelist[0].block=5; pagelist[0].disk=011; pagelist[1].flag=1;pagelist[1].block=8; pagelist[1].disk=012; pagelist[2].flag=1; pagelist[2].block=9; pagelist[2].disk=013; pagelist[3].flag=1; pagelist[3].block=1; pagelist[3].disk=021;}voidwork_e*1()//模擬分頁式存儲(chǔ)管理中硬件的地址轉(zhuǎn)換和產(chǎn)生缺頁中斷過程{ boolstop=0; longp,q;//頁號,單元號 chars[128];//初始定義塊長 do{ printf("請輸入指令的頁號和單元號:\n"); if(scanf("%ld%ld",&p,&q)!=2) { scanf("%s",s); if(strcmp(s,"e*it")==0)//如果輸入的為“e*it〞則就退出,進(jìn)入重選頁面 { stop=1; } } else { if(pagelist[p].flag)//如果該頁標(biāo)志flag為1,說明該頁已在主存中{printf("絕對地址=%ld\n",pagelist[p].block*SizeOfBlock+q);//計(jì)算出絕對地址,絕對地址=塊號*塊長〔默認(rèn)128〕+單元號 } else { printf("*%ld\n",p);//如果該頁標(biāo)志flag為0,說明該頁不在主存,則產(chǎn)生了一次缺頁中斷 } } }while(!stop);}voidinit_e*2(){/*以下局部為先進(jìn)先出〔FIFO〕頁面調(diào)度算法處理缺頁中斷的初始化,其中也包含了對于當(dāng)前的存儲(chǔ)器內(nèi)容的初始化*/ po=0; P[0]=0;P[1]=1;P[2]=2;P[3]=3;//對內(nèi)存中的4個(gè)頁面進(jìn)展初始化,并且使目前排在第一位的為0 memset(pagelist,0,sizeof(pagelist));//內(nèi)存空間初始化 pagelist[0].flag=1; pagelist[0].block=5; pagelist[0].disk=011;pagelist[1].flag=1; pagelist[1].block=8; pagelist[1].disk=012; pagelist[2].flag=1; pagelist[2].block=9; pagelist[2].disk=013; pagelist[3].flag=1; pagelist[3].block=1; pagelist[3].disk=021;}voidwork_e*2()//模擬FIFO算法的工作過程{ longp,q,i; chars[100]; boolstop=0; do { printf("請輸入指令的頁號、單元號,以及是否為內(nèi)存指令:\n"); if(scanf("%ld%ld",&p,&q)!=2) { scanf("%s",s); if(strcmp(s,"e*it")==0)//如果輸入的為“e*it〞就退出,進(jìn)入重選界面 { stop=1; } } else { scanf("%s",s); if(pagelist[p].flag)//如果該頁標(biāo)志flag為1,說明該頁已在主存中 { printf("絕對地址=%ld\n",pagelist[p].block*SizeOfBlock+q);//計(jì)算絕對地址 if(s[0]=='Y'||s[0]=='y')//內(nèi)存指令 { pagelist[p].dirty=1;//修改標(biāo)志為1 } } else { if(pagelist[P[po]].dirty)//當(dāng)前的頁面被更新過,需把更新后的內(nèi)容寫回外存 { pagelist[P[po]].dirty=0; } pagelist[P[po]].flag=0;//將flag置0,說明當(dāng)前頁面已被置換出去 printf("out%ld\n",P[po]);//顯示根據(jù)FIFO算法被置換出去的頁面 printf("in%ld\n",p);//顯示根據(jù)FIFO算法被調(diào)入的頁面 pagelist[p].block=pagelist[P[po]].block;//塊號一樣 pagelist[p].flag=1;//將當(dāng)前頁面flag置1,說明已在主存中 P[po]=p;//保存當(dāng)前頁面所在的位置 po=(po+1)%M; } } }while(!stop); printf("數(shù)組P的值為:\n"); for(i=0;i<M;i++)//循環(huán)輸入當(dāng)前數(shù)組的數(shù)值,即當(dāng)前在內(nèi)存中的頁面 { printf("P[%ld]=%ld\n",i,P[i]); }}voidselect()//選擇哪種方法進(jìn)展{ longse; chars[128]; do { printf("第九章虛擬存儲(chǔ)器管理\tBY鹿瑤\n請選擇題號:\n1:模擬分頁式存儲(chǔ)管理中硬件的地址轉(zhuǎn)換和產(chǎn)生缺頁中斷\n2:用先進(jìn)先出頁面調(diào)度算法處理缺頁中斷\n"); if(scanf("%ld",&se)!=1) { scanf("%s",&s); if(strcmp(s,"e*it")==0)//如果輸入為e*it則退出整個(gè)程序 { return; } } else { if(se==1)//如果se=1說明選擇的模擬分頁式存儲(chǔ)管理中硬件的地址轉(zhuǎn)換和產(chǎn)生缺頁中斷 { init_e*1();//初始化 work_e*1();//進(jìn)展模擬 } if(se==2)//如果se=2說明選擇的是FIFO算法來實(shí)現(xiàn)頁面的置換 { init_e*2();//初始化 work_e*2();//進(jìn)展模擬 } } }while(1);}intmain(){ select();//選擇題號return0;}程序運(yùn)行結(jié)果及結(jié)論實(shí)驗(yàn)七死鎖的防止〔銀行家算法〕銀行家算法:Dijkstra(1965)提出了一種能夠防止死鎖的調(diào)度算法,稱為銀行家算法。其根本思想是:系統(tǒng)中的所有進(jìn)程放入一個(gè)進(jìn)程集合,先把資源試探性地分配給它。然后找出剩余資源能滿足最大需求量的進(jìn)程,進(jìn)展分配。1、問題的求解方法與策略=1\*GB2⑴內(nèi)存分配方面采用動(dòng)態(tài)分區(qū)管理,使用操作系統(tǒng)書上的Frist-Fit算法。=2\*GB2⑵資源分配方面采用銀行家算法進(jìn)展檢測。=3\*GB2⑶未對運(yùn)行時(shí)間加以考慮。提交時(shí)間只作為作業(yè)順序的參考。2、概要設(shè)計(jì)2.1算法設(shè)計(jì)存儲(chǔ)管理采用動(dòng)態(tài)分區(qū)方法,建立已用分配表和未用分配表。資源分配方面采用銀行家算法。嘗試分配資源,等到不滿足條件時(shí),返還資源,繼續(xù)嘗試分配??偟倪M(jìn)程建立一個(gè)PCB表,記錄進(jìn)程ID、主存需求量、任務(wù)狀態(tài)、資源需求量、已占用資源、當(dāng)前資源申請量、是否執(zhí)行完成信息。運(yùn)行進(jìn)程時(shí),先判斷內(nèi)存是否夠用。在內(nèi)存可以分配的情況下,考慮資源的分配情況。用銀行家算法檢測資源分配序列是否平安。2.2文件的組織構(gòu)造圖及函數(shù)設(shè)計(jì)下面是文件的組織構(gòu)造圖。memroy.h文件的函數(shù)設(shè)計(jì)system.h文件的函數(shù)設(shè)計(jì)system.cpp文件的函數(shù)設(shè)計(jì)3、詳細(xì)設(shè)計(jì)3.1內(nèi)存的定義classMemory{structMemoryBlock//內(nèi)存塊 {intaddress; //地址intlength; //塊長度 MemoryBlock(intaddress=0,intlength=0)://在初始化列表里初始化 address(address),length(length){} };public:structProcess//進(jìn)程 {intid; //idintsize; //所需內(nèi)存大小 Process(intid,intsize): id(id),size(size){} }; Memory(inttotalSize);boolassign(constProcess&process); //分配塊voidrecovercy(intid); //回收塊private:voidbine(vector<MemoryBlock>::iteratoriter); //合并塊vector<MemoryBlock>unassignedArea; //未分配區(qū)map<int,MemoryBlock>assignedArea; //已分配區(qū)};3.2System類的定義classSystem{enumTaskState//枚舉作業(yè)狀態(tài) {New, //新建態(tài)Ready, //就緒態(tài)Waiting, //等待態(tài)E*it//終止態(tài) };structPCB//進(jìn)程控制塊 {intid; //進(jìn)程idintmemory; //主存需求量TaskStatestate; //任務(wù)狀態(tài)intrequire[3]; //資源需求量intoccupy[3]; //已占用資源intapply[3]; //當(dāng)前申請量boolisEnd; //是否執(zhí)行完成public:PCB&operator=(PCB&pcb)//重載賦值函數(shù) {this->id=pcb.id;this->state=pcb.state;for(inti=0;i<3;++i) {this->require[i]=pcb.require[i];this->occupy[i]=pcb.occupy[i];this->apply[i]=pcb.apply[i]; }this->isEnd=pcb.isEnd;return*this; } };structRequest//資源請求 {intno; //序列編號intid; //進(jìn)程idintnumber[3]; //資源數(shù)量public: Request(intno,intid,intr1,intr2,intr3) {this->no=no;this->id=id; number[0]=r1; number[1]=r2; number[2]=r3; } };public:e*plicitSystem();voidstart(); //開場調(diào)度private:voidcreateProgress(); //創(chuàng)立進(jìn)程信息voidcreateResourceRequest(); //創(chuàng)立資源請求信息boolisSafeState(intavailable[]); //當(dāng)前是否是平安狀態(tài)voidwakeup(); //喚醒滿足要求的等待狀態(tài)的進(jìn)程TaskStatebanker(deque<int>::iteratoriter,intno); //銀行家算法Memorymemory; //內(nèi)存管理PCBprogress[5]; //進(jìn)程控制deque<Request>resourceRequest; //資源請求序列deque<int>readyQueue; //就緒隊(duì)列deque<int>waitingQueue; //等待隊(duì)列intleftResource[3]; //當(dāng)前剩余資源};3.3內(nèi)存管理的核心代碼//采用First-Fit算法,建立了兩個(gè)分區(qū)表:已分配表和為分配表boolMemory::assign(constProcess&process){for(vector<MemoryBlock>::iteratoriter=unassignedArea.begin();iter!=unassignedArea.end();++iter) {if(process.size<=iter->length) { assignedArea[process.id]=MemoryBlock(iter->address,process.size); iter->address+=process.size; iter->length-=process.size;if(0==iter->length)//已經(jīng)分配完畢 unassignedArea.erase(iter);//刪除iter所指的元素returntrue; } }returnfalse;}voidMemory::recovercy(intid){map<int,MemoryBlock>::iteratorprocessIter=assignedArea.find(id);vector<MemoryBlock>::iteratoriter;for(iter=unassignedArea.begin();iter!=unassignedArea.end();++iter) {if(iter->address>processIter->second.address)break; } iter=unassignedArea.insert(iter,processIter->second); assignedArea.erase(processIter); bine(iter);//調(diào)用下面的bine()函數(shù)}voidMemory::bine(vector<MemoryBlock>::iteratoriter){if((iter+1)!=unassignedArea.end()//在已分配表中查找 &&iter->address+iter->length==(iter+1)->address) {iter->length+=(iter+1)->length;iter=unassignedArea.erase(iter+1)-1; }if(iter!=unassignedArea.begin() &&(iter-1)->address+(iter-1)->length==iter->address) { (iter-1)->length+=iter->length;iter=unassignedArea.erase(iter); }}3.4銀行家算法的核心代碼System::TaskStateSystem::banker(deque<int>::iteratoriter,intno){intlength[3];//判斷能否滿足進(jìn)程的當(dāng)前資源請求if(progress[*iter-1].apply[0]>leftResource[0]|| progress[*iter-1].apply[1]>leftResource[1]|| progress[*iter-1].apply[2]>leftResource[2]) //如果申請的資源大于剩余的資源 { progress[*iter-1].state=Waiting; //進(jìn)程等待 waitingQueue.push_back(*iter); //移入等待隊(duì)列iter=readyQueue.erase(iter);returnWaiting; }//假定對申請資源的進(jìn)程分配資源PCBbackup; backup=progress[*iter-1];for(inti=0;i<3;++i) { length[i]=leftResource[i]; progress[*iter-1].occupy[i]+=progress[*iter-1].apply[i]; length[i]-=progress[*iter-1].apply[i]; }if((progress[*iter-1].require[0]-progress[*iter-1].occupy[0]>length[0]|| progress[*iter-1].require[1]-progress[*iter-1].occupy[1]>length[1]|| progress[*iter-1].require[2]-progress[*iter-1].occupy[2]>length[2])&& !isSafeState(length)) //如果還需要的資源大于剩余的資源并且不是平安狀態(tài) { progress[*iter-1].occupy[0]=backup.occupy[0]; //復(fù)原當(dāng)前進(jìn)程占用資源數(shù) progress[*iter-1].occupy[1]=backup.occupy[1]; progress[*iter-1].occupy[2]=backup.occupy[2]; progress[*iter-1].state=Waiting; waitingQueue.push_back(*iter);iter=readyQueue.erase(iter);returnWaiting; } cout<<right<<setw(7)<<no<<"J"<<*iter<<endl;for(inti=0;i<3;++i) { leftResource[i]-=progress[*iter-1].apply[i]; //分配成功,剩余資源減少 progress[*iter-1].apply[i]=0; //重置當(dāng)前資源申請量 } if(progress[*iter-1].occupy[0]==progress[*iter-1].require[0]&& progress[*iter-1].occupy[1]==progress[*iter-1].require[1]&& progress[*iter-1].occupy[2]==progress[*iter-1].require[2]) { progress[*iter-1].state=E*it; //當(dāng)前進(jìn)程改為終止態(tài)//重置當(dāng)前進(jìn)程已占用資源 progress[*iter-1].occupy[0]=progress[*iter-1].occupy[1]=progress[*iter-1].occupy[2]=0; //歸還系統(tǒng)資源 leftResource[0]+=progress[*iter-1].require[0]; leftResource[1]+=progress[*iter-1].require[1]; leftResource[2]+=progress[*iter-1].require[2];//釋放內(nèi)存 memory.recovercy(*iter);//刪除進(jìn)程 readyQueue.erase(iter);//喚醒等待進(jìn)程 wakeup();returnE*it; }elsereturnReady;}運(yùn)行與調(diào)試從以上截圖可以看出,根本上實(shí)現(xiàn)了課程設(shè)計(jì)的要求。資源請求序列正確??此坪唵蔚膯栴},其實(shí)暗藏一定的技術(shù)難度。主要是算法的設(shè)計(jì)問題,分區(qū)管理算法和銀行家算法要綜合起來一起考慮,這樣才能寫出正確的程序,從而順利的完本錢次課程設(shè)計(jì)。本次課程設(shè)計(jì)比擬好的地方就是它的文檔構(gòu)造比擬清楚,這樣利于組織管理,利于編碼實(shí)現(xiàn)。采用了自頂向下,逐步求精的設(shè)計(jì)思路。從實(shí)驗(yàn)結(jié)果的截圖上可以看出,沒有打印出模擬的過程,這是本實(shí)驗(yàn)的缺乏之處之一。另外,把所申請的資源寫入了程序,也是一個(gè)小小的缺乏。因?yàn)檫@樣失去了交互性,不過,帶來的好處就是我們不需要手動(dòng)輸入數(shù)據(jù)。實(shí)驗(yàn)六 處理機(jī)管理FCFS:在多道程序或多任務(wù)系統(tǒng)中,系統(tǒng)中同時(shí)處于就緒態(tài)的進(jìn)程又假設(shè)干個(gè),也就是說能運(yùn)行的進(jìn)程數(shù)遠(yuǎn)遠(yuǎn)大于處理機(jī)個(gè)數(shù),為了使系統(tǒng)中的各個(gè)進(jìn)程能有條不紊的運(yùn)行,必須選擇*種調(diào)度策略,以選擇一進(jìn)程占用處理機(jī)。RR:如果早就緒的進(jìn)程排在就緒隊(duì)列的前面,遲就緒的進(jìn)程排在就緒隊(duì)列的后面,則先來先效勞FCFS(firstefirstservice)總是把當(dāng)前處于就緒隊(duì)列之首的那個(gè)進(jìn)程調(diào)度到運(yùn)行狀態(tài)。也就說,它只考慮進(jìn)程進(jìn)入就緒隊(duì)列的先后,而不考慮它的下一個(gè)CPU周期的長短及其他因素。FCFS算法簡單易行,但性能卻不大好。如果在時(shí)間片完畢時(shí)進(jìn)程還在運(yùn)行,則CPU將被剝奪并分配給另一個(gè)進(jìn)程。如果進(jìn)程在時(shí)間片完畢前阻塞或完畢,則CPU當(dāng)即進(jìn)展切換。調(diào)度程序所要做的就是維護(hù)一*就緒進(jìn)程列表,當(dāng)進(jìn)程用完它的時(shí)間片后,它被移到隊(duì)列的末尾。優(yōu)先級調(diào)度:〔1〕當(dāng)該算法用于作業(yè)調(diào)度時(shí),系統(tǒng)從后備作業(yè)隊(duì)列中選擇假設(shè)干個(gè)優(yōu)先級最高的,且系統(tǒng)能滿足資源要求的作業(yè)裝入內(nèi)存運(yùn)行。〔2〕當(dāng)該算法用于進(jìn)程調(diào)度時(shí),將把處理機(jī)分配給就緒進(jìn)程隊(duì)列中優(yōu)先級最高的進(jìn)程。程序中使用的數(shù)據(jù)構(gòu)造及主要符號說明structtask_struct{charname[10];/*進(jìn)程名稱*/intnumber;/*進(jìn)程編號*/floate_time;/*到達(dá)時(shí)間*/floatrun_begin_time;/*開場運(yùn)行時(shí)間*/floatrun_time;/*運(yùn)行時(shí)間*/floatrun_end_time;/*運(yùn)行完畢時(shí)間*/intpriority;/*優(yōu)先級*/intorder;/*運(yùn)行次序*/intrun_flag;/*調(diào)度標(biāo)志*/}tasks[MA*];程序流程圖1>main函數(shù)以及進(jìn)程信息的輸入2>先來先效勞進(jìn)程調(diào)度算法〔FCFS〕具體設(shè)計(jì):①先來先效勞intfcfs()/*先來先效勞算法*/{fcfsinput();floattime_temp=0;inti;intnumber_schedul;time_temp=tasks[0].e_time;for(i=0;i<counter;i++){tasks[i].run_begin_time=time_temp;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;time_temp=tasks[i].run_end_time;number_schedul=i;tasks[number_schedul].order=i+1;}fcfsoutput();return0;}intfcfsinput()/*進(jìn)程參數(shù)的初始化,按照教材127頁最上面的表格*/{ task_structtt;inti,j;//初始化進(jìn)程數(shù)counter=3;//初始化每個(gè)到達(dá)系統(tǒng)的時(shí)間tasks[0].e_time=rand()%9;tasks[1].e_time=rand()%9;tasks[2].e_time=rand()%9;for(i=1;i<3;i++){ for(j=0;j<3-i;j++) { if(tasks[j].e_time>tasks[j+1].e_time) { tt=tasks[j]; tasks[j]=tasks[j+1]; tasks[j+1]=tt; } }}//初始化每個(gè)進(jìn)程估計(jì)運(yùn)行的時(shí)間tasks[0].run_time=28;tasks[1].run_time=9;tasks[2].run_time=3;//初始化每個(gè)進(jìn)程的名字 tasks[0].name='A';tasks[1].name='B';tasks[2].name='C'; cout<<"************************先來先效勞算法************************"<<endl<<endl;for(i=0;i<counter;i++){tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}return0;}intfcfsoutput()/*調(diào)度結(jié)果輸出*/{inti;floatturn_round_time=0,f1,w=0;cout<<"作業(yè)名到達(dá)時(shí)間運(yùn)行時(shí)間開場時(shí)間停頓時(shí)間運(yùn)行次序周轉(zhuǎn)時(shí)間"<<endl;for(i=0;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].e_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].e_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}cout<<"平均周轉(zhuǎn)時(shí)間:"<<turn_round_time/counter<<endl;cout<<"平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<w/counter<<endl;cout<<"";return0;}②優(yōu)先級調(diào)度intps()/*優(yōu)先級調(diào)度*/{psinput();floattemp_time=0;inti=0,j;intnumber_schedul,temp_counter;intma*_priority;ma*_priority=tasks[i].priority;j=1;while((j<counter)&&(tasks[i].e_time==tasks[j].e_time)){if(tasks[j].priority>=tasks[i].priority){ma*_priority=tasks[j].priority;i=j;}j++;}/*查找第一個(gè)被調(diào)度的進(jìn)程*//*對第一個(gè)被調(diào)度的進(jìn)程求相應(yīng)的參數(shù)*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].e_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;while(temp_counter<counter){ma*_priority=0;for(j=0;j<counter;j++){if((tasks[j].e_time<=temp_time)&&(!tasks[j].run_flag))if(tasks[j].priority>ma*_priority){ma*_priority=tasks[j].priority;number_schedul=j;}}tasks[number_schedul].run_begin_time=temp_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;temp_counter++;tasks[number_schedul].order=temp_counter;}psoutput();return0;}intpsinput()/*進(jìn)程參數(shù)的初始化*/{inti;//初始化進(jìn)程數(shù)counter=3;//初始化每個(gè)到達(dá)系統(tǒng)的時(shí)間tasks[0].e_time=4;tasks[1].e_time=5;tasks[2].e_time=6;//初始化每個(gè)進(jìn)程估計(jì)運(yùn)行的時(shí)間tasks[0].run_time=5;tasks[1].run_time=10;tasks[2].run_time=8;//初始化每個(gè)進(jìn)程的名字 tasks[0].name='A';tasks[1].name='B';tasks[2].name='C'; //初始化優(yōu)先級 tasks[0].priority=rand()%5+3;tasks[1].priority=rand()%3;tasks[2].priority=rand()%3; cout<<"****************************優(yōu)先級調(diào)度算法****************************"<<endl<<endl;for(i=0;i<counter;i++){tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}return0;}intpsoutput()/*調(diào)度結(jié)果輸出*/{inti;floatturn_round_time=0,f1,w=0;cout<<"作業(yè)名到達(dá)時(shí)間運(yùn)行時(shí)間開場時(shí)間停頓時(shí)間優(yōu)先級運(yùn)行次序周轉(zhuǎn)時(shí)間"<<endl;for(i=0;i<1;i++){f1=tasks[i].run_end_time-tasks[i].e_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].e_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<'\t'<<tasks[i].priority<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}for(i=1;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].e_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);cout<<""<<tasks[i].name<<'\t'<<""<<tasks[i].e_time<<'\t'<<""<<tasks[i].run_time<<'\t'<<""<<tasks[i].run_begin_time<<'\t'<<""<<tasks[i].run_end_time<<'\t'<<tasks[i].priority<<'\t'<<tasks[i].order<<'\t'<<f1<<'\t'<<endl;}cout<<"平均周轉(zhuǎn)時(shí)間:"<<turn_round_time/counter<<endl;cout<<"平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<w/counter<<endl;return0;}③時(shí)間片輪轉(zhuǎn)法intrr(){intn=3,num=0;node*head=NULL;node*tail=NULL;cout<<"*********************時(shí)間片輪轉(zhuǎn)調(diào)度算法*********************"<<endl<<endl;for(inti=0;i<n;i++){node*temp=newnode; if(i==0)strcpy(temp->name,"A"); if(i==1)strcpy(temp->name,"B"); if(i==2)strcpy(temp->name,"C");temp->need_time=rand()%4+1;temp->state='R';//初始狀態(tài)每個(gè)進(jìn)程均為運(yùn)行態(tài)temp->allocation=0; //初始時(shí)進(jìn)程均不占用cpunum+=temp->need_time;//用num來限制循環(huán)的次數(shù)if(!head){tail=head=temp;}else{tail->ne*t=temp;tail=temp;tail->ne*t=head;}}node*p;p=head;cout<<endl<<"初始時(shí)刻:"<<endl;cout<<"進(jìn)程"<<'\t'<<"剩余時(shí)間"<<'\t'<<"占用cpu時(shí)間"<<endl;while(p!=tail){ cout<<""<<p->name<<'\t'<<""<<p->need_time<<'\t'<<'\t'<<p->allocation<<'s'<<endl; p=p->ne*t;}cout<<""<<tail->name<<'\t'<<""<<tail->need_time<<'\t'<<'\t'<<p->allocation<<'s'<<endl;node*q;intlabel=1;inti=1;while(label==1&&i<=num){ cout<<endl; label=0;while(!p->need_time){ p=p->ne*t;}if(p->need_time){ p->need_time--; p->allocation++; if(p->need_time==0) { p->state='E'; } label=1; p=p->ne*t;}cout<<"執(zhí)行"<<i<<"秒后:"<<endl;q=head;cout<<"進(jìn)程"<<'\t'<<"剩余時(shí)間"<<'\t'<<"占用cpu時(shí)間"<<endl;while(q!=tail){ cout<<""<<q->name<<'\t'<<""<<q->need_time<<'\t'<<'\t'<<q->allocation<<'s'<<endl; q=q->ne*t;}cout<<""<<tail->name<<'\t'<<""<<tail->need_time<<'\t'<<'\t'<<q->allocation<<'s'<<endl;i++;}cout<<endl<<"";return0;}結(jié)果如下:為了驗(yàn)證該程序的通用性,下面我把3個(gè)作業(yè)的調(diào)度順序改為2、1、3,對于的程序片段修改如下://初始化每個(gè)進(jìn)程估計(jì)運(yùn)行的時(shí)間tasks[0].run_time=9;tasks[1].run_time=28;tasks[2].run_time=3;然后得到了下面的結(jié)果:結(jié)果符合教材127頁中提到的結(jié)果,平均作業(yè)時(shí)間為29ms,進(jìn)一步說明的程序的正確性和通用性。繼續(xù)調(diào)整作業(yè)進(jìn)入順序,將進(jìn)入順序調(diào)整為3、2、1可以得到:實(shí)驗(yàn)八 主存空間的分配與回收FIFO先進(jìn)先出頁面替換算法,基于程序總是按線性順序來物理空間這一假設(shè),總是淘汰最先調(diào)入主存的頁面,即淘汰在主存中駐留時(shí)間最長的頁面,認(rèn)為駐留時(shí)間最長的頁不再使用的可能性最大。LRU最近最少使用頁面替換算法淘汰的頁面是在最近一段時(shí)間內(nèi)最久未被的那一頁,它是基于程序局部性原理來考慮的,認(rèn)為那些剛被使用過的頁面可能還要立即被使用,而那些在較長時(shí)間內(nèi)未被使用的頁面可能不會(huì)立即使用。OPT最正確頁面替換算法,當(dāng)要調(diào)入一頁而必須淘汰舊頁時(shí),應(yīng)該淘汰以后不再的頁,或距現(xiàn)在最長時(shí)間后要的頁面。開始開始調(diào)度算法選擇輸入1輸入2輸入3FIFO置換算法LRU置換算法OPT置換算法結(jié)束初始化內(nèi)存塊數(shù)組與頁面串?dāng)?shù)組圖1程序流程圖開始開始將內(nèi)存塊數(shù)組當(dāng)前列分別賦值為上一列元素當(dāng)前頁面號在內(nèi)存塊中是否存在.否是缺頁,找到內(nèi)存塊數(shù)組中最先進(jìn)入的頁面將該頁面號賦值為當(dāng)前需調(diào)入內(nèi)存的頁面號,time標(biāo)記重置為1,缺頁數(shù)加1,缺頁*標(biāo)記置1結(jié)束輸出內(nèi)存塊調(diào)度結(jié)果圖2FIFO置換調(diào)度算法流程圖①最正確頁面替換算法voidOPT(){ intlength; intopt[100]={0}; intpageLength; intoptPage[100]={0}; intpare[100]={0}; intpares=1; inti,j,k; cout<<"***************************最正確頁面調(diào)度算法***********************"<<endl; pageLength=3; length=9; cout<<"時(shí)刻t"<<'\t'; for(i=0;i<length;i++) { cout<<i<<'\t'; }cout<<endl<<"引用串"<<'\t'; for(i=1;i<=length;i++) { opt[i]=rand()%5+1; cout<<opt[i]<<'\t'; } for(i=1;i<=length;i++) { pares=1; for(intll=1;ll<=100;ll++) { pare[ll]=0; } intflag=0; for(j=1;j<=pageLength;j++) { if(opt[i]==optPage[j]) { flag=1; j=pageLength+1; } elseif(optPage[j]==0) { optPage[j]=opt[i]; j=pageLength+1; flag=1; } } if(flag==1){ } else { for(j=1;j<=pageLength;j++) { for(intk=i;k<=length;k++) { if(optPage[j]==opt[k]) { k=length+1; } else { pare[pares]++; } } pares++; } for(k=1;k<pageLength;k++) { if(pare[k]>=pare[k+1]) { pare[k+1]=pare[k]; } else { } } flag=pare[pageLength]; for(k=1;k<=pageLength;k++) { if(flag==pare[k]) { flag=k; k=pageLength+1; } } cout<<"→淘汰"<<optPage[flag]<<endl; optPage[flag]=opt[i]; } cout<<endl<<"t="<<i-1<<"時(shí)"<<'\t'; for(intjk=1;jk<=pageLength;jk++) { cout<<"P"<<jk<<'\t'; } cout<<endl<<'\t'; for(ints=1;s<=pageLength;s++){ cout<<optPage[s]<<'\t'; } cout<<endl; }}②先進(jìn)先出頁面替換算法voidFIFO(){ intlength; intfifo[100]={0}; intpageLength; intfifoPage[100]={0}; inti,j; cout<<"***********************先進(jìn)先出頁面調(diào)度算法**************************"<<endl; pageLength=3; length=9; cout<<"時(shí)刻t"<<'\t'; for(i=0;i<length;i++) { cout<<i<<'\t'; }cout<<endl<<"引用串"<<'\t'; for(i=1;i<=length;i++) { fifo[i]=rand()%5+1; cout<<fifo[i]<<'\t'; } for(i=1;i<=length;i++){ intflag=0; for(j=1;j<=pageLength;j++){ if(fifo[i]==fifoPage[j]){ flag=1; j=pageLength+1; }elseif(fifoPage[j]==0){ fifoPage[j]=fifo[i]; j=pageLength+1; flag=1; } } if(flag==1) { } else { cout<<"→淘汰"<<fifoPage[1]<<endl; for(j=1;j<=pageLength;j++){ fifoPage[j]=fifoPage[j+1]; } fifoPage[pageLength]=fifo[i]; } cout<<endl<<"t="<<i-1<<"時(shí)"<<'\t'; for(intjk=1;jk<=pageLength;jk++) { cout<<"P"<<jk<<'\t'; } cout<<endl<<'\t'; for(ints=1;s<=pageLength;s++){ cout<<fifoPage[s]<<'\t'; } cout<<endl; }}③最近最少使用頁面替換算法voidLRU(){ intlength; intlru[100]={0}; intpageLength; intlruPage[100]={0}; inti,j; cout<<"***********************最近最少使用頁面替換算法***********************"<<endl; pageLength=3; length=9; cout<<"時(shí)刻t"<<'\t'; for(i=0;i<length;i++) { cout<<i<<'\t'; }cout<<endl<<"引用串"<<'\t'; for(i=1;i<=length;i++) { lru[i]=rand()%5+1; cout<<lru[i]<<'\t'; } for(i=1;i<=length;i++){ intflag=0; for(j=1;j<=pageLength;j++){ if(lru[i]==lruPage[j]){ for(intcc=j;cc>0;cc--){ lruPage[cc]=lruPage[cc-1]; } lruPage[1]=lru[i]; flag=1; j=pageLength+1; }elseif(lruPage[j]==0){ for(intvv=j;vv>0;vv--){ lruPage[vv]=lruPage[vv-1]; } lruPage[1]=lru[i]; j=pageLength+1; flag=1; } } if(flag==1) { } else { cout<<"→淘汰"<<lruPage[pageLength]<<endl; for(j=pageLength;j>0;j--){ lruPage[j]=lruPage[j-1]; } lruPage[1]=lru[i]; } cout<<endl<<"t="<<i-1<<"時(shí)"<<'\t'; for(intjk=1;jk<=pageLength;jk++) { cout<<"P"<<jk<<'\t'; } cout<<endl<<'\t'; for(ints=1;s<=pageLength;s++){ cout<<lruPage[s]<<'\t'; } cout<<endl; }}實(shí)驗(yàn)十磁盤移臂調(diào)度FCFS先來先效勞驅(qū)動(dòng)調(diào)度算法中,移動(dòng)臂是隨機(jī)移動(dòng)的,不考慮各I/O請求之間的相對次序和移動(dòng)臂當(dāng)前所處的位置,進(jìn)程等待I/O請求的時(shí)間會(huì)很長,尋道性能較差。SSTF最短查找時(shí)間優(yōu)先驅(qū)動(dòng)調(diào)度算法考慮I/O請求之間的區(qū)別,總是執(zhí)行查找時(shí)間最短的請求,與FCFS算法相比有較好的尋道性能。電梯調(diào)度算法每次總是選擇沿移動(dòng)臂的移動(dòng)方向最近的那個(gè)柱面,假設(shè)同一柱面上有多個(gè)請求,還需進(jìn)展旋轉(zhuǎn)優(yōu)化。如果當(dāng)前移動(dòng)方向上沒有請求時(shí),就改變移動(dòng)臂的移動(dòng)方向,然后,處理所遇到的最近的I/O請求。①先來先效勞算法voidybfcfs(){ intnum=100; intcurrentNum=rand()%100; intjustNum; intlength=6; intfcfs[100]={0}; intsum=0; cout<<"*************************先來先效勞調(diào)度算法***********************"<<endl; cout<<"默認(rèn)磁盤柱面數(shù)量為100"<<endl; cout<<"當(dāng)前存取臂的位置為:"<<currentNum<<endl; cout<<"請求隊(duì)列序列為:"; for(inti=1;i<=length;i++){ fcfs[i]=rand()%100; cout<<fcfs[i]<<'\t'; } sum=sum+abs(currentNum-fcfs[1]); for(intj=1;j<length;j++) { sum=sum+abs(fcfs[j]-fcfs[j+1]); } cout<<endl; cout<<"存取臂移動(dòng)序列為:"<<currentNum; for(intk=1;k<=length;k++) { cout<<"-"<<fcfs[k]; } cout<<endl<<"存取臂移動(dòng)總量為:"<<sum<<endl;}②最短查找時(shí)間算法 voidsstf(){ intnum=100; intcurrentNum=rand()%100; intjustNum=rand()%100; intlength=6; intpare[100]={0}; intsstf[100]={0}; intfinalSstf[100]={0}; intsum=0; cout<<"***************************最短查找時(shí)間算法*************************"<<endl; cout<<"默認(rèn)磁盤柱面數(shù)量為100"<<endl; cout<<"當(dāng)前存取臂的位置為:"<<currentNum<<endl;// cout<<"剛完成的柱面號:"<<justNum<<endl; cout<<"請求隊(duì)列序列為:"; inti,j; for(i=1;i<=length;i++){ sstf[i]=rand()%100; cout<<sstf[i]<<'\t'; } intk; for(i=1;i<length;i++){//排序 for(intj=1;j<length;j++){ if(sstf[j]>sstf[j+1]){ k=sstf[j+1]; sstf[j+1]=sstf[j]; sstf[j]=k; } } } for(i=1;i<=length;i++) { //找出夾在currentNum值的兩個(gè)數(shù)i,i-1 if(currentNum>sstf[i]){ }else{ k=i; i=length+1; } } intheight; intlow; finalSstf[1]=currentNum;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論