第一篇:操作系統(tǒng)存儲管理實驗介紹
河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告
實驗五 存儲管理
一、實驗?zāi)康?、加深對操作系統(tǒng)存儲管理的理解、能過模似頁面調(diào)試算法,加深理解操作系統(tǒng)對內(nèi)存的高度管理
二、總的設(shè)計思想、環(huán)境語言、工具等總的設(shè)計思想:
1、編寫函數(shù)計算并輸出下述各種算法的命中率
① OPT頁面置換算法
OPT所選擇被淘汰的頁面是已調(diào)入內(nèi)存,且在以后永不使用的,或是在最長時間內(nèi)不再被訪問的頁面。因此如何找出這樣的頁面是該算法的關(guān)鍵??蔀槊總€頁面設(shè)置一個步長變量,其初值為一足夠大的數(shù),對于不在內(nèi)存的頁面,將其值重置為零,對于位于內(nèi)存的頁面,其值重置為當(dāng)前訪問頁面與之后首次出現(xiàn)該頁面時兩者之間的距離,因此該值越大表示該頁是在最長時間內(nèi)不再被訪問的頁面,可以選擇其作為換出頁面。② FIFO頁面置換算法
FIFO總是選擇最先進入內(nèi)存的頁面予以淘汰,因此可設(shè)置一個先進先出的忙頁幀隊列,新調(diào)入內(nèi)存的頁面掛在該隊列的尾部,而當(dāng)無空閑頁幀時,可從該隊列首部取下一個頁幀作為空閑頁幀,進而調(diào)入所需頁面。③ LRU頁面置換算法
LRU是根據(jù)頁面調(diào)入內(nèi)存后的使用情況進行決策的,它利用“最近的過去”作為“最近的將來”的近似,選擇最近最久未使用的頁面予以淘汰。該算法主要借助于頁面結(jié)構(gòu)中的訪問時間time來實現(xiàn),time記錄了一個頁面上次的訪問時間,因此,當(dāng)須淘汰一個頁面時,選擇處于內(nèi)存的頁面中其time值最小的頁面,即最近最久未使用的頁面予以淘汰。
④ LFU頁面置換算法
LFU要求為每個頁面配置一個計數(shù)器(即頁面結(jié)構(gòu)中的counter),一旦某頁被訪問,則將其計數(shù)器的值加1,在需要選擇一頁置換時,則將選擇其計數(shù)器值最小的頁面,即內(nèi)存中訪問次數(shù)最少的頁面進行淘汰。⑤ NUR頁面置換算法
NUR要求為每個頁面設(shè)置一位訪問位(該訪問位仍可使用頁面結(jié)構(gòu)中的counter表示),當(dāng)某頁被訪問時,其訪問位counter置為1。需要進行頁面置換時,置換算法從替換指針開始(初始時指向第一個頁面)順序檢查處于內(nèi)存中的各個頁面,如果其訪問位為0,就選擇該頁換出,否則替換指針下移繼續(xù)向下查找。如果內(nèi)存中的所有頁面掃描完畢未找到訪問位為0的頁面,則將替換指針重新指向第一個頁面,同時將內(nèi)
河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告
存中所有頁面的訪問位置0,當(dāng)開始下一輪掃描時,便一定能找到counter為0的頁面。
2、在主函數(shù)中生成要求的指令序列,并將其轉(zhuǎn)換成頁地址流;在不同的內(nèi)存容量下調(diào)用上述函數(shù)使其計算并輸出相應(yīng)的命中率。
環(huán)境語言:Linux下的GNU 編譯環(huán)境
三、數(shù)據(jù)結(jié)構(gòu)與模塊說明
程序中用到的數(shù)據(jù)結(jié)構(gòu)、類型定義及主要的函數(shù)原型如下:
1、數(shù)據(jù)結(jié)構(gòu)
(1)頁面結(jié)構(gòu) typedef struct{ int pn, pfn, counter, time;} pl_type;pl_type pl[total_vp];其中pn為頁面號(頁號),pfn為頁幀號(物理塊號),counter為一個周期內(nèi)訪問該頁面的次數(shù),time為訪問時間;pl[total_vp]為頁面結(jié)構(gòu)數(shù)組,由于共有320條指令,每頁可裝入10條指令,因此虛頁長total_vp的值為32。
(2)頁幀控制結(jié)構(gòu) struct pfc_struct{ int pn, pfn;struct pfc_struct *next;};typedef struct pfc_struct pfc_type;pfc_type pfc[total_vp], *freepf_head, *busypf_head, *busypf_tail;其中pfc[total_vp]定義用戶進程的頁幀控制結(jié)構(gòu)數(shù)組,在該實驗中,用戶內(nèi)存工作區(qū)是動態(tài)變化的,最多可達(dá)到用戶進程的虛頁數(shù)目,即32個物理塊。
*freepf_head為空閑頁幀頭的指針 *busypf_head為忙頁幀頭的指針 *busypf_tail忙頁幀尾的指針
2、變量定義
(1)int a[total_instruction]: 指令流數(shù)組(2)int diseffect: 頁面失效次數(shù)
(3)int page[total_instruction]: 每條指令所屬頁面號
(4)int offset[total_instruction]: 每頁裝入10條指令后取模運算得出的頁內(nèi)偏移地址(5)int total_pf: 用戶進程的內(nèi)存頁幀數(shù)
河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告
3、主要函數(shù)
(1)void initialize(int): 初始化函數(shù)
該函數(shù)主要對頁面結(jié)構(gòu)數(shù)組pl和頁幀結(jié)構(gòu)數(shù)組pfc進行初始化,如置頁面結(jié)構(gòu)中的頁面號pn,初始化頁幀號pfn為空,訪問次數(shù)counter為0,訪問時間time為-1;同樣對頁幀數(shù)組進行初始化,形成一個空閑頁幀隊列。
(2)void OPT(int): 計算使用最佳頁面算法時的命中率
(3)void FIFO(int): 計算使用先進先出頁面置換算法時的命中率(4)void LRU(int): 計算使用最近最久未使用頁面置換算法時的命中率(5)void LFU(int): 計算使用最少使用置換算法時的命中率(6)void NUR(int): 計算使用最近未使用置換算法時的命中率
四、主要算法的設(shè)計與實現(xiàn)
void FIFO(int total_pf)/*先進先出頁面置換算法*/ { int i,j;pfc_type *p;initialize(total_pf);busypf_head=busypf_tail=NULL;for(i=0;i if(pl[page[i]].pfn==INVALID)/*頁面失效*/ { diseffect=diseffect+1; if(freepf_head==NULL)/*無空閑頁幀*/ { } p=freepf_head->next;//有空閑頁幀 freepf_head->next=NULL;freepf_head->pn=page[i];/* 將所需頁面調(diào)入空閑頁幀 */ pl[page[i]].pfn=freepf_head->pfn;if(busypf_tail==NULL)/* 若忙頁幀隊列為空,則將其頭尾指針都指向剛調(diào)入頁p=busypf_head->next;pl[busypf_head->pn].pfn=INVALID;//將忙頁幀隊首頁面作為換出頁面 freepf_head=busypf_head;freepf_head->next=NULL;busypf_head=p;//忙頁幀頭指針后移 面所在的頁幀 */ 河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告 busypf_head=busypf_tail=freepf_head;else{ //否則,將剛調(diào)入頁面所在的頁幀掛在忙頁幀隊列尾部 } freepf_head=p;//空閑頁幀頭指針后移 busypf_tail->next=freepf_head;busypf_tail=freepf_head;} } printf(“FIFO:%6.4f ”,1-(float)diseffect/320);} void LRU(int total_pf)/*最近最久未使用頁面置換算法*/ { int i,j;int min,minj,present_time;initialize(total_pf);present_time=0;for(i=0;i if(pl[page[i]].pfn==INVALID)/*頁面失效*/ { diseffect++;if(freepf_head==NULL)/*無空閑頁幀*/ { min=32767;for(j=0;j } freepf_head=&pfc[pl[minj].pfn];//騰出一個單元 pl[minj].pfn=INVALID;pl[minj].time=-1;freepf_head->next=NULL;if(min>pl[j].time && pl[j].pfn!=INVALID){ } min=pl[j].time;minj=j;面*/ } pl[page[i]].pfn=freepf_head->pfn;//有空閑頁面,改為有效 pl[page[i]].time=present_time;//修改頁面的訪問時間 河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告 } freepf_head=freepf_head->next;//減少一個free 頁面 else pl[page[i]].time=present_time;//命中則修改該單元的訪問時間 present_time++;} printf(“LRU:%6.4f ”,1-(float)diseffect/320);} void NUR(int total_pf)/* 最近未使用頁面置換算法 */ { int i,j,dp,cont_flag,old_dp;initialize(total_pf);dp=0;for(i=0;i if(pl[page[i]].pfn==INVALID)/*頁面失效*/ { diseffect++;if(freepf_head==NULL)/*無空閑頁幀*/ { cont_flag=TRUE;old_dp=dp;while(cont_flag){ if(pl[dp].counter==0&&pl[dp].pfn!=INVALID) cont_flag=FALSE;//找到位于內(nèi)存且未被訪問的頁面 else { dp++; if(dp==total_vp)dp=0;//將替換指針重新指向第一個頁面 if(dp==old_dp) {/* 若內(nèi)存中所有頁面掃描完畢未找到訪問位為0的頁面,將內(nèi)存中所有頁面的訪問位置0 */ } freepf_head=&pfc[pl[dp].pfn];//騰出一個單元 } } for(j=0;j pl[j].counter=0; 河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告 } pl[dp].pfn=INVALID;freepf_head->next=NULL; } pl[page[i]].pfn=freepf_head->pfn;//有空閑頁面,改為有效 freepf_head=freepf_head->next;//減少一個free 頁面 else pl[page[i]].counter=1;//命中則將訪問位置1 if(i%clear_period==0)//清零周期到,將所有訪問位清零 { for(j=0;j } } } void OPT(int total_pf)/* 最佳頁面置換算法 */ { int i,j,max,maxpage,d,dist[total_vp];initialize(total_pf);for(i=0;i for(j=0;j } d=1;/* 對于位于內(nèi)存且在當(dāng)前訪問頁面之后將再次被訪問的頁面,dist重置為當(dāng)前頁 面與之后首次出現(xiàn)該頁面時兩者之間的距離 */ for(j=i+1;j dist[j]=32767;printf(“NUR:%6.4f ”,1-(float)diseffect/320); else //不在內(nèi)存的頁面該變量則置為0 dist[j]=0; 河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告 } } if(pl[page[j]].pfn!=INVALID && dist[page[j]]==32767) dist[page[j]]=d; d++;max=-1;//查找dist變量值最大的頁面作為換出頁面 for(j=0;j } freepf_head=&pfc[pl[maxpage].pfn];//騰出一個單元 freepf_head->next=NULL;pl[maxpage].pfn=INVALID;if(max } max=dist[j];maxpage=j; } } pl[page[i]].pfn=freepf_head->pfn;//有空閑頁面,改為有效 freepf_head=freepf_head->next;//減少一個free 頁面 printf(“OPT:%6.4f ”,1-(float)diseffect/320);} void LFU(int total_pf)/* 最少使用頁面置換算法 */ { int i,j,min,minpage;initialize(total_pf);for(i=0;i min=32767;for(j=0;j if(min>pl[j].counter&&pl[j].pfn!=INVALID){ 河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告 } } } min=pl[j].counter;minpage=j;pl[j].counter=0; freepf_head=&pfc[pl[minpage].pfn];//騰出一個單元 pl[minpage].pfn=INVALID;freepf_head->next=NULL; pl[page[i]].pfn=freepf_head->pfn;//有空閑頁面,改為有效 pl[page[i]].counter++;//增加頁面訪問次數(shù) freepf_head=freepf_head->next;//減少一個free 頁面 } else pl[page[i]].counter++;//命中增加頁面訪問次數(shù) } printf(“LFU:%6.4f ”,1-(float)diseffect/320);} 五、運行結(jié)果 本實驗的運行結(jié)果如下圖所示(以O(shè)PT、FIFO、LRU為例): 從上述結(jié)果可知,隨著內(nèi)存頁面數(shù)的增加,三種算法的訪問命中率逐漸增大。在內(nèi)存頁面數(shù)為4~25個頁面之間時,三種算法的命中率大致在56%至88%之間變化,但是,OPT算法和其他兩種算法之間的差別一般在6~12個百分點左右。在內(nèi)存頁面為25~32個頁面時,由于用戶進程的所有指令基本上都已裝入內(nèi)存,從而命中率增加較大,各種算法之間的差別不大。 河南師范大學(xué)計算機與信息技術(shù)學(xué)院實驗報告 比較上述三種算法,OPT算法的命中率最高,LRU算法和FIFO算法的命中率則較為接近。 六、總結(jié) 經(jīng)過測試結(jié)果完全正常。經(jīng)過編寫和學(xué)習(xí)讓我對操作系統(tǒng)方面的知識更深一步的得到了理解和鞏固。讓我在今后的學(xué)習(xí)中可以更好的去理解和體會。 操作系統(tǒng)課程設(shè)計 設(shè)計題目 動態(tài)分區(qū)分配存儲管理 學(xué)生姓名學(xué) 號 專業(yè)班級 指導(dǎo)教師 呂 霆 20102675 計算機10-01班 第一章 課程設(shè)計概述 1.1 設(shè)計任務(wù): 動態(tài)分區(qū)分配存儲管理 1.2 設(shè)計要求 建立描述內(nèi)存分配狀況的數(shù)據(jù)結(jié)構(gòu); ?建立描述進程的數(shù)據(jù)結(jié)構(gòu); ?使用兩種方式產(chǎn)生進程:(a)自動產(chǎn)生,(b)手工輸入; ? 在屏幕上顯示內(nèi)存的分配狀況、每個進程的執(zhí)行情況; ? 建立分區(qū)的分配與回收算法,支持緊湊算法; ? 時間的流逝可用下面幾種方法模擬:(a)按鍵盤,每按一次可認(rèn)為過一個時間單位;(b)響應(yīng)WM_TIMER; ? 將一批進程的執(zhí)行情況存入磁盤文件,以后可以讀出并重放; ? 支持算法:首次適應(yīng)算法、循環(huán)首次適應(yīng)算法、最佳適應(yīng)算法:最壞適應(yīng)算法。 1.3 設(shè)計目的 旨在讓我們更好的了解動態(tài)分區(qū)管理方面的知識.第二章 原理及算法描述 2.1動態(tài)分區(qū)分配算法原理 首次適應(yīng)算法 * 算法概述:分配內(nèi)存時,從鏈?zhǔn)组_始順序查找,找到滿足的空閑分區(qū)則劃出空間分配,余下的空閑空間仍保留在空閑鏈表中 * 實現(xiàn)方法:分配時從數(shù)組第一個元素開始比較,若符合條件則將該元素減去對應(yīng)作業(yè)的值 循環(huán)首次適應(yīng)算法 * 算法概述:由首次適應(yīng)算法演變,只是每次分配改為由上一次找到的空閑分區(qū)開始查找 * 實現(xiàn)方法:在首次適應(yīng)算法的基礎(chǔ)上增加一個值用于記錄找到的空閑分區(qū)的位置 最佳適應(yīng)算法 * 算法概述:每次為作業(yè)分配內(nèi)存時,總是把能滿足要求、又是最小的空閑分區(qū) 分配給作業(yè) * 實現(xiàn)方法:我們決定每次分配先把空閑分區(qū)按從小到大的順序排列,然后將第一個匹配分區(qū)分配給作業(yè) 最壞適應(yīng)算法 * 算法概述:每次為作業(yè)分配內(nèi)存時,總是挑選一個最大的空閑分區(qū)分割給作業(yè)使用 * 實現(xiàn)方法:算法與最佳適應(yīng)算法幾乎相同,僅在排序時把空閑分區(qū)表按從大到小的順序排列,所以未作詳細(xì)注釋 回收分區(qū) 當(dāng)進程運行完畢釋放內(nèi)存時,系統(tǒng)根據(jù)回收區(qū)的首址,從空閑區(qū)鏈(表)中找到相應(yīng)的插入點,此時可能出現(xiàn)以下四種情況之一;1)回收區(qū)與插入點的前一個空閑分區(qū)F1相鄰接,此時應(yīng)將回收區(qū)與插入點的前一分區(qū)合并,不必為回收區(qū)分配新表項,而只需修改其前一分區(qū)F1的大小.2)回收分區(qū)與插入點的后一空閑分區(qū)F2相鄰接,此時也可將兩分區(qū)合并,形成新的空閑分區(qū),但用回收區(qū)的首址作為新空閑區(qū)的首址,大小為兩者之和.3)回收區(qū)同時與插入點的前,后兩個分區(qū)鄰接,此時將三個分區(qū)合并,使用F1的表項和F1的首址,取消F2的表項,大小為三者之和.4)回收區(qū)既不與F1相鄰接,又不與F2鄰接.這時應(yīng)為回收區(qū)單獨建立一新表項,填寫回收區(qū)的首址和大小,并根據(jù)其首址插入到空閑鏈中的適當(dāng)位置.緊湊算法 通過移動內(nèi)存中的作業(yè)的位置,以把原來多個分散的小分區(qū)拼接成一個大分區(qū)的方法.第三章 開發(fā)環(huán)境 此程序是本人利用c++語言在vs2012的開發(fā)環(huán)境中實現(xiàn)的第四章 程序?qū)崿F(xiàn)--數(shù)據(jù)結(jié)構(gòu) #include int recycle;//需要回收的盤塊序號 int id1;//算法選擇號 int m;//內(nèi)存區(qū)數(shù) int n;//空閑區(qū)數(shù) int q;//進程數(shù) int r=0;//循環(huán)首次適應(yīng)算法:對應(yīng)的這次查找到的空閑分區(qū)序號 //打印輸出函數(shù) void vision(){ int i;int j;if(id1==1)stream.open(“first_fit.txt”, ios::app);if(id1==2)stream.open(“nextfirst_fit.txt”, ios::app);if(id1==3)stream.open(“best_fit.txt”,ios::app);if(id1==4)stream.open(“worst_fit.txt”, ios::app);if(id1==5)stream.open(“compact.txt”,ios::app);if(id1==6)stream.open(“huishou.txt”,ios::app);cout<<“-------------內(nèi)存分配狀態(tài)-------------”< } cout < } cout < } //作業(yè)信息的自動產(chǎn)生 void create_pro(){ } //作業(yè)的手動生成 void create_zuoye(){ int j;int choice2;int id3=rand()%10;m=id3;//內(nèi)存區(qū)數(shù)量 cout<<“產(chǎn)生”< } ary3[0]=42;ary3[1]=86;ary3[i]=rand()%100;if(ary3[i]==0){i--;} { } cout<<“--------------------------”< } //內(nèi)存信息的自動產(chǎn)生 void create_apply(){ int k=0;//空閑區(qū)數(shù)量 for(i=0;i if(ary1[i][3]!=2){ary2[k][0]=ary1[i][0];ary2[k][1]=ary1[i][1];ary2[k][2]=ary1[i][2];k++;} int i;for(i=0;i } ary1[i][0]=i+1;ary1[i][1]=rand()%100;if(i==0){ } ary1[i][3]=rand()%3;//cout <>choice2;q=choice2;cout<<“輸入想創(chuàng)建的作業(yè)請求大小”< } cout<<“你創(chuàng)建了”< } //內(nèi)存信息的手動生成 int create_fenqu(){ } //首次適應(yīng)算法 void first_fit()int k,x,y,o=0;int a=0;cout<<“輸入想創(chuàng)建的內(nèi)存分區(qū)塊數(shù) : ”;cin>>k; cout<<“輸入”< } cout<<“輸入內(nèi)存塊的分配狀態(tài)”< } ary1[0][2]=0;ary1[1][2]=ary1[0][1];for(int i=2;i for(int i=0;i } n=a;return m,n;if(ary1[i][3]!=2){ } ary2[a][0]=ary1[i][0];ary2[a][1]=ary1[i][1];ary2[a][2]=ary1[i][2];a++;ary1[i][2]=ary1[i-1][2]+ary1[i-1][1];//起始地址 cin>>y;if(y==2){ } ary1[i][3]=y;//狀態(tài) n++;ary1[i][0]=i;//序號 cin>>x;ary1[i][1]=x;//大小 } n=k;//空閑塊數(shù)量 { vision();int i;int j;int k;int l;int d;//用來保存第k個的值 int id2=0;for(i=0;i for(j=0;j if(ary2[j][1]>=ary3[i])//進程占用空間小于等于其中一個空閑區(qū)的大小 { cout<<“[”< ary1[ary2[j][0]-1][3]=2;for(k=j+1;k ary2[k-1][0]=ary2[k][0];ary2[k-1][1]=ary2[k][1];ary2[k-1][2]=ary2[k][2];} n--; }else//否則的話,空閑鏈對應(yīng)的地方盤塊大小小了進程占用的大小,并且內(nèi)存分配從對應(yīng)的 { l=ary2[j][0];d=ary1[l-1][1];//大小 ary1[l-1][1]=ary3[i];ary1[l-1][3]=2;m++;for(k=m;k>ary2[j][0]+1;k--){ ary1[k-1][0]=ary1[k-2][0]+1;ary1[k-1][1]=ary1[k-2][1];ary1[k-1][2]=ary1[k-2][2];ary1[k-1][3]=ary1[k-2][3];那一項開始增加一項 } l=ary2[j][0]; } } { if(ary1[id2][3]!=2) } } n=k;} break;} else { } cout<<“[”< { ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;} ary1[l][0]=l+1;ary1[l][1]=d-ary3[i];ary1[l][2]=ary1[l-1][1]+ary1[l-1][2];ary1[l][3]=0;k=0;for(id2=0;id2 //首次循環(huán)適應(yīng)算法 void next_fit(){ vision();int i;int j;int k;int s;int d;int id2;for(i=0;i { for(j=r;j if(ary3[i]<=ary2[j][1]){ cout<<“[”< { } else//對應(yīng)的空閑塊大小大于進程需要大小 { //-----改變內(nèi)存分配情況-----r=(r+1)%n;//改變第k塊的內(nèi)容 k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;//從k+1之后所有向后移一格 m++;//內(nèi)存塊數(shù)增加1 for(s=m-1;s>k;s--){ ary1[s][0]=ary1[s-1][0]+1;ary1[s][1]=ary1[s-1][1];ary1[s][2]=ary1[s-1][2];//---改變內(nèi)存分配---k=ary2[j][0];//得到對應(yīng)空閑塊對應(yīng)內(nèi)存塊的序號 k--;ary1[k][3]=2;//把對應(yīng)內(nèi)存塊標(biāo)志位上改成已分配 //------------------//--改變空閑塊表:把從這塊空閑塊以下的所有空閑塊向上移一格--n--;for(k=j;k } vision();//------------------break;ary2[k][0]=ary2[k+1][0];ary2[k][1]=ary2[k+1][1];ary2[k][2]=ary2[k+1][2];stream<<“[”< } } //思路:先把空閑列表檢索一遍,選出最佳答案,進行分配 void best_fit()//最佳算法--按順序檢索,把與進程要求內(nèi)存大小最接近的快分配給進程 { int i;int s;int j=-9999;//用來保存最接近的答案 int e;//用來存放進行比較時的中間結(jié)果 } { if(ary1[id2][3]!=2) } } else{ } cout<<“[”< { ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;} ary1[s][3]=ary1[s-1][3];} //改變第k+1塊內(nèi)容:對應(yīng)的數(shù)組是ary1[k] ary1[k][0]=ary1[k-1][0]+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];//--------------------------//----改變空閑表分配情況----k=0;for(id2=0;id2 }else { cout<<“[”< for(s=0;s } if(j<0){ cout<<“[”< if(ary2[j][1]==ary3[i]){ } else for(l=k;l } n--;ary2[l-1][0]=ary2[l][0];ary2[l-1][1]=ary2[l][1];ary2[l-1][2]=ary2[l][2];ary1[k-1][3]=2;k=ary2[j][0]; } //最壞適應(yīng)算法 void worst_fit() } { if(ary1[id2][3]!=2) } } vision();n=k; } for(k=j+1;k { ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;} { //把對應(yīng)的內(nèi)存分配進行更改 k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;m++;for(l=m;l>ary2[j][0]+1;l--){ } k=ary2[j][0];ary1[k][0]=k+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];ary1[k][3]=0;k=0;ary1[l-1][0]=ary1[l-2][0]+1;ary1[l-1][1]=ary1[l-2][1];ary1[l-1][2]=ary1[l-2][2];ary1[l-1][3]=ary1[l-2][3];for(id2=0;id2 { }else { cout<<“[”< int e=-9999;//用來存放進行比較時的中間結(jié)果 int k;int l;int d;int id2;vision();{ j=-9999;e=-9999;for(s=0;s } if(j<0){ cout<<“[”< if(ary2[j][1]==ary3[i]){ k=ary2[j][0]; ary1[k-1][3]=2; for(l=k;l { if(ary1[id2][3]!=2) } } vision();n=k; } for(k=j+1;k { ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;} } else { //把對應(yīng)的內(nèi)存分配進行更改 k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;m++;for(l=m;l>ary2[j][0]+1;l--){ } k=ary2[j][0];ary1[k][0]=k+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];ary1[k][3]=0;k=0;ary1[l-1][0]=ary1[l-2][0]+1;ary1[l-1][1]=ary1[l-2][1];ary1[l-1][2]=ary1[l-2][2];ary1[l-1][3]=ary1[l-2][3];} n--;ary2[l-1][2]=ary2[l][2];for(id2=0;id2 } //回收內(nèi)存算法: /* 有共計八種情況,1.(1)回收區(qū)上鄰接著空閑盤塊,下連接著已分配盤塊(2)回收區(qū)下鄰接著空閑盤塊,上鄰接著已分配盤塊(3)回收區(qū)上下連接的都是空閑盤塊(4)空閑區(qū)上下鄰接的都是已分配盤塊 (5)要回收的盤塊就是第一個盤塊,并且向下鄰接著空閑盤塊(6)要回收的盤塊就是第一個盤塊,但是向下鄰接著已分配盤塊(7)要回收的盤塊就是最后一個盤塊,并且向上鄰接的是空閑盤塊(8)要回收的盤塊就是最后一個盤塊,但是向上鄰接的是已分配盤塊 */ void apply_recycle(){ ary1[0][1]=ary1[0][1]+ary1[1][1];ary1[0][3]=0;for(i=1;i if(recycle==1){ //cout< if(ary1[1][3]!=2){ cout<<“要回收的盤塊就是第一個盤塊,并且向下鄰接著空閑盤塊”< } else { ary1[0][3]=0;n++;ary2[0][0]=1;ary2[0][1]=ary1[0][1];ary2[0][2]=ary1[0][2];vision();} stream<<“要回收的盤塊就是第一個盤塊,并且向下鄰接著空閑盤塊”< ary2[k][0]=ary1[j][0]; ary1[0][3]=0;k=0;for(j=0;j //cout<<“ary1[j][3]”< } else{ cout<<“要回收的盤塊就是第一個盤塊,但是向下鄰接著已分配盤塊”< } n=k;vision(); } ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++; { } m--;// cout<<“" k=0;vision();//cout<<”ary1[0][3]“< cout<<”ary1[j][3]“< } else{ cout<<”要回收的盤塊就是最后一個盤塊,但是向上鄰接的是已分配盤塊“< } n=k;vision(); } ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++; ary1[recycle-2][3]=0;ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];m--;k=0;for(j=0;j //cout<<”ary1[j][3]“< } else if(recycle==m){ if(ary1[recycle-2][3]!=2){ cout<<”要回收的盤塊就是最后一個盤塊,并且向上鄰接的是空閑盤塊“< } n=k;vision(); } ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;stream<<”要回收的盤塊就是最后一個盤塊,并且向上鄰接的是空閑盤塊“< ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++; } else{//剩下比較復(fù)雜的四種情況 if((ary1[recycle-2][3]!=2)&&(ary1[recycle][3]==2))//回收區(qū)上鄰接著空閑盤塊,下連接著{cout<<”回收區(qū)上鄰接著空閑盤塊,下連接著已分配盤塊“< } } n=k;vision(); } ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++; ary1[recycle-1][3]=0;k=0;for(j=0;j //cout<<”ary1[j][3]“< stream<<”回收區(qū)上鄰接著空閑盤塊,下連接著已分配盤塊“< ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];for(i=recycle-1;i } m--;k=0;for(j=0;j //cout<<”ary1[j][3]“< } if((ary1[recycle-2][3]!=2)&&(ary1[recycle][3]!=2))//回收區(qū)上下連接的都是空閑盤塊 { cout<<”回收區(qū)上下連接的都是空閑盤塊“< } vision(); } ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++; } n=k;vision();} if((ary1[recycle][3]!=2)&&(ary1[recycle-2][3]==2))//回收區(qū)下鄰接著空閑盤塊,上鄰接著{ cout<<”回收區(qū)下鄰接著空閑盤塊,上鄰接著已分配盤塊“< stream<<”回收區(qū)下鄰接著空閑盤塊,上鄰接著已分配盤塊“< ary1[recycle-2][3]=0;ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];for(i=recycle-1;i } m--;k=0;for(j=0;j //cout<<”ary1[j][3]“< } } } if((ary1[recycle-2][3]==2)&&(ary1[recycle][3]==2))//空閑區(qū)上下鄰接的都是已分配盤塊 { } ary1[recycle-1][3]=0;k=0;for(j=0;j } vision();//cout<<”ary1[j][3]“< } ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;cout<<”回收區(qū)上下連接的都是空閑盤塊“< } m=m-2;k=0;for(j=0;j } vision();//cout<<”ary1[j][3]“< } ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;ary1[recycle-1][0]=ary1[recycle+1][0]-2;ary1[recycle-1][1]=ary1[recycle+1][1];ary1[recycle-1][2]=ary1[recycle+1][2];ary1[recycle-1][3]=ary1[recycle+1][3];n=k;n=k; } //緊湊算法 void compact(){ num_avl=0;for(id2=0;id2 int num_avl;//記錄空閑盤塊數(shù)量 int sum_avl=0;//總共空閑區(qū)大小 int num_apl=0;//統(tǒng)計總共空閑區(qū)有多大 vision();for(id2=0;id2 } //最后一塊空閑塊 ary1[num_apl][0]=num_apl+1;ary1[num_apl][1]=sum_avl;ary1[num_apl][2]=ary1[num_apl-1][1]+ary1[num_apl-1][2];ary1[num_apl][3]=0;m=num_apl+1;//包括最后一個空閑區(qū) if(ary1[id2][3]==2){ } ary1[num_apl][0]=num_apl+1;ary1[num_apl][1]=ary1[id2][1];if(num_apl==0){ } ary1[num_apl][3]=2;num_apl++;//cout<<”num_apl“< } //主函數(shù)入口 void main(){ if(choice1==1){ } num=rand()&10;q=num;int id3=2+rand()%8;m=id3;//內(nèi)存區(qū)數(shù)量 create_apply();create_pro();int i;int j;int num;int choice1;//操作選擇標(biāo)記 int choice2;int flag=1;//標(biāo)記是否再執(zhí)行 while(flag==1){ cout<<”********************************************“< } n=num_avl;vision(); } ary2[num_avl][0]=ary1[id2][0];ary2[num_avl][1]=ary1[id2][1];ary2[num_avl][2]=ary1[id2][2];num_avl++;if(choice1==2){ } vision(); cout<<”**------------------請選擇處理算法----------------------**“< } } cout<<”**************************** “< cout<<”**1首次適應(yīng)算法-----2循環(huán)首次適應(yīng)算法-----3最佳適應(yīng)算法 **“< } {first_fit();} {next_fit();} {best_fit();} {worst_fit();} { compact();} if(id1==6){ cout<<”*******************生成內(nèi)存狀態(tài)******************“< } cout<<”錯誤:內(nèi)存中不存在此塊!“< } if(id2==-9999){ apply_recycle();} if(ary2[i][0]==recycle){ } cout<<”錯誤:輸入的為空閑盤塊!"< 操作系統(tǒng)實驗 實驗一 Linux常用命令實驗 一.目的和要求 本實驗的目的是熟悉Linux操作系統(tǒng)的命令接口、圖形接口和程序接口;了解Linux操作系統(tǒng)的啟動過程;了解Linux操作系統(tǒng)的目錄結(jié)構(gòu);用vi編輯器編寫簡單的C語言程序,并用gcc編譯器編譯、運行。 二.實驗內(nèi)容 1、實現(xiàn)開機、登錄、退出與關(guān)機: (1)如果以root用戶登錄,則命令窗口的提示符為#;如果以普通用戶登錄,則命令窗口的提示符為$;登陸用戶名:user 密碼:123456(2)修改口令(修改口令操作不做):成功進入系統(tǒng)后,在命令提示符后輸入“passwd”并鍵入回車鍵 (3)退出帳號:命令方式下:logout(4)關(guān)機或重啟: 命令方式下:halt或reboot 窗口方式下:“桌面”->“注銷” 2、掌握的基本常用命令列表 (1)關(guān)于目錄的操作命令:cd、ls、mkdir、rmdir、pwd等; (2)關(guān)于文件的操作命令:cat、find、man/help、vi/vim、cp、rm、mv、dd、du、df、chmod、ln等; (3)關(guān)于進程管理的操作命令:ps、kill、top、free 等; (4)關(guān)于系統(tǒng)管理的操作命令:whoami、passwd、adduser/useradd、addgroup、userdel、groupdel、su、who、Ctrl+Alt+Fn(n=1、2、3、4、5、6)(在X-Window界面下切換到字符界面,重新登錄,Ctrl+Alt+F7返回圖形界面)、Alt+Fn(n=1、2、3、4、5、6)(在6個虛擬終端之間切換)等; (5)安裝和卸載文件系統(tǒng):mount、umount等; (6)顯示有關(guān)計算機系統(tǒng)信息的命令:uname(顯示操作系統(tǒng)的名稱)、uname –n(顯示系統(tǒng)域名)、uname –p(顯示系統(tǒng)的CPU名稱) (7)其它命令:time、date、cal 等。 3、閱讀/etc/inittab 文本文件,思考問題:如果要求啟動Linux系統(tǒng)之后進入字符 1 操作系統(tǒng)實驗 界面,應(yīng)如何修改/etc/inittab文件?用戶應(yīng)具有什么權(quán)限? 4、切換到不同的虛擬終端,登錄到Linux系統(tǒng) 5、vi 編輯器的使用(1)進入和退出vi(2)利用文本插入方式建立一個文件(3)在新建的文本文件上移動光標(biāo)。 (4)對文本文件執(zhí)行刪除、復(fù)原、修改、替換操作。 6、熟悉gcc編譯環(huán)境:編寫一個C語言程序myfile1.c,求1~100中偶數(shù)的和,編譯并運行。 (1)編譯 gcc myfile1.c 運行./a.out(2)編譯 gcc –o myfile1 myfile1.c 運行./myfile1 7、編寫一個C語言程序myfile2.c,顯示字符串“Hello, Linux!”,并將其反向輸出。 8、熟悉Linux系統(tǒng)的目錄結(jié)構(gòu),使用命令或者編寫C語言程序報告Linux內(nèi)核的行為。 報告以下內(nèi)容: ? ? CPU類型和型號 ? ? 內(nèi)核版本 ? ? 從系統(tǒng)最后一次啟動以來經(jīng)歷了多長時間?形式為dd:hh:mm:ss ? ? 當(dāng)前配置的內(nèi)存數(shù)量 ? ? 當(dāng)前可用內(nèi)存數(shù)量 ? ? 自系統(tǒng)啟動以來,發(fā)生的所有的中斷的次數(shù) ? ? 從系統(tǒng)啟動開始創(chuàng)建的進程數(shù) ? ? 內(nèi)核執(zhí)行的上下文轉(zhuǎn)換的次數(shù) 三.實驗提示 1、Linux安裝 (1)安裝前的準(zhǔn)備工作 <1>.基本的硬件配置 由于安裝涉及到各種硬件的設(shè)置,所以在安裝前必須了解機器各種硬件的型號,硬盤的使用情況,內(nèi)存的大小,鼠標(biāo)的類型及接口,聲卡,網(wǎng)卡,顯卡,顯示器的型號。 操作系統(tǒng)實驗 <2>.有關(guān)網(wǎng)絡(luò)的信息 IP地址,掩碼,網(wǎng)關(guān)IP地址,域名服務(wù)器IP地址,域名,宿主機名。<3>.安裝方式的選擇 ?從CD-ROM安裝 ?從FTP站點安裝 ?從NFS服務(wù)器安裝 ?從硬盤安裝 硬盤分區(qū) 硬盤空間必須和計算機上安裝的其他操作系統(tǒng)所使用的硬盤空間分開。特別要注意,如果硬盤空間很大,切忌不能將Linux裝在8G以后。安裝Red Hat Linux至少需要兩個硬盤分區(qū):一個或多個“Linux native”類型的分區(qū),一個“Linux swap”類型的分區(qū) 分區(qū)命名設(shè)計Linux 通過字母和數(shù)字的組合來表示硬盤分區(qū)。 ? 前兩個字母-----分區(qū)名的前兩個字母表明分區(qū)所在設(shè)備的類型。hd指IDE硬盤,sd指SCSI硬盤。 ? 下一個字母-----分區(qū)在哪個設(shè)備。例如,/dev/hda(第一個IDE硬盤),/dev/sdb(第二個SCSI硬盤)。 ? 數(shù)字-----代表分區(qū)。前四個分區(qū)(主分區(qū)或擴展分區(qū))用數(shù)字1到4表示。邏輯分區(qū)從5開始。例如,? 若IDE硬盤在安裝Linux前安裝了Windows系統(tǒng)并劃分了C盤和邏輯分區(qū)D盤,那么D盤就是/dev/hda5, /dev/hda5表示第一個硬盤的第一個邏輯分區(qū)。 對于Linux初學(xué)者來說,為Linux分兩個區(qū)(根分區(qū)和交換分區(qū))是比較簡單方便的。 一個交換分區(qū):用來支持虛擬內(nèi)存。一個根分區(qū):根分區(qū)是/(根目錄)的所在地,其中包含啟動系統(tǒng)所需的文件和系統(tǒng)配置文件。這個分區(qū)要足夠大。 一個/usr分區(qū): /usr是Linux系統(tǒng)許多軟件所在的地方。一個/home分區(qū):這是用戶的主目錄所在地。(2)開始安裝 注意點:我們一般選擇的是圖形化的安裝方式。它的主要部分是相同的。 ? 可能會在安裝完成后第一次啟動時才進行網(wǎng)卡的檢測。 操作系統(tǒng)實驗 ? 在選擇圖形化界面時,有兩種方式gnome和kde;它們各有優(yōu)缺點。? 系統(tǒng)會讓你選擇啟動時是圖形化方式,還是字符方式。請大家選擇字符方式。 ? 在選擇防火墻的時候,在安裝時請先不用防火墻。 ? 圖形化安裝方式下,不能選擇啟動時的開啟服務(wù)??稍谙到y(tǒng)安裝完成后用setup命令進行修改。 2、進入Linux(1)登錄 第一次登錄系統(tǒng),必須作為“root”登錄。這個帳號對系統(tǒng)的一切都有完全的訪問權(quán)限。 在login:提示符處輸入root。按[Enter](或[Return]鍵).會出現(xiàn)Password提示。輸入口令,應(yīng)該看到類似以下的信息: [root@localhost /root] #(2)退出 輸入[Ctrl]-[D](3)帳號和口令 <1>.帳號 創(chuàng)建新的帳號有幾種方法,最基本的方法:useradd命令.[root @ localhost / root] # useradd Tom [root @ localhost / root] # <2>.口令 passwd 命令可以用來: ? 為新創(chuàng)建的用戶分配口令。? 修改已存在的用戶的口令。? 修改登錄的用戶的口令。此時必須以root登錄。如: [root @ localhost / root]# passwd Tom New UNIX password: Retype new UNIX password: passwd:all authentication tokens updated successfully 4 操作系統(tǒng)實驗 [root @ localhost / root]# 用新帳戶登錄: Red Hat Linux release 7.1(Manhattan) Kernel 2.0.34 on an i586 login: Tom Password: [Tom@ localhost Tom] $ <3>.su 命令 用su,當(dāng)前的登錄段能變成root(或其他用戶)的登錄段。如: [Tom@ localhost Tom] $ su Password: [root@ localhost Tom] # 也可以用su變成其他用戶。這時,必須作為root運行su,給出用戶名。<4>.關(guān)閉系統(tǒng) 關(guān)閉系統(tǒng)時,必須告訴所有的進程結(jié)束運行,使用shutdown命令。且只能由root 運行,格式是: shutdown -h-------在關(guān)閉完成后(Halt)停止系統(tǒng)。 -r--------在關(guān)閉完成后重啟動(Reboot)系統(tǒng)。 3、vi 編輯器的使用(1)進入和退出vi <1>進入vi 在系統(tǒng)提示符($)下輸入命令vi和想要編輯(建立)的文件名(如example),便可進入vi。 <2>退出vi 在命令方式下可有幾種方法退出vi編輯器: :wq 把編輯緩沖區(qū)的內(nèi)容寫到正在編輯的文件中,退出編輯器,回到Linux shell下。 :ZZ 僅當(dāng)作過修改時才將緩沖區(qū)內(nèi)容寫到文件上。 操作系統(tǒng)實驗 :x 與 :ZZ 相同。 :q!強行退出vi。感嘆號(!)告訴vi,無條件退出,丟棄緩沖區(qū)內(nèi)容。這樣,先前對該文件所做的修改或輸入都被拋棄。(2)新建文件 <1>在Linux提示符$之后,輸入命令 :vi myfile,然后按〈Enter〉鍵。<2>輸入插入命令i(屏幕上看不到字符i)。<3>然后,輸入以下文本行: To the only book tht I, For mang year you have been my favourite book <4>發(fā)現(xiàn)這兩行有錯,進行改正: 按〈Esc〉鍵,從插入方式回到命令方式。按光標(biāo)上移鍵,使光標(biāo)移到第一行。 按光標(biāo)左移鍵,使光標(biāo)移到“tht”的第二個“t”處。 輸入i(這是插入命令),然后輸入a。該行變成如下形式: To the only book that I, 按光標(biāo)右移鍵,使光標(biāo)移到“I”上。 我們想在“I”之后輸入一個空格和單詞“l(fā)ike”。為此,輸入附加命令“a”。結(jié)果屏幕顯示為: To the only book that a I,沒有出現(xiàn)預(yù)期的效果......原來是:我們先前使用了插入命令i,至今并未用〈Esc〉鍵返回命令方式。所以,輸入的所有字符都作為輸入文本予以顯示。<5>按〈Esc〉鍵,返回命令方式。 利用x命令刪除錯誤字符。然后,進入插入方式,輸入正確字符。<6>最后輸入如下所示的文本: To the only book that I like, For many year you have been my favourite book I liveeyou all the time and could not have picked much better.<7>將編輯的文本文件存盤。(利用“:wq”命令,或者“:x”命令)<8>重新進入vi編輯程序,編輯上面的文件。(如:$ vi myfile) 操作系統(tǒng)實驗 <9>在屏幕上見到myfile文件的內(nèi)容。在屏幕底邊一行顯示出該文件的名稱、行數(shù)和字符個數(shù):“myfile”4 lines,130 characters 它仍然有錯,需進一步修改。 <10>將光標(biāo)移到第二行的year的r處。輸入a命令,添加字符s。 <11>按〈Esc〉,回到命令方式。輸入命令10〈Space〉,光標(biāo)移至何處?---光標(biāo)右移10個字符位置。 <12>利用取代命令r將liveeyou改為live you。 <13>將光標(biāo)移至第三行。輸入新行命令O(大寫字母),屏幕上有什么變化?---光標(biāo)移至上一行(新加空行)的開頭。<14>輸入新行的內(nèi)容: We've been through much together 此時,vi處于哪種工作方式? <15>按〈Esc〉,回到命令方式。將光標(biāo)移到第四行的live的v字母處。利用替換命令s將v改為k。 <16>在第四行的you之后添加單詞very much。<17>修改后的文本是以下內(nèi)容: To the only book that I like, For many years you have been my favourite book We've been through much together I like you very much all the the time and could not have picked much better.將該文件存盤,退出vi。 <18>重新編輯該文件。并將光標(biāo)移到最后一行的have的v字母處,使用d$命令將v至行尾的字符都刪除。 <19>現(xiàn)在想恢復(fù)17步的原狀,怎么辦?(使用復(fù)原命令u) <20>使用dd命令刪除第一行;將光標(biāo)移至through的u字母處,使用C(大寫字母)命令進行修改,隨便輸入一串字符。將光標(biāo)移到下一行的開頭,執(zhí)行5x命令;然后執(zhí)行重復(fù)命令(.)。 <21>屏幕內(nèi)容亂了!現(xiàn)在想恢復(fù)17步的原狀,怎么辦?(不寫盤,強行退出vi) 4、Linux內(nèi)核 操作系統(tǒng)實驗 Linux 內(nèi)核源程序目錄結(jié)構(gòu)(/usr/src/redhat/SOURCES)如下: /document :保存幫助文檔 /arch :包含多個子目錄,每個存放與特定體系結(jié)構(gòu)相關(guān)的代碼。如arch/i386(intel 386 體系結(jié)構(gòu)),arch/sparc,arch/alpha等。每個子目錄下至少又包含三個子目錄: ? kernel(存放支持該體系結(jié)構(gòu)特有的諸如信號處理和SMP之類特征的實現(xiàn)); ? ? lib(存放該體系結(jié)構(gòu)特有的諸如Strlen和memcpy之類的高效率函數(shù)); mm(存放該體系結(jié)構(gòu)特有的諸如內(nèi)存管理程序的實現(xiàn)) /drivers :該目錄占內(nèi)核代碼一半以上,包括顯卡、網(wǎng)卡、SCSI適配器、軟驅(qū)、PCI設(shè)備和其他外設(shè)的軟件驅(qū)動程序。/fs:包含linux支持的文件系統(tǒng)。 /include :包含源程序中大部分包含(.h)文件。/init: 包含main.c,保存大部分協(xié)調(diào)內(nèi)核初始化的代碼。/ipc:實現(xiàn)了SYSTEM V的進程間通訊IPC。 /kernel:包含了linux最重要的部分:實現(xiàn)平臺獨立的基本功能,包括Sched.c、fork.c、exit.c。 /lib :存放字符串和內(nèi)存操作函數(shù)。 /mm:包含與體系結(jié)構(gòu)無關(guān)的內(nèi)存管理代碼。/net:包含了linux應(yīng)用的網(wǎng)絡(luò)協(xié)議代碼。/script :包含用來配置內(nèi)核的腳本。 5、報告Linux狀態(tài)(/proc 中的信息) 在終端窗口提示符下,可以使用cat命令顯示相關(guān)文件的內(nèi)容,如: cat /proc/cpuinfo 通過編寫程序,顯示相關(guān)文件內(nèi)容:應(yīng)用文件操作,將相關(guān) /proc中的文件讀入到緩沖區(qū)中,可用fgets()函數(shù)按行取文件中數(shù)據(jù),通過strstr()檢驗包含所需數(shù)據(jù)字符串。如存在,用printf()函數(shù)輸出。(1)CPU類型和型號 /proc/cpuinfo文件提供了有關(guān)CPU的多種信息,這些信息是從內(nèi)核里對CPU的測試代碼中得到的。文件列出了CPU個數(shù):processor;CPU制造商:vendor_id;CPU架構(gòu):model;CPU名稱:model name;CPU時鐘頻率:cpu MHz;CPU緩存大?。?8 操作系統(tǒng)實驗 cache size;CPU包含的指令集:flags。文件還包含了以bogomips表示的處理機速度,而且如果檢測到CPU的多種特性或bug,文件還會包含相應(yīng)的標(biāo)志。該文件的格式為:文件由多行構(gòu)成,每行包括一個域名稱、一個冒號和一個值。 通過fopen()函數(shù)打開包含CPU類型和型號的文件cpuinfo,把內(nèi)容讀入字符數(shù)組char_all,然后通過strstr()函數(shù)查找CPU類型和型號所在的位置,用strncpy()函數(shù)拷貝到字符數(shù)組中,通過printf()標(biāo)準(zhǔn)輸出函數(shù)輸出。(2)存儲器信息 /proc/meminfo 文件給出了內(nèi)存狀態(tài)的信息。它顯示出系統(tǒng)中物理內(nèi)存的總量:MenTotal;未使用的物理內(nèi)存的總量:MemFree;用做文件緩沖的物理內(nèi)存的總量:buffers;用做緩沖的物理內(nèi)存的總量:Cached;活躍的內(nèi)存大?。篈ctive;不活躍的內(nèi)存大?。篒nactive;交換分區(qū)的總量:SwapTotal;交換分區(qū)未使用的總量:SwapFree等信息。(3)內(nèi)核版本 文件/proc/version顯示了正在運行的內(nèi)核版本、編譯此內(nèi)核的gcc版本以及該內(nèi)核的編譯時間。 (4)從系統(tǒng)最后一次啟動以來的時間,形式為dd:hh:mm:ss uptime讀出的時間是以秒計的,所以根據(jù)要求要轉(zhuǎn)換為天:小時:分鐘:秒。1天為86400秒,1小時為3600秒,1分鐘為60秒。通過兩個運算符就可以很好的轉(zhuǎn)換:“/”做除法取整運算,“%”做除法取余運算。舉例:86800秒,(86800/86400)=1(天),(86800%86400)=400(余400秒);400秒,(400/3600)=0小時,(400%3600)=400(余400秒);400秒,(400/60)=6分鐘,(400%60)=40(余40秒)。所以最后結(jié)果為:1:0:6:40。(5)其他信息的讀取 從/proc/stat中讀取信息 ? CPU花費在用戶態(tài)、系統(tǒng)態(tài)和空閑態(tài)的時間——cpu ? 自系統(tǒng)啟動以來,發(fā)生的所有的中斷的次數(shù)——intr ? 內(nèi)核執(zhí)行的上下文轉(zhuǎn)換的次數(shù)----ctxt ? 系統(tǒng)最后啟動的時間----btime ? 從系統(tǒng)啟動開始創(chuàng)建的進程數(shù)----processes 6、Linux的目錄結(jié)構(gòu) 操作系統(tǒng)實驗 對于Linux來講它的樹型結(jié)構(gòu)與Windows不同,Windows可以有多個分區(qū),每個分區(qū)都有根,但Linux 只有一個根,其他的所有文件、目錄或硬盤分區(qū)、軟盤、光盤、U 盤都必須mount(掛載)到Linux 根下的一個目錄中才能被訪問和使用。下面列出根目錄下的常見系統(tǒng)目錄及其用途。 /bin bin是binary的縮寫。這個目錄沿襲了UNIX系統(tǒng)的結(jié)構(gòu),存放著使用者最經(jīng)常使用的命令。例如cp、ls、cat,等等。 /boot 這里存放的是啟動Linux時使用的一些核心文件。 /dev dev是device(設(shè)備)的縮寫。這個目錄下是所有Linux的外部設(shè)備,其功能類似DOS下的.sys和Win下的.vxd。在Linux中設(shè)備和文件是用同種方法訪問的。例如:/dev/hda代表第一個物理IDE硬盤。 /etc 這個目錄用來存放系統(tǒng)管理所需要的配置文件(例如配置文件inittab)和子目錄。 /home 用戶的主目錄,比如說有個用戶叫wang,那他的主目錄就是/home/wang,也可以用~wang表示。 /lib 這個目錄里存放著系統(tǒng)最基本的動態(tài)鏈接共享庫,其作用類似于Windows里的.dll文件。幾乎所有的應(yīng)用程序都需要用到這些共享庫。 /lost+found 這個目錄平時是空的,當(dāng)系統(tǒng)不正常關(guān)機后,這里就成了一些無家可歸的文件的避難所,有點類似于DOS下的.chk文件。 /media 用來掛載光盤、U盤等文件系統(tǒng)的目錄。/misc 用來掛載NFS 共享目錄。 /mnt 用于掛載其他硬盤分區(qū)系統(tǒng)的目錄(如掛載xp分區(qū))。 /opt 某些第三方軟件商軟件的安裝地點,如國產(chǎn)紅旗office就存放于此。/proc 這個目錄是一個虛擬的目錄,它是系統(tǒng)內(nèi)存的映射,可以通過直接訪問這個目錄來獲取系統(tǒng)信息。也就是說,這個目錄的內(nèi)容不在硬盤上而是在內(nèi)存里。 /root 系統(tǒng)管理員(也叫超級用戶)的主目錄。作為系統(tǒng)的擁有者,總要有些特權(quán),比如單獨擁有一個目錄。 /sbin s就是Super User的意思,也就是說這里存放的是系統(tǒng)管理員使用的管理程序。 /tmp 這個目錄是用來存放一些臨時文件的地方。 /usr 這是最龐大的目錄,要用到的應(yīng)用程序和文件幾乎都存放在這個目錄 10 操作系統(tǒng)實驗 下。其中包含以下子目錄: /usr/X11R6 存放X-Window的目錄; /usr/bin 存放著許多應(yīng)用程序; /usr/sbin 給超級用戶使用的一些管理程序就放在這里; /usr/include Linux下開發(fā)和編譯應(yīng)用程序需要的頭文件,在這里查找; /usr/lib 存放一些常用的動態(tài)鏈接共享庫和靜態(tài)檔案庫; /usr/local 這是提供給一般用戶的/usr目錄,在這里安裝軟件最適合; /usr/src Linux開放的源代碼就存在這個目錄。 /var 這個目錄中存放著那些不斷在擴充著的東西,為了保持usr的相對穩(wěn)定,那些經(jīng)常被修改的目錄可以放在這個目錄下,實際上許多系統(tǒng)管理員都是這樣做的。另外,系統(tǒng)的日志文件就在/var/log目錄中。 我們一般日常能經(jīng)常訪問的目錄有/home 目錄、/mnt目錄、/media 目錄、/usr 目錄。 計算機操作系統(tǒng)實驗 存儲管理模擬 實驗三 存儲管理模擬 一、內(nèi)容補充說明 實驗中固定內(nèi)存分區(qū)采用結(jié)構(gòu)體數(shù)組實現(xiàn),分區(qū)信息采用結(jié)構(gòu)體初始化實現(xiàn)。由于結(jié)構(gòu)體中含string類,VC++不能對含string類的結(jié)構(gòu)體初始化,這里采用MinGW編譯器作為程序平臺。 MinGW,即 Minimalist GNU For Windows。它是一些頭文件和端口庫的集合,該集合允許人們在沒有第三方動態(tài)鏈接庫的情況下使用 GCC(GNU Compiler C)產(chǎn)生 Windows32 程序。實際上 MinGW 并不是一個 C/C++ 編譯器,而是一套 GNU 工具集合。除開 GCC(GNU 編譯器集合)以外,MinGW 還包含有一些其他的 GNU 程序開發(fā)工具(比如 gawk bison 等等)。開發(fā) MinGW 是為了那些不喜歡工作在 Linux(FreeBSD)操作系統(tǒng)而留在 Windows 的人提供一套符合 GNU 的 GNU 工作環(huán)境。 內(nèi)存的分配采用“最先適應(yīng)算法”實現(xiàn),由于是固定分區(qū),采用該算法不僅簡單,而且保證效率。 二、分析和設(shè)計 1.理論分析 初始狀態(tài)內(nèi)存中沒有作業(yè)運行;以后每5 秒鐘隨機生成一個作業(yè),如果不能滿足作業(yè)需求(主存中沒有分區(qū)能夠容納的下),則丟棄該作業(yè)。作業(yè)以秒為單位進行驅(qū)動,當(dāng)一個作業(yè)運行時間結(jié)束后將釋放內(nèi)存空間。 2.總體設(shè)計 分區(qū)信息采用初始化實現(xiàn)。 作業(yè)以秒為單位進行驅(qū)動。 作業(yè)的生成、內(nèi)存的釋放采用永真循環(huán)實現(xiàn),當(dāng)作業(yè)全部運行完后跳出循環(huán)。 新作業(yè)的大小和運行時間由隨機數(shù)函數(shù)rand生成。 結(jié)構(gòu)體Job用于生成新作業(yè)時用;結(jié)構(gòu)體District是內(nèi)存分區(qū),作業(yè)分配成功后,作業(yè)的信息全部保存在District內(nèi),不再由專門的作業(yè)隊列記錄。 作業(yè)運行時間由District[i].Remainder記錄,當(dāng)每秒驅(qū)動一次時,時間將減少一秒。當(dāng)時間減少為0時,作業(yè)運行結(jié)束,釋放內(nèi)存空間。 每分配一個作業(yè),變量Jump自加一次;每釋放一個作業(yè)時Jump自減一次。因為作業(yè)先分配、內(nèi)存后釋放,所以當(dāng)作業(yè)都運行完時Jump必定等于初始值,這時程序跳出永真循環(huán)。 三、詳細(xì)實現(xiàn) for(int j=0,clock=0,flag=0;1;clock++,flag=0,Sleep(1000)) //總循環(huán),永真循環(huán),flag為作業(yè)分配標(biāo)志,clock為作業(yè)產(chǎn)生時鐘,Sleep為程序步進驅(qū)動 {if(j //每5秒產(chǎn)生一個新作業(yè) {p=new Job; //產(chǎn)生新作業(yè) …… for(int k=0;k<10;k++) if(District_table[k].Job_size==0 && p->Job_size<=District_table[k].District_size) //如果分區(qū)未分配并且作業(yè)大小小于分區(qū)大小 {District_table[k].Job_num=j; //分配內(nèi)存,并將作業(yè)信息保存至分區(qū)信息中 …… for(int k=0;k<10;k++) if(District_table[k].Job_size!=0) //如果分區(qū)中有作業(yè)運行 District_table[k].Remainder-=1; //程序步進驅(qū)動,作業(yè)運行減1 …… for(int t=0;t<10;t++)if(District_table[t].Job_size!=0 && District_table[t].Remainder==0) //如果分區(qū)中有作業(yè)運行,并且作業(yè)已運行完成 計算機操作系統(tǒng)實驗 存儲管理模擬 {District_table[t].Job_size=0; //釋放內(nèi)存 …… 四、操作界面 操作界面為命令提示符界面,實驗截圖如下: 1.編譯、連接界面 計算機操作系統(tǒng)實驗 存儲管理模擬 五、心得體會 程序最后跳出永真循環(huán)是用break語句。原來是用goto語句,用break語句或exit語句應(yīng)該也是可以的,但運行后死活都跳不出來,后來不知道為什么又好了。 MinGW是一個很好的編譯器,安裝包小、程序文件小、綠色環(huán)保、速度快、效率高。另外,還有很多人性化的設(shè)計,比如:現(xiàn)實代碼行數(shù)、網(wǎng)格顯示、配對括號激活時高亮顯示方便檢查、括號代碼折疊方便查看上下段程序等等。可惜Windows Vista用戶沒福氣,幸好我是Windows XP。 六、附錄 #include using namespace std; 計算機操作系統(tǒng)實驗 存儲管理模擬 cout<<“/\/\/\/分區(qū)表初始化完成\/\/\/\”< //打印內(nèi)存分區(qū)內(nèi)容 cout< //總循環(huán),永真循環(huán),flag為作業(yè)分配標(biāo)志,clock為作業(yè)產(chǎn)生時鐘,Sleep為程序步進驅(qū)動 {if(j //每5秒產(chǎn)生一個新作業(yè) {p=new Job; //產(chǎn)生新作業(yè) p->Job_size=rand()%34+1; //作業(yè)大小隨機 p->Job_time=rand()%40+1; //作業(yè)運行時間隨機 cout< Job_time<<“S”< for(int k=0;k<10;k++) if(District_table[k].Job_size==0 && p->Job_size<=District_table[k].District_size) //如果分區(qū)未分配并且作業(yè)大小小于分區(qū)大小 {District_table[k].Job_num=j; //分配內(nèi)存,并將作業(yè)信息保存至分區(qū)信息中 District_table[k].Job_size=p->Job_size; District_table[k].Remainder=p->Job_time; District_table[k].District_state=“Allocated”; cout<<“↓↓↓↓↓↓↓↓↓↓分配成功,分配信息如下↓↓↓↓↓↓↓↓↓↓”< cout<<“分區(qū)號碼 分區(qū)大小 作業(yè)大小 分區(qū)狀態(tài)”< for(int t=0;t<10;t++) cout< flag=1; //分配成功 Jump+=1; //內(nèi)存中作業(yè)數(shù) break; } if(flag==0) //如果作業(yè)分配不成功 cout<<“→→→→→→→→→空間不足,分配失敗,已丟棄→→→→→→→→→”< j++; //生成作業(yè)數(shù) } for(int k=0;k<10;k++) if(District_table[k].Job_size!=0) //如果分區(qū)中有作業(yè)運行 District_table[k].Remainder-=1; //程序步進驅(qū)動,作業(yè)運行減1 for(int t=0;t<10;t++) if(District_table[t].Job_size!=0 && District_table[t].Remainder==0) //如果分區(qū)中有作業(yè)運行,并且作業(yè)已運行完成 {District_table[t].Job_size=0; //釋放內(nèi)存 District_table[t].District_state=“Unallocated”; cout< District_table[t].Job_num=0; cout<<“分區(qū)號碼 分區(qū)大小 作業(yè)大小 分區(qū)狀態(tài)”< for(int r=0;r<10;r++) cout< Jump-=1; //內(nèi)存中作業(yè)數(shù) 操作系統(tǒng)實驗總結(jié) 學(xué)號: 姓名: 班級: 在本學(xué)期的計算機操作系統(tǒng)這門課學(xué)習(xí)當(dāng)中,為了更好的了解操作系統(tǒng)相關(guān)知識,我們通過OS Lab平臺做了幾個實驗。在實驗室的過程中,我對課堂上學(xué)到的操作系統(tǒng)的一些知識有了新的認(rèn)識,同時還接觸到了操作系統(tǒng)的相關(guān)源代碼,而且通過實驗的運行效果了解了平時我們看不到的操作系統(tǒng)的一些狀況,收獲還是很大的。下面先簡要歸納在實驗課上我做的幾個實驗的主要實驗內(nèi)容和實驗步驟: 實驗一:實驗環(huán)境的使用 實驗步驟: 1.1啟動OS Lab OS Lab每次啟動后都會首先彈出一個用于注冊用戶信息的對話框(可以選擇對話框標(biāo)題欄上的“幫助”按鈕獲得關(guān)于此對話框的幫助信息)。在此對話框中填入學(xué)號和姓名后,點擊“確定”按鈕完成本次注冊。觀察OS Lab主窗口的布局。OS Lab主要由下面的若干元素組成:菜單欄、工具欄以及??吭谧髠?cè)和底部的各種工具窗口,余下的區(qū)域用來放置編輯器窗口。 1.2 學(xué)習(xí)OS Lab的基本使用方法 練習(xí)使用OS Lab編寫一個Windows控制臺應(yīng)用程序,熟悉OS Lab的基本使用方法(主要包括新建項目、生成項目、調(diào)試項目等)。 實驗二:操作系統(tǒng)的啟動 實驗步驟: 2.1 準(zhǔn)備實驗 啟動OS Lab,新建一個EOS Kernel項目,在“項目管理器”窗口中打開boot文件夾中的boot.asm和loader.asm兩個匯編文件,按F7生成項目,生成完成后,使用Windows資源管理器打開項目文件夾中的Debug文件夾。找到由boot.asm生成的軟盤引導(dǎo)扇區(qū)程序boot.bin文件,找到由loader.asm生成的loader程序loader.bin文件,記錄下此文件的大小1566字節(jié)。 2.2 調(diào)試EOS操作系統(tǒng)的啟動過程 2.2.1 使用Bochs做為遠(yuǎn)程目標(biāo)機 將調(diào)試時使用的遠(yuǎn)程目標(biāo)機修改為Bochs 2.2.2 調(diào)試BIOS程序 按F5啟動調(diào)試,Bochs在CPU要執(zhí)行的第一條指令(即BIOS的第一條指令)處中斷,從Console窗口顯示的內(nèi)容中,我們可以獲得關(guān)于BIOS第一條指令的相關(guān)信息,然后查看CPU在沒有執(zhí)行任何指令之前主要寄存器中的數(shù)據(jù),以及內(nèi)存中的數(shù)據(jù)。 2.2.3 調(diào)試軟盤引導(dǎo)扇區(qū)程序 練習(xí)從0x7c00處調(diào)試軟盤引導(dǎo)扇區(qū)程序;查看boot.lst文件;調(diào)試過程——軟盤引導(dǎo)扇區(qū)程序的主要任務(wù)就是將軟盤中的loader.bin文件加載到物理內(nèi)存的0x1000處,然后跳轉(zhuǎn)到loader程序的第一條指令(物理地址0x1000處的指令)繼續(xù)執(zhí)行l(wèi)oader程序; 2.2.4 調(diào)試加載程序 調(diào)試過程——Loader程序的主要任務(wù)是將操作系統(tǒng)內(nèi)核(kernel.dll文件)加載到內(nèi)存中,然后讓CPU進入保護模式并且啟用分頁機制,最后進入操作系統(tǒng)內(nèi)核開始執(zhí)行(跳轉(zhuǎn)到kernel.dll的入口點執(zhí)行); 2.2.5 調(diào)試內(nèi)核 2.2.6 EOS啟動后的狀態(tài)和行為 查看EOS的版本號;查看EOS啟動后的進程和線程的信息;查看有應(yīng)用程序運行時進程和線程的信息 實驗三:進程的創(chuàng)建 實驗步驟: 3.1 準(zhǔn)備實驗 啟動OS Lab;新建一個EOS Kernel項目;分別使用Debug配置和Release配置生成此項目,從而在該項目文件夾中生成完全版本的EOS SDK文件夾;新建一個EOS應(yīng)用程序項目;使用在第3步生成的SDK文件夾覆蓋EOS應(yīng)用程序項目文件夾中的SDK文件夾 3.2 練習(xí)使用控制臺命令創(chuàng)建EOS應(yīng)用程序的進程 3.3 練習(xí)通過編程的方式讓應(yīng)用程序創(chuàng)建另一個應(yīng)用程序的進程 使用OS Lab打開本實驗文件夾中的NewProc.c文件;查看應(yīng)用程序創(chuàng)建另一個應(yīng)用程序的進程的執(zhí)行結(jié)果。 3.4 調(diào)試CreateProcess函數(shù) 調(diào)試CreateProcess函數(shù)創(chuàng)建進程的過程;分別驗證應(yīng)用程序和操作系統(tǒng)內(nèi)核在進程的4G虛擬地址空間中所處的位置; 3.5 調(diào)試PsCreateProcess函數(shù) 調(diào)試PspCreateProcessEnvironment函數(shù);調(diào)試進程控制塊的創(chuàng)建過程;調(diào)試初始化進程控制塊中各個成員變量的過程。 3.6 練習(xí)通過編程的方式創(chuàng)建應(yīng)用程序的多個進程 使用OS Lab打開本實驗文件夾中的參考源代碼文件NewTwoProc.c,仔細(xì)閱讀此文件中的源代碼。使用NewTwoProc.c文件中的源代碼替換EOS應(yīng)用程序項目中EOSApp.c文件內(nèi)的源代碼,生成后啟動調(diào)試,查看多個進程并發(fā)執(zhí)行的結(jié)果。 實驗四:線程的狀態(tài)和轉(zhuǎn)換 實驗步驟: 4.1 準(zhǔn)備實驗 啟動OS Lab,新建一個EOS Kernel項目 4.2 調(diào)試線程狀態(tài)的轉(zhuǎn)換過程 查看一下loop命令執(zhí)行的效果;調(diào)試線程狀態(tài)轉(zhuǎn)換的過程;對斷點進行一些調(diào)整。 4.2.1 線程由阻塞狀態(tài)進入就緒狀態(tài): 將線程從等待隊列中移除;將線程的狀態(tài)由Waiting修改為Zero;將線程插入其優(yōu)先級對應(yīng)的就緒隊列的隊尾;將線程的狀態(tài)由Zero修改為Ready。 4.2.2 線程由運行狀態(tài)進入就緒狀態(tài): 線程中斷運行,將線程中斷運行時的上下文保存到線程控制塊中;如果處于運行狀態(tài)的線程被更高優(yōu)先級的線程搶先,就需要將該線程插入其優(yōu)先級對應(yīng)的就緒隊列的隊首。(注意,如果處于運行狀態(tài)的線程主動讓出處理器,例如時間片用完,就需要將程插入其優(yōu)先級對應(yīng)的就緒隊列的隊尾);將線程的狀態(tài)由Running修改為Ready 4.2.3 線程由就緒狀態(tài)進入運行狀態(tài): 將線程從其優(yōu)先級對應(yīng)的就緒隊列中移除;將線程的狀態(tài)由Ready修改為Zero;將線程的狀態(tài)由Zero修改為Running;將線程的上下文從線程控制塊(TCB)復(fù)制到處理器的各個寄存器中,讓線程從上次停止運行的位置繼續(xù)運行。 4.2.4 線程由運行狀態(tài)進入阻塞狀態(tài): 將線程插入等待隊列的隊尾;將線程的狀態(tài)由Running修改為Waiting;將線程中斷執(zhí)行,并將處理器上下文保存到該線程的線程控制塊中。 4.3 為線程增加掛起狀態(tài) 觀察loop線程被掛起的情況:刪除之前添加的所有斷點;按F5啟動調(diào)試;待EOS啟動完 畢,在EOS控制臺中輸入命令“l(fā)oop”后按回車。此時可以看到loop線程的執(zhí)行計數(shù)在不停增長,說明loop線程正在執(zhí)行,記錄下loop線程的ID;按Ctrl+F2切換到控制臺2,輸入命令“suspend 31”(如果loop線程的ID是31)后按回車;按Ctrl+1切換回控制臺1,可以看到由于loop線程已經(jīng)成功被掛起,其執(zhí)行計數(shù)已經(jīng)停止增長了。 在PsResumThread函數(shù)第119行需要添加的代碼的流程可以是:首先調(diào)用List Remove Entry函數(shù)將線程從掛起線程隊列中移除,然后調(diào)用PspReadyThread函數(shù)將線程恢復(fù)為就緒狀態(tài),最后調(diào)用PspThreadSchedule宏函數(shù)執(zhí)行線程調(diào)度,讓剛剛恢復(fù)的線程有機會執(zhí)行。 實驗過程: 做實驗時,最開始并不是很了解OS Lab平臺的使用,即使對著老師給的實驗教程做還是不怎么會,于是請教會做的同學(xué),通過同學(xué)的講解我知道了怎樣在OS Lab平臺上建立項目,怎樣更改路徑并找到項目的源文件等等基本操作。 掌握對平臺的簡單應(yīng)用后,做后面的實驗我是按照實驗教程上的步驟一步步的實施,并且每次都認(rèn)真觀察相應(yīng)的運行結(jié)果,每個實驗都會建議我們學(xué)習(xí)實驗教程前面的理論部分,我想如果對他的理論不熟悉,就算試驗成功了我也不知道為什么,所以我一般在做實驗前會對前面的理論部分進行簡要的學(xué)習(xí)和熟悉。做實驗的過程中,有時候按照實驗教程上的步驟做平臺還是會出現(xiàn)一些錯誤,比如做實驗三到調(diào)試CreateProcess函數(shù)時,出現(xiàn)的調(diào)試異常對話框中,本來是要點擊“是”的,但做到這里電腦總是會出現(xiàn)像死機一樣的狀況,關(guān)掉平臺重做到這里老是出現(xiàn)同樣的問題,最后換電腦也是這樣,然后我嘗試不按照實驗步驟點擊“是”也不行,最后還是又還了電腦才做成功,問其他同學(xué)也有出現(xiàn)同樣的問題,我想可能是平臺和電腦上有什么地方有沖突吧。 之后做試驗是遇到問題我還是選擇多問同學(xué),畢竟每個人擅長的是不同的,有些問題這個同學(xué)會解決,有些問題則是那個同學(xué)才懂解決,通過互相交流和學(xué)習(xí),我們通過實驗不僅鞏固了課堂上學(xué)到的相關(guān)知識,也對操作系統(tǒng)有了更深的了解。 體會: 其實做完實驗我還是不能保證我對OS Lab這個平臺有很好的全面的了解,但是對一些基本操作及其快捷鍵我算是大致掌握了,通過這個平臺我也是認(rèn)識到了“沒有做不到的,只有想不到的”,我覺得創(chuàng)建這個平臺的人們真的是很了不起,這個平臺讓我們便動手便了解了平時我們看不到的操作系統(tǒng)的相關(guān)知識。要做好實驗,得按照實驗教程上面的內(nèi)容一步步落實,要邊做變領(lǐng)悟相關(guān)原理及運行結(jié)果的出現(xiàn)的原因,這樣我們才能在試驗中學(xué)到更多、掌握更多。其次,也遇到問題我們自然是要先自己思考,通過不同的嘗試來解決,之后不能解決的我們要多向老師同學(xué)請教,通過互相交流得來的知識也是會讓我們難忘的。第二篇:操作系統(tǒng)課程設(shè)計_動態(tài)分區(qū)分配存儲管理
第三篇:操作系統(tǒng)實驗
第四篇:實驗3存儲管理模擬
第五篇:操作系統(tǒng)實驗總結(jié)