計算機操作系統(tǒng)課程設計.doc_第1頁
計算機操作系統(tǒng)課程設計.doc_第2頁
計算機操作系統(tǒng)課程設計.doc_第3頁
計算機操作系統(tǒng)課程設計.doc_第4頁
計算機操作系統(tǒng)課程設計.doc_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

精品文檔景德鎮(zhèn)陶瓷學院計算機操作系統(tǒng)課程設計學院:信息工程學院專業(yè):計算機科學與技術班級:13級二班學號:201310510112姓名:張旸任務一、進程創(chuàng)建、控制與撤消一、實驗目的:通過進程的創(chuàng)建和控制的設計來達到如下目的:1、加深對進程概念的理解,明確進程和程序的區(qū)別2、進一步認識并發(fā)執(zhí)行的概念,區(qū)別順序執(zhí)行和并發(fā)執(zhí)行3、分析進程爭用臨界資源的現(xiàn)象,學習解決進程互斥的方法二、實驗內容:在WINDOWS環(huán)境下模擬實驗:1、編寫一程序,來模擬進程的創(chuàng)建和撤消,要求通過終端鍵盤輸入三、四作業(yè)的名稱、大小、優(yōu)先級等。系統(tǒng)為它創(chuàng)建進程,并把進程控制塊PCB的內容送到終端顯示器上輸出2、同時模擬內存空間為作業(yè)分配內存空間,并把結果用圖形形象地表示出來,同樣通過終端輸出3、按進程的優(yōu)先級的順序撤消進程,同時通過終端顯示PCB的撤消過程和內存的釋放過程三、結構框圖:開始主函數(shù)main ()查看進程viewrun()撤銷進程kill()創(chuàng)建進程create()替換進程huanchu()結束退出exit(0)四、實驗代碼:#include #include #include struct jincheng int pid;int youxian;int daxiao;int msg;int live;struct jincheng neicun20,waicun;int shumu=1;create()if(shumu=20)printf(n 內存已滿,請先結束或換出進程n);elseprintf(n 請創(chuàng)建第%d個進程,shumu);printf(n 請輸入新進程的 pidn); scanf(%d,&neicunshumu.pid);printf(n 請輸入新的進程的優(yōu)先級n); scanf(%d,&neicunshumu.youxian);printf(n 請輸入新的進程的大小n); scanf(%d,&neicunshumu.daxiao);printf(n 請輸入新的進程的消息n);scanf(%d,&neicunshumu.msg); neicunshumu.live=1; shumu+;return neicunshumu-1.live;void viewrun()int vpid;printf(n 請輸入想顯示第幾個創(chuàng)建的進程n); scanf(%d,&vpid);if(vpid0&vpid0&pid1neicunpid2.youxian) waicun.pid=neicunpid1.pid;waicun.youxian=neicunpid1.youxian;waicun.daxiao=neicunpid1.daxiao;waicun.msg=neicunpid1.msg;neicunpid1.pid=neicunpid2.pid;neicunpid1.youxian=neicunpid2.youxian;neicunpid1.daxiao=neicunpid2.daxiao;neicunpid1.msg=neicunpid2.msg;neicunpid2.pid=waicun.pid; neicunpid2.youxian=waicun.youxian; neicunpid2.daxiao=waicun.daxiao; neicunpid2.msg=waicun.msg;printf(n 替換完成n);printf(n 被替換進程的pid是:%dn,waicun.pid);printf(n 被替換進程的youxian是:%dn,waicun.youxian);printf(n 被替換進程的daxiao是:%dn,waicun.daxiao);printf(n 被替換進程的msg是:%dn,waicun.msg);elseprintf(n進程優(yōu)先級不夠大);elseprintf(所查看運行進程不存在); printf(請按回車退出換出進程n);c=getche();void kill()int kpid; printf(n 請輸入要撤銷第幾個創(chuàng)建的進程n); scanf(%d,&kpid);if(kpid0&kpid20&neicunkpid.live=1)neicunkpid.live=0;printf(n 已撤銷第%d個創(chuàng)建的進程,kpid);else printf(n 所查看運行進程不存在n);printf(請按回車退出查看n);kpid=getch();void main ()int n,m,i;char a;n=1;while(n=1)system(cls);printf(n*); printf(n* 進程演示系統(tǒng) *);printf(n*);printf(n 1.創(chuàng)建新的進程 2.查看運行進程 );printf(n 3.換出某個進程 4.殺死運行進程 ); printf(n 5.退出 ); printf(n*);printf(n請選擇(15)); a=getch();switch(a) case1:create();break;case2:viewrun();break;case3:huanchu();break;case4:kill();break;case5:exit(0);default:n=0; 五:實驗結果:任務二、單處理機系統(tǒng)的進程調度一、實驗目的:1、加深對進程概念的理解,明確進程和程序的區(qū)別2、深入了解系統(tǒng)如何組織進程,創(chuàng)建進程3、進一步認識如何實現(xiàn)處理機調度二、實驗內容:從下面四個調度算法中,選擇一個調度算法來實現(xiàn)進程調度:1、先來先服務調度算法2、優(yōu)先數(shù)調度算法3、時間片輪法調度算法4、多級反饋隊列輪轉調度算法三、結構框圖:四、實驗代碼:#include stdio.h #include #include #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定義進程控制塊PCB */ char name10; char state; int super; int ntime; int rtime; struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; void sort() /* 建立對進程進行優(yōu)先級排列函數(shù)*/ PCB *first, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) /*優(yōu)先級最大者,插入隊首*/ p-link=ready; ready=p; else /* 進程比較優(yōu)先級,插入適當?shù)奈恢弥?/ first=ready; second=first-link; while(second!=NULL) if(p-super)(second-super) /*若插入進程比當前進程優(yōu)先數(shù)大,*/ /*插入到當前進程前面*/ p-link=second; first-link=p; second=NULL; insert=1; else /* 插入進程優(yōu)先數(shù)最低,則插入到隊尾*/ first=first-link; second=second-link; if(insert=0) first-link=p; void input() /* 建立進程控制塊函數(shù)*/ int i,num; printf(n請輸入進程數(shù)量:); scanf(%d,&num); for(i=1;iname); printf(n 輸入進程優(yōu)先數(shù):); scanf(%d,&p-super); printf(n 輸入進程運行時間:); scanf(%d,&p-ntime); printf(n); p-rtime=0;p-state=w; p-link=NULL; sort(); /* 調用sort函數(shù)*/ int space() int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l); void show()printf(nqnametstatetsupertndtimetruntimen); void disp(PCB * pr) /*建立進程顯示函數(shù),用于顯示當前進程*/ printf( %st,pr-name); printf( %ct,pr-state); printf( %dt,pr-super); printf( %dt,pr-ntime); printf( %dt,pr-rtime); printf(n); void check() /* 建立進程查看函數(shù) */ PCB* pr; printf(n*當前正在運行的進程是:%s,p-name); /*顯示當前運行進程*/ show();disp(p); pr=ready; if(pr=NULL)printf(n*當前就緒隊列為空!);else printf(n*當前就緒隊列狀態(tài)為:); /*顯示就緒隊列狀態(tài)*/show();while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立進程撤消函數(shù)(進程運行結束,撤消進程)*/ printf(n 進程%s已完成.n,p-name); free(p); void running() /* 建立進程就緒函數(shù)(進程運行時間到,置就緒狀態(tài)*/ (p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 調用destroy函數(shù)*/ else (p-super)-; p-state=w; sort(); /*調用sort函數(shù)*/ void main() /*主函數(shù)*/ int len,h=0; char ch; input(); len=space(); while(len!=0)&(ready!=NULL) ch=getchar(); h+; printf(n 當前運行次數(shù)為:%d n,h); p=ready; ready=p-link; p-link=NULL; p-state=R; check(); running(); printf(n 按任一鍵繼續(xù).); ch=getchar(); printf(nn 進程已經完成.n); ch=getchar(); 五:實驗結果:任務三、基本存儲器管理一、實驗目的:一個好的計算機系統(tǒng)不僅要有一個足夠容量的、存取速度高的、穩(wěn)定可靠的主存儲器,而且要能合理地分配和使用這些存儲空間。當用戶提出申請存儲器空間時,存儲管理必須根據(jù)申請者的要求,按一定的策略分析主存空間的使用情況,找出足夠的空閑區(qū)域分配給申請者。當作業(yè)撤離或主動歸還主存資源時,則存儲管理要收回作業(yè)占用的主存空間或歸還部分主存空間。主存的分配和回收的實現(xiàn)與主存儲器的管理方式有關的,通過本實驗幫助學生理解在不同的存儲管理方式下怎樣實現(xiàn)主存的分配和回收二、實驗內容:從下兩種存儲管理方式的主存分配和回收中,選擇一種管理方式來實現(xiàn)本次實驗任務:1、在可變(動態(tài))分區(qū)管理方式下,采用最先適應算法2、在分頁式管理方式下,采用位示圖來表示主存的分配情況和回收情況三、結構框圖:四、實驗代碼:#include#includestruct linkkint size;int addr;struct linkk *next;struct jobtabint jno;int size;int addr;int flag;struct linkk *PL,*p,*q,*p1;struct jobtab tab20;int l,m,n,t,addr,length;void printlink()if (PL!=NULL)printf(n 進程內存大小 剩余內存n);printf(-n);q=PL;while(q!=NULL)printf( %d %dn,q-addr,q-size);q=q-next; printf(-n);return;void printtab()int i; int flag=0;for (i=0;i20&flag=0;i+)if (tabi.flag=1)flag=1;if (flag=0)printf(n 無進程!);return;printf(n 進程編號 進程起始地址 進程內存大小n);printf(-n);for (i=0;isize=l)tabn.addr=q-addr;p1=q;if (p1=PL) PL=q-next;else p-next=q-next;free(p1);return;if (q-sizel)tabn.addr=q-addr;q-size=q-size-l; q-addr=q-addr+l;return;p=q; q=q-next;tabn.flag=0;printf(n 沒有內存剩余!n);return;void freem()printf(n 輸入進程編號:); scanf(%d,&n); if(tabn.flag=0)printf(n 不是該進程!); return; addr=tabn.addr; length=tabn.size; tabn.flag=0; q=PL;if (q=NULL)|(addr+lengthaddr)p1=(struct linkk *)malloc(sizeof(struct linkk); p1-size=length; p1-addr=addr; p1-next=q; PL=p1;return;if(addr+length=q-addr)q-addr=addr; q-size=q-size+length; return;p=q; q=q-next;while (q!=NULL)if(p-addr+p-size=addr)p-size=p-size+length;if (addr+length=q-addr)p-size=p-size+q-size;p1=q; p-next=q-next;free(p1);return;if(addr+length=q-addr)q-addr=addr; q-size=q-size+length; return; if(addr+lengthaddr)p1=(struct linkk *)malloc(sizeof(struct linkk); p1-size=length; p1-addr=addr; p1-next=q; p-next=p1; return;p=q; q=q-next; if(p-addr+p-size=addr)p-size=p-size+length; return; p1=(struct linkk *)malloc(sizeof(struct linkk); p1-addr=addr; p1-size=length; p1-next=NULL; p1-next=p1; return; main()PL=(struct linkk *)malloc(sizeof(struct linkk); PL-addr=0; PL-next=NULL; printf(n輸入內存大小:); scanf(%d,&n); PL-size=n; for(int i=0;i20;i+)tabi.jno=i; tabi.flag=0; t=0; doprintf(n-n); printf( 1-分配內存 2-釋放內存n); printf( 3-鏈接進程號 4-輸出_TAB n); printf( 5-Quitn); printf(n-n); printf( Select bb); scanf(%d,&m); switch(m)case 1: allocm();break;case 2: freem();break;case 3: printlink();break;case 4: printtab();break;case 5: t=1;while (!t);五:實驗結果:任務四、請求分頁存儲管理(虛擬存儲)一、實驗目的:通過請求分頁存儲管理的設計,讓學生了解虛擬存儲器的概念和實現(xiàn)方法。進行運行時不需要將所有的頁面都調入內存,只需將部分調入內存,即可運行,在運行的過程中若要訪問的頁面不在內存時,則需求有請求調入的功能將其調入。假如此時若內存沒有空白物理塊,則通過頁面置換的功能將一個老的不用的頁面淘汰出來,其中淘汰的算法有多種二、實驗內容:模擬仿真請求分頁調度算法,其中淘汰的算法可選下列其一1、先進先出算法2、最近最久算法3、CLOCK算法三、結構框圖:四、實驗代碼:#include#includeusing namespace std;const int MaxNum=320;const int M=5;int PageOrderMaxNum;int SimulateMaxNumM;int PageCountM,LackNum;float PageRate;int PageCount132;bool IsExit(int i)bool f=false;for(int j=0;jM;j+)if(Simulatei-1j=PageOrderi)f=true;return f;int IsExitLRU(int i)int f=-1;for(int j=0;jM;j+)if(Simulatei-1j=PageOrderi)f=j;return f;int Compare() int p,q;p=PageCount0;q=0;for(int i=1;iM;i+)if(pPageCounti)p=PageCounti;q=i;return q;void Init() for(int k=0;kMaxNum;k+)int n=rand()%320;PageOrderk=n/10;for(int i=0;iMaxNum;i+)for(int j=0;jM;j+)Simulateij=-1;for(int q=0;qM;q+)PageCountq=0;void OutPut()int i,j;cout頁面訪問序列:endl;for(j=0;jMaxNum;j+)coutPageOrderj ;coutendl;cout頁面訪問過程(只顯示前10個):endl;for(i=0;i10;i+)for(j=0;jM;j+)if(Simulateij=-1)cout ;elsecoutSimulateij ;coutendl;cout缺頁數(shù)= LackNumendl;cout命中率= PageRateendl;cout-endl; void FIFO()int j,x=0,y=0;LackNum=0,Init();for(j=0;jM;j+)for(int k=0;k=j;k+)if(j=k)Simulatejk=PageOrderj;elseSimulatejk=Simulatej-1k; ;for(x=M;xMaxNum;x+)for(int t=0;tM;t+)Simulatext=Simulatex-1t;if(!IsExit(x)LackNum+;Simulatexy%M=PageOrderx;y+;PageRate=1-(float)LackNum/(float)MaxNum);OutPut();void LRU()int j,x=0,y=0;LackNum=0,Init();for(j=0;jM;j+)for(int k=0;k=j;k+)PageCountk+;if(j=k)Simulatejk=PageOrderj;elseSimulatejk=Simulatej-1k; LackNum+;for(x=M;xMaxNum;x+)for(int t=0;tM;t+)Simulatext=Simulatex-1t;int p=IsExitLRU(x);if(p=-1)int k;k=Compare();for(int w=0;wM;w+)if(w!=k)PageCountw+;elsePageCountk=1;Simulatexk=PageOrderx;LackNum+;elsefor(int w=0;wM;w+)if(w!=p)PageCountw+;elsePageCountp=1;PageRate=1-(float)LackNum/(float)MaxNum);OutPut();void YourChoice(int choice)switch(choice)case 1:cout-endl; coutFIFO算法結果如下:endl;FIFO();break;case 2:cout-endl; coutLRU算法結果如下:endl;LRU();break;case 5:break;default:cout重新選擇算法:1-FIFO 2-LRU 5-退出 choice;YourChoice(choice);void main()int choice,i=1;while(i)cout請選擇算法:1-FIFO 2-LRU 5-退出 choice;if(choice=5)i=0;elseYourChoice(choice);五:實驗結果:任務五、死鎖的避免一、實驗目的:在多道程序系統(tǒng)中,多個進程的并發(fā)執(zhí)行來改善系統(tǒng)的資源利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險死鎖。所謂死鎖(Deadlock),是指多個進程在運行過程中因爭奪資源而造成的一種僵局(DeadlyEmbrace),當進程處于這種狀態(tài)時,若無外力作用,他們都無法在向前推進我們可以在分配資源時加上限制條件就可以預防死鎖,但是,在每一種預防死鎖的方法之中,都施加了較強的限制條件;而在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能二、實驗內容:利用銀行家算法來避免死鎖的發(fā)生三、結構框圖:四、實驗代碼:#include#include#includeusing namespace std;int Sign100;/標記數(shù)組int Progress100;/進程執(zhí)行順序標記數(shù)組string Number100;/進程號class BankerArithmeticpublic:BankerArithmetic(int a,int b); /構造函數(shù)int Safe(int grac);/判斷是否安全void Show();/顯示相關信息void Bank();/計算剩余資源量BankerArithmetic();/析構函數(shù)private:BankerArithmetic();void Init(int a,int b);/初始化int ID;/記錄成功申請資源的進程號int n; /包含的進程數(shù)int m; /資源種類數(shù)int *Available;/可提供的資源總數(shù)int * Allocation;/以分配的資源int * Need;/仍需要的資源int *Left;/剩余的資源;BankerArithmetic:BankerArithmetic(int a,int b):n(a),m(b)Init(n,m);BankerArithmetic:BankerArithmetic()int i;deleteAvailable;deleteLeft;for(i=0;in;i+)deleteAllocationi;deleteAllocation;for(i=0;in;i+)deleteNeedi;deleteNeed;void BankerArithmetic:Init(int a,int b)int i,j;for(i=0;i100;i+)Signi=-1;Available=new intb;/Availablede的申請Left=new intb;/Left的申請Allocation=new int*a;/Allocation的申請for(i=0;ia;i+)Allocationi=new intb;Need=new int*a;/Need的申請for(i=0;ia;i+)Needi=new intb;cout請輸入可用資源Available:endl;for(i=0;iAvailablei;cout請輸入進程號:endl;for(i=0;iNumberi;cout請輸入分配資源矩陣Allocation:(a,b)endl; for(i=0;ia;i+)for(j=0;jAllocationij;cout請輸入仍需要資源矩陣Need:(a,b)endl; for(i=0;ia;i+)for(j=0;jNeedij;/計算剩余的資源for(i=0;im;i+)Lefti=Availablei;j=0;while(jm)for(i=0;in;i+)Leftj-=Allocationij;j+;int BankerArithmetic:Safe(int grac) int i,j,temp;for(i=0;in;i+)if(Signi!=1)temp=1;for(j=0;j=Needij)temp*=1;elsetemp*=0;if(temp=1)break;ID=i;Signi=1;Progressgrac=ID;if(temp)return ID;elsereturn -1;void BankerArithmetic:Bank()for(int i=0;im;i+)Lefti=Lefti+AllocationIDi; void BankerArithmetic:Show()int i,j;cout進程 Allocation Need n;for(i=0;in;i+)if(Signi!=1)coutNumberi ;for(j=0;jm;j+)cout Allocationij;cout ;for(j=0;jm;j+)cout Needij;coutendl;coutendl;for(i=0;im;i+)coutLefti ;coutendl;int main()int process,source,result,i=0,sum=1;char ans1,ans2;coutprocess;coutsource;BankerArithmetic banker(process,source);while(iprocess)coutans1;if(ans1=y|ans1=Y)banker.Show();result=banker.Safe(i);if(result=0)Progressi=result;elsesum=0;cout處于不安全狀態(tài)!程序將退出!n; exit(1);cout按空格鍵程序執(zhí)行一次endl; while(cin.get(ans2)&ans2=n)banker.Bank();i+;if(sum=1)cout進程執(zhí)行的順序如下:;for(i=0;iprocess-1;i+)coutNumberProgressi ; coutNumberProgressprocess-1;return 0;五:實驗結果:任務六、磁盤空間的分配與回收一、實驗目的:磁盤初始化時把磁盤存儲空間分成許多塊(扇區(qū)),這些空間可以被多個用戶共享。用戶作業(yè)在執(zhí)行期間常常要在磁盤上建立文件或已經建立在磁盤上的文件刪去,這就涉及到磁盤存儲空間的分配和回收。一個文件存放到磁盤上,可以組織成順序文件(連續(xù)文件)、鏈接文件(串聯(lián)文件)、索引文件等,因此,磁盤存儲空間的分配有兩種方式,一種是分配連續(xù)的存儲空間,另一種是可以分配不連續(xù)的存儲空間。怎樣有效地管理磁盤存儲空間是操作系統(tǒng)應解決的一個重要問題,通過本實驗使學生掌握磁盤存儲空間的分配和收回算法二、實驗內容:模擬磁盤空閑空間的表示方法,以及模擬實現(xiàn)磁盤空間的分配和回收。從下題目中選擇一題來實現(xiàn)設備的管理:1、連續(xù)的磁盤存儲空間的分配和回收2、用位示圖管理磁盤存儲空間3、模擬UNIX系統(tǒng)的空閑塊組鏈接法,實現(xiàn)磁盤存儲空間的管理三、結構框圖:分配框圖 否 是 是 否 否 是回收框圖 四、實驗代碼:#include #include void Initbitmap(int map88)int cylinder,track,sector;char choice=Y;printf(初始化位視圖.n);while(choice=y|choice=Y)printf(柱面號:);scanf(%d,&cylinder);printf(磁道號:);scanf(%d,&track);printf(物理記錄號:);scanf(%d,§or);mapcylinder4*track+sector=1;printf(contiune?);getchar();scanf(%c,&choice);void allocate(int map88)int i,j;int flag=0;int cylinder,track,sector;for(i=0;i8;i+) for(j=0;j8;j+)if(mapij=0) mapij=1;flag=1;break;if(flag=1) break;if(flag=1)cylinder=i;track=j/4;sector=j%4;printf(分配到的柱面號、磁道號、物理記錄數(shù));printf(%dt%

溫馨提示

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

評論

0/150

提交評論