OS實(shí)驗(yàn)報(bào)告格式 (4000字) - 實(shí)驗(yàn)報(bào)告 - 書業(yè)網(wǎng).docx
《OS實(shí)驗(yàn)報(bào)告格式 (4000字) - 實(shí)驗(yàn)報(bào)告 - 書業(yè)網(wǎng).docx》由會(huì)員分享,可在線閱讀,更多相關(guān)《OS實(shí)驗(yàn)報(bào)告格式 (4000字) - 實(shí)驗(yàn)報(bào)告 - 書業(yè)網(wǎng).docx(24頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、OS實(shí)驗(yàn)報(bào)告格式(4000字)-實(shí)驗(yàn)報(bào)告-書業(yè)網(wǎng)2012-2013學(xué)年第一學(xué)期計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)一L Windows多線程【開發(fā)語言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET【實(shí)驗(yàn)?zāi)康摹?1)進(jìn)一步理解操作系統(tǒng)的并發(fā)性;了解Windows線程創(chuàng)立方法,并通過查閱資料理 解各參數(shù)的含義;了解多線程程序設(shè)計(jì)方法,并進(jìn)行簡單應(yīng)用。 【實(shí)驗(yàn)要求】(1)逐程序進(jìn)行簡要分析、運(yùn)行各程序并仔細(xì)閱讀注 釋; 線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè) 線程的執(zhí)行依賴另一個(gè)線程的消
2、息,當(dāng)它沒有得到另一個(gè)線 程的消息時(shí)應(yīng)等待,直到消息到達(dá)時(shí)才被喚醒。 線程互斥是指對(duì)于共享的操作系統(tǒng)資源(指的是廣義 的"資源",而不是Windows的.res文件,譬如 全局變量就是一種共享資源),在各線程訪問時(shí)的排它性。 當(dāng)有假設(shè)干個(gè)線程都要使用某一共享資源時(shí),任何時(shí)刻最多只 允許一個(gè)線程去使用,其它要使用該資源的線程必須等待, 直到占用資源者釋放該資源。 線程互斥是一種特殊的線程同步。 實(shí)際上,互斥和同步對(duì)應(yīng)著線程間通信發(fā)生的兩種情 況: (1)當(dāng)有多個(gè)線程訪問共享資源而不使資源被破壞時(shí); (2)當(dāng)一個(gè)線程需要將某個(gè)任務(wù)已經(jīng)完成的情況通知 另外一個(gè)或多個(gè)線程
3、時(shí)。 在WIN32中,同步機(jī)制主要有 以下幾種: (1)事件(Event);(2)信號(hào)量(semaphore);(3)互斥量(mutex);(4)臨界區(qū)(Critical section)。 全局變量因?yàn)檫M(jìn)程中的所有線程均可以訪問所有的全局變量,因而全局變量成為Win32多線程通信的最簡單方式。例如: 實(shí)驗(yàn)四銀行家算法模擬【開發(fā)語言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#Microsoft Visual Studio 6.0/ Microsoft VisualStudio .NET 2003【實(shí)驗(yàn)?zāi)康摹? (1)進(jìn)一步理解利用銀行家算法防止死鎖的問題;(2)在了解和掌握銀行家算法。 (3)理解
4、和掌握平安序列、平安性算法【實(shí)驗(yàn)內(nèi)容】(1)編寫平安性算法; (2)編寫銀行家算法,并編制銀行家算法通用程序, 將調(diào)試結(jié)果顯示在計(jì)算機(jī)屏幕上,再檢測(cè)和筆算的一致性。 【源代碼】#include<iostream>using namespace std;#include<stringeh>#include<stdio.h>#define False 0#define True 1 int Max[100][100]={0};〃各進(jìn)程所需各類資源的最大需求 int Avaliable[100]={0};〃系統(tǒng)可用資源char name[100]={0};〃
5、資源的名稱int Allocation[100][100]={0};〃系統(tǒng)已分配資源int Need[100][100]={0};〃還需要資源int Request[100]={0};〃請(qǐng)求資源向量int temp[100]={0};〃存放平安序列int Work[100]={0};〃存放系統(tǒng)可提供資源intM=100;〃作業(yè)的最大數(shù)為100 intN=100;〃資源的最大數(shù)為100void showdata()〃顯示資源矩陣(int i,j;cout<<"系統(tǒng)目前可用的資源[Available]: & quot; < < endl;for(i=0;i<
6、;N;i++)cout<<name[i]<<""; cout<<endl;for(j=0;j<N;j++)cout<<Avaliable[j]<<""; 〃輸出分配資源cout<<endl; cout<<" Max Allocation Need"<<endl;cout<<"進(jìn)程名 ";15 forg=0;j<3;j++){for(i=0;i<N;i++)cout<<nam
7、e[i]<<"";cout<<" ";}cout<<endl;for(i=0;i<M;i++){"; for(j=0;j<N;j++)cout<<Max[i][j]<<"";cout<<" ";for(j=0; j < ;N; j++)cout< < Allocation^] [j] < < &qu ot; ";cout<<" ";for(j=0;j&
8、lt;N;j++)cout<<Need[i][j]<<"";cout<<endl; ))int changdata(int i) 〃進(jìn)行資源分配|intj;forg=0;j<M;j++){Available [j ]=Avaliable [j ] -Request [j ];Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]-Request[j];)return 1;)int safe()〃平安性算法(int i,k=O,m,apply,Fini
9、sh[100]={0};intj; int flag=O;for(i=0;i<N;i++)Work[i]=Avaliable[i];for(i=0;i<M;i++){apply=0;fora=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];〃變分配數(shù)Finish[i]=True;temp[k]=i;i=-l;k++;flag++;16 })))
10、for(i=0;i<M;i++){if(Finish[i]==False){ cout< < "系統(tǒng)不平安"<<endl;// 不成功系統(tǒng)不平安return -1;))cout<< "系統(tǒng)是 平安的! "<<endl;〃如果平安,輸出成功cout<<"分配的序列:";for(i=0;i<M;i++){〃輸出運(yùn)行進(jìn)程數(shù)組cout< <temp[i];cout<<"->";)cout<<endl;ret
11、urn 0; )void share。//利用銀行家算法對(duì)申請(qǐng)資源對(duì)進(jìn)行判定(char ch;int i=0,j=0;ch='y';cout<<"請(qǐng)輸入要求分配的資源進(jìn)程號(hào)cin>>i; 〃輸入須申請(qǐng)的資源號(hào) cout<<"請(qǐng)輸入進(jìn)程 "<<i<<" 申請(qǐng)的 資源: "<<endl;fora=0;j<N;j++){cout< < ;name[j] < < ": ";cin>>Request[j]
12、; 〃輸入需要申請(qǐng)的資源}for a=O;j<N;j++){ if(Request[j]>Need[i]U]) 〃判斷申請(qǐng)是否大于需求, 假設(shè)大于那么出錯(cuò)(cout<<" 進(jìn) 程 申請(qǐng)的資源大于它需要的資 源"; cout<<"分配不合理,不予分配! "<<endl;ch='n';break;)else {if(Request[j]>Avaliable[j]) 〃判斷申請(qǐng)是否大于當(dāng)前資源,假設(shè)大于那么〃出錯(cuò) cout<<" 進(jìn) 程 "<&l
13、t;i<<"申請(qǐng)的資源大于系統(tǒng)現(xiàn)在可 利用的資源";17 cout<<" 分配出錯(cuò),不予分配! "<<endl;ch='n';break;))}if(ch=='y') { changdata(i); 〃根據(jù)進(jìn)程需求量變換資源 showdata();〃根據(jù)進(jìn)程需求量顯示變換后的資源 safe();〃根據(jù)進(jìn)程需求量進(jìn)行銀行家算法判斷 ) ) void addresources。{〃添加資源 int n,flag; cout<<"請(qǐng)輸入需要添加資源種類的數(shù)量:
14、";cin>>n;flag=N;N=N+n;for(int i=O;i<n;i++){cout<<"名稱:";cin>>name[flag];cout<<"數(shù)量:"; cin>>Avaliable[flag++];}showdata();safe();}void delresources。{〃刪除資源char ming;int i,flag=l; cout<<"請(qǐng)輸入需要?jiǎng)h除的資源名稱: ";do{cin>>ming;for(i=0
15、;i<N ;i++) (2)查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用 方法和參數(shù)含義;(3)完成實(shí)驗(yàn)報(bào)告。 【實(shí)驗(yàn)結(jié)果與分析】 Sleep是阻塞線程函數(shù)。它會(huì)在當(dāng)前語句阻塞一段時(shí) 間,參數(shù)是以1/1000秒為單位的,線程1和主線程并發(fā)執(zhí)行, Sleep(lO) 使當(dāng)前線程放棄目前的時(shí)間片,并且在 10ms 內(nèi)不會(huì)被再次調(diào)度。會(huì)使主進(jìn)程和分進(jìn)程同時(shí)被調(diào)度,進(jìn)程 也有父子關(guān)系。父進(jìn)程退出后子進(jìn)程也會(huì)退出,而加入Sleep 后主進(jìn)程先停止10后子進(jìn)程就有時(shí)間進(jìn)行了。 加入循環(huán),使得倆個(gè)進(jìn)程交替執(zhí)行,出現(xiàn)倆個(gè)L倆個(gè)6是因?yàn)椴豢稍佻F(xiàn)性,即倆個(gè)進(jìn)程同時(shí)邁出同一部步, 倆個(gè)進(jìn)程中存在共享變
16、量。因?yàn)榧尤雡hile所以不需要sleep, 父子進(jìn)程也能同時(shí)進(jìn)行。 加入sleep (1000)后父進(jìn)程有足夠的時(shí)間運(yùn)行子進(jìn)程if(ming==name[i]){flag=O;break;)if(i==N) cout<<"該資源名稱不存在,請(qǐng)重新輸入: ";}while(flag);for(int j=i;j<N-l;j++){name[j]=name[j+l];18 Available [j]=Available [j+1];}N=N-1;showdata();safe();) void changeresources。{〃修改資源函數(shù) cou
17、t<<"系統(tǒng)目前可用的資源 [Available]:"<<endl; for(int i=O;i<N;i++)cout<<name[i]<<":"<<Avaliabl e[i]<<endl; cout< < "輸入系統(tǒng)可用資源 [Avaliable]:"<<endl;cin>>Avaliable[O]>>Avaliable[l]>>Avali able[2];cout<<"
18、經(jīng)修改后的系統(tǒng)可用資源為for (int k=0;k<N;k++)cout< <name[k] < < ": " < < Avaliab le[k]<<endl;showdata();safeQ;) void addprocess。{〃添加作業(yè)int flag=M;M=M+1;cout<<"請(qǐng)輸入該作業(yè)的最打需求量[Max]"<<endl;for(int i=O;i<N;i++){cout<<name[i]<<":";cin&
19、gt; >Max[flag] [i]; Need [flag] [i]=Max[flag] [i] - Allocation[flag] [i];)showdata();safe();}int main()〃主函數(shù)(int i,j ,number,choice,m,n,flag; char ming; cout<<"***************** 資源管理系統(tǒng) 的設(shè)計(jì)與實(shí)現(xiàn) *****************"<<endl; cout<<"請(qǐng)首先輸入系統(tǒng)可供資源種類的數(shù)量: ";cin>>n
20、;N=n;for(i=0;i<n;i++){cout<<" 資 源 的名稱:";cin>>ming;name[i]=ming;cout<<"資源的數(shù)量:"; cin>>number;19 Avaliable[i]=number;cout<<endl;cout<<"請(qǐng)輸入作業(yè)的數(shù)量:";M=m;COU COU t<<"請(qǐng)輸入各進(jìn)程的最大需求量t;"矩陣)[Max]:"<<endl;for(i=0
21、;i<m;i++) for(j=0;j<n;j++)cin> > ;Max[i] [j];do{ flag=0;cout<<"請(qǐng)輸入各進(jìn)程已經(jīng)申請(qǐng)的資源量t;"矩陣) [AHocation]:"<<en(n;for(i=0;i<m;i++) for(j=0;j<n;j++){cin> > Allocation [i] [j];if(Allocation[i][j]>Max[i][j])flag=l;Need[i][j]=Max[i][j]-Allocation[i][j];}if(fla
22、g) cout<<"申請(qǐng)的資源大于最大需求量,請(qǐng)重 新輸入! \n";)while(flag);showdata(); 〃顯示各種資源safe。;〃用銀行家算法判定系統(tǒng)是否平安 while(true){cout<<"************** 銀行家算法演示***************";<;<;endl;cout<<" 1:增加資源 "<<endl; cout<<" 2:刪除資源 "<<endl;cout<<&quo
23、t; 3:修改資源 "<<endl;cout<<" 4:分配資源 "<<endl;cout<<" 5:增加作業(yè) "<<endl;cout<<" 0:離開 "<<endl;cout<<" cout<<" 0:離開 "<<endl;cout<<" cout<<" cout<<" cout<<
24、;" ^X> ^2> ^S> rj^ rjM r|^ rj> rj^ rj^ rj^ r|M r1^ rj^ rj^ rj^ rj> rj> r|w r|M r|M r|^ rj> rj^ rj^ r|^ rj^ r|M r|M rj^ rjM rj^ rj^ r1^ rj^ r|w *********"<<endl;cout<<"請(qǐng)選擇功能號(hào):";cin>>choice;switch(choice){addresources();break;delresources();break;changeresource
25、s();break; case 1: share();break;addprocess();break;case 0: choice=0;break; default: cout<<"請(qǐng)正確選擇功能號(hào) (0-5)! " < < ;endl;break;)}return 1;)【實(shí)驗(yàn)結(jié)果與分析】【實(shí)驗(yàn)思考及總結(jié)】銀行家算法的平安算法不唯一,我們可以把操作系統(tǒng) 看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資 金,進(jìn)程向操作系統(tǒng)請(qǐng)求分配資源相當(dāng)于用戶向銀行家貸 款。操作系統(tǒng) 按照銀行家制定的規(guī)那么為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請(qǐng) 資源時(shí),要測(cè)試該
26、進(jìn)程對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存 的資源可以滿足它的最大需求量那么按當(dāng)前的申請(qǐng)量分配資 源,否那么就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請(qǐng)資源時(shí),先 測(cè)試該進(jìn)程已占用的資源數(shù)與本次申請(qǐng)的資源數(shù)之和是否 超過了該進(jìn)程對(duì)資源的最大需求量。假設(shè)超過那么拒絕分配資 源,假設(shè)沒有超過那么再測(cè)試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚 需的最大資源量,假設(shè)能滿足那么按當(dāng)前的申請(qǐng)量分配資源,否 那么也要推遲分配。 實(shí)驗(yàn)五頁面置換算法模擬5=]C++/C#Microsoft Visual Studio 6.0/ Microsoft VisualStudio .NET 2003【實(shí)驗(yàn)?zāi)康摹?1)進(jìn)一步理解利用頁面調(diào)度算法
27、實(shí)現(xiàn)虛擬內(nèi)存的問題; (2)通過模擬實(shí)現(xiàn)請(qǐng)求頁式存儲(chǔ)管理的幾種基本頁面 置換算法,了解虛擬存儲(chǔ)技術(shù)的特點(diǎn)。 (3)掌握虛擬存儲(chǔ)請(qǐng)求頁式存儲(chǔ)管理中幾種基本頁面 置換算法的基本思想和實(shí)現(xiàn)過程,并比擬它們的效率。 (4) 了解頁面大小和內(nèi)存實(shí)際容量對(duì)命中率的影響。 【實(shí)驗(yàn)內(nèi)容】 (1)在了解和掌握頁面調(diào)度算法的基礎(chǔ)上,編制先進(jìn) 先出的算法(FIFO).最近最少使用算法(LRU)、最正確淘 汰算法(OPT)等各種頁面置換算法。將調(diào)試結(jié)果顯示在計(jì) 算機(jī)屏幕上,再檢測(cè)和筆算的一致性。 (2)理解和掌握命中率的問題(3)會(huì)使用某種編程語言。 【源代碼】#include <iostream&
28、gt;#include <deque>#includeusing namespace std;typedef struct(int id; 〃頁面 ID int stay Time; 〃內(nèi)存中駐留時(shí)間int unUseTime; 〃已經(jīng)多久未被使用JCPage;deque<int> RunQueue;deque<CPage> interPage;〃內(nèi)存中的四個(gè)頁面deque<CPage> exterPage;〃外存中的 N 個(gè)頁面 int presentSeat;//目前運(yùn)行到了隊(duì)列的第幾個(gè)? int lackNum[3] ={0}; i
29、nt getRandNum(int range) 〃返回[0,range)范圍內(nèi)的 整數(shù)(return static_cast<int>(rand()%range);) int findPage!dByCmdId(int cmdld) 〃通過強(qiáng)制轉(zhuǎn)換成 整數(shù)的形式判斷指令屬于哪個(gè)頁面 (return static_cast<int>(cmdId/10);)void InitDeviceO〃初始化運(yùn)行隊(duì)列按照25%50% 25%的標(biāo)準(zhǔn)生成(srand(static_cast<int>(time(NULL)));int t_cmdNum = getRandN
30、um(320);〃隨機(jī)選擇第 一條指令 RunQueue.push_back(t_cmdNum);〃將其插入隊(duì)列 if(t_cmdNum < 319) RunQueue.push_back(t_cmdNum+l); 〃順序執(zhí)行 下一條指令while(RunQueue.size() <= 320)( t_cmdNum = getRandNum(t_cmdNum); 〃跳轉(zhuǎn)到 ml 屬于RunQueue.push_back(t_cmdNum);//^ ml 插入隊(duì)列if(t_cmdNum < 319) RunQueue.push_back(t_cmdNum+l);//^r
31、 ml+1 插入 隊(duì)列int temp = 320 - (t_cmdNum + 2); t_cmdNum = t_cmdNum+2+getRandNum(temp); 〃跳 轉(zhuǎn)到m2屬于[m+2,319]RunQueue.push_back(t_cmdNiim); 〃插入隊(duì)歹[Jif(t_cmdNum < 319) RunQueue.push_back(t_cmdNum+l);//^ m2+l 插入 隊(duì)列 加入倆個(gè) sleep(1)后,有可能到 threadl is sell tickets: 時(shí)間片就停了, tickets沒還可以運(yùn)行thread! is sell tickets
32、:"<<tickets—也就是說 tickets 變?yōu)?0,返 回再運(yùn)行threadl is sell tickets時(shí)就賣0號(hào)票了【實(shí)驗(yàn)思考及總結(jié)】加入循環(huán),使得倆個(gè)進(jìn)程交替執(zhí)行Sleep是阻塞線程函數(shù)。它會(huì)在當(dāng)前語句阻塞一段時(shí)間,參數(shù)是以1/1000秒為單位的線程也有父子關(guān)系。父進(jìn) 程退出后子進(jìn)程也會(huì)退出 不可再現(xiàn)性,即倆個(gè)進(jìn)程同時(shí)邁出同一部步,倆個(gè)進(jìn) 程中存在共享變量4 實(shí)驗(yàn)二 Windows線程同步機(jī)制【開發(fā)語言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#Microsoft Visual Studio 6.0/ Microsoft VisualStudio .NET【實(shí)
33、驗(yàn)?zāi)康摹苛私釽indows線程同步機(jī)制;while(RunQueue.size() > 320) RunQueue.pop_back();} void InitMemoryQueueO 〃初始化運(yùn)行標(biāo)志、內(nèi)存外 存頁面隊(duì)列(presentSeat = 0;exterPage.clear();interPage.clear();for(int i=0;i<32;i++)(CPage temp; temp.id = i;temp.stayTime = 0;temp.unUseTime = 0; exterPage.push_back(temp); ) ) int sear
34、chStatusOfPage(int t_PageId5bool sign) 〃分 別在內(nèi)外存中查找頁面 存在返回位置 不存在返回-1if(sign) for(unsigned i=O;i<iiiterPage.size();i++) if(t_PageId == interPage[i].id) return i; } 〃這里的括號(hào)不能刪除,否那么if else的匹配會(huì)出問題 elsefor(unsigned j=O;j<exterPage>size();j++)if(t_PageId == exterPage[j].id)return j;return -1;} int
35、 searchNextStatusOflnterPage(int start, int id) //OPT算法中查找內(nèi)存頁面中的頁面下次需要用到它的時(shí)候 的隊(duì)列下標(biāo) { 〃找到就返回下標(biāo)沒找到就返回“for(int i=start;i < 320;i++) if(static_cast<int>(RunQueue[i]/10) == id) return i;return -1;) int findLongestStayTimePage() //FIFO 算法中查找 在內(nèi)存中呆了最久的頁面int max = 0; for(unsigned i=l;i<inter
36、Page.size();i++) if(interPage[i].stayTime>interPage[max].stayTime) max = i;return max;) int findLongestUnUseTimePage() //LRU 算法中查找 最久未使用的頁面(int max = 0;for (unsigned j=0; j &11; inter Page>size(); j++)if(interPage[j]eUnUseTime>interPage[max]eUnUseTime)max = j;return max;) int findNeedLonges
37、tTimePage() //OPT 算法中查找 最長時(shí)間不會(huì)用到的頁面(deque<int> temp;for(unsigned i=0;i < interPage.size();i++)it it intsearchNextStatusOffnterPage(presentSeat3nterPage[i].id);if(it == -1)return i;temp.push_back(it); )int max = [status = 0;for(unsigned j=X;j < temp.size();j++)(if(max < temp。])(ma
38、x = temp[j];status = j; )} return status; 〃返回需要最長時(shí)間才執(zhí)行的頁面 在內(nèi)存中的位置) void directFlod(int t_PageId) 〃當(dāng)內(nèi)存空間還有剩余 時(shí)直接調(diào)入int status = searchStatusOfPage(t_PageId?false);if(status == -1) return; interPage.push_back(exterPage[status]); 〃先插入節(jié) 點(diǎn)到內(nèi)存,再從外存中將其刪除 exterPage.erase(exterPage.begin()+status);} bool
39、 Manage(int count,int t_PageId) 〃當(dāng)內(nèi)存已經(jīng)滿 了需要按照三種算法調(diào)度時(shí)( int status = searchStatusOfPage(t_PageId^false); // 獲取執(zhí)行頁面在外存中的索引地址if(status == -1)return false;int targetstatus = 0;if(count == 0)targetstatus = findNeedLongestTimePage();else if(count == 1)targetstatus = findLongestStay TimePage();else if(coun
40、t == 2) targetstatus = findLongestU nUseTimePage();interPage[targetStatus].stayTime = 0;interPage[targetStatus].unUseTime = 0;swap(exterPage[status]3nterPage[targetStatus]);return true; void Run(int count) 〃運(yùn)行,通過count來決定使用什 么算法(while(presentSeat < 320)|for(unsigned i=O;i<interPage.size();i++
41、)(interPage[i].stayTime++;interPage[i].unUseTime++; }int t_PageId =findPageIdByCmdId(RunQueue[presentSeat++])^status = -1 〃找到當(dāng)前將要執(zhí)行的指令的頁面號(hào)if((status =searchStatusOfPage(t_PageId,true)) != -1)(interPage[status].unUseTime = 0;continue;) lackNum[count]++;if(interPage.size()<4)directFlod(t_PageId);
42、elseManage(count9t_PageId);))void main(void) 〃主函數(shù) |InitDevice();int count = 0;while(count<3)(InitMemory Queue();Run(count);cout<<(double)lackNum[count++]/320*100<<&q uot;%"<<endl; ))【實(shí)驗(yàn)結(jié)果與分析】缺頁率分別為【實(shí)驗(yàn)思考及總結(jié)】首先,我們清楚一個(gè)概念:缺頁一一我要裝的程序的 頁,內(nèi)存中沒有該頁就叫缺頁。 先進(jìn)先出頁面置換算法 往內(nèi)存的3個(gè)頁中先后裝入程序
43、的3個(gè)頁(這三個(gè)的 程序頁號(hào)是不一樣的),再裝入程序的下一個(gè)頁時(shí),先判斷 內(nèi)存中有無此頁,有就不用再次裝入;內(nèi)存中沒有此頁時(shí), 就把先進(jìn)入 內(nèi)存中的程序頁給弄到虛擬內(nèi)存上,然后,裝入要裝 入的,以后,以此類推。 最近最久未使用置換算法 往內(nèi)存的3個(gè)頁中先后裝入程序的3個(gè)頁(這三個(gè)的程序頁號(hào)是不一樣的),再裝入程序的下一個(gè)頁時(shí),先判斷 內(nèi)存中有無此頁,有就不用再次裝入;內(nèi)存中沒有此頁時(shí), 就把內(nèi)存中那個(gè)隔得時(shí)間最長沒有運(yùn)行的程序頁給弄到虛 擬內(nèi)存上,然后,裝入要裝入的,以后,以此類推。這個(gè)開 始時(shí)和先進(jìn)先出頁面置換算法的結(jié)果時(shí)一樣的,但是,往后 運(yùn)行一段后,就不一樣了。 最正確置換算法
44、往內(nèi)存的3個(gè)頁中先后裝入程序的3個(gè)頁(這三個(gè)的 程序頁號(hào)是不一樣的),再裝入程序的下一個(gè)頁時(shí),先判斷 內(nèi)存中有無此頁,有就不用再次裝入;內(nèi)存中沒有此頁時(shí), 該算法會(huì)把之后要裝入內(nèi)存的程序頁號(hào)查一遍,并且要計(jì)算 出,此時(shí)內(nèi)存中的三個(gè)頁號(hào)在之后誰是被最晚再次裝入的頁 號(hào),然后,把該頁號(hào)給弄到虛擬內(nèi)存上,然后,裝入該裝入 的程序頁號(hào),最正確置換算法是這幾種算法中最好的算法。 先進(jìn)先出適應(yīng)算法特點(diǎn):那個(gè)頁面先進(jìn)來,那個(gè) 頁面先出去,不管該頁面是不是最近又被訪問了一次沒有。這種算法連蒙都不會(huì)。 最長最久未被使用算法的特點(diǎn):頁面置換時(shí),不管你們這 些頁面誰先進(jìn)來,我只管的是從你們當(dāng)中選擇一個(gè)從最后一次
45、被訪問到現(xiàn)在,時(shí)間最長的那個(gè)頁面。這個(gè)比擬會(huì)蒙。最正確適應(yīng)算法:置換頁面的 時(shí)候,我看一下以后要進(jìn)來的頁面,把那個(gè)最晚再次進(jìn)入內(nèi) 存的頁面(這些頁面必須是內(nèi)存中存在的那些)置換出來。 這個(gè)是鐵板釘釘?shù)氖?0 (1) 了解互斥體,并通過查閱資料理解互斥體對(duì)象的 使用方法; (2) 了解事件,并通過查閱資料理解事件對(duì)象的使用 方法;了解關(guān)鍵區(qū),并通過查閱資料理解關(guān)鍵區(qū)對(duì)象的使用方法;了解信號(hào)量,并通過查閱資料理解信號(hào)量對(duì)象的使用方法;(6) 使用方法;(6) (6) (6) (6) 利用Windows線程同步機(jī)制,模擬生產(chǎn)者消費(fèi)者 問題。 【實(shí)驗(yàn)要求】逐程序進(jìn)行
46、簡要分析、運(yùn)行各程序并仔細(xì)閱讀注釋;Q) 釋;Q) 釋;Q) Q) Q) Q) 查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用 方法和參數(shù)含義;(3)完成實(shí)驗(yàn)報(bào)告。 【實(shí)驗(yàn)結(jié)果與分析】 2-1到2-3加入倆個(gè)sleep (1)后,有可能到threadl is sell tickets:時(shí)間片就停了,tickets沒-,還可以運(yùn)行thread2 is sell tickets:"<<tickets—也就是說 tickets 變?yōu)?0,返回再運(yùn)行thread 1 is sell tickets時(shí)就賣0號(hào)票了67【實(shí)驗(yàn)思考及總結(jié)】 Sleep(lO)
47、使當(dāng)前線程放棄目前的時(shí)間片,并且在 10ms 內(nèi)不會(huì)被再次調(diào)度 進(jìn)程也有父子關(guān)系o父進(jìn)程退出 后子進(jìn)程也會(huì)退出,線程之間的同步使用一些核心對(duì)象:如 thread, process, evnet, mutex, semaphore.在線程之間使 用等待函數(shù)如 WaitForSingleObjects, WaitForMultipleObjects.等 待函數(shù)使用核心對(duì)象的handle作為參數(shù),如果handle被激 發(fā),那么執(zhí)行下一步。handle被激發(fā)的條件:(handle是一 段內(nèi)存指針,為了掩藏內(nèi)部實(shí)現(xiàn)而作的一個(gè)類型轉(zhuǎn)化指針) 激發(fā):我的理解是資源未被戰(zhàn)勝。未激發(fā): 資源正在被占用。eg
48、: l)thread, process被終止,那么激發(fā)。 2) event:要通過它的API來手動(dòng)激發(fā),是最靈活的激發(fā)方 式,可被所有線程使用。3)mutex:沒被任何線程所擁有, 那么激發(fā)。 1)臨界區(qū):CRITICAL.SECTION適用范圍:單一進(jìn) 程的各線程之間用來排它性占有特性:局部性對(duì)象;快速而 有效.無法監(jiān)測(cè)是否被線程放棄函數(shù):EnterCriticalSectionLeaveCriticalSection 2)Mutex:適用范圍:不同線程之間用來排它性占有 特性:核心對(duì)象,可以使用wait進(jìn)行等待,只能被擁有線程 所釋放函數(shù):CreateMutex ReleaseMute
49、x 3)semaphore:信號(hào)量 適用范圍:用來限制資源占用 特性:核心對(duì)象,沒有擁有者,任何線程都可釋放函 : CreateSemaphore OpenSemaphore ReleaseSemaphore8 4)Event:適用范圍:同來控制對(duì)象信號(hào)的接收,常與信號(hào) 系統(tǒng)結(jié)合起來特性:核心對(duì)象函數(shù):CreateEvent OpenEvent PulseEvent SetEvent ResetEvent 5)Interlocked 簡單的原 子操作,如寫文件中對(duì)文件中字節(jié)范圍的鎖定」。eking NOTE:線程同步中很重要的可歸納為鎖系統(tǒng)lock和 信號(hào)系統(tǒng)signal lock包
50、括:CRITICAL_SECTION, Mutex, wait function: WaitF orMultipleObj ects WaitForSingleObject Sleep 6)completion port 適 用范圍:網(wǎng)絡(luò)異步接收,包括文件讀寫特性:由OS來控制讀 寫,是windows平臺(tái)最有效的同步機(jī)制,相當(dāng)于linux的AIO 或者非阻塞 socket+epoll 函數(shù):CreateloCompletionPort GetQueuedCompletionStatus 例如1: event 〃事件機(jī)制:設(shè)置一個(gè)全局event對(duì)象, 這個(gè)只能等待最多64個(gè)對(duì)象,而且要用 W
51、aitForMultipleObjects 來監(jiān)視線程handle數(shù)組.不如完全端口 completion portHANDLEghWriteEvent;HANDLEghThreads[THREADCOUNT]; 〃⑴創(chuàng)立個(gè)手動(dòng)事件,一開始 不接受任何信號(hào)no signel //ResetEvent:用來信號(hào)重置,同 CreateEvent or OpenEvent ghWriteEvent = CreateEvent( NULL, // default security attributes TRUE, // manual-reset event FALSE, // initial sta
52、te is nonsignaled TEXT("WriteEvent") // object name ); 〃(2)產(chǎn)生一堆線程,設(shè)置事件響應(yīng)信號(hào) signal,if (! SetEvent(ghWriteEvent)){printf("SetEvent failed (%d)/n",GetLastError()); return; } 〃(3)設(shè)置線程等待事件, 所有線程都接到這個(gè)事件,,這里對(duì)線程進(jìn)行了同步,只有所有 線程都執(zhí)行了,才執(zhí)行下一步 dwWaitResult = WaitForMultipleObjects( THREADCOUNT,
53、 //number of handles in array ghThreads^ // array of thread handles TRUE, // wait until all are signaled INFINITE); { 〃(3.1)其中每個(gè)線程函數(shù)都在等待事件對(duì)象,這里也對(duì)線程 進(jìn)行了同步,只有得到signal的線程才執(zhí)行下一步 dwWaitResult =WaitForSingleObject(ghWriteEvent, // eventhandle INFINITE); // indefinite wait ) //(4)關(guān)閉了這個(gè)全局事件 == CloseHandle
54、(ghWriteEvent) CloseEvents(); 例如2: completion port (1)創(chuàng)立完成端口,與一個(gè) 監(jiān)聽socket發(fā)生關(guān)聯(lián) CreateloCompletionPort (2)產(chǎn)生一堆線程,讓線程 在完全端口循環(huán)等待. CreateThread—(WorkerThread)— GetQueuedCompletionStatus (3)接收監(jiān)聽 socket 的 讀寫請(qǐng)求accept,將accept socket與完全端口關(guān)聯(lián)9 實(shí)驗(yàn)三Windows線程通信【開發(fā)語言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#Microsoft Visual Studio 6.0/ Microsoft VisualStudio .NET【實(shí)驗(yàn)?zāi)康摹苛私釽indow線程通信方法;了解匿名管道,并通過查閱資料理解匿名管道的 使用方法; (1) 了解命名管道,并通過查閱資料理解命名管道的 使用方法;【實(shí)驗(yàn)要求】⑴逐程序進(jìn)行簡要分析、運(yùn)行各程序并仔細(xì)閱讀注釋; (2)查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用 方法和參數(shù)含義;(3)完成實(shí)驗(yàn)報(bào)告。 【實(shí)驗(yàn)結(jié)果與分析】 【實(shí)驗(yàn)思考及總結(jié)】 學(xué)會(huì)了在vc6.0中open已經(jīng)編譯好的程序,選擇所有 文件,線程之間通信的兩個(gè)基本問題是互斥和同步。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 指向核心素養(yǎng)發(fā)展的高中生物學(xué)1輪復(fù)習(xí)備考建議
- 新課程新評(píng)價(jià)新高考導(dǎo)向下高三化學(xué)備考的新思考
- 新時(shí)代背景下化學(xué)高考備考策略及新課程標(biāo)準(zhǔn)的高中化學(xué)教學(xué)思考
- 2025屆江西省高考政治二輪復(fù)習(xí)備考建議
- 新教材新高考背景下的化學(xué)科學(xué)備考策略
- 新高考背景下的2024年高考化學(xué)二輪復(fù)習(xí)備考策略
- 2025屆高三數(shù)學(xué)二輪復(fù)習(xí)備考交流會(huì)課件
- 2025年高考化學(xué)復(fù)習(xí)研究與展望
- 2024年高考化學(xué)復(fù)習(xí)備考講座
- 2025屆高考數(shù)學(xué)二輪復(fù)習(xí)備考策略和方向
- 2024年感動(dòng)中國十大人物事跡及頒獎(jiǎng)詞
- XX教育系統(tǒng)單位述職報(bào)告教育工作概述教育成果展示面臨的挑戰(zhàn)未來規(guī)劃
- 2025《增值稅法》全文解讀學(xué)習(xí)高質(zhì)量發(fā)展的增值稅制度規(guī)范增值稅的征收和繳納
- 初中資料:400個(gè)語文優(yōu)秀作文標(biāo)題
- 初中語文考試專項(xiàng)練習(xí)題(含答案)