版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023-2023學(xué)年第一學(xué)期計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級(jí):學(xué)號(hào):姓名:日期:實(shí)驗(yàn)一Windows多線程【開發(fā)語(yǔ)言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【實(shí)驗(yàn)?zāi)康摹?1)進(jìn)一步理解操作系統(tǒng)的并發(fā)性;(2)了解Windows線程創(chuàng)立方法,并通過(guò)查閱資料理解各參數(shù)的含義;(3)了解多線程程序設(shè)計(jì)方法,并進(jìn)行簡(jiǎn)單應(yīng)用?!緦?shí)驗(yàn)要求】(1)逐程序進(jìn)行簡(jiǎn)要分析、運(yùn)行各程序并仔細(xì)閱讀注釋;(2)查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用方法和參數(shù)含義;(3)完成實(shí)驗(yàn)報(bào)告?!緦?shí)驗(yàn)結(jié)果與分析】〔1〕1-1.cpp程序運(yùn)行1-1.cpp結(jié)果:將main函數(shù)中注釋掉的Sleep語(yǔ)句讓其可用,運(yùn)行結(jié)果為:分析原因:Sleep〔0〕的作用為語(yǔ)句可觀察線程1和主線程并發(fā)執(zhí)行。輸出結(jié)果“mainthreadisrunning/thread1isrunning〞。沒(méi)有添加的線程1運(yùn)行結(jié)束只輸出“mainthreadisrunning〞。〔2〕1-2.cpp程序運(yùn)行1-2.cpp結(jié)果:分析原因:1-2.cpp文件使用的是時(shí)間片輪轉(zhuǎn)方法調(diào)度的主線程、線程1、線程2.因此不需要sleep語(yǔ)句就可將主線程調(diào)度。因?yàn)樵趦蓚€(gè)線程中存在共享變量,因此執(zhí)行結(jié)果出現(xiàn)不可再現(xiàn)性。〔3〕1-3.cpp程序運(yùn)行1-3.cpp結(jié)果:將main函數(shù)中注釋掉的Sleep語(yǔ)句讓其可用,運(yùn)行結(jié)果為:將兩個(gè)子函數(shù)中注釋掉的Sleep語(yǔ)句讓其可用,運(yùn)行結(jié)果:分析原因:參加兩個(gè)sleep〔1〕后,有可能到thread1isselltickets:時(shí)間片就停了,tickets沒(méi)--,還可以運(yùn)行thread2isselltickets:"<<tickets—也就是說(shuō)tickets變?yōu)?,返回再運(yùn)行thread1isselltickets時(shí)就賣0號(hào)票了?!緦?shí)驗(yàn)思考及總結(jié)】………〔1〕參加循環(huán),使得兩個(gè)進(jìn)程可以交替執(zhí)行?!?〕Sleep是阻塞線程函數(shù)。它會(huì)在當(dāng)前語(yǔ)句阻塞一段時(shí)間,參數(shù)是以1/1000秒為單位的。〔3〕線程也有父子關(guān)系。父進(jìn)程退出后子進(jìn)程也會(huì)退出?!?〕不可再現(xiàn)性:兩個(gè)進(jìn)程同時(shí)邁出同一部步,兩個(gè)進(jìn)程中存在共享變量。.實(shí)驗(yàn)二Windows線程同步機(jī)制【開發(fā)語(yǔ)言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【實(shí)驗(yàn)?zāi)康摹?1)了解Windows線程同步機(jī)制;(2)了解互斥體,并通過(guò)查閱資料理解互斥體對(duì)象的使用方法;(3)了解事件,并通過(guò)查閱資料理解事件對(duì)象的使用方法;(4)了解關(guān)鍵區(qū),并通過(guò)查閱資料理解關(guān)鍵區(qū)對(duì)象的使用方法;(5)了解信號(hào)量,并通過(guò)查閱資料理解信號(hào)量對(duì)象的使用方法;(6)利用Windows線程同步機(jī)制,模擬生產(chǎn)者消費(fèi)者問(wèn)題。【實(shí)驗(yàn)要求】(1)逐程序進(jìn)行簡(jiǎn)要分析、運(yùn)行各程序并仔細(xì)閱讀注釋;(2)查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用方法和參數(shù)含義;(3)完成實(shí)驗(yàn)報(bào)告?!緦?shí)驗(yàn)結(jié)果與分析】〔1〕2-1(mutex).cpp程序運(yùn)行2-1(mutex).cpp結(jié)果:將兩個(gè)子函數(shù)中注釋掉的Sleep語(yǔ)句讓其可用,運(yùn)行結(jié)果:〔2〕2-2(event).cpp程序運(yùn)行2-2(event).cpp結(jié)果:將兩個(gè)子函數(shù)中注釋掉的Sleep語(yǔ)句讓其可用,運(yùn)行結(jié)果:〔3〕2-3(critical_section).cpp程序運(yùn)行2-3(critical_section).cpp結(jié)果:將兩個(gè)子函數(shù)中注釋掉的Sleep語(yǔ)句讓其可用,運(yùn)行結(jié)果:分析原因:2-1(mutex).cpp、2-2(event).cpp、2-3(critical_section).cpp的處理方式相同,不會(huì)出現(xiàn)銷售出0號(hào)票的情況原因相同:修改之前,在指定暫停的時(shí)間Sleep(1000)內(nèi),thread1和thread2隨機(jī)售票,出現(xiàn)多種情況;將兩個(gè)子函數(shù)中注釋掉的Sleep〔1〕語(yǔ)句讓其可用后,thread1和thread2交替售票,即thread1在其暫停的時(shí)間Sleep(1)內(nèi),thread2獲得了對(duì)共享對(duì)象hMutex的所有權(quán),開始售票,同理當(dāng)thread2在其暫停的時(shí)間Sleep(1)內(nèi),thread1獲得了對(duì)共享對(duì)象hMutex的所有權(quán),開始售票,這樣thread1和thread2就實(shí)現(xiàn)了交替售票,不會(huì)出現(xiàn)銷售出0號(hào)票的情況?!?〕2-4(Producer_Consumer).cpp程序運(yùn)行2-4(Producer_Consumer).cpp結(jié)果:將兩個(gè)子函數(shù)中注釋掉的while語(yǔ)句讓其可用,運(yùn)行結(jié)果:分析原因:修改之前,在指定暫停時(shí)間sleep〔20〕內(nèi),producer和consumer只能執(zhí)行一次;將兩個(gè)子函數(shù)中注釋掉的while語(yǔ)句讓其可用后,producer和consumer在指定暫停時(shí)間sleep〔20〕內(nèi),隨機(jī)循環(huán)獲得共享對(duì)象的所有權(quán),進(jìn)行生產(chǎn)或消費(fèi),從而出現(xiàn)多種結(jié)果?!?〕2-4(Producer_Consumer)1.cpp程序運(yùn)行2-4(Producer_Consumer)1.cpp結(jié)果:【實(shí)驗(yàn)思考及總結(jié)】………〔1〕Sleep(10)使當(dāng)前線程放棄目前的時(shí)間片,并且在10ms內(nèi)不會(huì)被再次調(diào)度。〔2〕進(jìn)程也有父子關(guān)系。父進(jìn)程退出后子進(jìn)程也會(huì)退出?!?〕線程之間的同步使用一些核心對(duì)象:如thread,process,evnet,mutex,semaphore.。在線程之間使用等待函數(shù)如WaitForSingleObjects,
WaitForMultipleObjects.〔4〕等待函數(shù)使用核心對(duì)象的handle作為參數(shù),如果handle被激發(fā),那么執(zhí)行下一步。handle被激發(fā)的條件:(handle是一段內(nèi)存指針,為了掩藏內(nèi)部實(shí)現(xiàn)而做的一個(gè)類型轉(zhuǎn)化指針〕激發(fā):---資源未被占用。未激發(fā):---資源正在被占用。eg:thread,process被終止,那么激發(fā)。event:要通過(guò)它的API來(lái)手動(dòng)激發(fā),是最靈活的激發(fā)方式,可被所有線程使用。mutex:沒(méi)被任何線程所擁有,那么激發(fā)。實(shí)驗(yàn)三Windows線程通信【開發(fā)語(yǔ)言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【實(shí)驗(yàn)?zāi)康摹?1)了解Window線程通信方法;(2)了解匿名管道,并通過(guò)查閱資料理解匿名管道的使用方法;(3)了解命名管道,并通過(guò)查閱資料理解命名管道的使用方法;【實(shí)驗(yàn)要求】(1)逐程序進(jìn)行簡(jiǎn)要分析、運(yùn)行各程序并仔細(xì)閱讀注釋;(2)查閱MSDN或其他資料,掌握相關(guān)系統(tǒng)調(diào)用使用方法和參數(shù)含義;(3)完成實(shí)驗(yàn)報(bào)告。【實(shí)驗(yàn)結(jié)果與分析】(1)匿名管道:先編譯Child工程,然后運(yùn)行Parent工程,再在Parent中創(chuàng)立管道和子進(jìn)程,然后雙方即可通過(guò)管道通信。如下列圖所示:命名管道:Server和Client各自運(yùn)行,再在Server中創(chuàng)立命名管道,然后在Client中連接管道,最后雙方即可通過(guò)管道通信。如下列圖所示:注:相關(guān)代碼在*View.cpp中(實(shí)驗(yàn)三選做題目):在客戶端輸入數(shù)據(jù)a和b,然后發(fā)送到效勞器并計(jì)算a+b,然后把計(jì)算結(jié)果發(fā)送到客戶端??梢远鄠€(gè)客戶端與同一個(gè)效勞器并行通信。相關(guān)代碼:客戶端://CDlg.cpp:implementationfile//#include"stdafx.h"#include"C.h"#include"CDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public: CAboutDlg();//DialogData //{{AFX_DATA(CAboutDlg) enum{IDD=IDD_ABOUTBOX}; //}}AFX_DATA //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL//Implementationprotected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){ //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) //{{AFX_MSG_MAP(CAboutDlg) //Nomessagehandlers //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CCDlgdialogCCDlg::CCDlg(CWnd*pParent/*=NULL*/) :CDialog(CCDlg::IDD,pParent){ //{{AFX_DATA_INIT(CCDlg) //NOTE:theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCCDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCDlg) //NOTE:theClassWizardwilladdDDXandDDVcallshere //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCDlg,CDialog) //{{AFX_MSG_MAP(CCDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CCDlgmessagehandlersBOOLCCDlg::OnInitDialog(){ CDialog::OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemcommandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog SetIcon(m_hIcon,TRUE); //Setbigicon SetIcon(m_hIcon,FALSE); //Setsmallicon //TODO:Addextrainitializationhere returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCCDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID,lParam); }}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCCDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); }}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCCDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}效勞端://SDlg.cpp:implementationfile//#include"stdafx.h"#include"S.h"#include"SDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public: CAboutDlg();//DialogData //{{AFX_DATA(CAboutDlg) enum{IDD=IDD_ABOUTBOX}; //}}AFX_DATA //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL//Implementationprotected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){ //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) //{{AFX_MSG_MAP(CAboutDlg) //Nomessagehandlers //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CSDlgdialogCSDlg::CSDlg(CWnd*pParent/*=NULL*/) :CDialog(CSDlg::IDD,pParent){ //{{AFX_DATA_INIT(CSDlg) //NOTE:theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCSDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSDlg) //NOTE:theClassWizardwilladdDDXandDDVcallshere //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CSDlg,CDialog) //{{AFX_MSG_MAP(CSDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CSDlgmessagehandlersBOOLCSDlg::OnInitDialog(){ CDialog::OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemcommandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog SetIcon(m_hIcon,TRUE); //Setbigicon SetIcon(m_hIcon,FALSE); //Setsmallicon //TODO:Addextrainitializationhere returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCSDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID,lParam); }}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCSDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); }}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCSDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}運(yùn)行結(jié)果如下列圖:【實(shí)驗(yàn)思考及總結(jié)】………〔1〕在VC++6.0中open已經(jīng)編譯好的程序,選擇所有文件,線程之間通信的兩個(gè)根本問(wèn)題是互斥和同步。
線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的消息,當(dāng)它沒(méi)有得到另一個(gè)線程的消息時(shí)應(yīng)等待,直到消息到達(dá)時(shí)才被喚醒。
線程互斥是指對(duì)于共享的操作系統(tǒng)資源〔指的是廣義的"資源",而不是Windows的.res文件,譬如全局變量就是一種共享資源〕,在各線程訪問(wèn)時(shí)的排它性。當(dāng)有假設(shè)干個(gè)線程都要使用某一共享資源時(shí),任何時(shí)刻最多只允許一個(gè)線程去使用,其它要使用該資源的線程必須等待,直到占用資源者釋放該資源。
線程互斥是一種特殊的線程同步。
〔2〕互斥和同步對(duì)應(yīng)著線程間通信發(fā)生的兩種情況:
1〕當(dāng)有多個(gè)線程訪問(wèn)共享資源而不使資源被破壞時(shí);
2〕當(dāng)一個(gè)線程需要將某個(gè)任務(wù)已經(jīng)完成的情況通知另外一個(gè)或多個(gè)線程時(shí)。
〔3〕在WIN32中,同步機(jī)制主要有以下幾種:
1〕事件(Event);
2〕信號(hào)量(semaphore);
3〕互斥量(mutex);
4〕臨界區(qū)(Criticalsection)。
〔4〕全局變量
因?yàn)檫M(jìn)程中的所有線程均可以訪問(wèn)所有的全局變量,因而全局變量成為Win32多線程通信的最簡(jiǎn)單方式。實(shí)驗(yàn)四銀行家算法模擬【開發(fā)語(yǔ)言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2003【實(shí)驗(yàn)?zāi)康摹俊?〕進(jìn)一步理解利用銀行家算法防止死鎖的問(wèn)題;〔2〕在了解和掌握銀行家算法?!?〕理解和掌握平安序列、平安性算法【實(shí)驗(yàn)內(nèi)容】〔1〕編寫平安性算法;〔2〕編寫銀行家算法,并編制銀行家算法通用程序,將調(diào)試結(jié)果顯示在計(jì)算機(jī)屏幕上,再檢測(cè)和筆算的一致性?!驹创a】#include<iostream.h>#include<string.h>#defineM3//資源的種類數(shù)#defineN5//進(jìn)程的個(gè)數(shù)voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);//統(tǒng)一的輸出格式boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);boolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);voidmain(){ inti,j; //當(dāng)前可用每類資源的資源數(shù) intiAvailable[M]={3,3,2}; //系統(tǒng)中N個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)M類資源的最大需求 intiMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //iNeed[N][M]每一個(gè)進(jìn)程尚需的各類資源數(shù) //iAllocation[N][M]為系統(tǒng)中每一類資源當(dāng)前已分配給每一進(jìn)程的資源數(shù) intiNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //進(jìn)程名 charcName[N]={'a','b','c','d','e'}; boolbExitFlag=true;//退出標(biāo)記 charch; //接收選擇是否繼續(xù)提出申請(qǐng)時(shí)傳進(jìn)來(lái)的值 boolbSafe;//存放平安與否的標(biāo)志 //計(jì)算iNeed[N][M]的值 for(i=0;i<N;i++) for(j=0;j<M;j++) iNeed[i][j]=iMax[i][j]-iAllocation[i][j]; //輸出初始值 output(iMax,iAllocation,iNeed,iAvailable,cName); //判斷當(dāng)前狀態(tài)是否平安 bSafe=safety(iAllocation,iNeed,iAvailable,cName); //是否繼續(xù)提出申請(qǐng) while(bExitFlag) { cout<<"\n"<<"繼續(xù)提出申請(qǐng)?\ny為是;n為否。\n"; cin>>ch; switch(ch) { case'y'://cout<<"調(diào)用銀行家算法"; bSafe=banker(iAllocation,iNeed,iAvailable,cName); if(bSafe)//平安,那么輸出變化后的數(shù)據(jù) output(iMax,iAllocation,iNeed,iAvailable,cName); break; case'n': cout<<"退出。\n"; bExitFlag=false; break; default: cout<<"輸入有誤,請(qǐng)重新輸入:\n"; } }}//輸出voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){ inti,j; cout<<"\n\tMax\tAllocation\tNeed\tAvailable"<<endl; cout<<"\tABC\tABC\tABC\tABC"<<endl; for(i=0;i<N;i++) { cout<<cName[i]<<"\t"; for(j=0;j<M;j++) cout<<iMax[i][j]<<""; cout<<"\t"; for(j=0;j<M;j++) cout<<iAllocation[i][j]<<""; cout<<"\t"; for(j=0;j<M;j++) cout<<iNeed[i][j]<<""; cout<<"\t"; cout<<""; //Available只需要輸出一次 if(i==0) for(j=0;j<M;j++) cout<<iAvailable[j]<<""; cout<<endl; } }//平安性算法,進(jìn)行平安性檢查;平安返回true,并且輸出平安序列,不平安返回false,并輸出不平安的提示;boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){ inti,j,flag,x=0; charName[N]; intWork[M]; boolFinish[N]; for(j=0;j<M;j++) Work[j]=iAvailable[j]; for(i=0;i<N;i++) Finish[i]=false; while(true) { flag=0; for(i=0;i<N;i++) { if(Finish[i]==false&&Work[0]>=iNeed[i][0]&&Work[1]>=iNeed[i][1]&&Work[2]>=iNeed[i][2]) { for(j=0;j<M;j++) { Work[j]+=iAllocation[i][j]; } Finish[i]=true; flag++; Name[x++]=cName[i]; } } for(i=0;i<N;i++) { if(Finish[i]==false) { i=i; break; } } if(i==5) { cout<<"\n"; cout<<"當(dāng)前時(shí)刻系統(tǒng)的一個(gè)平安序列為:"; for(x=0;x<N;x++) cout<<Name[x]<<""; cout<<"\n"; returntrue; } if(flag==0) { cout<<"無(wú)平安序列"; returnfalse; } } returntrue;}//平安返回true,不平安返回falseboolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){ intiMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; inti,j,Request[M],check[M]; boolf=true; charx; while(f) { cout<<"請(qǐng)輸入進(jìn)程名:"; cin>>x; for(i=0;i<N;i++) if(cName[i]==x) { i=i; break; }if(i==5) cout<<"\n您輸入的進(jìn)程名有誤!請(qǐng)重新輸入"; else f=false; }cout<<"請(qǐng)輸入申請(qǐng)各類資源數(shù)量:\n"; for(j=0;j<M;j++) cin>>Request[j]; for(j=0;j<M;j++) { check[j]=Request[j]+iAllocation[i][j]; } for(j=0;j<M;j++) { if((iMax[i][j]-check[j])<0) { cout<<"\n資源申請(qǐng)超過(guò)最大需求量?。?!\n"; returnfalse; } } for(j=0;j<M;j++) { if((iAvailable[j]-Request[j])<0) { cout<<"\n不能滿足進(jìn)程!?。n"; returnfalse; } }for(j=0;j<M;j++){iAvailable[j]-=Request[j];iAllocation[i][j]+=Request[j];iNeed[i][j]-=Request[j];}safety(iAllocation,iNeed,iAvailable,cName);returntrue;}【實(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è)試該進(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ù)之和是否超過(guò)了該進(jìn)程對(duì)資源的最大需求量。假設(shè)超過(guò)那么拒絕分配資源,假設(shè)沒(méi)有超過(guò)那么再測(cè)試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,假設(shè)能滿足那么按當(dāng)前的申請(qǐng)量分配資源,否那么也要推遲分配。實(shí)驗(yàn)五頁(yè)面置換算法模擬【開發(fā)語(yǔ)言及實(shí)現(xiàn)平臺(tái)或?qū)嶒?yàn)環(huán)境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2003【實(shí)驗(yàn)?zāi)康摹俊?〕進(jìn)一步理解利用頁(yè)面調(diào)度算法實(shí)現(xiàn)虛擬內(nèi)存的問(wèn)題;〔2〕通過(guò)模擬實(shí)現(xiàn)請(qǐng)求頁(yè)式存儲(chǔ)管理的幾種根本頁(yè)面置換算法,了解虛擬存儲(chǔ)技術(shù)的特點(diǎn)?!?〕掌握虛擬存儲(chǔ)請(qǐng)求頁(yè)式存儲(chǔ)管理中幾種根本頁(yè)面置換算法的根本思想和實(shí)現(xiàn)過(guò)程,并比擬它們的效率?!?〕了解頁(yè)面大小和內(nèi)存實(shí)際容量對(duì)命中率的影響?!緦?shí)驗(yàn)內(nèi)容】〔1〕在了解和掌握頁(yè)面調(diào)度算法的根底上,編制先進(jìn)先出的算法〔FIFO〕、最近最少使用算法〔LRU〕、最正確淘汰算法〔OPT〕等各種頁(yè)面置換算法。將調(diào)試結(jié)果顯示在計(jì)算機(jī)屏幕上,再檢測(cè)和筆算的一致性?!?〕理解和掌握命中率的問(wèn)題〔3〕會(huì)使用某種編程語(yǔ)言?!驹创a】#include<iostream>#defineM3#defineN20usingnamespacestd;structblock{ intiPageNum;//物理塊里存儲(chǔ)的頁(yè)面號(hào) intiBlockFlag; //在三種算法中用到的標(biāo)記。例如在FIFO中為在內(nèi)存中的時(shí)間};//算法模擬移位存放器原理voidFIFO(intiTempPage[N],intflag[N],blockmyBlock[M]);voidOptimal(intiTempPage[N],intflag[N],blockmyBlock[M]);voidLRU(intiTempPage[N],intflag[N],blockmyBlock[M]);intPageNum(intarray[]);voidmain(){ blockmyBlock[M]; intiPageString[N]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1}; //頁(yè)面引用串 intflag[N];//缺頁(yè)標(biāo)記;1為缺頁(yè),0為不缺頁(yè),在統(tǒng)計(jì)缺頁(yè)次數(shù)時(shí)用 inti; boolbExitFlag=true;//退出標(biāo)記 charch; //接收選擇算法時(shí)傳進(jìn)來(lái)的值 while(bExitFlag) { cout<<"\n"<<"請(qǐng)選擇頁(yè)面置換算法:\n"; cout<<"f:FIFO置換算法\to:OPT置換算法\tl:LRU置換算法\tx:退出置換算法程序.\n"; cin>>ch; //初始化數(shù)據(jù) if((ch=='f')||(ch=='o')||(ch=='l')) { for(i=0;i<N;i++) flag[i]=0;//初始化缺頁(yè)標(biāo)記為0,即不缺頁(yè) } switch(ch) { case'f': cout<<"FIFO置換算法的結(jié)果是:\n";FIFO(iPageString,flag,myBlock); //用PageNum(flag)統(tǒng)計(jì)缺頁(yè)次數(shù) cout<<"\n缺頁(yè)次數(shù)為"<<PageNum(flag)<<endl; break; case'o': cout<<"OPT置換算法的結(jié)果是:\n"; Optimal(iPageString,flag,myBlock); cout<<"\n缺頁(yè)次數(shù)為"<<PageNum(flag)<<endl; break;case'l': cout<<"LRU置換算法的結(jié)果是:\n"; LRU(iPageString,flag,myBlock); cout<<"\n缺頁(yè)次數(shù)為"<<PageNum(flag)<<endl; break; case'x': cout<<"退出置換算法。\n"; bExitFlag=false; break; default: cout<<"輸入有誤,請(qǐng)重新選擇置換算法:\n"; } }}//對(duì)數(shù)組中的數(shù)累加,用來(lái)統(tǒng)計(jì)缺頁(yè)次數(shù)時(shí)用intPageNum(intarray[]){ intnum=0; for(intj=0;j<N;j++) num=num+array[j]; returnnum;}//定位函數(shù),在最正確算法中用于定位;//定位物理塊中的某一個(gè)頁(yè)面在引用串中還未訪問(wèn)串中頁(yè)面的位置intallocate(intiPage,intiLoc,intiTempPage[N]){ inti; for(i=iLoc;i<N;i++) { if(iPage==iTempPage[i]) returni; } //永遠(yuǎn)不再訪問(wèn)的頁(yè)面位置假定為N returnN;}//找數(shù)組中最大值所在的下標(biāo),返回最大值在數(shù)組中的位置〔下標(biāo)〕,三種算法中都用到intmax(blockarray[M]){ intj,loc; inttemp=array[0].iBlockFlag; loc=0; for(j=1;j<M;j++) { if(temp<array[j].iBlockFlag) { temp=array[j].iBlockFlag; loc=j; } } returnloc;}//輸出數(shù)據(jù)voidoutput(intiPage,intflag,blockmyBlock[M],intblockNum){ intj; //如果缺頁(yè)那么輸出缺頁(yè)標(biāo)志,否那么不輸出 if(flag==1) cout<<"\n"<<flag; else cout<<"\n"; cout<<"\t"<<iPage; for(j=0;j<blockNum;j++) cout<<"\t"<<myBlock[j].iPageNum; }//初始化物理塊的內(nèi)容,因任一種算法在物理塊內(nèi)容為空時(shí),結(jié)果都一樣的//同時(shí)將目前物理塊中的內(nèi)容輸出voidInitialBlock(intiTempPage[N],intflag[N],blockmyBlock[M]){ inti; for(i=0;i<M;i++) { //初始化物理塊的內(nèi)容,因任一種算法在物理塊內(nèi)容為空時(shí),結(jié)果都一樣的 myBlock[i].iPageNum=iTempPage[i]; //myBlock[i].iBlockFlag的值:0為最后進(jìn)來(lái)的,數(shù)越大表示進(jìn)來(lái)的越早 //在最正確置換算法中那么初始化此值沒(méi)有意義 myBlock[i].iBlockFlag=(M-1)-i; flag[i]=1;//此時(shí)為缺頁(yè) } //輸出 cout<<"\n缺頁(yè)\t引用串\t物理塊1\t物理塊2\t物理塊3"; for(i=0;i<M;i++) output(iTempPage[i],flag[i],myBlock,i+1);}//FIFO置換算法voidFIFO(intiTempPage[N],intflag[N],blockmyBlock[M]){ inti,j,k,loc; //初始化物理塊的內(nèi)容,因任一種算法在物理塊內(nèi)容為空時(shí),結(jié)果都一樣的 //同時(shí)將目前物理塊中的內(nèi)容輸出 InitialBlock(iTempPage,flag,myBlock); //從引用串中的第4個(gè)頁(yè)面開始 for(i=3;i<N;i++) { for(j=0;j<M;j++) { //物理塊中存在 if(myBlock[j].iPageNum==iTempPage[i]) { //模擬移位存放器 for(k=0;k<M;k++) myBlock[k].iBlockFlag++; flag[i]=0; break; } } //物理塊中不存在 if(j==M) { //查找最先進(jìn)來(lái)的頁(yè)面,也就是block中iBlockFlag最大的物理塊 loc=max(myBlock); myBlock[loc].iPageNum=iTempPage[i]; //置缺頁(yè)標(biāo)志 flag[i]=1; //模擬移位存放器 for(k=0;k<M;k++) if(k!=loc) myBlock[k].iBlockFlag++; else myBlock[k].iBlockFlag=0; } //輸出 output(iTempPage[i],flag[i],myBlock,M); } cout<<endl;}//Optimal置換算法voidOptimal(intiTempPage[N],intflag[N],blockmyBlock[M]){ inti,j,loc; //初始化物理
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024幼兒園租賃合同(包括幼兒園特色課程開發(fā)及教學(xué)成果展示)3篇
- 2016-2020年印度尼西亞投資環(huán)境分析及前景預(yù)測(cè)報(bào)告
- 出差管理制度及出差標(biāo)準(zhǔn)
- 2024年租房付款條款3篇
- 2025年度離婚協(xié)議書定制與婚姻財(cái)產(chǎn)分割法律援助合同3篇
- 2024版消防安裝工程施工合同書
- 重慶旅游職業(yè)學(xué)院《病原微生物學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度15%股權(quán)轉(zhuǎn)讓與市場(chǎng)推廣服務(wù)合同2篇
- 山西大學(xué)《航空計(jì)算機(jī)組成與結(jié)構(gòu)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度餐廳智能化改造承包經(jīng)營(yíng)合同3篇
- 商業(yè)銀行風(fēng)險(xiǎn)偏好和限額管理管理辦法
- 《數(shù)學(xué)課程論》課件
- 2024年國(guó)家公安部直屬事業(yè)單位招錄人民警察及工作人員696人筆試(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 初中必背古詩(shī)文138首
- 車站調(diào)度員(技師)技能鑒定理論考試題庫(kù)(含答案)
- 2024年房屋交接確認(rèn)書
- 【深信服】PT1-AF認(rèn)證考試復(fù)習(xí)題庫(kù)(含答案)
- 反芻動(dòng)物消化道排泄物原蟲診斷技術(shù)規(guī)范
- 開放系統(tǒng)10861《理工英語(yǔ)(4)》期末機(jī)考真題及答案(第102套)
- 2024年國(guó)家能源集團(tuán)招聘筆試參考題庫(kù)含答案解析
- GB/T 43824-2024村鎮(zhèn)供水工程技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論