




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
...操作系統(tǒng)實(shí)驗(yàn)實(shí)驗(yàn)一進(jìn)程調(diào)度實(shí)驗(yàn)?zāi)康亩嗟莱绦蛟O(shè)計(jì)中,經(jīng)常是若干個(gè)進(jìn)程同時(shí)處于就緒狀態(tài),必須依照某種策略來(lái)決定那個(gè)進(jìn)程優(yōu)先占有處理機(jī)。因而引起進(jìn)程調(diào)度。本實(shí)驗(yàn)?zāi)M在單處理機(jī)情況下的處理機(jī)調(diào)度問(wèn)題,加深對(duì)進(jìn)程調(diào)度的理解。實(shí)驗(yàn)要求1.設(shè)計(jì)進(jìn)程調(diào)度算法,進(jìn)程數(shù)不定2.包含幾種調(diào)度算法,并加以實(shí)現(xiàn)3.輸出進(jìn)程的調(diào)度過(guò)程——進(jìn)程的狀態(tài)、鏈表等。參考例1.題目——優(yōu)先權(quán)法、輪轉(zhuǎn)法簡(jiǎn)化假設(shè)進(jìn)程為計(jì)算型的(無(wú)I/O)進(jìn)程狀態(tài):ready、running、finish進(jìn)程需要的CPU時(shí)間以時(shí)間片為單位確定2.算法描述優(yōu)先權(quán)法——?jiǎng)討B(tài)優(yōu)先權(quán)當(dāng)前運(yùn)行進(jìn)程用完時(shí)間片后,其優(yōu)先權(quán)減去一個(gè)常數(shù)。輪轉(zhuǎn)法實(shí)驗(yàn)流程圖開(kāi)始鍵盤(pán)輸入進(jìn)程數(shù)n,和調(diào)度方法的選擇BNB優(yōu)先權(quán)法?輪轉(zhuǎn)法Y產(chǎn)生n個(gè)進(jìn)程,對(duì)每個(gè)進(jìn)程產(chǎn)生一個(gè)PCB,并用隨機(jī)數(shù)產(chǎn)生進(jìn)程的優(yōu)先權(quán)及進(jìn)程所需的CPU時(shí)間按優(yōu)先權(quán)大小,把n個(gè)進(jìn)程拉成一個(gè)就緒隊(duì)列初始化其他數(shù)據(jù)結(jié)構(gòu)區(qū)鏈鏈?zhǔn)走M(jìn)程投入運(yùn)行時(shí)間片到,進(jìn)程所需的CPU時(shí)間減1,優(yōu)先權(quán)減3,輸出個(gè)進(jìn)程的運(yùn)行情況所需的CPU時(shí)間=0?撤銷(xiāo)進(jìn)程就緒隊(duì)列為空?將進(jìn)程插入就緒隊(duì)列NYYN結(jié)束B(niǎo)B產(chǎn)生n個(gè)進(jìn)程,對(duì)每個(gè)進(jìn)程用隨機(jī)數(shù)產(chǎn)生進(jìn)程的輪轉(zhuǎn)時(shí)間片數(shù)及進(jìn)程所需的時(shí)間片數(shù),已占用CPU的時(shí)間片數(shù)置為0按進(jìn)程產(chǎn)生的先后次序拉成就緒隊(duì)列鏈鏈?zhǔn)走M(jìn)程投入運(yùn)行時(shí)間片到時(shí)間片到,進(jìn)程所需時(shí)間片數(shù)減1,已占用CPU時(shí)間片數(shù)加1輸出各進(jìn)程的運(yùn)行情況進(jìn)程所需時(shí)間片數(shù)=0?撤銷(xiāo)該進(jìn)程占用CPU的時(shí)間片數(shù)=輪轉(zhuǎn)時(shí)間片數(shù)?占用CPU的時(shí)間片數(shù)置為0把該進(jìn)程插入就緒隊(duì)列尾NYNY結(jié)束就緒隊(duì)列為空嗎?Y注意:1.產(chǎn)生的各種隨機(jī)數(shù)的取值范圍加以限制,如所需的CPU時(shí)間限制在1~20之間。2.進(jìn)程數(shù)n不要太大通常取4~8個(gè)3.使用動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)4.獨(dú)立編程5.至少三種調(diào)度算法6.若有可能請(qǐng)?jiān)趫D形方式下,將PCB的調(diào)度用圖形成動(dòng)畫(huà)顯示。五.實(shí)驗(yàn)過(guò)程:(1)輸入:進(jìn)程流文件(1.txt),其中存儲(chǔ)的是一系列要執(zhí)行的進(jìn)程,每個(gè)作業(yè)包括四個(gè)數(shù)據(jù)項(xiàng):進(jìn)程名進(jìn)程狀態(tài)(1就緒2等待3運(yùn)行)所需時(shí)間優(yōu)先數(shù)(0級(jí)最高)進(jìn)程01502進(jìn)程12104進(jìn)程21150進(jìn)程33285進(jìn)程42191進(jìn)程5387輸出:進(jìn)程執(zhí)行流等待時(shí)間,平均等待時(shí)間本程序包括:FIFO算法,優(yōu)先數(shù)調(diào)度算法,時(shí)間片輪轉(zhuǎn)調(diào)度算法程調(diào)度;importjava.util.*;classPCB//創(chuàng)建進(jìn)程塊{intId;//進(jìn)程編號(hào)intUseTime;//服務(wù)時(shí)間intNeedTime;//需要時(shí)間intPerior;//優(yōu)先級(jí)StringStatus;//狀態(tài)PCB(){Id++;UseTime=0;NeedTime=(int)Math.round(Math.random()*6)+1;//隨機(jī)產(chǎn)生需要時(shí)間Perior=(int)Math.round(Math.random()*5)+1;//隨即產(chǎn)生優(yōu)先級(jí)Status="Ready";//初始狀態(tài)為就緒}}classFound//定義系統(tǒng)處理方法類(lèi){ArrayList<PCB>sequnce;//創(chuàng)建就緒隊(duì)列PCBpcb[]=newPCB[5];intStartTime=0;intSystemTime=(int)(Math.random()*3)+1;//隨即產(chǎn)生系統(tǒng)時(shí)間Found(){sequnce=newArrayList<PCB>();for(inti=0;i<5;i++){pcb[i]=newPCB();pcb[i].Id=i+1;sequnce.add(pcb[i]);}}voidFCFS()//先來(lái)先服務(wù)算法{PCBRunning=null;while(sequnce.size()>0)//就緒隊(duì)列不為空{(diào)Running=sequnce.remove(0);Running.UseTime=Running.NeedTime;Running.NeedTime=0;Running.Perior=0;System.out.println("當(dāng)前系統(tǒng)時(shí)間:"+SystemTime);SystemTime+=Running.UseTime;ShowMessages(Running);}}voidRR()//時(shí)間片輪換算法{PCBRunning=null;intTime=SystemTime;while(sequnce.size()>0){System.out.println("當(dāng)前系統(tǒng)時(shí)間:"+SystemTime);Running=sequnce.remove(0);if(Running.NeedTime<=Time){Running.UseTime=Running.NeedTime;Running.NeedTime=0;Running.Perior=0;Running.Status="Finish";SystemTime+=Running.UseTime;}else{Running.UseTime+=Time;Running.NeedTime-=Time;Running.Perior--;Running.Status="Ready";sequnce.add(Running);SystemTime+=Time;}ShowMessages(Running);}}voidShowMessages(PCBp)//輸出信息{System.out.println("當(dāng)前運(yùn)行進(jìn)程:"+p.Id+""+"服務(wù)時(shí)間:"+p.UseTime+""+"需要時(shí)間:"+p.NeedTime+""+"優(yōu)先級(jí):"+p.Perior+""+"狀態(tài):"+p.Status);if(sequnce.size()>0){System.out.println("當(dāng)前就緒進(jìn)程:");for(PCBp1:sequnce){System.out.println("進(jìn)程編號(hào):"+p1.Id+""+"服務(wù)時(shí)間:"+p1.UseTime+""+"需要時(shí)間:"+p1.NeedTime+""+"優(yōu)先級(jí):"+p1.Perior+""+"狀態(tài):"+p1.Status);System.out.println("");}}else{System.out.println("當(dāng)前系統(tǒng)中已經(jīng)沒(méi)有就緒進(jìn)程!");}System.out.println('\n');}}classMenu//主界面菜單{Scannersc=newScanner(System.in);intprint(){System.out.println("********************************************");System.out.println("進(jìn)調(diào)度算法演示");System.out.println("********************************************");System.out.println("1.先來(lái)先服務(wù)(FCFS)算法");System.out.println("2.時(shí)間片輪換(RR)算法");System.out.println("3.退出該程序");System.out.print("請(qǐng)選擇所要采用的算法:");intflag=sc.nextInt();returnflag;}voidselect(){intflag=print();switch(flag){case1:FoundProcess1=newFound();Process1.FCFS();print();case2:FoundProcess2=newFound();Process2.RR();print();case3:System.exit(0);default:break;}}}package進(jìn)程調(diào)度;publicclassProcessControl{publicstaticvoidmain(Stringargs[]){MenuTencent=newMenu();Tencent.select();}}(3)運(yùn)行結(jié)果:實(shí)驗(yàn)二銀行家算法實(shí)驗(yàn)?zāi)康乃梨i會(huì)引起計(jì)算機(jī)工作僵死,因此操作系統(tǒng)中必須防止。本實(shí)驗(yàn)的目的在于讓學(xué)生獨(dú)立的使用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)系統(tǒng)動(dòng)態(tài)分配資源的簡(jiǎn)單模擬程序,了解死鎖產(chǎn)生的條件和原因,并采用銀行家算法有效地防止死鎖的發(fā)生,以加深對(duì)課堂上所講授的知識(shí)的理解。實(shí)驗(yàn)要求設(shè)計(jì)有n個(gè)進(jìn)程共享m個(gè)系統(tǒng)資源的系統(tǒng),進(jìn)程可動(dòng)態(tài)的申請(qǐng)和釋放資源,系統(tǒng)按各進(jìn)程的申請(qǐng)動(dòng)態(tài)的分配資源。系統(tǒng)能顯示各個(gè)進(jìn)程申請(qǐng)和釋放資源,以及系統(tǒng)動(dòng)態(tài)分配資源的過(guò)程,便于用戶(hù)觀察和分析;三、數(shù)據(jù)結(jié)構(gòu)1.可利用資源向量Available,它是一個(gè)含有m個(gè)元素的數(shù)組,其中的每一個(gè)元素代表一類(lèi)可利用的資源的數(shù)目,其初始值是系統(tǒng)中所配置的該類(lèi)全部可用資源數(shù)目。其數(shù)值隨該類(lèi)資源的分配和回收而動(dòng)態(tài)地改變。如果Available(j)=k,標(biāo)是系統(tǒng)中現(xiàn)有Rj類(lèi)資源k個(gè)。2.最大需求矩陣Max,這是一個(gè)n×m的矩陣,它定義了系統(tǒng)中n個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)m類(lèi)資源的最大需求。如果Max(i,j)=k,表示進(jìn)程i需要Rj類(lèi)資源的最大數(shù)目為k。3.分配矩陣Allocation,這是一個(gè)n×m的矩陣,它定義了系統(tǒng)中的每類(lèi)資源當(dāng)前一分配到每一個(gè)進(jìn)程的資源數(shù)。如果Allocation(i,j)=k,表示進(jìn)程i當(dāng)前已經(jīng)分到Rj類(lèi)資源的數(shù)目為k。Allocation表示進(jìn)i程i的分配向量,有矩陣Allocation的第i行構(gòu)成。4.需求矩陣Need,這是一個(gè)n×m的矩陣,用以表示每個(gè)進(jìn)程還需要的各類(lèi)資源的數(shù)目。如果Need(i,j)=k,表示進(jìn)程i還需要Rj類(lèi)資源k個(gè),才能完成其任務(wù)。Need表示進(jìn)程i的需求向量,由矩陣Needi的第i行構(gòu)成。上述三個(gè)矩陣間存在關(guān)系:Need(i,j)=Max(i,j)-Allocation(i,j);四、銀行家算法Request是進(jìn)程Pi的請(qǐng)求向量。Request(j)=k表示進(jìn)程Pi請(qǐng)求分配Rj類(lèi)資源k個(gè)。當(dāng)Pi發(fā)出資源i i請(qǐng)求后,系統(tǒng)按下述步驟進(jìn)行檢查:1.如果Request≤Need,則轉(zhuǎn)向步驟2;否則,認(rèn)為出錯(cuò),因?yàn)樗?qǐng)求的資源數(shù)已超過(guò)它當(dāng)前的最大i需求量。2.如果Request≤Available,則轉(zhuǎn)向步驟3;否則,表示系統(tǒng)中尚無(wú)足夠的資源滿(mǎn)足Pi的申請(qǐng),Pi必須i等待。3.系統(tǒng)試探性地把資源分配給進(jìn)程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:Available=Available-RequestiAllocation=Allocation+Requesti i iNeed=Need-Request4.系統(tǒng)行安全算法,查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。如果安全才正式將資源分配給進(jìn)程Pi,以完成本次分配;否則,將試探分配作廢,恢復(fù)原來(lái)的資源分配狀態(tài),讓進(jìn)程Pi等待。假定系統(tǒng)有5個(gè)進(jìn)程(p0,p1,p2,p3,p4)和三類(lèi)資源(A,B,C),各種資源的數(shù)量分別為10,5,7,在T0時(shí)刻的資源分配情況如下圖:MaxAllocationNeedAvailableABCABCABCABCP0753010743332(230)P1322200122(302)(020)P2902302600P3222211011P4433002431五、安全性算法1.設(shè)置兩個(gè)向量。Work:它表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行的各類(lèi)資源數(shù)目,它包含m個(gè)元素,開(kāi)始執(zhí)行安全性算法時(shí),Work=Available。Finish:它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成,開(kāi)始Finish(I)=false;當(dāng)有足夠資源分配給進(jìn)程Pi時(shí),令Finish(i)=true;2.從進(jìn)程集合中找到一個(gè)能滿(mǎn)足下述條件的進(jìn)程。Finish(i)==false;Need≤work;如找則執(zhí)行步驟3;否則,執(zhí)行步驟4;3.當(dāng)進(jìn)程Pi獲得資源后,可順利執(zhí)行直到完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行Work=work+AllocationiFinish(i)=true;轉(zhuǎn)向步驟2;4.若所有進(jìn)程的Finish(i)都為true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。六、系統(tǒng)流程圖
開(kāi)開(kāi)始輸入資源數(shù)m,及各類(lèi)資源總數(shù),初始化輸入進(jìn)程數(shù)n,輸入進(jìn)程i的最大需求向量i≤nmax≤資源提示錯(cuò)誤i加1任選一個(gè)進(jìn)程作為輸入該進(jìn)程的資源請(qǐng)求量調(diào)用銀行家算法,及安全性算法,完成分配,或并該進(jìn)程的Need向量為0該進(jìn)程已運(yùn)行Need矩陣為所有進(jìn)程運(yùn)行結(jié)束NYYNNY初始化needNY七.銀行家算法程序代碼packageyinhangjia;importjava.util.Scanner;publicclassbanker{privateintProcess=0;//定義最大進(jìn)程數(shù)目privateintResource=0;//定義最大資源類(lèi)數(shù)privateintWork[];//定義系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類(lèi)資源數(shù)目privateintMAX[][];//定義進(jìn)程最大資源需求privateintAllocation[][];//定義進(jìn)程當(dāng)前已用資源數(shù)目privateintneed[][];//定義進(jìn)程需要資源數(shù)目privateintRequest[][];//定義進(jìn)程請(qǐng)求資源向量privatebooleanfinish[];//定義進(jìn)程完成標(biāo)志privateintAvailable[];privateintP[];privateScannerin=newScanner(System.in);//定義全局輸入流publicvoidclose(){in.close();}//構(gòu)造函數(shù),初始化各向量publicbanker()throwsException{inti,j;System.out.print("請(qǐng)輸入當(dāng)前進(jìn)程的個(gè)數(shù):");Process=in.nextInt();System.out.print("請(qǐng)輸入系統(tǒng)資源種類(lèi)的類(lèi)數(shù):");Resource=in.nextInt();//初始化各個(gè)數(shù)組Available=newint[Resource];Work=newint[Resource];MAX=newint[Process][Resource];Allocation=newint[Process][Resource];need=newint[Process][Resource];Request=newint[Process][Resource];finish=newboolean[Process];P=newint[Process];System.out.println("請(qǐng)輸入每個(gè)進(jìn)程最大資源需求量,按"+Process+"*"+Resource+"矩陣輸入:");for(i=0;i<Process;i++){System.out.print("請(qǐng)輸入P"+(i+1)+"進(jìn)程各類(lèi)資源最大需求量:");for(j=0;j<Resource;j++)MAX[i][j]=in.nextInt();}System.out.println("請(qǐng)輸入每個(gè)進(jìn)程已分配的各資源數(shù),也按照"+Process+"*"+Resource+"矩陣輸入:");for(i=0;i<Process;i++){System.out.print("請(qǐng)輸入P"+(i+1)+"進(jìn)程各類(lèi)資源已分配的資源數(shù):");for(j=0;j<Resource;j++){Allocation[i][j]=in.nextInt();need[i][j]=MAX[i][j]-Allocation[i][j];if(need[i][j]<0){System.out.println("您輸入的第"+(i+1)+"個(gè)進(jìn)程所擁有的第"+(j+1)+"個(gè)資源數(shù)錯(cuò)誤,請(qǐng)重新輸入:");j--;continue;}}}System.out.print("請(qǐng)輸入系統(tǒng)各類(lèi)資源可用的數(shù)目:");for(i=0;i<Resource;i++){Available[i]=in.nextInt();}}publicvoidBank()throwsException{intj,i;inttempAvailable[]=newint[Resource];inttempAllocation[]=newint[Resource];inttempNeed[]=newint[Resource];System.out.println("");System.out.print("請(qǐng)輸入要申請(qǐng)資源的進(jìn)程號(hào)(當(dāng)前共有"+Process+"個(gè)進(jìn)程,如為進(jìn)程P1申請(qǐng),請(qǐng)輸入1,以此類(lèi)推)");i=in.nextInt()-1;System.out.print("請(qǐng)輸入P"+(i+1)+"進(jìn)程申請(qǐng)的各資源的數(shù)量");for(j=0;j<Resource;j++){Request[i][j]=in.nextInt();}for(j=0;j<Resource;j++){if(Request[i][j]>need[i][j]){System.out.println("您輸入的申請(qǐng)的資源數(shù)超過(guò)進(jìn)程的需求量!請(qǐng)重新輸入!");continue;}if(Request[i][j]>Available[j]){System.out.println("您輸入的申請(qǐng)數(shù)超過(guò)系統(tǒng)可用的資源數(shù)!請(qǐng)重新輸入!");continue;}}for(j=0;j<Resource;j++){tempAvailable[j]=Available[j];tempAllocation[j]=Allocation[i][j];tempNeed[j]=need[i][j];Available[j]=Available[j]-Request[i][j];Allocation[i][j]=Allocation[i][j]+Request[i][j];need[i][j]=need[i][j]-Request[i][j];}if(Safe()){System.out.println("分配給P"+i+"進(jìn)程成功!");System.out.print("分配前系統(tǒng)可用資源:");for(intk=0;k<Resource;k++)System.out.print(tempAvailable[k]+"");System.out.print("\n分配前進(jìn)程P"+i+"各類(lèi)資源已分配數(shù)量:");for(intk=0;k<Resource;k++)System.out.print(tempAllocation[k]+"");System.out.print("\n分配前進(jìn)程P"+i+"各類(lèi)資源需求數(shù)量:");for(intk=0;k<Resource;k++)System.out.print(tempNeed[k]+"");System.out.print("\n分配后系統(tǒng)可用資源:");for(intk=0;k<Resource;k++)System.out.print(Available[k]+"");System.out.print("\n分配后進(jìn)程P"+i+"各類(lèi)資源已分配數(shù)量:");for(intk=0;k<Resource;k++)System.out.print(Allocation[i][k]+"");System.out.print("\n分配后進(jìn)程P"+i+"各類(lèi)資源需求數(shù)量:");for(intk=0;k<Resource;k++)System.out.print(need[i][k]+"");System.out.println();}else{System.out.println("申請(qǐng)資源失敗!");for(j=0;j<Resource;j++){Available[j]=Available[j]+Request[i][j];Allocation[i][j] = Allocation[i][j] +Request[i][j];need[i][j]=need[i][j]+Request[i][j];}}for(i=0;i<Process;i++){finish[i]=false;}}//安全性算法publicbooleanSafe(){inti,j,k,t=0;Work=newint[Resource];for(i=0;i<Resource;i++)Work[i]=Available[i];for(i=0;i<Process;i++){finish[i]=false;}for(i=0;i<Process;i++){if(finish[i]==true){continue;}else{for(j=0;j<Resource;j++){if(need[i][j]>Work[j]){break;}}if(j==Resource){finish[i]=true;for(k=0;k<Resource;k++){Work[k]+=Allocation[i][k];}P[t++]=i;i=-1;}else{continue;}}if(t==Process){System.out.print("當(dāng)前系統(tǒng)是安全的,存在一安全序列:");for(i=0;i<t;i++){System.out.print("P"+P[i]);if(i!=t-1){System.out.print("");}}System.out.println();returntrue;}}System.out.println("當(dāng)前系統(tǒng)是不安全的,不存在安全序列");returnfalse;}publicstaticvoidmain(String[]args){try{bankerb=newbanker();b.Safe();for(inti=0;i<200;i++)b.Bank();b.close();}catch(Exceptione){}}}八.運(yùn)行結(jié)果實(shí)驗(yàn)三存儲(chǔ)管理一.實(shí)驗(yàn)?zāi)康拇鎯?chǔ)管理的主要功能之一是合理地分配空間。請(qǐng)求頁(yè)式管理是一種常用的虛擬存儲(chǔ)管理技術(shù)。本實(shí)驗(yàn)的目的是通過(guò)請(qǐng)求頁(yè)式管理中頁(yè)面置換算法模擬設(shè)計(jì),了解虛擬存儲(chǔ)技術(shù)的特點(diǎn),掌握請(qǐng)求頁(yè)式存儲(chǔ)管理的頁(yè)面置換算法。二.實(shí)驗(yàn)內(nèi)容通過(guò)計(jì)算不同算法的命中率比較算法的優(yōu)劣。同時(shí)也考慮了用戶(hù)內(nèi)存容量對(duì)命中率的影響。頁(yè)面失效次數(shù)為每次訪問(wèn)相應(yīng)指令時(shí),該指令所對(duì)應(yīng)的頁(yè)不在內(nèi)存中的次數(shù)。頁(yè)面失效次數(shù)命中率1頁(yè)地址流長(zhǎng)度在本實(shí)驗(yàn)中,假定頁(yè)面大小為1k,用戶(hù)虛存容量為32k,用戶(hù)內(nèi)存容量為4頁(yè)到32頁(yè)。produce_addstream通過(guò)隨機(jī)數(shù)產(chǎn)生一個(gè)指令序列,共320條指令。指令的地址按下述原則生成:50%的指令是順序執(zhí)行的25%的指令是均勻分布在前地址部分25%的指令是均勻分布在后地址部分具體的實(shí)施方法是:在[0,319]的指令地址之間隨機(jī)選取一起點(diǎn)m;順序執(zhí)行一條指令,即執(zhí)行地址為m+1的指令;在前地址[0,m+1]中隨機(jī)選取一條指令并執(zhí)行,該指令的地址為m’;順序執(zhí)行一條指令,地址為m’+1的指令在后地址[m’+2,319]中隨機(jī)選取一條指令并執(zhí)行;重復(fù)上述步驟1)~5),直到執(zhí)行320次指令將指令序列變換稱(chēng)為頁(yè)地址流在用戶(hù)虛存中,按每k存放10條指令排列虛存地址,即320條指令在虛存中的存放方式為:第0條~第9條指令為第0頁(yè)(對(duì)應(yīng)虛存地址為[0,9]);第10條~第19條指令為第1頁(yè)(對(duì)應(yīng)虛存地址為[10,19]);。。。。。。第310條~第319條指令為第31頁(yè)(對(duì)應(yīng)虛存地址為[310,319]);按以上方式,用戶(hù)指令可組成32頁(yè)。計(jì)算并輸出下屬算法在不同內(nèi)存容量下的命中率。先進(jìn)先出的算法(FIFO);最近最少使用算法(LRU);最佳淘汰算法(OPT);最少訪問(wèn)頁(yè)面算法(LFR);其中3)和4)為選擇內(nèi)容三.系統(tǒng)框圖開(kāi)開(kāi)始生成地址流輸入算法號(hào)S1≤S≤4形成地址頁(yè)號(hào)用戶(hù)內(nèi)存空間msize=2Msize≤32OPT()FIFO()LRU()LFU()Msize加1S=?是否用其他算法繼續(xù)結(jié)束NY1234YN提示出錯(cuò),重新輸入四、頁(yè)面置換算法程序代碼:package存儲(chǔ)管理;importjava.util.Random;publicclassMemoryManage_Operation{privateString[][]dataStrings=newString[33][4];//數(shù)據(jù)傳遞數(shù)組privateint[]Addstream=newint[320];//地址流privateint[]Addspage=newint[320];//頁(yè)面流privateint[]phyBlock=newint[32];//物理塊數(shù)privateRandomrandom=newRandom();//隨機(jī)數(shù)privateintblockNum;//內(nèi)存塊數(shù)privateintnpageNum;//缺頁(yè)數(shù)臨時(shí)變量privatefloatrate;//缺頁(yè)率privateinttempK,tempG,tempF;//臨時(shí)變量//產(chǎn)生隨機(jī)地址流和頁(yè)面流publicvoidsetProduceAddstream(){inttemp;for(inti=0;i<320;i+=3){temp=random.nextInt(320)%320+0;Addstream[i]=temp+1;temp=random.nextInt(320)%(Addstream[i]+1);Addstream[i+1]=temp+1;temp=random.nextInt(320)%(319-Addstream[i+1])+(Addstream[i+1]+1);if(i+2>=320){break;}Addstream[i+2]=temp;}for(inti=0;i<320;i++){Addspage[i]=Addstream[i]/10;}}//用戶(hù)內(nèi)存及相關(guān)數(shù)據(jù)初始化privatevoidinitialization(){for(inti=0;i<32;i++){phyBlock[i]=-1;}this.npageNum=0;this.rate=0;this.tempK=0;this.tempG=-1;this.tempF=-1;}publicvoidFIFO(){int[]time=newint[32];//定義進(jìn)入內(nèi)存時(shí)間長(zhǎng)度數(shù)組intmax;//max表示進(jìn)入內(nèi)存時(shí)間最久的,即最先進(jìn)去的initialization();for(inti=0;i<blockNum;i++)time[i]=i+1;for(inti=0;i<320;i++){this.tempK=0;for(intj=0;j<blockNum;j++)if(phyBlock[j]==Addspage[i]){//表示內(nèi)存中已有當(dāng)前要調(diào)入的頁(yè)面this.tempG=j;break;}for(intj=0;j<blockNum;j++)if(phyBlock[j]==-1){//用戶(hù)內(nèi)存中存在空的物理塊this.tempF=j;break;}if(this.tempG!=-1)this.tempG=-1;else{if(this.tempF==-1){//找到最先進(jìn)入內(nèi)存的頁(yè)面max=time[0];for(intj=0;j<blockNum;j++)if(time[j]>max){max=time[j];this.tempK=j;}phyBlock[tempK]=Addspage[i];time[tempK]=0;//該物理塊中頁(yè)面停留時(shí)間置零npageNum++;//缺頁(yè)數(shù)+1}else{phyBlock[tempF]=Addspage[i];time[tempF]=0;npageNum++;tempF=-1;}}for(intj=0;j<blockNum&&phyBlock[j]!=-1;j++) time[j]++;//物理塊中現(xiàn)有頁(yè)面停留時(shí)間+1}this.rate=1-(float)npageNum/320;dataStrings[blockNum][1]=this.rate+"";}publicvoidLRU(){int[]time=newint[32];intmax;initialization();for(inti=0;i<blockNum;i++)time[i]=i+1;for(inti=0;i<320;i++){tempK=0;for(intj=0;j<blockNum;j++)if(phyBlock[j]==Addspage[i]){this.tempG=j;break;}for(intj=0;j<blockNum;j++)if(phyBlock[j]==-1){this.tempF=j;break;}if(this.tempG!=-1){time[tempG]=0;this.tempG=-1;}else{if(this.tempF==-1){max=time[0];for(intj=0;j<blockNum;j++)if(time[j]>max){this.tempK=j;max=time[j];}phyBlock[tempK]=Addspage[i];time[tempK]=0;npageNum++;}else{phyBlock[tempF]=Addspage[i];time[tempF]=0;npageNum++;this.tempF=-1;}}for(intj=0;j<blockNum&&phyBlock[j]!=-1;j++)time[j]++;}this.rate=1-(float)npageNum/320;dataStrings[blockNum][2]=this.rate+"";}publicvoidLFR(){initialization();int[]time_lru=newint[32];int[]time=newint[32];intmin,max_lru,t;for(inti=0;i<blockNum;i++){time[i]=0;time_lru[i]=i+1;}for(inti=0;i<320;i++){this.tempK=0;t=1;for(intj=0;j<blockNum;j++)if(phyBlock[j]==Addspage[i]){this.tempG=j;break;}for(intj=0;j<blockNum;j++)if(phyBlock[j]==-1){this.tempF=j;break;}if(this.tempG!=-1){time_lru[tempG]=0;this.tempG=-1;}else{if(this.tempF==-1){if(i<=20){//將最少使用的間隔時(shí)間定位個(gè)單位max_lru=time_lru[0];//在未達(dá)到“一定時(shí)間”的要求時(shí),先采用LRU進(jìn)行頁(yè)面置換for(intj=0;j<blockNum;j++)if(time_lru[j]>max_lru){this.tempK=j;max_lru=time_lru[j];}phyBlock[tempK]=Addspage[i];time_lru[tempK]=0;npageNum++;}else{for(intj=0;j<blockNum;j++)//計(jì)算一定時(shí)間間隔內(nèi)物理塊中的頁(yè)面使用次數(shù)for(inth=i-1;h>=i-1;h--)if(phyBlock[j]==Addspage[h])time[j]++;min=time[0];for(intj=0;j<blockNum;j++)if(time[j]<min){min=time[j];this.tempK=j;}for(intj=0;j<blockNum;j++)//應(yīng)對(duì)出現(xiàn)頁(yè)面使用次數(shù)同樣少的情況if(time[j]==min)t++;if(t>1){//若使用次數(shù)同樣少,將次數(shù)相同的頁(yè)面按照LRU進(jìn)行頁(yè)面置換max_lru=time_lru[tempK];for(intj=0;j<blockNum&&time[j]==min;j++)if(time_lru[j]>max_lru){this.tempK=j;max_lru=time_lru[j];}}phyBlock[tempK]=Addspage[i];time_lru[tempK]=0;npageNum++;}}else{phyBlock[tempF]=Addspage[i];time_lru[tempF]=0;npageNum++;tempF=-1;}}for(intj=0;j<blockNum&&phyBlock[j]!=-1;j++)time_lru[j]++;}this.rate=1-(float)npageNum/320;dataStrings[blockNum][3]=this.rate+"";}publicintgetBlockNum(){returnblockNum;}publicvoidsetBlockNum(intblockNum){this.blockNum=blockNum;}publicString[][]getDataStrings(){returndataStrings;}publicvoidsetDataStrings(String[][]dataStrings){this.dataStrings=dataStrings;}}package存儲(chǔ)管理;importorg.eclipse.swt.widgets.Display;importorg.eclipse.swt.widgets.MessageBox;importorg.eclipse.swt.widgets.Shell;importorg.eclipse.swt.widgets.Menu;importorg.eclipse.swt.widgets.TableItem;importorg.eclipse.swt.SWT;importorg.eclipse.swt.widgets.MenuItem;importorg.eclipse.swt.widgets.Table;importorg.eclipse.swt.widgets.TableColumn;importorg.eclipse.swt.events.SelectionAdapter;importorg.eclipse.swt.events.SelectionEvent;publicclassManageSWT{protectedShellshell;privateTabletable;publicstaticvoidmain(String[]args){try{ManageSWTwindow=newManageSWT();window.open();}catch(Exceptione){e.printStackTrace();}}publicvoidopen(){Displaydisplay=Display.getDefault();createContents();shell.open();shell.layout();while(!shell.isDisposed()){if(!display.readAndDispatch()){display.sleep();}}}protectedvoidcreateContents(){shell=newShell();shell.setSize(450,300);shell.setText("\u5B58\u50A8\u7BA1\u7406");Menumenu=newMenu(shell,SWT.BAR);shell.setMenuBar(menu);MenuItemmenuItem=newMenuItem(menu,SWT.NONE);menuItem.addSelectionListener(newSelectionAdapter(){@OverridepublicvoidwidgetSelected(SelectionEvente){analysis();}});menuItem.setText("\u547D\u4E2D\u7387\u5206\u6790");MenuItemmenuItem_2=newMenuItem(menu,SWT.NONE);{menuItem_2.addSelectionListener(newSelectionAdapter()@OverridepublicvoidwidgetSelected(SelectionEvente){shell.dispose();}});menuItem_2.setText("\u9000\u51FA");MenuItemmenuItem_1=newMenuItem(menu,SWT.NONE);{menuItem_1.addSelectionListener(newSelectionAdapter()@OverridepublicvoidwidgetSelected(SelectionEvente){MessageBox messageBox = newMessageBox(shell,SWT.ICON_INFORMATION);messageBox.setText("關(guān)于");messageBox.setMessage("存儲(chǔ)管理");messageBox.open();}});menuItem_1.setText("\u5173\u4E8E"); table = new Table(shell, SWT.BORDER |SWT.FULL_SELECTION);table.setBounds(0,0,434,242);table.setHeaderVisible(true);table.setLinesVisible(true);TableColumntblclmnNewColumn=newTableColumn(table,SWT.NONE);tblclmnNewColumn.setWidth(90);tblclmnNewColumn.setText("\u7269\u7406\u5757\u6570");TableColumntblclmnNewColumn_1=newTableColumn(table,SWT.CENTER);tblclmnNewColumn_1.setWidth(100);tblclmnNewColumn_1.setText("\u5148\u8FDB\u5148\u51FA\u7684\u7B97\u6CD5");TableColumn tblclmnNewColumn_2 = newTableColumn(table,SWT.CENTER);tblclmnNewColumn_2.setWidth(110);tblclmnNewColumn_2.setText("\u6700\u8FD1\u6700\u5C11\u4F7F\u7528\u7B97\u6CD5");TableColumntblclmnLfu=newTableColumn(table,SWT.CENTER);tblclmnLfu.setWidth(110);tblclmnLfu.setText("\u6700\u5C11\u8BBF\u95EE\u9875\u9762\u7B97\u6CD5");}publicvoidanalysis(){table.removeAll();MemoryManage_Operation mOperation = newMemoryManage_Operation();mOperation.setProduceAddstream();String[][]tempStrings=newString[33][4];for(inti=2;i<=32;i++){mOperation.setBlockNum(i);tempStrings[i][0]=i+"K";mOperation.FIFO();mOperation.LRU();mOperation.LFR(); tempStrings[i][1] =mOperation.getDataStrings()[i][1];tempStrings[i][2] =mOperation.getDataStrings()[i][2];tempStrings[i][3] =mOperation.getDataStrings()[i][3];}for(inti=2;i<33;i++){TableItemitem=newTableItem(table,SWT.NULL);for(intj=0;j<4;j++){item.setText(j,tempStrings[i][j]);}}}}五、運(yùn)行結(jié)果實(shí)驗(yàn)四磁盤(pán)調(diào)度實(shí)驗(yàn)?zāi)康模捍疟P(pán)是高速、大容量、旋轉(zhuǎn)型、可直接存取的存儲(chǔ)設(shè)備。它作為計(jì)算機(jī)系統(tǒng)的輔助存儲(chǔ)器,擔(dān)負(fù)著繁重的輸入輸出工作,在現(xiàn)代計(jì)算機(jī)系統(tǒng)中往往同時(shí)會(huì)有若干個(gè)要求訪問(wèn)磁盤(pán)的輸入輸出要求。系統(tǒng)可采用一種策略,盡可能按最佳次序執(zhí)行訪問(wèn)磁盤(pán)的請(qǐng)求。由于磁盤(pán)訪問(wèn)時(shí)間主要受尋道時(shí)間T的影響,為此需要采用合適的尋道算法,以降低尋道時(shí)間。本實(shí)驗(yàn)要求學(xué)生模擬設(shè)計(jì)一個(gè)磁盤(pán)調(diào)度程序,觀察調(diào)度程序的動(dòng)態(tài)運(yùn)行過(guò)程。通過(guò)實(shí)驗(yàn)讓學(xué)生理解和掌握磁盤(pán)調(diào)度的職能。實(shí)驗(yàn)題目:模擬電梯調(diào)度算法,對(duì)磁盤(pán)進(jìn)行移臂操作三、提示及要求:假設(shè)磁盤(pán)只有一個(gè)盤(pán)面,并且磁盤(pán)是可移動(dòng)頭磁盤(pán)。磁盤(pán)是可供多個(gè)進(jìn)程共享的存儲(chǔ)設(shè)備,但一個(gè)磁盤(pán)每個(gè)時(shí)刻只能為一個(gè)進(jìn)程服務(wù)。當(dāng)有進(jìn)程在訪問(wèn)某個(gè)磁盤(pán)時(shí),其它想訪問(wèn)該磁盤(pán)的進(jìn)程必須等待,直到磁盤(pán)一次工作結(jié)束。當(dāng)有多個(gè)進(jìn)程提出輸入輸出請(qǐng)求而處于等待狀態(tài)時(shí),可用電梯調(diào)度算法從若干個(gè)等待訪問(wèn)者中選擇一個(gè)進(jìn)程,讓它訪問(wèn)磁盤(pán)。為此設(shè)置“驅(qū)動(dòng)調(diào)度”進(jìn)程。由于磁盤(pán)與處理器是并行工作的,所以當(dāng)磁盤(pán)在為一個(gè)進(jìn)程服務(wù)時(shí),占有處理器的其它進(jìn)程可以提出使用磁盤(pán)(這里我們只要求訪問(wèn)磁道),即動(dòng)態(tài)申請(qǐng)?jiān)L問(wèn)磁道,為此設(shè)置“接受請(qǐng)求”進(jìn)程。為了模擬以上兩個(gè)進(jìn)程的執(zhí)行,可以考慮使用隨機(jī)數(shù)來(lái)確定二者的允許順序,程序結(jié)構(gòu)圖參考附圖:“接受請(qǐng)求”進(jìn)程建立一張“進(jìn)程請(qǐng)求I/O”表,指出等待訪問(wèn)磁盤(pán)的進(jìn)程要求訪問(wèn)的磁道,表的格式如下:進(jìn)程進(jìn)程名要求訪問(wèn)的磁道號(hào)“磁盤(pán)調(diào)度”的功能是查“請(qǐng)求I/O”表,當(dāng)有等待訪問(wèn)的進(jìn)程時(shí),按電梯調(diào)度算法(SCAN算法)從中選擇一個(gè)等待訪問(wèn)的進(jìn)程,按其指定的要求訪問(wèn)磁道。SCAN算法參考課本第九章。算法模擬框圖略。圖1中的“初始化”工作包括:初始化“請(qǐng)求I/O”表,設(shè)置置當(dāng)前移臂方向;當(dāng)前磁道號(hào)。并且假設(shè)程序運(yùn)行前“請(qǐng)求I/O”表中已有若干進(jìn)程(4~8個(gè))申請(qǐng)?jiān)L問(wèn)相應(yīng)磁道。實(shí)驗(yàn)報(bào)告:實(shí)驗(yàn)題目。程序中用到的數(shù)據(jù)結(jié)構(gòu)及其說(shuō)明。打印源程序并附注釋。實(shí)驗(yàn)結(jié)果內(nèi)容如下:打印“請(qǐng)求I/O”表,當(dāng)前磁道號(hào),移臂方向,被選中的進(jìn)程名和其要求訪問(wèn)的磁道,看是否體現(xiàn)了電梯調(diào)度(SCAN)算法。體會(huì)與問(wèn)題。附圖:開(kāi)始開(kāi)始初始化磁盤(pán)調(diào)度隨機(jī)數(shù)>1/2繼續(xù)?接受請(qǐng)求輸入在[0,1]區(qū)間內(nèi)的隨機(jī)數(shù)結(jié)束六.磁盤(pán)調(diào)度的程序代碼:package磁盤(pán)調(diào)度;publicclassCSCAN{publicintm=0;//用來(lái)存放磁頭的初始位置publicbooleanRun=true;publicintsum=0;publicvoidCheck(inta[],intn,intposition){inttemp;for(inti=n;i>0;i--){//冒泡排序for(intj=0;j<i;j++){if(a[j]>a[j+1]){//按順序依次比較大小temp=a[j];//把大的數(shù)字往前面放a[j]=a[j+1];a[j+1]=temp;}}}while(Run){for(inti=0;i<=n;i++){if(a[i]==position){m=i;Run=false;}}}System.out.println("CSCAN算法序列:");for(inti=m+1;i<=n;i++){//磁頭向大號(hào)移動(dòng)sum=sum+a[i]-a[i-1];System.out.print(a[i]+"");}sum=sum+200-a[n];sum=sum+199;sum=sum+a[0]-1;for(inti=0;i<=m-1;i++){if(i!=m-1){sum=sum+a[i+1]-a[i];}System.out.print(a[i]+"");}System.out.println();System.out.println("尋道長(zhǎng)度為"+sum);System.out.println("平均尋道長(zhǎng)度為"+sum/n);}}package磁盤(pán)調(diào)度;publicclassSCAN{publicintm=0;//用來(lái)存放磁頭的初始位置publicbooleanRun=true;publicintsum=0;publicvoidCheck(inta[],intn,intposition){inttemp;for(inti=n;i>0;i--)//冒泡排序{for(intj=0;j<i;j++){if(a[j]>a[j+1])//按順序依次比較大小{temp=a[j];//把大的數(shù)字往前面放a[j]=a[j+1];a[j+1]=temp;}}}while(Run){//此循環(huán)用來(lái)尋找磁頭的初始位置被排到了什么位置for(inti=0;i<=n;i++){if(a[i]==position){m=i;Run=false;}}}System.out.println("SCAN算法序列:");for(inti=m+1;i<=n;i++){//磁頭向大號(hào)移動(dòng)sum=sum+a[i]-a[i-1];System.out.print(a[i]+"");}sum=sum+200-a[n];sum=sum+200-a[m-1];for(inti=m-1;i>=0;i--){if(i!=0){sum=sum+a[i]-a[i-1];}System.out.print(a[i]+"");}System.out.println();System.out.println("尋到長(zhǎng)度為"+sum);System.out.println("平均尋到長(zhǎng)度為"+sum/n);}}package磁盤(pán)調(diào)度;publicclassSSTF{publicintm;//用來(lái)判斷排序后磁頭所在的初始位置的下標(biāo)publicintb[];publicintrflag=0,lflag=0;publicdoubleSUM=0;publicintmleft,mright;publicSSTF(){b=newint[20];}publicvoidCalculate(inta[],intn,intposition){inttemp;for(inti=n;i>0;i--)//冒泡排序{for(intj=0;j<i;j++){if(a[j]>a[j+1])//按順序依次比較大小{temp=a[j];//把大的數(shù)字往前面放a[j]=a[j+1];a[j+1]=temp;}}}if(a[n]==position){//如果磁頭的初始位置在最大號(hào)System.out.println("SSTF序列為:");for(inti=0;i<=n;i++){System.out.print(a[i]+"");}}elseif(a[0]==position){System.out.println("SSTF序列為:");for(inti=n;i>=0;i--){System.out.print(a[i]+"");}}else{System.out.println("SSTF序列為:");Check(a,n,position);}}publicvoidCheck(inta[],intn,intposition){booleanRun=true,Running=true;while(Run){//此循環(huán)用來(lái)尋找磁頭的初始位置被排到了什么位置for(inti=0;i<=n;i++){if(a[i]==position){m=i;System.out.println("m的值為"+m);mleft=m-1;mright=m+1;Run=false;}}}while(Running){if(a[m]-a[mleft]>=a[mright]-a[m]&&rflag!=1){SUM=SUM+(a[mright]-a[m]);//用來(lái)統(tǒng)計(jì)尋到長(zhǎng)度m=mright;mright++;if(mright>n){rflag=1;}System.out.print(a[m]+"");}elseif(a[m]-a[mleft]<a[mright]-a[m]&&lflag!=1){SUM=SUM+(a[m]-a[mleft]);m=mleft;mleft--;if(mleft<0){lflag=1;}System.out.print(a[m]+"");}if(mleft!=0&&mright>n){Running=false;SUM=SUM+a[n]-a[mleft];for(intj=mleft;j>=0;j--){if(j!=0){SUM=SUM+a[j]-a[j-1];}System.out.print(a[j]+"");}}if(mright!=n&&mleft<0){Running=false;SUM=SUM+a[mri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源汽車(chē)電池回收拆解與再生能源利用合同
- 企業(yè)內(nèi)訓(xùn)學(xué)院學(xué)期培訓(xùn)計(jì)劃
- 寵物醫(yī)院品牌授權(quán)及區(qū)域市場(chǎng)開(kāi)發(fā)協(xié)議
- 游戲IP授權(quán)合作:與醫(yī)療健康行業(yè)合作推廣合同
- 美團(tuán)民宿房源托管與民宿行業(yè)規(guī)范遵守協(xié)議
- 智能門(mén)鎖定制安裝與長(zhǎng)期維護(hù)服務(wù)協(xié)議
- 國(guó)際貿(mào)易貨物代理與清關(guān)風(fēng)險(xiǎn)防范合同
- 鍍銀電鍍工勞務(wù)合作協(xié)議
- 物業(yè)綠化養(yǎng)護(hù)管理人員工作計(jì)劃
- 高等教育課程設(shè)計(jì)中的細(xì)節(jié)心得體會(huì)
- 噴淋塔設(shè)計(jì)標(biāo)準(zhǔn)參考
- 國(guó)家課程設(shè)置標(biāo)準(zhǔn)課時(shí)
- 高支模板監(jiān)測(cè)記錄
- 涂裝工藝流程、PFMEA2018
- 《蘇泊爾盈利能力分析》8000字
- 車(chē)站信號(hào)自動(dòng)控制教案-四線(xiàn)制道岔控制啟動(dòng)電路
- 數(shù)字經(jīng)濟(jì)學(xué)導(dǎo)論-全套課件
- 委托書(shū)掛靠樣本
- 大學(xué)生職業(yè)發(fā)展與就業(yè)指導(dǎo)學(xué)習(xí)通課后章節(jié)答案期末考試題庫(kù)2023年
- 立體幾何中的空間距離問(wèn)題
評(píng)論
0/150
提交評(píng)論