版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
《操作系統(tǒng)》實驗指導(dǎo)書紹興文理學(xué)院計算機系
前言1.實驗總體目的通過學(xué)生自己動手設(shè)計實驗驗證理論知識,使學(xué)生掌握操作系統(tǒng)特性和功能,掌握不同調(diào)度算法下進程的調(diào)度、進程控制、進程調(diào)度與死鎖,并必須掌握作業(yè)管理、存儲器管理、設(shè)備管理和文獻管理的重要原理。加深對操作系統(tǒng)基本原理理解。⒉合用專業(yè)計算機科學(xué)與技術(shù)⒊先修課程C語言程序設(shè)計、計算機組成原理、數(shù)據(jù)結(jié)構(gòu)⒋實驗課時分派序號實驗名稱學(xué)時實驗規(guī)定實驗類型1分析操作系統(tǒng)所面臨的操作需求2必修驗證2進程管理4必修設(shè)計3存儲管理4必修設(shè)計4設(shè)備管理2必修設(shè)計5文獻管理4必修設(shè)計⒌實驗環(huán)境有70臺中檔配置的計算機組成的小型局域網(wǎng)的實驗室環(huán)境。計算機的具體規(guī)定:(1)Pentium133Hz以上的CPU;(2)建議至少256MB的內(nèi)存;(3)建議硬盤至少2GB,并有1GB空閑空間。(4)安裝Windows操作系統(tǒng)及C語言編譯程序或Linux虛擬環(huán)境。⒍實驗總體規(guī)定培養(yǎng)計算機專業(yè)的學(xué)生的系統(tǒng)程序設(shè)計能力,是操作系統(tǒng)課程的一個非常重要的環(huán)節(jié)。通過操作系統(tǒng)上機實驗,可以培養(yǎng)學(xué)生程序設(shè)計的方法和技巧,提高學(xué)生編制清楚、合理、可讀性好的系統(tǒng)程序的能力,加深對操作系統(tǒng)課程的理解。使學(xué)生更好地掌握操作系統(tǒng)的基本概念、基本原理、及基本功能,具有分析實際操作系統(tǒng)、設(shè)計、構(gòu)造和開發(fā)現(xiàn)代操作系統(tǒng)的基本能力。實驗規(guī)定做到:具體描述實驗設(shè)計思想、程序結(jié)構(gòu)及各模塊設(shè)計思緒;具體描述程序所用數(shù)據(jù)結(jié)構(gòu)及算法;明確給出測試用例和實驗結(jié)果;為增長程序可讀性,在程序中進行適當注釋說明;認真進行實驗總結(jié),涉及:設(shè)計中碰到的問題、解決方法與收獲等;實驗報告撰寫規(guī)定結(jié)構(gòu)清楚、描述準確邏輯性強;實驗過程中,同學(xué)之間可以進行討論互相提高,但絕對嚴禁抄襲。⒎本實驗的重點、難點及教學(xué)方法建議重點:理解進程調(diào)度中PCB的設(shè)計,以實現(xiàn)對進程的調(diào)度。難點:進程調(diào)度程序的設(shè)計,設(shè)備管理程序的設(shè)計。教學(xué)方法建議:力爭在本指導(dǎo)書的幫助下,獨立設(shè)計程序以加深理解。
實驗一分析操作系統(tǒng)所面臨的操作需求(一)實驗?zāi)康氖箤W(xué)生理解操作系統(tǒng)所面臨的操作需求,掌握操作系統(tǒng)中的進程管理、存儲管理、設(shè)備管理和文獻管理等功能。(二)實驗內(nèi)容1.
分析操作系統(tǒng)所面臨的操作需求;2.
熟悉實驗環(huán)境;3.
資料搜集與整理,進行實驗的前期準備。熟悉編程環(huán)境
本課程中的實驗題目既可以在windows下用控制臺應(yīng)用程序?qū)崿F(xiàn),也可以在linux下用全屏幕程序?qū)崿F(xiàn)。這里我們一方面介紹在windows下用vc++6.0設(shè)計控制臺應(yīng)用程序的環(huán)節(jié),然后介紹在linux下用C語言編寫全屏幕程序的環(huán)節(jié)。windows的控制臺應(yīng)用程序
圖1-1圖1-2圖1-3環(huán)節(jié)1:開機,單擊“開始”按鈕,選擇“程序
->Microsoft
Visual
Studio
6.0->Microsoft
Visual
C++6.0”進入Microsoft
Visual
環(huán)節(jié)2:在Microsoft
Visual
C++6.0中,單擊“File”菜單,選擇“New”菜單命令,見圖1-2。
環(huán)節(jié)3:在“Files”選項卡中選擇“C++
Source
File”,見圖1-32.
linux的vi應(yīng)用編程登錄Linux是一個多用戶多任務(wù)操作系統(tǒng),多個用戶可以擁有自己獨立的用戶賬號登錄提醒:RedHatLinuxrelease6.0(Hedwing)Kernel2.2.5-15onani686Login:此時輸入用戶戶名(賬號)并鍵入回車,則系統(tǒng)顯示“passward”。在輸入密碼和回車。登錄后:[root@hawk/root]##表達是按root方式登錄,$表達是普通用戶。Linux大小寫敏感,用“-”加參數(shù)zlinux:~#ls–FHowTo/HowToMin/linux@nag/sag/獲取幫助:Linux帶有聯(lián)機手冊,可以用man命令來閱讀Zlinux:~$manls虛擬終端Linux可有多個用戶登錄到同一個計算機,但一般微機只有一個終端難以體現(xiàn)??梢允褂枚鄠€虛擬終端,用Alt+F1、Alt+F2等來切換。退出系統(tǒng)在停止使用系統(tǒng)時,要退出系統(tǒng)。具體方法:exit或logout,或Ctrl+D關(guān)機假如沒有用戶在使用系統(tǒng),可以關(guān)機。但是不能直接關(guān)閉電源,而要按正常順序關(guān)機。一般用戶是不能關(guān)機的,只有root用戶可以關(guān)機。方法:可以使用halt或shutdown命令,也可以同時鍵入Ctrl+Alt+Del。Windows虛擬機環(huán)境:登錄到系統(tǒng)點擊桌面“VMware”圖標——>VmwareWorkstation窗口——>Commands——>Startthisvirtualmachine進入fedora后,用戶名:root口令:123456使用編輯器vi編輯文獻進入linux的文本模式之后,在命令行鍵入vifilename.c然后回車。下面作一些簡樸的解釋:一方面vi命令是打開vi編輯器。后面的filename.c是用戶即將編輯的c文獻名字,注意擴展名字是.c;當然,vi編輯器功能很強,可以用它來編輯其它格式的文獻,比如匯編文獻,其擴展名字是.s;也可以直接用vi打開一個新的未命名的文獻,當保存的時候再給它命名,只是這樣做不很方便。最基本的命令I(lǐng):當進入剛打開的文獻時,不能寫入信息,這時按一下鍵盤上的I鍵(insert),插入的意思,就可以進入編輯模式了。如下圖所示:a與i是相同的用法當文獻編輯完后,需要保存退出,這時需要通過以下幾個環(huán)節(jié):1)按一下鍵盤上的Esc鍵;2)鍵入冒號(:),緊跟在冒號后面是wq(意思是保存并退出)。假如不想保存退出,則在第二步鍵入冒號之后,鍵入!q(不帶w,機尾部保存)。如下圖所示:退出vi編輯器的編輯模式之后,要對剛才編寫的程序進行編譯。編譯的命令是:gccfilename.c[-ooutputfilename],其中g(shù)cc是c的編譯器。參數(shù):filename.c是剛才編輯的c文獻(當然也可以是以前編寫好的c文獻);后面中括號里面的參數(shù)是可選的,它是一個輸出文獻。假如不選,默認的輸出文獻是a.out,選了之后輸出文獻就是outputfilename.out.最后一步是運營程序,方法如下:./outputfilename.out
實驗二進程管理(一)實驗?zāi)康恼莆张R界區(qū)的概念及臨界區(qū)的設(shè)計原則;掌握信號量的概念、PV操作的含義以及應(yīng)用PV操作實現(xiàn)進程的同步與互斥;分析進程爭用資源的現(xiàn)象,學(xué)習(xí)解決進程互斥的方法;掌握進程的狀態(tài)及狀態(tài)轉(zhuǎn)換;掌握常用的進程調(diào)度算法。(二)實驗內(nèi)容1.分析進程的同步與互斥現(xiàn)象,編程實現(xiàn)經(jīng)典的進程同步問題——生產(chǎn)者消費者問題的模擬;2.
編寫允許進程并行執(zhí)行的進程調(diào)度程序,在常用的進程(作業(yè))調(diào)度算法:先來先服務(wù)算法、短作業(yè)優(yōu)先算法、最高響應(yīng)比優(yōu)先算法、高優(yōu)先權(quán)優(yōu)先算法等調(diào)度算法中至少選擇三種調(diào)度算法進行模擬,并輸出平均周轉(zhuǎn)時間和平均帶權(quán)周轉(zhuǎn)時間。本實驗涉及內(nèi)容較多,可以在兩個題目里選擇一個完畢。編程實現(xiàn)經(jīng)典的進程同步問題——生產(chǎn)者消費者問題的模擬模擬實現(xiàn)用同步機構(gòu)避免發(fā)生進程執(zhí)行時也許出現(xiàn)的與時間有關(guān)的錯誤。進程是程序在一個數(shù)據(jù)集合上運營的過程,進程是并發(fā)執(zhí)行的,也即系統(tǒng)中的多個進程輪流地占用解決器運營。我們把若干個進程都能進行訪問和修改的那些變量稱為公共變量。由于進程是并發(fā)地執(zhí)行的,所以,假如對進程訪問公共變量不加限制,那么就會產(chǎn)生“與時間有關(guān)”的錯誤,即進程執(zhí)行后所得到的結(jié)果與訪問公共變量的時間有關(guān)。為了防止這類錯誤,系統(tǒng)必須要用同步機構(gòu)來控制進程對公共變量的訪問。一般說,同步機構(gòu)是由若干條原語——同步原語——所組成。本實驗規(guī)定模擬PV操作同步機構(gòu)的實現(xiàn),模擬進程的并發(fā)執(zhí)行,了解進程并發(fā)執(zhí)行時同步機構(gòu)的作用。本次用到的數(shù)據(jù)結(jié)構(gòu)知識如下:typedefstructPcb{ charname[10];//進程名 charstate[10];//運營狀態(tài) charreason[10];//若阻塞,其因素 intbreakp;//斷點保護 structPcb*next;//阻塞時的順序}Pcb,*link;進程名狀態(tài)等待因素斷點后繼進程進程控制塊結(jié)構(gòu)定義兩個進程:linkp1;//生產(chǎn)者進程,linkc1;//消費者進程。pc程序計數(shù)器和linkready;就緒隊列,linkb_s1;s1阻塞隊列,linkb_s2;s2阻塞隊列。實驗指導(dǎo):h頭文獻#include<string.h>#include<ctype.h>#include<malloc.h>/*malloc()等*/#include<limits.h>/*INT_MAX等*/#include<stdio.h>/*EOF(=^Z或F6),NULL*/#include<stdlib.h>/*atoi()*/#include<io.h>/*eof()*/#include<math.h>/*floor(),ceil(),abs()*/#include<process.h>/*exit()*/#include<iostream>usingnamespacestd;#include<time.h>#defineBUF10//緩存的大小#defineMAX20//最大可以輸入的字符h頭文獻//數(shù)據(jù)結(jié)構(gòu)的定義和全局變量typedefstructPcb{ charname[10];//進程名 charstate[10];//運營狀態(tài) charreason[10];//若阻塞,其因素 intbreakp;//斷點保護 structPcb*next;//阻塞時的順序}Pcb,*link;ints1,s2;//信號量linkp1;//生產(chǎn)者進程linkc1;//消費者進程charstr[MAX];//輸入的字符串charbuffer[BUF];//緩沖池intlen;//輸入長度intsp=0;//string的指針intin=0;//生產(chǎn)者指針intout=0;//消費者指針chartemp;//供打印的臨時產(chǎn)品charrec_p[MAX];//生產(chǎn)記錄intrp1=0;//生產(chǎn)記錄指針charrec_c[MAX];//消費記錄intrp2=0;//消費記錄指針linkready;//就緒隊列l(wèi)inkb_s1;//s1阻塞隊列l(wèi)inkb_s2;//s2阻塞隊列intpc;//程序計數(shù)器intcount;//字符計數(shù)器intcon_cnt;//消費計數(shù)器h頭文獻voidinit();//初始化voidp(ints);//P操作voidv(ints);//V操作voidblock(ints);//阻塞函數(shù)voidwakeup(ints);//喚醒函數(shù)voidcontrol();//解決機調(diào)度voidprocessor();//解決機執(zhí)行voidprint();//打印函數(shù)voidinit(){//初始化 s1=BUF; s2=0; p1=(link)malloc(sizeof(Pcb));//建立新的結(jié)點,并初始化為生產(chǎn)者 strcpy(p1->name,"Producer"); strcpy(p1->state,"Ready"); strcpy(p1->reason,"Null"); p1->breakp=0; p1->next=NULL; c1=(link)malloc(sizeof(Pcb));//建立新的結(jié)點,并初始化為消費者 strcpy(c1->name,"Consumer"); strcpy(c1->state,"Ready"); strcpy(c1->reason,"Null"); c1->breakp=0; c1->next=NULL; ready=p1; ready->next=c1;//初始化為生產(chǎn)進程在前,消費進程在后 c1->next=NULL; b_s1=NULL; b_s2=NULL;//阻塞進程為NULL pc=0; con_cnt=0;//消費計數(shù)器}voidp(ints){ if(s==1){//p(s1) s1--; if(s1<0) block(1);//阻塞當前生產(chǎn)進程 else{ printf("\t*s1信號申請成功!\n"); ready->breakp=pc;//保存斷點 } } else{//p(s2) s2--; if(s2<0) block(2);//阻塞當前消費進程 else{ printf("\t*s2信號申請成功!\n"); ready->breakp=pc;//保存斷點 } }}voidv(ints){ if(s==1){//v(s1) s1++; if(s1<=0) wakeup(1);//喚醒生產(chǎn)進程 ready->breakp=pc;//保存斷點 } else{//v(s2) s2++; if(s2<=0) wakeup(2);//喚醒消費進程 ready->breakp=pc;//保存斷點 }}voidblock(ints){//阻塞函數(shù)的定義 linkp; intnum1=0; intnum2=0; if(s==1){//生產(chǎn)進程 strcpy(p1->state,"Block");//改變狀態(tài) strcpy(p1->reason,"S1");//說明因素 p=b_s1; while(p){ num1++; p=p->next;//p的值為NULL,表達隊尾 } if(!b_s1) b_s1=p1; else p=p1; p1->next=NULL; printf("\t*p1生產(chǎn)進程阻塞了!\n"); ready->breakp=pc;//保存斷點 ready=ready->next;//在就緒隊列中去掉,指向下一個 num1++; } else{//消費進程 strcpy(c1->state,"Block"); strcpy(c1->reason,"S2"); p=b_s2; while(p){ num2++; p=p->next;//p的值為NULL,表達隊尾 } if(!b_s2) b_s2=c1; else p=c1; ready->breakp=pc;//保存斷點 ready=ready->next;//在就緒隊列中去掉,指向下一個 c1->next=NULL; printf("\t*c1消費進程阻塞了!\n"); num2++; } printf("\t*阻塞的生產(chǎn)進程個數(shù)為:%d\n",num1); printf("\t*阻塞的消費進程個數(shù)為:%d\n",num2);}voidwakeup(ints){//喚醒函數(shù)的定義 linkp; linkq=ready; if(s==1){//喚醒b_s1隊首進程,生產(chǎn)進程隊列 p=b_s1; b_s1=b_s1->next;//阻塞指針指向下一個阻塞進程 strcpy(p->state,"Ready"); strcpy(p->reason,"Null"); while(q)//插入就緒隊列 q=q->next; q=p; p->next=NULL; printf("\t*p1生產(chǎn)進程喚醒了!\n"); } else{//喚醒b_s2隊首進程,消費進程隊列 p=b_s2; b_s2=b_s2->next;//阻塞指針指向下一個阻塞進程 strcpy(p->state,"Ready"); strcpy(p->reason,"Null"); while(q->next)//插入就緒隊列 q=q->next; q->next=p; p->next=NULL; printf("\t*c1消費進程喚醒了!\n"); }}voidcontrol()//解決器調(diào)度程序{ intrd; intnum=0; linkp=ready;if(ready==NULL)//若無就緒進程,結(jié)束 return; while(p)//記錄就緒進程個數(shù) { num++; p=p->next;//最終p變?yōu)镹ULL } printf("\t*就緒進程個數(shù)為:%d\n",num); time_tt; srand((unsigned)time(&t)); rd=rand()%num;//隨機函數(shù)產(chǎn)生隨機數(shù) if(rd==1){ p=ready; ready=ready->next; ready->next=p; p->next=NULL; strcpy(ready->state,"Run"); strcpy(ready->next->state,"Ready"); } else strcpy(ready->state,"Run"); pc=ready->breakp;}voidprocessor(){//模擬解決器指令執(zhí)行 if(strcmp(ready->name,"Producer")==0)//當前進程為生產(chǎn)者 switch(pc) {case0://produce printf("\t*生產(chǎn)者生產(chǎn)了字符%c\n",str[sp]); rec_p[rp1]=str[sp];//添加到生產(chǎn)記錄 sp=(sp+1)%len; pc++; ready->breakp=pc;//保存斷點 break; case1://p(s1) pc++; p(1); break; case2://put buffer[in]=rec_p[rp1];//放到緩沖區(qū) printf("\t*%c字符成功入駐空緩存!\n",buffer[in]); rp1++; in=(in+1)%BUF; pc++; ready->breakp=pc;//保存斷點 break; case3://v(s2) pc++; printf("\t*釋放一個s2信號\n"); v(2); break; case4://goto01 printf("\t*生產(chǎn)進程goto0操作\n"); pc=0; count--;//剩余字符個數(shù)減1 printf("\t*剩余字符count=%d個\n",count); ready->breakp=pc;//保存斷點 if(count<=0){//生產(chǎn)結(jié)束 printf("\t*生產(chǎn)者結(jié)束生產(chǎn)!\n"); strcpy(p1->state,"Stop"); strcpy(p1->reason,"Null"); ready->breakp=-1; ready=ready->next;//在就緒隊列中去掉 } } else//當前進程為消費者 switch(pc) { case0://p(s2) pc++; p(2); break; case1://get printf("\t*消費者取字符!\n"); temp=buffer[out]; out=(out+1)%BUF; pc++; ready->breakp=pc;//保存斷點 break; case2://v(s1) pc++; printf("\t*釋放一個s1\n"); v(1); break; case3://consume printf("\t*消費了字符%c\n",temp); rec_c[rp2]=temp;//添加到消費記錄 rp2++; con_cnt++; if(con_cnt>=len){ strcpy(c1->state,"Stop");//完畢態(tài) c1->breakp=-1; return; } pc++; ready->breakp=pc;//保存斷點 break; case4://goto0 printf("\t*消費進程goto0操作\n"); pc=0; ready->breakp=pc;//保存斷點 }}voidprint(){ inti,j; printf("生產(chǎn)者消費者模擬\n"); printf("*模擬過程的字符串為:\t"); printf("%s\n",&str); printf("*已生產(chǎn):"); for(j=0;j<=rp1;j++) printf("%c",rec_p[j]); printf("\n*空緩存:"); for(j=rp2;j<=rp1;j++) printf("%c",buffer[j]); printf("\n*已消費:"); for(j=0;j<=rp2;j++) printf("%c",rec_c[j]); printf("\n進程控制塊的信息\n"); printf("進程名\t\t狀態(tài)\t等待因素\t斷點\n"); printf("%s\t%s\t%s\t\t%d\n\n",p1->name,p1->state,p1->reason,p1->breakp); printf("%s\t%s\t%s\t\t%d\n",c1->name,c1->state,c1->reason,c1->breakp); printf("\n"); printf("1.繼續(xù)0.退出\n"); scanf("%d",&i); if(i==0){ exit(0); }}主程序#include"a.h"#include"b.h"#include"c.h"voidmain(){ printf("*生產(chǎn)者消費者模擬\n"); printf("\n"); printf("*請輸入字符串:\n"); scanf("%s",str);//string數(shù)組存放將要產(chǎn)生的字符 len=strlen(str); count=len;//輸入字符的個數(shù) init();//初始化 while(con_cnt<len)//消費完所有的字符為結(jié)束 { system("cls");//清屏操作 printf("模擬指令流程\n"); control();//解決器調(diào)度程序 processor();//模擬解決器指令執(zhí)行 print();//輸出顯示各個信息 } printf("\n程序結(jié)束!\n");}
進程調(diào)度算法模擬進程管理是操作系統(tǒng)中的重要功能,用來創(chuàng)建進程、撤消進程、實現(xiàn)進程狀態(tài)轉(zhuǎn)換,它提供了在可運營的進程之間復(fù)用CPU的方法。在進程管理中,進程調(diào)度是核心,由于在采用多道程序設(shè)計的系統(tǒng)中,往往有若干個進程同時處在就緒狀態(tài),當就緒進程個數(shù)大于解決器數(shù)目時,就必須依照某種策略決定哪些進程優(yōu)先占用解決器。本實驗?zāi)M在單解決器情況下的進程調(diào)度,目的是加深對進程調(diào)度工作的理解,掌握不同調(diào)度算法的優(yōu)缺陷。設(shè)計一個按先來先服務(wù)、時間片輪轉(zhuǎn)法、優(yōu)先數(shù)調(diào)度算法實現(xiàn)解決器調(diào)度的程序。實驗指導(dǎo):#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>typedefstructnode{ charname[10];/*進程標記符*/ intprio;/*進程優(yōu)先數(shù)*/ intround;/*進程時間輪轉(zhuǎn)時間片*/ intcputime;/*進程占用CPU時間*/ intneedtime;/*進程到完畢還要的時間*/ intarrivetime;/*進程到達時間*/ intstarttime;/*進程開始時間*/ intfinishtime;/*進程完畢時間*/ intservicetime;/*進程服務(wù)時間*/floatturnaroundtime;/*進程周轉(zhuǎn)時間*/floatweightedturnaroundtime;/*進程帶權(quán)周轉(zhuǎn)時間*/ intcount;/*計數(shù)器*/ charstate;/*進程的狀態(tài)*/ structnode*next;/*鏈指針*/}PCB; PCB*finish,*ready,*tail,*run;/*隊列指針*/ intN;/*進程數(shù)*//*將就緒隊列中的第一個進程投入運營*/voidfirstin(){ run=ready;/*就緒隊列頭指針賦值給運營頭指針*/ run->state='R';/*進程狀態(tài)變?yōu)檫\營態(tài)*/ ready=ready->next;/*就緒對列頭指針后移到下一進程*/}/*****標題輸出函數(shù)*****/voidprt1(chara){ switch(a) { case1:/*優(yōu)先數(shù)法*/ printf("名字進程占用CPU時間進程到完畢還要的時間優(yōu)先級數(shù)狀態(tài)\n");break; case2:/*時間片算法*/ printf("名字進程占用CPU時間進程到完畢還要的時間計數(shù)器時間片狀態(tài)\n");break; case3:/*先來先服務(wù)算法*/ printf("名字到達時間開始時間服務(wù)時間完畢時間周轉(zhuǎn)時間帶權(quán)周轉(zhuǎn)時間狀態(tài)\n");break; default:break; }}/*****進程PCB輸出*****/voidprt2(chara,PCB*q){ switch(a) { case1:/*優(yōu)先數(shù)法的輸出*/ printf("%-10s\t%-10d\t%-10d\t%-10d\t%c\n",q->name, q->cputime,q->needtime,q->prio,q->state);break; case2:/*輪轉(zhuǎn)法的輸出*/ printf("%-10s%-20d%-15d%-10d%-10d%-c\n",q->name, q->cputime,q->needtime,q->count,q->round,q->state);break; case3:/*先來先服務(wù)算法輸出*/ printf("%s%10d%10d%10d%10d%10.1f%10.2f\t\t%c\n",q->name,q->arrivetime,q->starttime,q->servicetime,q->finishtime, q->turnaroundtime,q->weightedturnaroundtime,q->state);break; default:break; }}/*****輸出函數(shù)*****/voidprt(charalgo){ PCB*p; prt1(algo);/*輸出標題*/ if(run!=NULL)/*假如運營指針不空*/ prt2(algo,run);/*輸出當前正在運營的PCB*/ p=ready;/*輸出就緒隊列PCB*/ while(p!=NULL){ prt2(algo,p); p=p->next;} p=finish;/*輸出完畢隊列的PCB*/ while(p!=NULL){ prt2(algo,p); p=p->next;} getch();/*壓任意鍵繼續(xù)*/}/*****優(yōu)先數(shù)的插入算法*****/voidinsert1(PCB*q){ PCB*p1,*s,*r; intb; s=q;/*待插入的PCB指針*/ p1=ready;/*就緒隊列頭指針*/ r=p1;/*r做p1的前驅(qū)指針*/ b=1;while((p1!=NULL)&&b)/*根據(jù)優(yōu)先數(shù)擬定插入位置*/if(p1->prio>=s->prio){ r=p1; p1=p1->next;}else b=0; if(r!=p1)/*假如條件成立說明插入在r與p1之間*/{ r->next=s; s->next=p1;} else{ s->next=p1;/*否則插入在就緒隊列的頭*/ ready=s;}}/*****輪轉(zhuǎn)法插入函數(shù)*****/voidinsert2(PCB*p2){tail->next=p2;/*將新的PCB插入在當前就緒隊列的尾*/tail=p2;p2->next=NULL;}/*****先來先服務(wù)插入函數(shù)*****/voidinsert3(PCB*q){ PCB*p1,*s,*r; intb; s=q;/*指針s指向新要插入的進程*/ p1=ready;/*指針p1指向本來的進程的對首*/ r=p1;/*使用指針r指向p1前面的進程*/ b=1; while((p1!=NULL)&&b) if(p1->arrivetime<s->arrivetime) { r=p1; p1=p1->next; } else b=0; if(r!=p1) { r->next=s; s->next=p1; } else { s->next=p1; ready=s; }}/*****優(yōu)先數(shù)創(chuàng)建初始PCB信息*****/voidcreate1(charalg){ PCB*p; inti,time; charna[10]; ready=NULL;/*就緒隊列頭指針*/ finish=NULL;/*完畢隊列頭指針*/ run=NULL;/*運營隊列頭指針*/ printf("請輸入進程的名字和運營所需要的時間\n");/*輸入進程標記和所需時間創(chuàng)建PCB*/ for(i=1;i<=N;i++){ p=(PCB*)malloc(sizeof(PCB)); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime=0; p->needtime=time; p->state='W'; p->prio=50-time; if(ready!=NULL)/*就緒隊列不空則調(diào)用插入函數(shù)插入*/ insert1(p); else{ p->next=ready;/*創(chuàng)建就緒隊列的第一個PCB*/ ready=p;}} voidclrscr(void); printf("優(yōu)先級調(diào)度算法模擬輸出結(jié)果:\n"); printf("*******************************************************************\n"); prt(alg);/*輸出進程PCB信息*/ run=ready;/*將就緒隊列的第一個進程投入運營*/ ready=ready->next; run->state='R';}/*****輪轉(zhuǎn)法創(chuàng)建進程PCB*****/voidcreate2(charalg){ PCB*p; inti,time; charna[10]; ready=NULL; finish=NULL; run=NULL; printf("請輸入進程的名字和運營所需要的時間\n"); for(i=1;i<=N;i++){ p=(PCB*)malloc(sizeof(PCB)); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime=0; p->needtime=time; p->count=0;/*計數(shù)器*/ p->state='W'; p->round=2;/*時間片*/ if(ready!=NULL) insert2(p); else{ p->next=ready; ready=p; tail=p;}} voidclrscr(void); printf("時間片輪轉(zhuǎn)法模擬輸出結(jié)果:\n"); printf("********************************************************************\n"); prt(alg);/*輸出進程PCB信息*/ run=ready;/*將就緒隊列的第一個進程投入運營*/ ready=ready->next; run->state='R';}/*****先來先服務(wù)算法創(chuàng)建PCB*****/voidcreate3(charalg){ PCB*p; inti;ready=NULL; run=NULL; finish=NULL; printf("請輸入進程的名字、到達時間和運營所需要的時間\n"); for(i=0;i<N;i++) {p=(PCB*)malloc(sizeof(PCB)); scanf("%s",p->name); scanf("%d",&p->arrivetime); scanf("%d",&p->servicetime);p->starttime=0; p->finishtime=0; p->turnaroundtime=0; p->weightedturnaroundtime=0; p->state='W'; if(ready!=NULL) insert3(p); else { p->next=ready; ready=p; } } voidclrscr(void); printf("先來先服務(wù)算法模擬輸出結(jié)果:\n"); printf("***************************************************************************\n"); prt(alg); run=ready;/*將就緒隊列的第一個進程投入運營*/ ready=ready->next; run->state='R';}/*****優(yōu)先數(shù)調(diào)度算法*****/voidpriority(charalg){while(run!=NULL)/*當運營隊列不空時,有進程正在運營*/{run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->prio=run->prio-3;/*每運營一次優(yōu)先數(shù)減少3個單位*/if(run->needtime==0)/*如所需時間為0將其插入完畢隊列*/{run->next=finish;finish=run;run->state='F';/*置狀態(tài)為完畢態(tài)*/run=NULL;/*運營隊列頭指針為空*/if(ready!=NULL)/*假如就緒隊列不空*/firstin();/*將就緒對列的第一個進程投入運營*/}else/*沒有運營完同時優(yōu)先數(shù)不是最大,則將其變?yōu)榫途w態(tài)插入到就緒隊列*/if((ready!=NULL)&&(run->prio<ready->prio)){run->state='W';insert1(run);firstin();/*將就緒隊列的第一個進程投入運營*/}prt(alg);/*輸出進程PCB信息*/}}/*****時間片輪轉(zhuǎn)法*****/voidroundrun(charalg){while(run!=NULL){run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->count=run->count+1;if(run->needtime==0)/*運營完將其變?yōu)橥戤厬B(tài),插入完畢隊列*/{run->next=finish;finish=run;run->state='F';run=NULL;if(ready!=NULL)firstin();/*就緒對列不空,將第一個進程投入運營*/}elseif(run->count==run->round)/*假如時間片到*/{run->count=0;/*計數(shù)器置0*/if(ready!=NULL)/*如就緒隊列不空*/{run->state='W';/*將進程插入到就緒隊列中檔待輪轉(zhuǎn)*/insert2(run);firstin();/*將就緒對列的第一個進程投入運營*/}} prt(alg);/*輸出進程信息*/}}/*****先來先服務(wù)調(diào)度算法*****/voidFIFO(charalg){inttime; while(run!=NULL) { time=run->arrivetime>time?run->arrivetime:time;run->starttime=time; time=time+run->servicetime; run->finishtime=time; run->turnaroundtime=run->finishtime-run->arrivetime; run->weightedturnaroundtime=run->turnaroundtime/run->servicetime; run->next=finish; finish=run; run->state='F'; run=NULL; if(ready!=NULL){ run=ready; run->state='R'; ready=ready->next;} prt(alg); }} /*****主函數(shù)*****/intmain(){charalgo;/*算法標記*/voidclrscr(void);charmainmenu;do{ system("cls");/*清屏*/ printf("\n溫馨提醒:為保證您的操作得到預(yù)期效果,請規(guī)范輸入您的信息^_^\n"); printf("\n\n"); printf("\t\t+━━━━━━━━━━━━━━━━━━━━━━━━+\n");printf("\t\t||歡迎進入進程調(diào)度算法模擬演示系統(tǒng)||\n");printf("\t\t|┗━━━━━━━━━━━━━━━━┛|\n");printf("\t\t||\n");printf("\t\t|●[1]優(yōu)先級算法演示|\n");printf("\t\t||\n");printf("\t\t|●[2]時間片輪轉(zhuǎn)算法演示|\n");printf("\t\t||\n");printf("\t\t|●[3]先來先服務(wù)算法演示|\n");printf("\t\t||\n"); printf("\t\t|●[4]退出系統(tǒng)|\n"); printf("\t\t||\n"); printf("\t\t+━━━━━━━━━━━━━━━━━━━━━━━━+\n");printf("請輸入您的選擇:\n");scanf("%d",&algo);/*輸入字符擬定算法*/ switch(algo) { case1: printf("您選擇的是優(yōu)先級算法模擬進程調(diào)度\n\n"); printf("請輸入進程數(shù)目\n"); scanf("%d",&N);/*輸入進程數(shù)*/ create1(algo);/*優(yōu)先數(shù)法*/ priority(algo); break; case2: printf("您選擇的是時間片輪轉(zhuǎn)算法模擬進程調(diào)度\n\n"); printf("請輸入進程數(shù)目\n"); scanf("%d",&N);/*輸入進程數(shù)*/ create2(algo);/*輪轉(zhuǎn)法*/ roundrun(algo); break; case3: printf("您選擇的是先來先服務(wù)算法模擬進程調(diào)度\n\n"); printf("請輸入進程數(shù)目\n"); scanf("%d",&N);/*輸入進程數(shù)*/ create3(algo); FIFO(algo); break; case4: printf("歡迎您再次使用進程調(diào)度算法模擬系統(tǒng)!\n"); exit(4); break; default: printf("輸入有誤\n"); break; }printf("\n是否繼續(xù)操作(y/n)?");fflush(stdin);mainmenu=getchar(); }while(mainmenu=='y'||mainmenu=='Y');return0;}
實驗三存儲管理(一)實驗?zāi)康恼莆瘴锢韮?nèi)存和虛擬內(nèi)存的基本概念;掌握重定位的基本概念及其要點,理解邏輯地址與絕對地址;掌握各種存儲管理的實現(xiàn)方法,涉及基本原理、地址變換和缺頁中斷、主存空間的分派及分派算法;掌握常用淘汰算法。(二)實驗內(nèi)容編寫一個模擬的動態(tài)頁式存儲管理程序,實現(xiàn)對動態(tài)頁式存儲的淘汰算法的模擬(在先進先出淘汰算法、最近最少使用淘汰算法、最不經(jīng)常使用淘汰算法三種算法中至少選擇兩種進行模擬)并計算各個算法的缺頁率;并且頁面淘汰算法在淘汰一頁時,只將該頁在頁表中抹去,而不再判斷它是否被改寫過,也不將它寫回到輔存。實驗指導(dǎo):#include<iostream.h>#definen12#definem3intpage[n];//保存需要訪問的頁面inti,j,q,mem[m]={0},List[m][n],sum;charflag,f[n];voidInit();voidFIFO();voidLRU();voidmain(){ cout<<"*********************實驗***********************"<<endl; cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl; cout<<"┃頁面調(diào)度算法的模擬實現(xiàn)┃"<<endl; cout<<"┠───────────────────────┨"<<endl; cout<<"┃先進先出算法FIFO┃"<<endl; cout<<"┃最近最少使用算法LRU┃"<<endl; cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl; cout<<"請輸入頁面訪問序列:\n"<<""; for(i=0;i<n;i++) cin>>page[i];cout<<endl; FIFO(); Init(); LRU();}voidInit()//初始化函數(shù){ sum=0;//初始化計算缺頁次數(shù)的變量 for(inti=0;i<m;i++) mem[i]=0; for(i=0;i<m;i++) for(j=0;j<n;j++) List[i][j]=0;}voidFIFO(){ for(i=0;i<n;i++)//查頁表,看是否缺頁 { q=0; while((page[i]!=mem[q])&&(q!=m)) q++; if(q==m) flag='*';//缺頁,則置標志flag為'*' else flag=''; if(flag=='*') { for(j=m-1;j>0;j--)//淘汰最先調(diào)入的頁面調(diào)入當前訪問的 mem[j]=mem[j-1]; mem[0]=page[i]; } for(j=0;j<m;j++) List[j][i]=mem[j]; f[i]=flag; } cout<<"0代表為空,*代表有缺頁:\n"; cout<<endl; cout<<"FIFO算法結(jié)果"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) cout<<List[i][j]<<""; cout<<endl; } for(i=0;i<n;i++) { if(f[i]=='*') sum++; cout<<f[i]<<""; } cout<<"\n"<<endl; cout<<"缺頁次數(shù)是:"<<sum<<"缺頁率是:"<<(double)sum/12<<endl;}voidLRU(){ for(i=0;i<n;i++)//查頁表,看是否缺頁 { q=0; while((page[i]!=mem[q])&&(q!=m)) q++; if(q==m) flag='*';//缺頁,則置標志flag為'*' else flag=''; for(j=q;j>0;j--) mem[j]=mem[j-1]; mem[0]=page[i]; for(j=0;j<m;j++) List[j][i]=mem[j]; f[i]=flag; } cout<<endl; cout<<"LRU算法結(jié)果"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) cout<<List[i][j]<<""; cout<<endl; } for(i=0;i<n;i++) { if(f[i]=='*') sum++; cout<<f[i]<<""; } cout<<endl; cout<<""<<endl; cout<<"缺頁次數(shù)是:"<<sum<<"缺頁率是:"<<(double)sum/12<<endl;}
實驗四設(shè)備管理(一)實驗?zāi)康恼莆摘氄荚O(shè)備的使用方式,以及設(shè)備的分派和回收;掌握用死鎖避免方法來解決申請獨占設(shè)備也許導(dǎo)致的死鎖。(二)實驗內(nèi)容用死鎖避免方法來解決申請獨占設(shè)備也許導(dǎo)致的死鎖,程序?qū)崿F(xiàn)對銀行家算法的模擬。設(shè)計五個進程{P0,P1,P2,P3,P4}共享三類資源{A,B,C}的系統(tǒng),{A,B,C}的資源數(shù)量分別為10,5,7。進程可動態(tài)地申請資源和釋放資源,系統(tǒng)按各進程的申請動態(tài)地分派資源。規(guī)定程序具有顯示和打印各進程的某一時刻的資源分派表和安全序列;顯示和打印各進程依次規(guī)定申請的資源號以及為某進程分派資源后的有關(guān)資源數(shù)據(jù)的情況。實驗指導(dǎo):#include<iostream.h>#include<string.h>#include<stdio.h>#include<iomanip>#definen10#definetrue1#definefalse0intN;//資源總類intM; //總進程數(shù)intAvailable[50];intMax[50][50];intAllocation[50][50]={0};intNeed[50][50]={0};intWork[50]={0}; intTemp[50]={0};//存放安全序列號charName[50]={0};intSum[50]={0};intRequest[50]={0};voidPrint(){ intk=0; cout<<" ***********資源分派表***********"<<endl; cout<<"Process"<<"Max"<<"Allocation"<<"Need"<<"Available"<<endl; cout<<" ABC"<<"ABC"<<"ABC"<<"ABC"<<endl; for(inti=0;i<M;i++) { cout<<"P"<<i<<""; for(intj=0;j<N;j++) cout<<""<<Max[i][j]; cout<<""; for(j=0;j<N;j++) cout<<""<<Allocation[i][j]; cout<<""; for(j=0;j<N;j++) cout<<""<<Need[i][j]; cout<<""; for(j=0;j<N;j++) { if(k!=3) { cout<<""<<Available[j]; k++; } } cout<<endl; }}voidCreate(){ inti,j; cout<<"請輸入您要創(chuàng)建進程的數(shù)量:"<<endl; cin>>M; cout<<"請輸入各類資源的總數(shù):("<<N<<"個)"<<endl; for(i=0;i<N;i++) cin>>Sum[i];k1: cout<<endl; cout<<"請輸入各類進程所需要資源最大數(shù)目:("<<N*M<<"個)"<<endl; for(i=0;i<M;i++) for(j=0;j<N;j++) { cin>>Max[i][j]; if(Max[i][j]>Sum[j]) { cout<<"占有資源超過了聲明的該資源總數(shù),請重新輸入!"<<endl; gotok1; } } k2: cout<<endl; cout<<"請輸入各類進程已分派的各類資源的數(shù)目:("<<N*M<<"個)"<<endl; for(i=0;i<M;i++) for(j=0;j<N;j++) { cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) { cout<<"占有資源超過了聲明的該資源總數(shù),請重新輸入!"<<endl; gotok2; } } intp; for(i=0;i<N;i++) { p=Sum[i]; for(j=0;j<M;j++) p=p-Allocation[j][i]; Available[i]=p; } for(i=0;i<M;i++) for(j=0;j<N;j++) Need[i][j]=Max[i][j]-Allocation[i][j];}voidrestore(inti){ intj; for(j=0;j<N;j++) { Available[j]+=Request[j]; Allocation[i][j]-=Request[j]; Need[i][j]+=Request[j]; }}intchangedata(inti){ intj; for(j=0;j<N;j++) { Available[j]+=Request[j]; Allocation[i][j]-=Request[j]; Need[i][j]+=Request[j]; } return1;}intSafe()//解決傳過來的第幾個進程{ inti=0; intk=0; intm; intapply,Finish[50]={0}; intj,flag=0; for(i=0;i<N;i++) Work[i]=Available[i]; for(i=0;i<M;i++) { apply=0; for(j=0;j<N;j++) { if(Finish[i]==false&&Need[i][j]<=Work[j]) { apply++; if(apply==N) { for(m=0;m<N;m++) Work[m]=Work[m]+Allocation[i][m]; Finish[i]=true; Temp[k++]=i; i=-1; flag; } } }} for(i=0;i<M;i++) { if(Finish[i]==false) { cout<<"系統(tǒng)不安全!!!本次資源申請不成功!!!"<<endl; return-1; } } cout<<"經(jīng)安全性檢查,系統(tǒng)安全,本次分派成功!!"<<endl; cout<<"安全序列號"; for(i=0;i<M-1;i++) cout<<"P"<<Temp[i]<<","; cout<<"P"<<Temp[i]<<">"<<endl; cout<<endl; return0;}voiddijkstra(){ charch; inti=0,j=0; ch='y'; cout<<"請輸入你要請求的資源進程號(0-"<<M-1<<"):"<<endl; cin>>i; cout<<"請輸入進程"<<i<<"請求Request變量"<<endl; for(i=0;i<N;i++) { cout<<Name[j]<<":"; cin>>Request[i]; } for(i=0;i<N;i++) { if(Request[i]>Need[j][i]) { cout<<"進程"<<i<<"申請的資源大于他需要的資源"; cout<<"分派不合理,不予分派!"<<endl; ch='n'; break; } else if(Request[j]>Available[j]) { cout<<"進程"<<i<<"申請的資源大于系統(tǒng)可運用的資源"; cout<<"分派犯錯,不予分派!"<<endl; ch='n'; break; } if(ch='y') changedata(i); Print(); Safe(); if(Safe()==1) restore(i); } }intmain(){ intc; Create(); Print(); Safe(); while(c) { cout<<" 銀行家算法"<<endl; cout<<"1分派資源"<<endl; cout<<"2離開"<<endl; cout<<"請選擇功能號:"<<endl; cin>>c; switch(c) { case1:dijkstra();break; case0:c=0;break; default:cout<<"請對的選擇功能號(0--1)"<<endl;break; } } return1;}
實驗五文獻管理(一)實驗?zāi)康恼莆瘴墨I的存取方法;掌握文獻的邏輯結(jié)構(gòu)和物理結(jié)構(gòu);掌握存儲空間的分派和回收;掌握磁盤管理與調(diào)度。(二)實驗內(nèi)容用程序模擬磁盤的調(diào)度過程,并計算各磁盤調(diào)度算法涉及先來先服務(wù)算法、最短尋道時間優(yōu)先算法、掃描算法和循環(huán)掃描算法的平均尋道長度。本實驗是模擬操作系統(tǒng)的磁盤尋道方式,運用磁盤訪問順序的不同來設(shè)計磁盤的調(diào)度算法。實現(xiàn)的磁盤調(diào)度算法有FCFS,SSTF,SCAN,CSCAN和NStepSCAN算法。設(shè)定開始磁道號尋道范圍,依據(jù)起始掃描磁道號和最大磁道號數(shù),隨機產(chǎn)生要進行尋道的磁道號序列。選擇磁盤調(diào)度算法,顯示該算法的磁道訪問順序,計算出移動的磁道總數(shù)和平均尋道總數(shù)。按算法的尋道效率進行排序,并對各算法的性能進行分析比較。實驗指導(dǎo):#include<stdio.h>#include<math.h>voidFCFS(intb[],intn,intinit){ inti,s,sum; inta[20]; for(i=0;i<n;i++) a[i]=b[i]; s=init; sum=0; for(i=0;i<n;i++){ printf("第%d次訪問的磁道:%d\n",i+1,a[i]); sum+=abs(s-a[i]); s=a[i]; } printf("平均尋道長度:%f\n",sum*1.0/n);}voidSSTF(intb[],intn,intk){ inti,j,s,sum=0,p; inta[20]; for(i=0;i<n;i++) a[i]=b[i]; for(i=n-1;i>=0;i--){ s=a[0]; p=0; for(j=0;j<=i;j++) if(abs(a[j]-k)<abs(s-k)){ s=a[j]; p=j; } a[p]=a[i]; printf("第%d次訪問的磁道:%d\n",n-i,s); sum+=abs(s-k); k=s; } printf("平均尋道長度:%f\n",sum*1.0/n);}voidSCAN1(intb[],intn,intk){ inti,j,s,sum=0,p,biaoji; inta[20]; for(i=0;i<n;i++) a[i]=b[i]; for(i=n-1;i>=0;i--){ biaoji=0; for(j=0;j<=i;j++) if(a[j]-k<0){ biaoji=1; p=j; break; } if(biaoji==1){ s=a[p]; for(j=0;j<=i;j++) if(a[j]<k&&k-a[j]<k-s) { s=a[j]; p=j; } a[p]=a[i]; printf("第%d次訪問的磁道:%d\n",n-i,s); sum+=k-s; k=s; } else{ s=a[0]; for(j=0;j<=i;j++) if(a[j]-k<=s-k) { s=a[j]; p=j; } a[p]=a[i]; printf("第%d次訪問的磁道:%d\n",n-i,s); sum+=abs(k-s); k=s; } } printf("平均尋道長度:%f\n",sum*1.0/n);}voidSCAN2(intb[],intn,intk){ inti,j,s,sum=0,p,biaoji; inta[20]; for(i=0;i<n;
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 美發(fā)師燙染知識培訓(xùn)課件
- 生產(chǎn)與安全知識培訓(xùn)課件
- 幼兒園年終工作總結(jié)
- 二零二五年度投資私募股權(quán)投資基金合同3篇
- 二零二五年度光伏發(fā)電項目電氣安裝工程合同3篇
- Unit6 My sweet home Lesson 1 Get ready(說課稿)-2024-2025學(xué)年外研版(三起)(2024)三年級上冊
- 從內(nèi)經(jīng)談冬日養(yǎng)生
- 電瓶車剎車知識培訓(xùn)課件
- 二零二五年度房地產(chǎn)銷售合同標的、房產(chǎn)描述與銷售條款協(xié)議3篇
- 期中測評卷 Lesson 1~ 6綜合測評卷(含答案)-2024-2025學(xué)年科普版(三起)英語四年級上冊
- 2025企業(yè)年會盛典
- 《鴻蒙智能互聯(lián)設(shè)備開發(fā)(微課版)》全套教學(xué)課件
- 場地平整施工組織設(shè)計-(3)模板
- 交通設(shè)施設(shè)備供貨及技術(shù)支持方案
- 山西省晉中市2023-2024學(xué)年高一上學(xué)期期末考試 物理 含解析
- 項目工程師年終總結(jié)課件
- 一年級口算練習(xí)題大全(可直接打印A4)
- 安全與急救學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 人力資源戰(zhàn)略規(guī)劃地圖
- 2024電力安全工器具及小型施工機具預(yù)防性試驗規(guī)程
- 基于單片機的2.4G無線通信系統(tǒng)
評論
0/150
提交評論