OS實驗報告格式 (4000字) - 實驗報告 - 書業(yè)網(wǎng).docx
《OS實驗報告格式 (4000字) - 實驗報告 - 書業(yè)網(wǎng).docx》由會員分享,可在線閱讀,更多相關《OS實驗報告格式 (4000字) - 實驗報告 - 書業(yè)網(wǎng).docx(24頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、OS實驗報告格式(4000字)-實驗報告-書業(yè)網(wǎng)2012-2013學年第一學期計算機操作系統(tǒng)實驗報告 實驗一L Windows多線程【開發(fā)語言及實現(xiàn)平臺或實驗環(huán)境】C++/C#Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET【實驗目的】(1)進一步理解操作系統(tǒng)的并發(fā)性;了解Windows線程創(chuàng)立方法,并通過查閱資料理 解各參數(shù)的含義;了解多線程程序設計方法,并進行簡單應用。 【實驗要求】(1)逐程序進行簡要分析、運行各程序并仔細閱讀注 釋; 線程同步是指線程之間所具有的一種制約關系,一個 線程的執(zhí)行依賴另一個線程的消
2、息,當它沒有得到另一個線 程的消息時應等待,直到消息到達時才被喚醒。 線程互斥是指對于共享的操作系統(tǒng)資源(指的是廣義 的"資源",而不是Windows的.res文件,譬如 全局變量就是一種共享資源),在各線程訪問時的排它性。 當有假設干個線程都要使用某一共享資源時,任何時刻最多只 允許一個線程去使用,其它要使用該資源的線程必須等待, 直到占用資源者釋放該資源。 線程互斥是一種特殊的線程同步。 實際上,互斥和同步對應著線程間通信發(fā)生的兩種情 況: (1)當有多個線程訪問共享資源而不使資源被破壞時; (2)當一個線程需要將某個任務已經(jīng)完成的情況通知 另外一個或多個線程
3、時。 在WIN32中,同步機制主要有 以下幾種: (1)事件(Event);(2)信號量(semaphore);(3)互斥量(mutex);(4)臨界區(qū)(Critical section)。 全局變量因為進程中的所有線程均可以訪問所有的全局變量,因而全局變量成為Win32多線程通信的最簡單方式。例如: 實驗四銀行家算法模擬【開發(fā)語言及實現(xiàn)平臺或實驗環(huán)境】C++/C#Microsoft Visual Studio 6.0/ Microsoft VisualStudio .NET 2003【實驗目的】 (1)進一步理解利用銀行家算法防止死鎖的問題;(2)在了解和掌握銀行家算法。 (3)理解
4、和掌握平安序列、平安性算法【實驗內容】(1)編寫平安性算法; (2)編寫銀行家算法,并編制銀行家算法通用程序, 將調試結果顯示在計算機屏幕上,再檢測和筆算的一致性。 【源代碼】#include<iostream>using namespace std;#include<stringeh>#include<stdio.h>#define False 0#define True 1 int Max[100][100]={0};〃各進程所需各類資源的最大需求 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};〃請求資源向量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<<"進程名 ";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) 〃進行資源分配|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++){〃輸出運行進程數(shù)組cout< <temp[i];cout<<"->";)cout<<endl;ret
11、urn 0; )void share。//利用銀行家算法對申請資源對進行判定(char ch;int i=0,j=0;ch='y';cout<<"請輸入要求分配的資源進程號cin>>i; 〃輸入須申請的資源號 cout<<"請輸入進程 "<<i<<" 申請的 資源: "<<endl;fora=0;j<N;j++){cout< < ;name[j] < < ": ";cin>>Request[j]
12、; 〃輸入需要申請的資源}for a=O;j<N;j++){ if(Request[j]>Need[i]U]) 〃判斷申請是否大于需求, 假設大于那么出錯(cout<<" 進 程 申請的資源大于它需要的資 源"; cout<<"分配不合理,不予分配! "<<endl;ch='n';break;)else {if(Request[j]>Avaliable[j]) 〃判斷申請是否大于當前資源,假設大于那么〃出錯 cout<<" 進 程 "<&l
13、t;i<<"申請的資源大于系統(tǒng)現(xiàn)在可 利用的資源";17 cout<<" 分配出錯,不予分配! "<<endl;ch='n';break;))}if(ch=='y') { changdata(i); 〃根據(jù)進程需求量變換資源 showdata();〃根據(jù)進程需求量顯示變換后的資源 safe();〃根據(jù)進程需求量進行銀行家算法判斷 ) ) void addresources。{〃添加資源 int n,flag; cout<<"請輸入需要添加資源種類的數(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<<"請輸入需要刪除的資源名稱: ";do{cin>>ming;for(i=0
15、;i<N ;i++) (2)查閱MSDN或其他資料,掌握相關系統(tǒng)調用使用 方法和參數(shù)含義;(3)完成實驗報告。 【實驗結果與分析】 Sleep是阻塞線程函數(shù)。它會在當前語句阻塞一段時 間,參數(shù)是以1/1000秒為單位的,線程1和主線程并發(fā)執(zhí)行, Sleep(lO) 使當前線程放棄目前的時間片,并且在 10ms 內不會被再次調度。會使主進程和分進程同時被調度,進程 也有父子關系。父進程退出后子進程也會退出,而加入Sleep 后主進程先停止10后子進程就有時間進行了。 加入循環(huán),使得倆個進程交替執(zhí)行,出現(xiàn)倆個L倆個6是因為不可再現(xiàn)性,即倆個進程同時邁出同一部步, 倆個進程中存在共享變
16、量。因為加入while所以不需要sleep, 父子進程也能同時進行。 加入sleep (1000)后父進程有足夠的時間運行子進程if(ming==name[i]){flag=O;break;)if(i==N) cout<<"該資源名稱不存在,請重新輸入: ";}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<<"請輸入該作業(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) 的設計與實現(xiàn) *****************"<<endl; cout<<"請首先輸入系統(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<<"請輸入作業(yè)的數(shù)量:";M=m;COU COU t<<"請輸入各進程的最大需求量t;"矩陣)[Max]:"<<endl;for(i=0
21、;i<m;i++) for(j=0;j<n;j++)cin> > ;Max[i] [j];do{ flag=0;cout<<"請輸入各進程已經(jī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<<"申請的資源大于最大需求量,請重 新輸入! \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<<"請選擇功能號:";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<<"請正確選擇功能號 (0-5)! " < < ;endl;break;)}return 1;)【實驗結果與分析】【實驗思考及總結】銀行家算法的平安算法不唯一,我們可以把操作系統(tǒng) 看作是銀行家,操作系統(tǒng)管理的資源相當于銀行家管理的資 金,進程向操作系統(tǒng)請求分配資源相當于用戶向銀行家貸 款。操作系統(tǒng) 按照銀行家制定的規(guī)那么為進程分配資源,當進程首次申請 資源時,要測試該
26、進程對資源的最大需求量,如果系統(tǒng)現(xiàn)存 的資源可以滿足它的最大需求量那么按當前的申請量分配資 源,否那么就推遲分配。當進程在執(zhí)行中繼續(xù)申請資源時,先 測試該進程已占用的資源數(shù)與本次申請的資源數(shù)之和是否 超過了該進程對資源的最大需求量。假設超過那么拒絕分配資 源,假設沒有超過那么再測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚 需的最大資源量,假設能滿足那么按當前的申請量分配資源,否 那么也要推遲分配。 實驗五頁面置換算法模擬5=]C++/C#Microsoft Visual Studio 6.0/ Microsoft VisualStudio .NET 2003【實驗目的】(1)進一步理解利用頁面調度算法
27、實現(xiàn)虛擬內存的問題; (2)通過模擬實現(xiàn)請求頁式存儲管理的幾種基本頁面 置換算法,了解虛擬存儲技術的特點。 (3)掌握虛擬存儲請求頁式存儲管理中幾種基本頁面 置換算法的基本思想和實現(xiàn)過程,并比擬它們的效率。 (4) 了解頁面大小和內存實際容量對命中率的影響。 【實驗內容】 (1)在了解和掌握頁面調度算法的基礎上,編制先進 先出的算法(FIFO).最近最少使用算法(LRU)、最正確淘 汰算法(OPT)等各種頁面置換算法。將調試結果顯示在計 算機屏幕上,再檢測和筆算的一致性。 (2)理解和掌握命中率的問題(3)會使用某種編程語言。 【源代碼】#include <iostream&
28、gt;#include <deque>#includeusing namespace std;typedef struct(int id; 〃頁面 ID int stay Time; 〃內存中駐留時間int unUseTime; 〃已經(jīng)多久未被使用JCPage;deque<int> RunQueue;deque<CPage> interPage;〃內存中的四個頁面deque<CPage> exterPage;〃外存中的 N 個頁面 int presentSeat;//目前運行到了隊列的第幾個? int lackNum[3] ={0}; i
29、nt getRandNum(int range) 〃返回[0,range)范圍內的 整數(shù)(return static_cast<int>(rand()%range);) int findPage!dByCmdId(int cmdld) 〃通過強制轉換成 整數(shù)的形式判斷指令屬于哪個頁面 (return static_cast<int>(cmdId/10);)void InitDeviceO〃初始化運行隊列按照25%50% 25%的標準生成(srand(static_cast<int>(time(NULL)));int t_cmdNum = getRandN
30、um(320);〃隨機選擇第 一條指令 RunQueue.push_back(t_cmdNum);〃將其插入隊列 if(t_cmdNum < 319) RunQueue.push_back(t_cmdNum+l); 〃順序執(zhí)行 下一條指令while(RunQueue.size() <= 320)( t_cmdNum = getRandNum(t_cmdNum); 〃跳轉到 ml 屬于RunQueue.push_back(t_cmdNum);//^ ml 插入隊列if(t_cmdNum < 319) RunQueue.push_back(t_cmdNum+l);//^r
31、 ml+1 插入 隊列int temp = 320 - (t_cmdNum + 2); t_cmdNum = t_cmdNum+2+getRandNum(temp); 〃跳 轉到m2屬于[m+2,319]RunQueue.push_back(t_cmdNiim); 〃插入隊歹[Jif(t_cmdNum < 319) RunQueue.push_back(t_cmdNum+l);//^ m2+l 插入 隊列 加入倆個 sleep(1)后,有可能到 threadl is sell tickets: 時間片就停了, tickets沒還可以運行thread! is sell tickets
32、:"<<tickets—也就是說 tickets 變?yōu)?0,返 回再運行threadl is sell tickets時就賣0號票了【實驗思考及總結】加入循環(huán),使得倆個進程交替執(zhí)行Sleep是阻塞線程函數(shù)。它會在當前語句阻塞一段時間,參數(shù)是以1/1000秒為單位的線程也有父子關系。父進 程退出后子進程也會退出 不可再現(xiàn)性,即倆個進程同時邁出同一部步,倆個進 程中存在共享變量4 實驗二 Windows線程同步機制【開發(fā)語言及實現(xiàn)平臺或實驗環(huán)境】C++/C#Microsoft Visual Studio 6.0/ Microsoft VisualStudio .NET【實
33、驗目的】了解Windows線程同步機制;while(RunQueue.size() > 320) RunQueue.pop_back();} void InitMemoryQueueO 〃初始化運行標志、內存外 存頁面隊列(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) 〃分 別在內外存中查找頁面 存在返回位置 不存在返回-1if(sign) for(unsigned i=O;i<iiiterPage.size();i++) if(t_PageId == interPage[i].id) return i; } 〃這里的括號不能刪除,否那么if else的匹配會出問題 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算法中查找內存頁面中的頁面下次需要用到它的時候 的隊列下標 { 〃找到就返回下標沒找到就返回“for(int i=start;i < 320;i++) if(static_cast<int>(RunQueue[i]/10) == id) return i;return -1;) int findLongestStayTimePage() //FIFO 算法中查找 在內存中呆了最久的頁面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 算法中查找 最長時間不會用到的頁面(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; 〃返回需要最長時間才執(zhí)行的頁面 在內存中的位置) void directFlod(int t_PageId) 〃當內存空間還有剩余 時直接調入int status = searchStatusOfPage(t_PageId?false);if(status == -1) return; interPage.push_back(exterPage[status]); 〃先插入節(jié) 點到內存,再從外存中將其刪除 exterPage.erase(exterPage.begin()+status);} bool
39、 Manage(int count,int t_PageId) 〃當內存已經(jīng)滿 了需要按照三種算法調度時( 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) 〃運行,通過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 〃找到當前將要執(zhí)行的指令的頁面號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; ))【實驗結果與分析】缺頁率分別為【實驗思考及總結】首先,我們清楚一個概念:缺頁一一我要裝的程序的 頁,內存中沒有該頁就叫缺頁。 先進先出頁面置換算法 往內存的3個頁中先后裝入程序
43、的3個頁(這三個的 程序頁號是不一樣的),再裝入程序的下一個頁時,先判斷 內存中有無此頁,有就不用再次裝入;內存中沒有此頁時, 就把先進入 內存中的程序頁給弄到虛擬內存上,然后,裝入要裝 入的,以后,以此類推。 最近最久未使用置換算法 往內存的3個頁中先后裝入程序的3個頁(這三個的程序頁號是不一樣的),再裝入程序的下一個頁時,先判斷 內存中有無此頁,有就不用再次裝入;內存中沒有此頁時, 就把內存中那個隔得時間最長沒有運行的程序頁給弄到虛 擬內存上,然后,裝入要裝入的,以后,以此類推。這個開 始時和先進先出頁面置換算法的結果時一樣的,但是,往后 運行一段后,就不一樣了。 最正確置換算法
44、往內存的3個頁中先后裝入程序的3個頁(這三個的 程序頁號是不一樣的),再裝入程序的下一個頁時,先判斷 內存中有無此頁,有就不用再次裝入;內存中沒有此頁時, 該算法會把之后要裝入內存的程序頁號查一遍,并且要計算 出,此時內存中的三個頁號在之后誰是被最晚再次裝入的頁 號,然后,把該頁號給弄到虛擬內存上,然后,裝入該裝入 的程序頁號,最正確置換算法是這幾種算法中最好的算法。 先進先出適應算法特點:那個頁面先進來,那個 頁面先出去,不管該頁面是不是最近又被訪問了一次沒有。這種算法連蒙都不會。 最長最久未被使用算法的特點:頁面置換時,不管你們這 些頁面誰先進來,我只管的是從你們當中選擇一個從最后一次
45、被訪問到現(xiàn)在,時間最長的那個頁面。這個比擬會蒙。最正確適應算法:置換頁面的 時候,我看一下以后要進來的頁面,把那個最晚再次進入內 存的頁面(這些頁面必須是內存中存在的那些)置換出來。 這個是鐵板釘釘?shù)氖?0 (1) 了解互斥體,并通過查閱資料理解互斥體對象的 使用方法; (2) 了解事件,并通過查閱資料理解事件對象的使用 方法;了解關鍵區(qū),并通過查閱資料理解關鍵區(qū)對象的使用方法;了解信號量,并通過查閱資料理解信號量對象的使用方法;(6) 使用方法;(6) (6) (6) (6) 利用Windows線程同步機制,模擬生產(chǎn)者消費者 問題。 【實驗要求】逐程序進行
46、簡要分析、運行各程序并仔細閱讀注釋;Q) 釋;Q) 釋;Q) Q) Q) Q) 查閱MSDN或其他資料,掌握相關系統(tǒng)調用使用 方法和參數(shù)含義;(3)完成實驗報告。 【實驗結果與分析】 2-1到2-3加入倆個sleep (1)后,有可能到threadl is sell tickets:時間片就停了,tickets沒-,還可以運行thread2 is sell tickets:"<<tickets—也就是說 tickets 變?yōu)?0,返回再運行thread 1 is sell tickets時就賣0號票了67【實驗思考及總結】 Sleep(lO)
47、使當前線程放棄目前的時間片,并且在 10ms 內不會被再次調度 進程也有父子關系o父進程退出 后子進程也會退出,線程之間的同步使用一些核心對象:如 thread, process, evnet, mutex, semaphore.在線程之間使 用等待函數(shù)如 WaitForSingleObjects, WaitForMultipleObjects.等 待函數(shù)使用核心對象的handle作為參數(shù),如果handle被激 發(fā),那么執(zhí)行下一步。handle被激發(fā)的條件:(handle是一 段內存指針,為了掩藏內部實現(xiàn)而作的一個類型轉化指針) 激發(fā):我的理解是資源未被戰(zhàn)勝。未激發(fā): 資源正在被占用。eg
48、: l)thread, process被終止,那么激發(fā)。 2) event:要通過它的API來手動激發(fā),是最靈活的激發(fā)方 式,可被所有線程使用。3)mutex:沒被任何線程所擁有, 那么激發(fā)。 1)臨界區(qū):CRITICAL.SECTION適用范圍:單一進 程的各線程之間用來排它性占有特性:局部性對象;快速而 有效.無法監(jiān)測是否被線程放棄函數(shù):EnterCriticalSectionLeaveCriticalSection 2)Mutex:適用范圍:不同線程之間用來排它性占有 特性:核心對象,可以使用wait進行等待,只能被擁有線程 所釋放函數(shù):CreateMutex ReleaseMute
49、x 3)semaphore:信號量 適用范圍:用來限制資源占用 特性:核心對象,沒有擁有者,任何線程都可釋放函 : CreateSemaphore OpenSemaphore ReleaseSemaphore8 4)Event:適用范圍:同來控制對象信號的接收,常與信號 系統(tǒng)結合起來特性:核心對象函數(shù):CreateEvent OpenEvent PulseEvent SetEvent ResetEvent 5)Interlocked 簡單的原 子操作,如寫文件中對文件中字節(jié)范圍的鎖定」。eking NOTE:線程同步中很重要的可歸納為鎖系統(tǒng)lock和 信號系統(tǒng)signal lock包
50、括:CRITICAL_SECTION, Mutex, wait function: WaitF orMultipleObj ects WaitForSingleObject Sleep 6)completion port 適 用范圍:網(wǎng)絡異步接收,包括文件讀寫特性:由OS來控制讀 寫,是windows平臺最有效的同步機制,相當于linux的AIO 或者非阻塞 socket+epoll 函數(shù):CreateloCompletionPort GetQueuedCompletionStatus 例如1: event 〃事件機制:設置一個全局event對象, 這個只能等待最多64個對象,而且要用 W
51、aitForMultipleObjects 來監(jiān)視線程handle數(shù)組.不如完全端口 completion portHANDLEghWriteEvent;HANDLEghThreads[THREADCOUNT]; 〃⑴創(chuàng)立個手動事件,一開始 不接受任何信號no signel //ResetEvent:用來信號重置,同 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)生一堆線程,設置事件響應信號 signal,if (! SetEvent(ghWriteEvent)){printf("SetEvent failed (%d)/n",GetLastError()); return; } 〃(3)設置線程等待事件, 所有線程都接到這個事件,,這里對線程進行了同步,只有所有 線程都執(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)其中每個線程函數(shù)都在等待事件對象,這里也對線程 進行了同步,只有得到signal的線程才執(zhí)行下一步 dwWaitResult =WaitForSingleObject(ghWriteEvent, // eventhandle INFINITE); // indefinite wait ) //(4)關閉了這個全局事件 == CloseHandle
54、(ghWriteEvent) CloseEvents(); 例如2: completion port (1)創(chuàng)立完成端口,與一個 監(jiān)聽socket發(fā)生關聯(lián) CreateloCompletionPort (2)產(chǎn)生一堆線程,讓線程 在完全端口循環(huán)等待. CreateThread—(WorkerThread)— GetQueuedCompletionStatus (3)接收監(jiān)聽 socket 的 讀寫請求accept,將accept socket與完全端口關聯(lián)9 實驗三Windows線程通信【開發(fā)語言及實現(xiàn)平臺或實驗環(huán)境】C++/C#Microsoft Visual Studio 6.0/ Microsoft VisualStudio .NET【實驗目的】了解Window線程通信方法;了解匿名管道,并通過查閱資料理解匿名管道的 使用方法; (1) 了解命名管道,并通過查閱資料理解命名管道的 使用方法;【實驗要求】⑴逐程序進行簡要分析、運行各程序并仔細閱讀注釋; (2)查閱MSDN或其他資料,掌握相關系統(tǒng)調用使用 方法和參數(shù)含義;(3)完成實驗報告。 【實驗結果與分析】 【實驗思考及總結】 學會了在vc6.0中open已經(jīng)編譯好的程序,選擇所有 文件,線程之間通信的兩個基本問題是互斥和同步。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。