




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2015-2016学年第一学期计算机操作系统实验报告专业:计算机科学与技术班级:学号:姓名:日期:实验一Windows多线程【开发语言及实现平台或实验环境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【实验目的】进一步理解操作系统的并发性;了解Windows线程创建方法,并通过查阅资料理解各参数的含义;了解多线程程序设计方法,并进行简单应用。【实验要求】逐程序进行简要分析、运行各程序并仔细阅读注释;查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;完成实验报告。【实验结果与分析】1-1.cpp程序运行1-1.cpp结果:■2"F:衣档2S■实验读貯拿诜程mainthreadisrunningPressanykeytocortinue将main函数中注释掉的Sleep语句让其可用,运行结果为:threadisirunningthyeadli弓runningPre".-snykeytocoritinue
分析原因:Sleep(0)的作用为语句可观察线程1和主线程并发执行。输出结果“mainthreadisrunning/threadlisrunning”。没有添加的线程1运行结束只输出“mainthreadisrunning”。(2)1-2.cpp程序运行1-2.cpp结果:■Z卞农档25实卧实醫一券述程2訪阳\1-2心已”bnairiithreadisrunning1pnainthreadisrunning2bnairiithreadisrunning4pnainthreadisrunningGbnairiithreadisrunning7nnainthreadisrunning8bnairiithreadisrunning9nnainthreadisrunningL0unainithreadisrunrilingLIpnainthreadisrunningL2uhairtthreadismiming13nnainthreadisrunningL4bnaitithreadisrunrking15pnainthreadisrunningLGbnaiDithreadisrunriling4thr&ad2isrunning5”nainthreadisrunriling2thr&adlisrunning3hreadlisrunning19hrsad.1isrunning20bnainthresdisrunning17hr&ad2isrunning18PressanykeyTocontinue分析原因:1-2.cpp文件使用的是时间片轮转方法调度的主线程、线程1、线程2•因此不需要sleep语句就可将主线程调度。因为在两个线程中存在共享变量,因此执行结果出现不可再现性。(3)1-3.cpp程序运行1-3.cpp结果:>''F:5宴验'宴验一辜连程W亡bug\1-3(tickets).exe1hjainthreadiwrunningpnainT-hreadisrjnniEgthreadlisselltickets:40anykeytoco'ntimie
将main函数中注释掉的Sleep语句让其可用,运行结果为:亘:・F:佼档实验肉宰城程-3(tick亡⑸心己‘luaintbreadisrunningniAinthreadisrunningthread1isselltickets::40threadlisselltickets::38threadlisselltickets::37threadlissei1tickets:36threadlisselltickets:35threadlisselltickets:34tlireadlisselltickets:33threadlissei1tickets32threadlisselltickets::31threadlisselltickets:30tlireadlisselltickets:29thread2isselltickets:39threadsisselltickets:27tliread2isselltickets:2Gtliread2isselltickets:25thread?isselltickets:24thread2isselltickets:23tliread2isselltickets:22thread2issei1tickets::21thread2isselltickets:20thread?isselltickets:19thread2isselltickets18thread2issei1tickets:17threadsisselltickets:16thread2isselltickets:15thread2isselltickets14thread2issei1ticl<Ets:131■ ■ H« 3b ■_II; H 将两个子函数中注释掉的Sleep语句让其可用,运行结果:U'F:咬档实验\实验一^H\Debug\1-3(tickets].exenpnainthreadisrunningihreadlissellthreadU'F:咬档实验\实验一^H\Debug\1-3(tickets].exenpnainthreadisrunningihreadlissellthread1issei1thread2iisellthread^is3ellthread2issellihreadlissellthreadsi?sei1thread2issellihreadlissellrhread2issei1threadsiisellthread]i-sei'thread^issellLhreadSissellthread]i-sei1ticke1t£:40tickets:40tickets:39tickets:38tickets:38:icketi;;37tickets:36tickets!36Lickett;:35tickets:34tickets:34tickets:33tickets:32ticka1tE:32tickets:31tthheread2asseils1tickeckets:s:3029tthheread.2asseilssolitickeckets:s:3029rhread2isse工tickets:28thread^iisellLicketis:28thread]isselltickets:27thread^isselltickets:26ihread2isL;ell:icketis:26thread1issei1tickets:25thread2iirhread2issellLithetis:1isselltickets:2324se1'tithets:Lissellticketsthread2iirhread2is分析原因:加入两个sleep(1)后,有可能到threadlisselltickets:时间片就停了,tickets没一,还可以运行thread2isselltickets:"〈〈tickets—也就是说tickets变为0,返回再运行threadlisselltickets时就卖0号票了。【实验思考及总结 :加入循环,使得两个进程可以交替执行。Sleep是阻塞线程函数。它会在当前语句阻塞一段时间,参数是以1/1000秒为单位的。线程也有父子关系。父进程退出后子进程也会退出。不可再现性:两个进程同时迈出同一部步,两个进程中存在共享变量。实验二Windows线程同步机制【开发语言及实现平台或实验环境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【实验目的】了解Windows线程同步机制;了解互斥体,并通过查阅资料理解互斥体对象的使用方法;了解事件,并通过查阅资料理解事件对象的使用方法;了解关键区,并通过查阅资料理解关键区对象的使用方法;了解信号量,并通过查阅资料理解信号量对象的使用方法;⑹利用Windows线程同步机制,模拟生产者消费者问题。【实验要求】逐程序进行简要分析、运行各程序并仔细阅读注释;查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;完成实验报告。【实验结果与分析】(1)2-1(mutex).cpp程序运行2-l(mutex).cpp结果:
1"F:破档验验二日步'Debug\2-1(nnJtex).exethread!sellticket::40threadlsellticket::40maintbreadisrunningthread!selltickst::39thread?sellticket::38thread!sei1ticket::37thread2sellticket::36thread!sellticket::35thieadEsellticket::34thread!sei1tic:ket:33thread2sellticket:32thread!sellticket:31threadssellticket:30thread!sellticket;29thread2sellticket:28threadlsellticket:27thread?sei1ticket:26thread!sellticket:25thread?sellticket:24thread!sei1ticket:23thread2sellticket;22thread!sellticket:21thread^sellticket:20thread!sei1:19thread2sellticket:18thread!sellticket:17threadssellticket:16thread!sellticket;15thread2sellticket:14将两个子函数中注释掉的Sleep语句让其可用,运行结果:12'F:切纽实钛实脸二[^\Detug\2-1(mutexj.exe-mainthreadis:runningthreadlsei1ticket::40thread^sellticket:39tlireadlsellticket:38tbreadssellticket:37threadlsellticket:36thread^sellticket:35threadlsellticket:34thread.2sellticket:33■threadlsellticket:32thread?sellticket:31threadlsei1ticket:30thread2sellticket:29tlireadlselltick巳t:28■thread.2selltick巳t:27threadlsellticket:26thread.2sellticket:25threadlsellticket:24thread.2sellticket:23threadlsellticket:22thread2sei1ticket::21threadlsei1ticket:20tlireadSsellticket:19tlireadlsellticket:18■thread.2sellticket:17threadlsellticket:16thrcad.2sellticket:15threadl£©11ticket:14thread2£911ticket:132-2(event).cpp程序运行2-2(event).cpp结果:ticket:40ticket:39ticket:38ticket:37ticket:36ticket:35■ticketticket:40ticket:39ticket:38ticket:37ticket:36ticket:35■ticket:34■ticket:33ticket:32■ticket:31ticket:30ticket:29ticket:28ticket:27ticket:26ticket:25ticket:24ticket:23ticket:22ticket:21ticket:20ticket:19ticket:13tiuket:]7tiuket:16ticket:15ticket:14ticket:13U"F:该档宴验'盛验二^\Debug\2-2fevent].exenpainthreadisrunningthread!sei1thread2s©l1threadlsellthread2sei1rthreadlsei1rthread2sellrthreadlsei1rthread2sellthreadlsellrthread2sellthreadlsellthreadssellthreadlsei1threadssei1threadlsei1threadSsei1threadlsei1threadSsei1threadlsei1thread2sellthreadlsellthread2sei1threadlsellthread2sei1threadlsei1thread2sellthreadlsei1thread2sei1将两个子函数中注释掉的Sleep语句让其可用,运行结果:
■'"巳丈档\0绥验迄5验二同佗阻nt)©/mtiinthread:isrunningthreadlsellticket:40t:iread?sellticket:39■tar^adlsoilticket:38thread^sellticket:37thrcadlsellticket-:36■taroad2sellticket-:35■tarcadlsellticker:34thread2selltic殳航:33tareadlselltic除匸:32■taread2sellticker:31threadlsellticket:30thread?sei1ticket:291.:irecit]lsellticket:28thread?sellticket:27t:ireadlsellticket:26taread2sellticket:25threadlsellticket:24thread2sellticket-:23taroadlsellticker:22threadssellticket:2itarcadlselltic殳航:20thread^sellticker:19thread1sellticket:18thread?sellticket:17sei1ticket:16thread2sei1ticket:15sei1ticket:14thread^sellticket:132-3(critical_section).cpp程序运行2-3(critical_section).cpp结果:4040393837363534333231302928212625242322212019181.716151413III'F:懐图05实验偎验二同涉\D亡bug\2-3Kritiel,亡dzicmMxHmainthreadisrunningthreadlsellticket:threadlsellticket:tin^?adlsei1ticket:tbread1se]1ticket:threadlsellticket:threadlselltiuket■:thread1sellticket::thrsadlsellticket:thr^adlsellticket:tine^adlsei1ticket:tbread1se]1tiuket;threadlselltiuket:thread1selltiuket:threadlsellticket:threadlsellticket:threadlsellticket:tin^?adlsei1ticket:tbread1se]1ticket:threadlsellticket:threadlsellticket■:thread1sellticker:thrsadlsellticket:thr^adlsellticket:tinsei1ticket:tbread1se]1tiuket;threadlselltiuket:thread1selltiuket:threadlselltiukec:将两个子函数中注释掉的Sleep语句让其可用,运行结果:
■7"F:\^\OS^:\^^ra^\Debdg\2-3(critical_sectioni.exemainthreadisrunningthreadlsellticket:40thr&ad2sellticket:39threadlsellticket:33thread2selltiuk巳t:37threadlsei1ticket:36thread2sellticket:35threadlselltieket:34Lliread2sellticket:33threadlsei1tinket:32thread2sellticket::31threadlselltiuket:30Lhread2sellticket:29threadlsei1ticket:23thread2sellticket:27threadlselltieket:26Lhread2sellticket:25threadlsei1ticket:24thr©ad2selltieket:23threadlsellticket:22Lliiead2sellticket:21threadlsellticket:2Dthr©ad2selltiukot:19threadlsellticket:18Lliiead2sellticket:17threadlsellticket:ISthread2sellticket:15threadlsellticket:14thread2sei1tinket:13r”r- i■■- 2 A分析原因:2-l(mutex).cpp、2-2(event).cpp、2-3(critical_section).cpp的处理方式相同,不会出现销售出0号票的情况原因相同:修改之前,在指定暂停的时间Sleep(lOOO)内,threadl和thread2随机售票,出现多种情况;将两个子函数中注释掉的Sleep(1)语句让其可用后,threadl和thread2交替售票,即threadl在其暂停的时间Sleep(1)内,thread2获得了对共享对象hMutex的所有权,开始售票,同理当thread2在其暂停的时间Sleep⑴内,threadl获得了对共享对象hMutex的所有权,开始售票,这样threadl和thread2就实现了交替售票,不会出现销售出0号票的情况。2-4(Producer_Consumer).cpp程序运行2-4(Producer_Consumer).cpp结果:E下:\文档\。5实验\实验二同歩\Detiug吃吃弭mainthreadisrunningProducerisrunning:1Consmn&risrunning:1Hressanykeytocontinue将两个子函数中注释掉的while语句让其可用,运行结果:■J下:说档怕S实验\实验二HW)ebug\2-4<ProducerConsumeO-exe"mainthreadisrunningProducerismiming::1卩roducerisrunnirg::7Consumerisrunning::2Producerisrunning::2Consumerisrunning::?Producerisrunning::2Conzumerisrunning::2Producerisrunning:2Consumerisrunning:2Producerismiming:2Consumerisrunning:2Producerisrunning:2Conzuinerisrunning:2Producerisrunning:2Consuinerisrunning:2Producerismiming:2Consumerisrunning:2卩reducerisrunnirg:TConsumerisrunning:2Producerisrunning:2Consumerisrunnirg:7Producerisrunning:2Consumerisrunning:2卩reducerisrunnirg:?Consumerisrunning:2Producerisrunning:2Consumerisrunnirg:TProducerisrunning:2分析原因:修改之前,在指定暂停时间sleep(20)内,producer和consumer只能执行一次;将两个子函数中注释掉的while语句让其可用后‘producer和consumer在指定暂停时间sleep(20)内,随机循环获得共享对象的所有权,进行生产或消费,从而出现多种结果。2-4(Producer_Consumer)l.cpp程序运行2-4(Producer_Consumer)1.cpp结果:
<2"F:该档实验\实验二^\Debug\2-^(ProdiJcer_Consume01,exentnainthreadisrunningmainthreadisrunningProducer1isrunning::1ProduceTlisrurning::2Consumer!isrunning::2卩roducer2isrurning::2ProduceTlisrurning::3Consumer2isrunning::3Producer2isrurning::3Consumer1isrunning:3ProduceTlisrurning:3Consumer2isrunning;;3Producer^13rurning:3Consumer1isrurning3Producer1isrurning:3ConsumeT2isrurning:3Pi'odLicer2匕rurniiig:3ConsumeTlisrurning:3Producer1isrunning;:3Conjumer^13rurning:3ProduceT2irunning:3ConsumeTlisrurning:3Producer1isrurning:3Consumer2isrurning:3Producersisrurning:3Consumer1isrunning:3ProduceTlisrurning:3GonsLimer2isrunning;:3ProduceT2isrurning:3Lh卜2— \& 【实验思考及总结 :Sleep(lO)使当前线程放弃目前的时间片,并且在10ms内不会被再次调度。进程也有父子关系。父进程退出后子进程也会退出。线程之间的同步使用一些核心对象:如thread,process,evnet,mutex,semaphore.。在线程之间使用等待函数如WaitForSingleObjects,WaitForMultipleObjects.等待函数使用核心对象的handle作为参数,如果handle被激发,则执行下一步。handle被激发的条件:(handle是一段内存指针,为了掩藏内部实现而做的一个类型转化指针)激发: 资源未被占用。未激发: 资源正在被占用。eg:thread,process被终止,则激发。event:要通过它的API来手动激发,是最灵活的激发方式,可被所有线程使用。mutex:没被任何线程所拥有,则激发。实验三Windows线程通信【开发语言及实现平台或实验环境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【实验目的】了解Window线程通信方法;了解匿名管道,并通过查阅资料理解匿名管道的使用方法;了解命名管道,并通过查阅资料理解命名管道的使用方法;【实验要求】逐程序进行简要分析、运行各程序并仔细阅读注释;查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;完成实验报告。【实验结果与分析】(1)匿名管道:先编译Child工程,然后运行Parent工程,再在Parent中创建管道和子进程,然后双方即可通过管道通信。如下图所示:
(2)命名管道:Server和Client各自运行,再在Server中创建命名管道,然后在Client中连接管道,最后双方即可通过管道通信。如下图所示:注:相关代码卷View.虫p中(3)(实验三选做题目):在客户端输入数据a和b,然后发送到服务器并计算a+b,然后把计算结果发送到客户端。可以多个客户端与同一个服务器并行通信。相关代码:客户端://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_MSGDECLARE_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//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_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'smainwindowisnotadialogSetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE); //Setsmallicon//TODO:AddextrainitializationherereturnTRUE;//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);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);//CentericoninclientrectangleintcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//Drawtheicondc.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_MSGDECLARE_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//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_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'smainwindowisnotadialogSetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE); //Setsmallicon//TODO:AddextrainitializationherereturnTRUE;//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);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);//CentericoninclientrectangleintcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//Drawtheicondc.DrawIcon(x,y,m_hIcon);}else{CDialog::OnPaint();}}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCSDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}运行结果如下图:Kt-O-JkL曲|CSnY?rt)lg■+jSnrv^r■ciwcvb:f?ri*UB«*Vil47rDnl>*t-rfxch-an|K-(U-at-aEniu«gr4|#i)m^lafj Banguip*i.)•/H^AFi^DA7/MTE?MrCci■昭沖临小灯mil-addWindDM<-»L15//JJHFi.lWiift.fflPEftlriHE器wbE■AFiCj«rw^Dlgl.ttialag}ffl_W_5V5CI*«iH)4l>E4I_WPAIHlqUEFIrtUi[CDI^)M-lM-DESTt*T()(HlULIC晖啊IDQECI[怔》DnfcHLT2zEl»l[twnu-ri^-E^flvriu-C#tS9£V««Hmu{FAl-££)•iF4pSyrfitlHiut-IM"kcniwiCEtriajFtrMhwtMrnu;SCrM+iCWnU.LtMStrlAftlt^i_ABVVlHKt£If(SftHAbQUtltaJ.f5fsKrntt-J*wrndHe«w(^_.EEraS!DR>EFSf5*nqi-^«wrndHe«v(.]Dt«_wrBnKP5-tr4boutHe««);//Srtt*+icnnF皆this4i-»l«q. >**FrjwH<r*dorstsisautnn*ti<-allu]~hBaak-diJIthi<\、~FandinFl]-ixL~X~F“dznF 2~\F^znJiaE/"■KiHcrn【实验思考及总结】(1)在VC++6.0中open已经编译好的程序,选择所有文件,线程之间通信的两个基本问题是互斥和同步。线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows的.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥是一种特殊的线程同步。(2)互斥和同步对应着线程间通信发生的两种情况:1)当有多个线程访问共享资源而不使资源被破坏时;2)当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。(3)在WIN32中,同步机制主要有以下几种:事件(Event);信号量(semaphore);互斥量(mutex);临界区(Criticalsection)。(4)全局变量因为进程中的所有线程均可以访问所有的全局变量,因而全局变量成为Win32多线程通信的最简单方式。实验四银行家算法模拟【开发语言及实现平台或实验环境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2003【实验目的】(1)进一步理解利用银行家算法避免死锁的问题;(2)在了解和掌握银行家算法。(3)理解和掌握安全序列、安全性算法【实验内容】(1)编写安全性算法;(2)编写银行家算法,并编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。【源代码】#include<iostream.h>#include<string.h>#defineM3 //资源的种类数#defineN5 //进程的个数voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);//统一的输出格式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;//当前可用每类资源的资源数intiAvailable[M]={3,3,2};//系统中N个进程中的每一个进程对M类资源的最大需求intiMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};〃iNeed[N][M]每一个进程尚需的各类资源数〃iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数intiNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//进程名charcName[N]={'a','b','c','d','e'};boolbExitFlag=true; //退出标记charch; //接收选择是否继续提出申请时传进来的值boolbSafe; //存放安全与否的标志〃计算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);//判断当前状态是否安全bSafe=safety(iAllocation,iNeed,iAvailable,cName);//是否继续提出申请while(bExitFlag){coutvv"\n"vv"继续提出申请?\ny为是;n为否。\n";cin>>ch;switch(ch){case'y'://coutvv"调用银行家算法";bSafe=banker(iAllocation,iNeed,iAvailable,cName);if(bSafe) //安全,则输出变化后的数据output(iMax,iAllocation,iNeed,iAvailable,cName);break;case'n':coutvv"退出。\n";bExitFlag=false;break;default:coutvv"输入有误,请重新输入:\n";}}}//输出voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]){inti,j;coutvv"\n\tMax\tAllocation\tNeed\tAvailable"vvendl;coutvv"\tABC\tABC\tABC\tABC"vvendl;for(i=0;ivN;i++){coutvvcName[i]vv"\t";for(j=0;jvM;j++)coutvviMax[i][j]vv"";coutvv"\t";for(j=0;jvM;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;}}〃安全性算法,进行安全性检查;安全返回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";coutvv"当前时刻系统的一个安全序列为:";for(x=0;x<N;x++)cout<<Name[x]<<"";cout<<"\n";returntrue;}if(flag==0){coutvv"无安全序列";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){coutvv"请输入进程名:";cin>>x;for(i=0;ivN;i++)if(cName[i]==x){i=i;break;}if(i==5)coutvv"\n您输入的进程名有误!请重新输入";elsef=false;}coutvv"请输入申请各类资源数量:\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){coutvv"\n资源申请超过最大需求量!!!\n";returnfalse;}}for(j=0;j<M;j++){if((iAvailable[j]-Request[j])<0){cout<<"\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;}
【实验结果与分析】■'"F:懐档\O政那实蹩四银行彖耳法2出阳\银行謔法Stu^nt}心『MBA
ABC
7 5 32 MBA
ABC
7 5 32 29 0 22 匸 23 3NeedAB
7 41260
014 3C22011AvailciuleABC3 3 2为前时劇强纺的一个安全序列为:bde继续提出屮请?y为是:n沖否.y诸输入进程名:a请输入中清各类资源数虽;332无安全序列■"卜;档实牌冥適□银行^S\Debug\^疔杲亘选时朝別旳心己‘I请输入申请各类资源数量^332尤安2序列t:d73924Max55t:d73924Max552023C3227AllocationA夕400103320C3021941604Need彳12013C
D2011AvailableABC000继线提出申请?”为島虹为否「佝输入进程名:请输入申请各盜资源数量土555资源申话超迂最大需求量!!【实验思考及总结】银行家算法的安全算法不唯一,我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。实验五页面置换算法模拟【开发语言及实现平台或实验环境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2003【实验目的】进一步理解利用页面调度算法实现虚拟内存的问题;通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点。掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。了解页面大小和内存实际容量对命中率的影响。【实验内容】在了解和掌握页面调度算法的基础上,编制先进先出的算法(FIFO)、最近最少使用算法(LRU)、最佳淘汰算法(OPT)等各种页面置换算法。将调试结果显示在计算机屏幕上,再检测和笔算的一致性。理解和掌握命中率的问题会使用某种编程语言。【源代码】#include<iostream>#defineM3#defineN20usingnamespacestd;structblock{intiPageNum; //物理块里存储的页面号intiBlockFlag; 〃在三种算法中用到的标记。例如在FIFO中为在内存中的时间};//算法模拟移位寄存器原理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};//页面引用串intflag[N]; //缺页标记;1为缺页,0为不缺页,在统计缺页次数时用inti;boolbExitFlag=true; //退出标记charch; //接收选择算法时传进来的值while(bExitFlag){coutvv"\n"vv"请选择页面置换算法:\n";coutvv"f:FIFO置换算法\to:OPT置换算法\tl:LRU置换算法\tx:退出置换算法程序.\n";cin>>ch;//初始化数据if((ch=='f')||(ch=='o')||(ch=='l')){for(i=0;i<N;i++)flag[i]=0; //初始化缺页标记为0,即不缺页}switch(ch){case'f':coutvv"FIFO置换算法的结果是:\n";FIFO(iPageString,flag,myBlock);〃用PageNum(flag)统计缺页次数cout<<"\n缺页次数为"vvPageNum(flag)vvendl;break;case'o':coutvv"OPT置换算法的结果是:\n";Optimal(iPageString,flag,myBlock);cout<<"\n缺页次数为"vvPageNum(flag)vvendl;break;case'l':coutvv"LRU置换算法的结果是:\n";LRU(iPageString,flag,myBlock);cout<<"\n缺页次数为"vvPageNum(flag)vvendl;break;case'x':coutvv"退出置换算法。\n";bExitFlag=false;break;default:coutvv"输入有误,请重新选择置换算法:\n";}}}//对数组中的数累加,用来统计缺页次数时用intPageNum(intarray[]){intnum=0;for(intj=0;j<N;j++)num=num+array[j];returnnum;}//定位函数,在最佳算法中用于定位;//定位物理块中的某一个页面在引用串中还未访问串中页面的位置intallocate(intiPage,intiLoc,intiTempPage[N]){inti;for(i=iLoc;i<N;i++){if(iPage==iTempPage[i])returni;}〃永远不再访问的页面位置假定为NreturnN;}//找数组中最大值所在的下标,返回最大值在数组中的位置(下标),三种算法中都用到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;}//输出数据voidoutput(intiPage,intflag,blockmyBlock[M],intblockNum){intj;//如果缺页则输出缺页标志,否则不输出if(flag==1)cout<<"\n"<<flag;elsecout<<"\n";cout<<"\t"<<iPage;for(j=0;j<blockNum;j++)cout<<"\t"<<myBlock[j].iPageNum;}//初始化物理块的内容,因任一种算法在物理块内容为空时,结果都一样的//同时将目前物理块中的内容输出voidInitialBlock(intiTempPage[N],intflag[N],blockmyBlock[M]){inti;for(i=0;i<M;i++){//初始化物理块的内容,因任一种算法在物理块内容为空时,结果都一样的myBlock[i].iPageNum=iTempPage[i];〃myBlock[i].iBlockFlag的值:0为最后进来的,数越大表示进来的越早//在最佳置换算法中则初始化此值没有意义myBlock[i].iBlockFlag=(M-1)-i;flag[i]=1; //此时为缺页}//输出coutvv"\n缺页\t引用串\t物理块l\t物理块2\t物理块3";for(i=0;i<M;i++)output(iTempPage[i],flag[i],myBlock,i+l);}//FIFO置换算法voidFIFO(intiTempPage[N],intflag[N],blockmyBlock[M]){inti,j,k,loc;//初始化物理块的内容,因任一种算法在物理块内容为空时,结果都一样的//同时将目前物理块中的内容输出InitialBlock(iTempPage,flag,myBlock);//从引用串中的第4个页面开始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){//查找最先进来的页面,也就是block中iBlockFlag最大的物理块loc=max(myBlock);myBlock[loc].iPa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030科学视觉照相机行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025-2030睡袍行业并购重组机会及投融资战略研究咨询报告
- 2025-2030皮肤科用药行业市场发展分析及发展趋势前景预测报告
- 2025-2030登山靴行业风险投资发展分析及投资融资策略研究报告
- 2025-2030电热水器产业行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030特色餐饮行业市场发展前景及发展趋势与投资机会研究报告
- 2025-2030牙膏行业市场深度调研及供需格局与投资前景研究报告
- 2025-2030燃气汽车行业市场发展现状分析及竞争格局与投资价值研究报告
- 2025-2030洗涤用品行业兼并重组机会研究及决策咨询报告
- 2025-2030汽车保险行业市场发展分析及发展前景与投资机会研究报告
- 安全生产、文明施工资金保障制度11142
- 安徽省C20教育联盟2024-2025学年九年级下学期3月月考数学试题 (原卷版+解析版)
- 2025新疆机场(集团)有限责任公司阿克苏管理分公司第一季度招聘(75人)笔试参考题库附带答案详解
- 2025年高级育婴师的试题及答案
- 中药性状鉴定技术知到课后答案智慧树章节测试答案2025年春天津生物工程职业技术学院
- 2025年北京电子科技职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- GB/T 45120-2024道路车辆48 V供电电压电气要求及试验
- 2025年广东深圳市职业病防治院选聘事业单位常设岗位3人历年高频重点提升(共500题)附带答案详解
- 儿童哮喘预防
- 人工智能设计伦理知到智慧树章节测试课后答案2024年秋浙江大学
- 《陆上风电场工程概算定额》NBT 31010-2019
评论
0/150
提交评论