操作系统实验2015-2016学年第一学期专业:计算机科学与技术班级:学号:姓名:日期:计算机操作系统实验报告1实验一Windows多线程【开发语言及实现平台或实验环境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【实验目的】(1)进一步理解操作系统的并发性;(2)了解Windows线程创建方法,并通过查阅资料理解各参数的含义;(3)了解多线程程序设计方法,并进行简单应用。【实验要求】(1)逐程序进行简要分析、运行各程序并仔细阅读注释;(2)查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;(3)完成实验报告。【实验结果与分析】(1)1-1.cpp程序运行1-1.cpp结果:将main函数中注释掉的Sleep语句让其可用,运行结果为:2分析原因:Sleep(0)的作用为语句可观察线程1和主线程并发执行。输出结果“mainthreadisrunning/thread1isrunning”。没有添加的线程1运行结束只输出“mainthreadisrunning”。(2)1-2.cpp程序运行1-2.cpp结果:分析原因:1-2.cpp文件使用的是时间片轮转方法调度的主线程、线程1、线程2.因此不需要sleep语句就可将主线程调度。因为在两个线程中存在共享变量,因此执行结果出现不可再现性。(3)1-3.cpp程序运行1-3.cpp结果:3将main函数中注释掉的Sleep语句让其可用,运行结果为:将两个子函数中注释掉的Sleep语句让其可用,运行结果:4分析原因:加入两个sleep(1)后,有可能到thread1isselltickets:时间片就停了,tickets没--,还可以运行thread2isselltickets:tickets—也就是说tickets变为0,返回再运行thread1isselltickets时就卖0号票了。【实验思考及总结】………………………(1)加入循环,使得两个进程可以交替执行。(2)Sleep是阻塞线程函数。它会在当前语句阻塞一段时间,参数是以1/1000秒为单位的。(3)线程也有父子关系。父进程退出后子进程也会退出。(4)不可再现性:两个进程同时迈出同一部步,两个进程中存在共享变量。.5实验二Windows线程同步机制【开发语言及实现平台或实验环境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【实验目的】(1)了解Windows线程同步机制;(2)了解互斥体,并通过查阅资料理解互斥体对象的使用方法;(3)了解事件,并通过查阅资料理解事件对象的使用方法;(4)了解关键区,并通过查阅资料理解关键区对象的使用方法;(5)了解信号量,并通过查阅资料理解信号量对象的使用方法;(6)利用Windows线程同步机制,模拟生产者消费者问题。【实验要求】(1)逐程序进行简要分析、运行各程序并仔细阅读注释;(2)查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;(3)完成实验报告。【实验结果与分析】(1)2-1(mutex).cpp程序运行2-1(mutex).cpp结果:6将两个子函数中注释掉的Sleep语句让其可用,运行结果:7(2)2-2(event).cpp程序运行2-2(event).cpp结果:8将两个子函数中注释掉的Sleep语句让其可用,运行结果:9(3)2-3(critical_section).cpp程序运行2-3(critical_section).cpp结果:10将两个子函数中注释掉的Sleep语句让其可用,运行结果:11分析原因:2-1(mutex).cpp、2-2(event).cpp、2-3(critical_section).cpp的处理方式相同,不会出现销售出0号票的情况原因相同:修改之前,在指定暂停的时间Sleep(1000)内,thread1和thread2随机售票,出现多种情况;将两个子函数中注释掉的Sleep(1)语句让其可用后,thread1和thread2交替售票,即thread1在其暂停的时间Sleep(1)内,thread2获得了对共享对象hMutex的所有权,开始售票,同理当thread2在其暂停的时间Sleep(1)内,thread1获得了对共享对象hMutex的所有权,开始售票,这样thread1和thread2就实现了交替售票,不会出现销售出0号票的情况。12(4)2-4(Producer_Consumer).cpp程序运行2-4(Producer_Consumer).cpp结果:将两个子函数中注释掉的while语句让其可用,运行结果:13分析原因:修改之前,在指定暂停时间sleep(20)内,producer和consumer只能执行一次;将两个子函数中注释掉的while语句让其可用后,producer和consumer在指定暂停时间sleep(20)内,随机循环获得共享对象的所有权,进行生产或消费,从而出现多种结果。(5)2-4(Producer_Consumer)1.cpp程序运行2-4(Producer_Consumer)1.cpp结果:14【实验思考及总结】………………………(1)Sleep(10)使当前线程放弃目前的时间片,并且在10ms内不会被再次调度。(2)进程也有父子关系。父进程退出后子进程也会退出。(3)线程之间的同步使用一些核心对象:如thread,process,evnet,mutex,semaphore.。在线程之间使用等待函数如WaitForSingleObjects,WaitForMultipleObjects.(4)等待函数使用核心对象的handle作为参数,如果handle被激发,则执行下一步。handle被激发的条件:(handle是一段内存指针,为了掩藏内部实现而做的一个类型转化指针)激发:---资源未被占用。未激发:---资源正在被占用。eg:1)thread,process被终止,则激发。2)event:要通过它的API来手动激发,是最灵活的激发方式,可被所有线程使用。3)mutex:没被任何线程所拥有,则激发。15实验三Windows线程通信【开发语言及实现平台或实验环境】C++/C#MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET【实验目的】(1)了解Window线程通信方法;(2)了解匿名管道,并通过查阅资料理解匿名管道的使用方法;(3)了解命名管道,并通过查阅资料理解命名管道的使用方法;【实验要求】(1)逐程序进行简要分析、运行各程序并仔细阅读注释;(2)查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;(3)完成实验报告。【实验结果与分析】(1)匿名管道:先编译Child工程,然后运行Parent工程,再在Parent中创建管道和子进程,然后双方即可通过管道通信。如下图所示:16(2)命名管道:Server和Client各自运行,再在Server中创建命名管道,然后在Client中连接管道,最后双方即可通过管道通信。如下图所示:注:相关代码在*View.cpp中17(3)(实验三选做题目):在客户端输入数据a和b,然后发送到服务器并计算a+b,然后把计算结果发送到客户端。可以多个客户端与同一个服务器并行通信。相关代码:客户端://CDlg.cpp:implementationfile//#includestdafx.h#includeC.h#includeCDlg.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public:CAboutDlg();//DialogData//{{AFX_DATA(CAboutDlg)enum{IDD=IDD_ABOUTBOX};18//}}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//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin3219m_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();//AddAbout...menuitemtosystemmenu.//IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX0xF000);CMenu