2024年操作系統(tǒng)實驗報告_第1頁
2024年操作系統(tǒng)實驗報告_第2頁
2024年操作系統(tǒng)實驗報告_第3頁
2024年操作系統(tǒng)實驗報告_第4頁
2024年操作系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

院系:計算機科學學院專業(yè):計算機科學與技術(shù)年級:課程名稱:操作系統(tǒng)指導(dǎo)教師:艾勇6月1曰年級

專業(yè)計算機科學與技術(shù)

班級

1小班組號01試驗室9-206曰期

.6.1試驗名稱

操作系統(tǒng)試驗實驗內(nèi)容分項內(nèi)容試驗級別試驗一操作系統(tǒng)試驗環(huán)境熟悉(Linux操作命令、Linux/Windows平臺編程工具)操作系統(tǒng)使用級試驗二進程控制操作系統(tǒng)觀測級,原碼閱讀與系統(tǒng)編程級試驗三進程同步與通信管理原碼閱讀與系統(tǒng)編程級試驗四虛擬內(nèi)存管理操作系統(tǒng)觀測級,算法仿真實現(xiàn)級試驗五文獻系統(tǒng)與磁盤管理操作系統(tǒng)管理級小組成員姓名學號組內(nèi)分工自我評分教師評分李延珍10061001試驗1,2,3,4,5

秦婷10061002試驗1,2,3,4,5

劉夢雲(yún)10061003試驗1,2,3,4,5

金柏統(tǒng)10061023試驗1,2,3,4,5

許文君10061029試驗1,2,3,4,5

小組成績評定教師簽名:年月曰試驗分項1操作系統(tǒng)試驗環(huán)境熟悉(Linux操作命令、Linux/Windows平臺編程工具)實驗?zāi)康?/p>

熟悉操作系統(tǒng)試驗環(huán)境實驗要求詳細題目Linux常用命令的使用(操作系統(tǒng)使用級)Linux系統(tǒng)基本操作(啟動與退出、文獻和目錄操作、文檔備份與壓縮、聯(lián)機協(xié)助等)Vi/Emacs等編輯軟件的使用(操作系統(tǒng)使用級)cc、gcc、g++、gdb命令的使用(開發(fā)調(diào)試環(huán)境)(操作系統(tǒng)使用級)系統(tǒng)平臺:Linux實驗原理步驟(算法流程)login1.作用login的作用是登錄系統(tǒng),它的使用權(quán)限是所有顧客。2.格式login[name][-p][-h(huán)主機名稱]3.重要參數(shù)-p:告知login保持目前的環(huán)境參數(shù)。-h(huán):用來向遠程登錄的之間傳播顧客名。mkdir

[options]

目錄名

1.[options]重要參數(shù)

-m,

--mode=模式:設(shè)定權(quán)限<模式>,與chmod類似。

-p,

--parents:需要時創(chuàng)立上層目錄;假如目錄早已存在,則不妥作錯誤。

-v,

--verbose:每次創(chuàng)立新目錄都顯示信息。

--version:顯示版本信息後離開。

$

mkdir

-m

777

tsk

grep

1.作用

grep命令可以指定文獻中搜索特定的內(nèi)容,并將具有這些內(nèi)容的行原則輸出。grep全稱是Global

Regular

Expression

Print,表達全局正則體現(xiàn)式版本,它的使用權(quán)限是所有顧客。

2.格式

grep

[options]

find1.作用

find命令的作用是在目錄中搜索文獻,它的使用權(quán)限是所有顧客。2.格式

find

[path][options][expression]

path指定目錄途徑,系統(tǒng)從這裏開始沿著目錄樹向下查找文獻。它是一種途徑列表,互相用空格分離,假如不寫path,那么默認為目前目錄。

find命令查找文獻的幾種措施:

(1)根據(jù)文獻名查找

例如,我們想要查找一種文獻名是lilo.conf的文獻,可以使用如下命令:

find

/

-name

lilo.conf

find命令後的“/”表達搜索整個硬盤。

(3)根據(jù)部分文獻名查找措施

find

/

-name

'*abvd*'

(4)

使用混合查找方式查找文獻

find

/etc

-size

+500000c

-and

-mtime

+1

mv

1.作用

mv命令用來為文獻或目錄更名,或者將文獻由一種目錄移入另一種目錄中,它的使用權(quán)限是所有顧客。該命令如同DOS命令中的ren和move的組合。

2.格式

mv[options]

源文獻或目錄

目的文獻或目錄

3.[options]重要參數(shù)

-i:交互方式操作。假如mv操作將導(dǎo)致對已存在的目的文獻的覆蓋,此時系統(tǒng)問詢與否重寫,規(guī)定顧客回答“y”或“n”,這樣可以防止誤覆蓋文獻。

-f:嚴禁交互操作。mv操作要覆蓋某個已經(jīng)有的目的文獻時不給任何指示,指定此參數(shù)後i參數(shù)將不再起作用。

ls

1.作用

ls命令用于顯示目錄內(nèi)容,類似DOS下的dir命令,它的使用權(quán)限是所有顧客。

2.格式

ls

[options][filename]

cat

1.作用

cat(“concatenate”的縮寫)命令用于連接并顯示指定的一種和多種文獻的有關(guān)信息,它的使用權(quán)限是所有顧客。

2.格式

cat

[options]

文獻1

文獻2……

3.[options]重要參數(shù)

-n:由第一行開始對所有輸出的行數(shù)編號。

-b:和-n相似,只不過對于空白行不編號。

-s:當碰到有持續(xù)兩行以上的空白行時,就代換為一行的空白行。

$

cat

-b

/etc/named.conf

實驗結(jié)果及分析Linux常用命令的使用在字符界面使用login登錄系統(tǒng),顧客名niceboy:ls–f用在每個文獻名的背面或者前面添加一種特定的後綴字符的措施指出它的類型:pwd查看目前所在目錄的絕對路經(jīng):mkdir目錄名,創(chuàng)立一種目錄。如在目前目錄下面創(chuàng)立目錄secrest:

file檢測文獻的目錄的屬性和內(nèi)容屬性,如檢測文獻1.txt的文獻的目錄屬性和內(nèi)容屬性:cp1.txtabc將temp下面的1.txt復(fù)制到abc下面:rmdir空目錄名,刪除一種空目錄如,執(zhí)行命令後secrest被刪除了:cat顯示文獻的內(nèi)容:把test1(包括1.doc)、test2備份到backup文獻夾中追加2.doc和3.doc到backup文獻夾中解壓backup壓縮包中的test2文獻夾創(chuàng)立了以abc開頭的文獻,然後壓縮成mytar.tar:解壓mytar.tar,如下所示:使用man進入在線協(xié)助:使用rpm指令安裝軟件包:在目錄/dev中搜索文獻名中含字符串sda的文獻:使用shutdown指令關(guān)閉系統(tǒng):Vi編輯軟件的使用cc、gcc、g++、gdb命令的使用心得體會通過本次試驗,我基本上掌握了怎樣使用Linux系統(tǒng)進行簡樸的操作,學會了某些基本的linux操作命令,懂得怎樣在linux下編寫、編譯并運行C語言程序;理解了VI的基本命令,插入,粘貼,復(fù)制等命令。理解了linux下文獻目錄的基本構(gòu)造,文獻的屬性,顧客的屬性,可以較純熟的操作圖形界面。為此後的學習奠定了基礎(chǔ)。試驗分項2進程控制實驗?zāi)康?/p>

熟悉linux和windows下進程的管理,包括創(chuàng)立,睡眠,銷毀等。實驗要求詳細題目Linux系統(tǒng)常用進程管理命令的使用(操作系統(tǒng)觀測級)Linux系統(tǒng)常用進程創(chuàng)立與管理的系統(tǒng)調(diào)用(原碼閱讀與系統(tǒng)編程級)Windows平臺常用進線程控制API(原碼閱讀與系統(tǒng)編程級)系統(tǒng)平臺LinuxWindows實驗原理步驟(算法流程)fork()函數(shù)創(chuàng)立子進程需要將父進程的資源復(fù)制一種副本;當調(diào)用fork()執(zhí)行成功時,調(diào)用1次卻返回2次,該調(diào)用向父進程返回子進程的ID,向子進程返回0。wait()函數(shù)進程一旦調(diào)用了wait,就立即阻塞了自已,由wait自動分析與否目前進程的某個子進程已經(jīng)退出,假如讓它找到了這樣一種已經(jīng)變成僵尸的子進程,wait就會搜集這個子進程的信息,并把它徹底銷毀後返回;假如沒有找到這樣的一種子進程,wait就會一直阻塞在這裏,直到一種出現(xiàn)為止。參數(shù)status用來保留被搜集的進程退出時的某些狀態(tài),它是一種指向int類型的指針sleep()函數(shù)該函數(shù)使得進程掛起一種指定的時間,直到懂得時間用完或收到信號;假如掛起時間到了,就返回0;假如該函數(shù)被信號打斷,則返回剩余掛起的時間數(shù)。實驗結(jié)果及分析Linux系統(tǒng)常用進程管理命令的使用使用ps命令重要查看系統(tǒng)中進程的狀態(tài):使用kill命令終止一種進程:Linux系統(tǒng)常用進程創(chuàng)立與管理的系統(tǒng)調(diào)用fork()函數(shù)創(chuàng)立子進程需要將父進程的資源復(fù)制一種副本;當調(diào)用fork()執(zhí)行成功時,調(diào)用1次卻返回2次,該調(diào)用向父進程返回子進程的ID,向子進程返回0。wait()函數(shù)進程一旦調(diào)用了wait,就立即阻塞了自已,由wait自動分析與否目前進程的某個子進程已經(jīng)退出,假如讓它找到了這樣一種已經(jīng)變成僵尸的子進程,wait就會搜集這個子進程的信息,并把它徹底銷毀後返回;假如沒有找到這樣的一種子進程,wait就會一直阻塞在這裏,直到一種出現(xiàn)為止。參數(shù)status用來保留被搜集的進程退出時的某些狀態(tài),它是一種指向int類型的指針sleep()函數(shù)該函數(shù)使得進程掛起一種指定的時間,直到懂得時間用完或收到信號;假如掛起時間到了,就返回0;假如該函數(shù)被信號打斷,則返回剩余掛起的時間數(shù)。Windows平臺常用進線程控制API#include<windows.h>#include<iostream>#include<conio.h>#include<stdio.h>staticLPCSTRg_szMutexName="w2kdg.ProcTerm.mutex.Suicide";voidStartClone()//創(chuàng)立目前進程的克隆進程的簡樸措施{ TCHARszFilename[MAX_PATH]; GetModuleFileName(NULL,szFilename,MAX_PATH);//獲得目前可執(zhí)行文獻名TCHARszCmdLine[MAX_PATH]; sprintf(szCmdLine,"\"%s\"child",szFilename); STARTUPINFOsi; ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si)); si.cb=sizeof(si); PROCESS_INFORMATIONpi;//闡明一種返回的子進程信息構(gòu)造 //運用同樣的可執(zhí)行文獻名和命令行創(chuàng)立進程,并指明是一種返回進程 BOOLbCreateOk=CreateProcess( szFilename,//產(chǎn)生的應(yīng)用程序的名稱 szCmdLine,//指定創(chuàng)立一種子進程的符號標識 NULL,//默認的進程安全性 NULL,//默認的線程安全性 FALSE,//不繼承句柄 CREATE_NEW_CONSOLE,//創(chuàng)立新窗口,使輸出更直觀 NULL,//新環(huán)境 NULL,//目前目錄 &si,//啟動信息構(gòu)造 &pi);//返回進程信息 if(bCreateOk)//關(guān)閉子進程 { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }}voidParent(){HANDLEhMutexSuicide=CreateMutex( NULL,//默認的安全性 TRUE,//創(chuàng)立者是互斥體得最初擁有者 g_szMutexName);//為互斥體命名 if(hMutexSuicide!=NULL) { printf("Creatingthechildprocess.\n"); { StartClone();//創(chuàng)立一種子進程 printf("Tellingthechildprocesstoquit.\n"); printf("本來是子進程,請終止!\n"); Sleep(6000);//暫停5秒 } printf("我也結(jié)束了!\n"); ReleaseMutex(hMutexSuicide);//告知子進程殺掉自身 CloseHandle(hMutexSuicide);//消除互斥體句柄 }}voidChild(){//打開“自殺”互斥體 HANDLEhMutexSuicide=OpenMutex( SYNCHRONIZE,//打開用于同步 FALSE,//不需要向下傳遞 g_szMutexName);//互斥體名稱 if(hMutexSuicide!=NULL) { printf("Childwaitingforsuicideinstuctions.\n"); WaitForSingleObject(hMutexSuicide,INFINITE); //等待子進程釋放互斥體 //準備好終止,清除句柄 printf("收到命令,本子進程立即終止請等10秒鐘\n"); printf("Childquiting"); Sleep(6000); CloseHandle(hMutexSuicide); }}intmain(intargc,char*argv[]){ //決定其行為是父進程還是子進程 if(argc>1&&strcmp(argv[1],"child")==0) { Child(); } else { Parent(); Sleep(); } return0;}程序運行成果如下:心得體會通過本次試驗,對父進程和子進程之間的關(guān)系也有了比較清晰的認識,可以在linux下用c語言創(chuàng)立進程,子進程,銷毀進程等。理解了linux下進程控制塊的基本構(gòu)造,對linux的進程和線程的區(qū)別和聯(lián)絡(luò)有個比較清晰的認識,可以在終端管理進程。對進程的同步互斥有一定的理解。Windos下和linux下的進程在構(gòu)造上也有相似的地方。試驗分項3

進程同步與通信管理實驗?zāi)康?/p>

熟悉掌握進程的通信管理實驗要求詳細題目進程同步與互斥控制(讀者寫者、一家人吃蘋果桔子、哲學家吃飯)簡樸進程通信(管道、消息緩沖、郵件槽等)(原碼閱讀與系統(tǒng)編程級)系統(tǒng)平臺Linux平臺windows平臺實驗原理步驟(算法流程)一家人吃蘋果桔子問題算法設(shè)計如下:父親進程:#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intmain(intargc,char*argv[]){HANDLEhSem_Empty_Plate;hSem_Empty_Plate=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Empty_Plate");HANDLEhSem_Apple;hSem_Apple=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Apple");inti;for(i=0;i<20;i++){cout<<"試圖放入蘋果"<<endl;cin.get();WaitForSingleObject(hSem_Empty_Plate,INFINITE);//申請信號量hSem_Empty_Plate/*************************************//************詳細操作*****************//*************************************/cout<<"成功放入蘋果,并準備通告兒子"<<endl;cin.get();ReleaseSemaphore(hSem_Apple,1,NULL);//釋放信號量hSem_Applecout<<"通告完畢,準備削蘋果"<<endl;cin.get();}cin.get();return0;}母親進程和父親進程類似:#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intmain(intargc,char*argv[]){HANDLEhSem_Empty_Plate;hSem_Empty_Plate=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Empty_Plate");HANDLEhSem_Orange;hSem_Orange=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Orange");inti;for(i=0;i<20;i++){cout<<"試圖放入桔子"<<endl;cin.get();WaitForSingleObject(hSem_Empty_Plate,INFINITE);/*************************************//************詳細操作*****************//*************************************/cout<<"成功放入桔子,并準備通告女兒"<<endl;cin.get();ReleaseSemaphore(hSem_Orange,1,NULL);cout<<"通告完畢,準備剝桔子"<<endl;cin.get();}cin.get();return0;}兒子進程:#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intmain(intargc,char*argv[]){HANDLEhSem_Empty_Plate;hSem_Empty_Plate=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Empty_Plate");HANDLEhSem_Apple;hSem_Apple=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Apple");inti;for(i=0;i<20;i++){cout<<"試圖取出蘋果"<<endl;cin.get();WaitForSingleObject(hSem_Apple,INFINITE);/*************************************//************詳細操作*****************//*************************************/cout<<"成功取出蘋果,并準備通告老爹老媽"<<endl;cin.get();ReleaseSemaphore(hSem_Empty_Plate,1,NULL);cout<<"通告完畢,正在吃蘋果"<<endl;cin.get();}cin.get();return0;}女兒進程:#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intmain(intargc,char*argv[]){HANDLEhSem_Empty_Plate;hSem_Empty_Plate=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Empty_Plate");HANDLEhSem_Orange;hSem_Orange=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Sem_Orange");inti;for(i=0;i<20;i++){cout<<"試圖取出桔子"<<endl;cin.get();WaitForSingleObject(hSem_Orange,INFINITE);/*************************************//************詳細操作*****************//*************************************/cout<<"成功取出桔子,并準備通告老媽老爹"<<endl;cin.get();ReleaseSemaphore(hSem_Empty_Plate,1,NULL);cout<<"通告完畢,正在吃桔子"<<endl;cin.get();}cin.get();return0;}實驗原理步驟(算法流程)讀者寫者問題算法設(shè)計如下:讀者:#include<vcl.h>#pragmahdrstop#include"iostream.h"http://---------------------------------------------------------------------------#pragmaargsusedintmain(intargc,char*argv[]){intcount=0;//記錄正在讀的讀者數(shù)inti=0;HANDLErMutex;rMutex=OpenMutex(MUTEX_ALL_ACCESS,false,"rMutex");//打開rWutex互斥體HANDLEwMutex;wMutex=OpenMutex(MUTEX_ALL_ACCESS,false,"wMutex");//打開wWutex互斥體cout<<"如下用讀者進程循環(huán)方式模擬多種讀者進程。"<<endl;while(i<5){WaitForSingleObject(rMutex,INFINITE);if(count==0)//假如還沒有讀者,開始,并阻塞後來的寫者{WaitForSingleObject(wMutex,INFINITE);}count=count+1;ReleaseMutex(rMutex);cout<<i;cout<<"號讀者正在讀數(shù)據(jù)!"<<endl;Sleep(1000);WaitForSingleObject(rMutex,INFINITE);count=count-1;if(count==0)//假如沒有讀者了,喚醒也許阻塞的寫者{ReleaseMutex(wMutex);}ReleaseMutex(rMutex);i++;Sleep();}//目前模擬一口氣有多種讀者幾乎同步到i=0;//i清零while(i<4){WaitForSingleObject(rMutex,INFINITE);if(count==0)//假如還沒有讀者,開始,并阻塞後來的寫者{WaitForSingleObject(wMutex,INFINITE);}count=count+1;ReleaseMutex(rMutex);cout<<i;cout<<"號讀者正在讀數(shù)據(jù)!目前count值為";cout<<count<<endl;Sleep(100);i++;}i=0;while(i<4){WaitForSingleObject(rMutex,INFINITE);count=count-1;cout<<"目前count值為";cout<<count<<endl;if(count==0)//假如沒有讀者了,喚醒也許阻塞的寫者{ReleaseMutex(wMutex);}ReleaseMutex(rMutex);Sleep(3000);i++;}cin.get();return0;}寫者:#include<vcl.h>#pragmahdrstop#include"iostream.h"http://---------------------------------------------------------------------------#pragmaargsusedintmain(intargc,char*argv[]){inti=0;HANDLEwMutex;wMutex=OpenMutex(MUTEX_ALL_ACCESS,false,"wMutex");//打開wWutex互斥體cout<<"如下用寫者進程循環(huán)方式模擬多種寫者進程。"<<endl;while(true){WaitForSingleObject(wMutex,INFINITE);cout<<i;cout<<"號寫者正在寫數(shù)據(jù)!需時1秒。"<<endl;Sleep(1000);ReleaseMutex(wMutex);i++;Sleep(1000);}return0;}哲學家問題:send(i):第i個哲學家要吃飯BeginIfimod2==0then//第偶數(shù)個哲學家{P(c[i]);//申請左邊的筷子P(c[i+1]mod5));//申請右邊的筷子eat;V(c[i]);//釋放左邊的筷子V(c[i+1mod5]);//釋放右邊的筷子}Else{

P(c[i+1mod5]);//申請右邊的筷子P(c[i]);//申請左邊的筷子EatV(c[i+1mod5]);//釋放右邊的筷子V(c[i]);//釋放左邊的筷子}EndLinux系統(tǒng)常用進程創(chuàng)立與管理的系統(tǒng)調(diào)用#include<sys/types.h>#include<unistd.h>#include<errno.h>#include<stdio.h>

intmain(){pid_tret;intstatus,i,role=-1;ret=fork();if(ret>0){printf("Parent:thisistheparentprocess(pid%d)\n",getpid());for(i=0;i<6;i++){printf("Parent:Atcount%d\n",i);sleep(2);}ret=wait(&status);role=0;}elseif(ret==0){printf("Child:thisistheChildprocess(pid%d)\n",getpid());for(i=0;i<6;i++){printf("Child:Atcount%d\n",i);sleep(2);}role=1;}else{printf("Parent:Errortryingtofork()(%d)\n",errno);}printf("%s:Exiting...\n",((role==0)?"Parent":"Child"));return0;}fork()創(chuàng)立子進程需要將父進程的資源復(fù)制一種副本;當調(diào)用fork()執(zhí)行成功時,調(diào)用1次卻返回2次,該調(diào)用向父進程返回子進程的ID,向子進程返回0。實驗結(jié)果及分析一家人吃蘋果桔子問題算法設(shè)計如下:設(shè)三個個信號量hSem_Empty_Plate=2hSem_Apple=0hSem_Orange=0父親進程:父親先申請盤子的位子,假如申請不到,那么等待盤子有位子可以放入水果時,才可以放入蘋果。當放完蘋果後,釋放信號量蘋果,這時候女兒可以吃蘋果了母親進程:母親先申請盤子的位子,假如申請不到,那么等待盤子有位子可以放入水果時,才可以放入桔子。當放完桔子後,釋放信號量桔子,這時候兒子可以吃桔子了女兒進程:女兒先申請盤子的桔子,假如申請不到,那么等待盤子裏面有桔子,才可以申請成功,然後吃桔子。吃完桔子釋放信號量hSem_Empty_Plate,這樣母親或者父親可以放入水果到盤子裏面了兒子進程:兒子先申請盤子的蘋果,假如申請不到,那么等待盤子裏面有蘋果,才可以申請成功,然後吃蘋果。吃完蘋果釋放信號量hSem_Empty_Plate,這樣母親或者父親可以放入水果到盤子裏面了讀者寫者問題設(shè)信號量rMutex=1wMutex=1;count初始值為0,以來記錄目前讀者的個數(shù)讀者進程:先申請rMutex,假如此時是第一種讀者,那么先申請wMutex,然後count加1,加完1之後釋放rMutex(實際上count也是臨界資源,用rMutex互斥體來控制讀者對count的修改,防止count的值出錯),開始讀數(shù)據(jù),讀完數(shù)據(jù)後修改count的值,使count減1,同樣的,也要先申請rMutex才能使count減1;當count=0的時候,此時闡明讀者已經(jīng)所有讀完了,那么釋放wMutex,寫者可以申請到wMutex,進行寫操作了。寫者進程:先申請wMutex,假如申請不到資源,將處在等待狀態(tài),若申請到wMutex,進行寫操作,這個時候讀者申請不到wMutex,也就是寫的時候不能有讀者讀。當寫者寫完後,釋放wMutex,此時讀者可以申請到wMutex,進而進行讀操作了。哲學家問題讓奇數(shù)號的哲學家先取右手邊的筷子,讓偶數(shù)號的哲學家先取左手邊的筷子.這樣,任何一種哲學家拿到一只筷子之後,就已經(jīng)制止了他鄰座的一種哲學家吃飯的企圖,除非某個哲學家一直吃下去,否則不會有人會餓死.心得體會通過本次試驗對進程同步互斥深入理解,對進程通信中其中的三種方式管道,消息緩沖,共享內(nèi)存的機制有一定理解,熟悉了Linux系統(tǒng)常用進程創(chuàng)立與管理的系統(tǒng)調(diào)用。對蘋果桔子問題,哲學家吃飯問題以及讀者寫者問題更深入理解。理解linux下實現(xiàn)進程通行的機制和對應(yīng)的數(shù)據(jù)構(gòu)造等試驗分項4虛擬內(nèi)存管理實驗?zāi)康?/p>

熟悉操作系統(tǒng)的內(nèi)存構(gòu)造和頁置換過程實驗要求詳細題目局部性原理演示(數(shù)組清零)(操作系統(tǒng)觀測級)頁面置換算法模擬演示(算法仿真實現(xiàn)級)實際系統(tǒng)內(nèi)存分派演示(Linux,Windows平臺)(操作系統(tǒng)觀測級)系統(tǒng)平臺Windows平臺Linux平臺實驗原理步驟(算法流程)程序的局部性原理指程序在執(zhí)行時展現(xiàn)出局部性規(guī)律,即在一段時間內(nèi),整個程序的執(zhí)行僅限于程序中的某一部分。對應(yīng)地,執(zhí)行所訪問的存儲空間也局限于某個內(nèi)存區(qū)域。局部性原理又體現(xiàn)為:時間局部性和空間局部性。時間局部性是指假如程序中的某條指令一旦執(zhí)行,則很快之後該指令也許再次被執(zhí)行;假如某數(shù)據(jù)被訪問,則很快之後該數(shù)據(jù)也許再次被訪問??臻g局部性是指一旦程序訪問了某個存儲單元,則很快之後。其附近的存儲單元也將被訪問。此外,根據(jù)程序的局部性理論,Denning提出了工作集理論。所謂工作集是指進程運行時被頻繁訪問的頁面集合。顯然我們懂得只要使程序的工作集所有集中在內(nèi)存中,就可以大大減少進程的缺頁次數(shù);否則會使進程在運行過程中頻繁出現(xiàn)缺頁中斷,從而出現(xiàn)頻繁的頁面調(diào)入/調(diào)出現(xiàn)象,導(dǎo)致系統(tǒng)性能的下降,甚至出現(xiàn)“抖動”。劃分工作集可以按定長時間或定長頁面兩種措施進行劃分。當顛簸現(xiàn)象發(fā)生時,闡明系統(tǒng)的負荷過大,一般采用處理器均衡調(diào)度。另一種是控制缺頁率,當缺頁率到達上限時,則增長內(nèi)存分派量;當缺頁率到達下限時,就減少內(nèi)存的分派量。#include<vcl.h>#pragmahdrstop#pragmaargsused#include"iostream.h"intconstrow=10240;longarray[row][1024];intmain(){inti,j;TTimesystime;systime=Time();cout<<"行清零開始時間(放大了10倍):"<<FormatDateTime("hh:nn:ss",systime).c_str()<<endl;inttemp;for(temp=0;temp<10;temp++)//將行清零時間放大10倍for(i=0;i<row;i++)for(j=0;j<1024;j++)array[i][j]=0;systime=Time();cout<<"行清零結(jié)束時間(放大了10倍):"<<FormatDateTime("hh:nn:ss",systime).c_str()<<endl;systime=Time();cout<<"列清零開始時間:"<<FormatDateTime("hh:nn:ss",systime).c_str()<<endl;for(j=0;j<1024;j++)for(i=0;i<row;i++)array[i][j]=0;systime=Time();cout<<"列清零結(jié)束時間:"<<FormatDateTime("hh:nn:ss",systime).c_str()<<endl;cin.get();return0;}頁面置換算法模擬演示#include"iostream.h"constintDataMax=100;constintBlockNum=10;intDataShow[BlockNum][DataMax];//用于存儲要顯示的數(shù)組boolDataShowEnable[BlockNum][DataMax];//用于存儲數(shù)組中的數(shù)據(jù)與否需要顯示//intData[DataMax]={4,3,2,1,4,3,5,4,3,2,1,5,6,2,3,7,1,2,6,1};//測試數(shù)據(jù)//intN=20;//輸入頁面?zhèn)€數(shù)intData[DataMax];//保留數(shù)據(jù)intBlock[BlockNum];//物理塊intcount[BlockNum];//計數(shù)器intN;//頁面?zhèn)€數(shù)intM;//最小物理塊數(shù)intChangeTimes;voidDataInput();//輸入數(shù)據(jù)的函數(shù)voidDataOutput();voidFIFO();//FIFO函數(shù)voidOptimal();//Optimal函數(shù)voidLRU();//LRU函數(shù)///*voidmain(intargc,char*argv[]){DataInput();//DataInput();//FIFO();//Optimal();//LRU();//return0;intmenu; while(true) { cout<<endl; cout<<"*菜單項選擇擇*"<<endl; cout<<"*******************************************************"<<endl; cout<<"*1-FIFO*"<<endl; cout<<"*2-Optimal*"<<endl; cout<<"*3-LRU*"<<endl; cout<<"*0-EXIT*"<<endl; cout<<"*******************************************************"<<endl; cin>>menu;switch(menu) { case1:FIFO();break; case2:Optimal();break; case3:LRU();break; default:break; } if(menu!=1&&menu!=2&&menu!=3)break; }}voidDataInput(){cout<<"請輸入最小物理塊數(shù):";cin>>M;while(M>BlockNum)//不小于數(shù)據(jù)個數(shù){cout<<"物理塊數(shù)超過預(yù)定值,請重新輸入:";cin>>M;}cout<<"請輸入頁面的個數(shù):";cin>>N;while(N>DataMax)//不小于數(shù)據(jù)個數(shù){cout<<"頁面?zhèn)€數(shù)超過預(yù)定值,請重新輸入:";cin>>N;}cout<<"請輸入頁面訪問序列:"<<endl;for(inti=0;i<N;i++)cin>>Data[i];}voidDataOutput(){inti,j;for(i=0;i<N;i++)//對所有數(shù)據(jù)操作{cout<<Data[i]<<"";}cout<<endl;for(j=0;j<M;j++){cout<<"";for(i=0;i<N;i++)//對所有數(shù)據(jù)操作{if(DataShowEnable[j][i])cout<<DataShow[j][i]<<"";elsecout<<"";}cout<<endl;}cout<<"缺頁次數(shù):"<<ChangeTimes<<endl;cout<<"缺頁率:"<<ChangeTimes*100/N<<"%"<<endl;}voidFIFO(){inti,j;boolfind;intpoint;inttemp;//臨時變量ChangeTimes=0;for(j=0;j<M;j++)for(i=0;i<N;i++)DataShowEnable[j][i]=false;//初始化為false,表達沒有要顯示的數(shù)據(jù)for(i=0;i<M;i++){count[i]=0;//不小于等于BlockNum,表達塊中沒有數(shù)據(jù),或需被替代掉//因此經(jīng)這樣初始化(321),每次替代>=3的塊,替代後計數(shù)值置1,//同步其他的塊計數(shù)值加1,成了(132),見下面先進先出程序段}for(i=0;i<N;i++)//對有所數(shù)據(jù)操作{//增長countfor(j=0;j<M;j++)count[j]++;find=false;//表達塊中有無該數(shù)據(jù)for(j=0;j<M;j++){if(Block[j]==Data[i]){find=true;

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論