计算机操作系统实验指导.doc
《计算机操作系统实验指导.doc》由会员分享,可在线阅读,更多相关《计算机操作系统实验指导.doc(177页珍藏版)》请在三一办公上搜索。
1、第二章 windows的进程管理2.1 实验一:线程的创建与撤销2.1.1 实验目的(1)熟悉windows系统提供的线程创建与撤销系统调用.(2)掌握windows系统环境下线程的创建与撤销方法.2.1.2 实验准备知识1.线程的创建CeateThread()完成线程的创建.它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立的线程的句柄.原型:HANDLE CeateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPSECURITY_START_ROUTINE lpStartAddress,
2、LPVOID lpparameter,DWORD dwCreationFlags,LPDWORD lpThreadId);参数说明:(1)lpThreadAttributes:为线程指定安全属性.为NULL时,线程得到一个默认的安全描述符.(2)dwStackSize:线程堆栈的大小.其值为0时,其大小与调用该线程的线程堆栈大小相同.(3)lpStartAddress:指定线程要执行的函数.(4)lpparameter:函数中要传递的参数.(5)dwCreationFlags:指定线程创建后所处的状态.若为CRRATE_SUSPENDED,表示创建后出于挂起状态,用ResumeThread()
3、激活线程才可以执行.若该值为0,表示线程创建后立即执行.(6)lpThreadId:用一个32位的变量接受系统返回的线程标识符.若该值设为NULL,系统不返回线程标识符.返回值:如果线程创建成功,将返回线程的句柄;如果失败,系统返回NULL,可以调用函数GetLastError查询失败的原因.用法举例:static HANDLE hHandle1=NULL; /用于存储线程返回句柄的变量DWORD dwThreadID1; /用于存储线程标识符的变量/创建一个名为ThreadName1的线程hHandle1=CeateThread(LPSECURITY_ATTRIBUTES) NULL 0,
4、(LPSECURITY_START_ROUTINE)ThreadName1, (LPDWORD)NULL, 0,&dwThreadID1);2.撤销进程ExitThread()用于撤销当前进程.原型:VOID ExitThread(DWORD dwExitCode); /线程返回码参数说明:dwExitCode:指定线程返回码,可以调用GetExitCodeThread()查询返回码的含义.返回值:该函数没有返回值.用法举例:ExitThread(0); /参数0表示要撤销进程中的所有线程3.终止线程TerminateThread()用于终止当前线程.该函数与ExitThread()的区别在于
5、,ExitThread()在撤销线程时将该线程所拥有的资源全部归还给系统,而TerminateThread()不归还资源.原型:BOOL TerminateThread(HANDLE hHandle, /线程句柄DWORD dwExitCode); /线程返回码参数说明:(1)hThread:要终止线程的线程句柄.(2)dwExitCode:指定线程返回码,可以调用GetExitCodeThread()查询返回码的含义.返回值:函数调用成功,将返回一个非0值;若失败,返回0,可以调用函数GetLastError()查询失败的原因.4.挂起线程Sleep()用于挂起当前正在执行的线程.原型:VO
6、ID Sleep(DWORD dwMilliseconds);参数说明:dwMilliseconds;指定挂起时间,单位为ms(毫秒).返回值:该函数没有返回值.5.关闭句柄函数CloseHandle()用于关闭已打开的对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使线程安全运行.原型:BOOL CloseHandle(HANDLE hObject);参数说明:hObject:已打开对象的句柄.返回值:如果函数调用成功,则返回值为非0值;如果函数调用失败,则返回值为0.若要得到更多的错误信息,调用函数GetLastError()查询.2.1.3实验内容使用系统调用Cre
7、atThread()创建一个子线程,并在子线程中显示;Thread is Running!.为了能让用户清楚地看到线程的运行情况,使用Sleep()使线程挂起5s,之后使用ExitThread(0)撤销进程.2.1.4实验要求能正确使用CreatThread(),ExitThread()及Sleep()等系统调用,进一步理解进程与线程理论.2.1.5实验指导本实验在WindowsXP,Microsoft Visual C+ 6.0环境下实现,利用Windows SDK提供的API完成程序的功能.实验在Windows XP环境下安装由于WindowsXP,Microsoft Visual C+
8、6.0是一个集成开发环境,其中包含了Windows SDK 所有工具和定义,所以安装了WindowsXP,Microsoft Visual C+ 6.0后不用特意安装SDK.试验中所有的API是操作系统提供的用来进行应用程序开发的系统功能接口.(1)首先启动安装好的,Microsoft Visual C+ 6.0.(2)在,Microsoft Visual C+ 6.0环境下选择File-new命令,然后在Project选项卡中选择Win32 Console Application建立一个控制台工程文件.(3)由于CreatThread()等函数是Microsoft Windows操作系统的系
9、统调用,因此,在下图中选择An application that supports MFC,之后单击Finish按钮.(4)之后将打开,Microsoft Visual C+ 6.0编辑环境(见下图),按本实验的要求编辑C程序,之后编辑,链接并运行该程序即可.2.1.6实验总结在Windows系统中进程是资源的拥有者,线程是系统调用的单位.进程创建后,其主线程也随即被创建.在该实验中,有创建了一个名为ThreadName1的子线程,该子线程与主线程并并发的被系统调度.为了能让用户清楚地看到线程的运行情况,在主线程创建了子线程之后,将主线程挂起5s,以确保子线程能够运行完毕,之后调用ExitTh
10、read(0)将所有线程撤销.线程运行如下图所示.2.1.7 源程序/ ThreadCreate.cpp : Defines the entry point for the console application./#include stdafx.h#include ThreadCreate.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ The one and only application objectCWinApp theApp;using namespa
11、ce std;void ThreadName()printf(Thread is Running!n);static HANDLE hHandle1=NULL; / /需要改成hHandleDWORD ThreadID1; /需要改成ThreadID int _tmain(int argc, TCHAR* argv, TCHAR* envp)int nRetCode = 0; hHandle=CreateThread(LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) ThreadName,(LPVOID)NULL,0,&ThreadI
12、D);ThreadName(); /需要在这里添加一个调用ThreadName()1; /需要在这里添加一个调用Sleep(5000);CloseHandle(hHandle);ExitThread(0);return nRetCode; / initialize MFC and print and error on failureif (!AfxWinInit(:GetModuleHandle(NULL), NULL, :GetCommandLine(), 0)/ TODO: change error code to suit your needscerr _T(Fatal Error: M
13、FC initialization failed) endl;nRetCode = 1;else/ TODO: code your applications behavior here.CString strHello;strHello.LoadString(IDS_HELLO);cout (LPCTSTR)strHello endl;return nRetCode;void ThreaName1()Printf(“Thread is Runing!n”);2.1.8 实验展望可以进一步完善程序功能,请思考以下问题.(1)如何向线程对应的函数传递参数?一个参数如何传递,多个参数又如何传递?(2
14、)深入理解线程与进程的概念,在Windows环境下何时使用进程,何时使用线程?2.2实验二:线程的同步2.2.1 实验目的进一步掌握windows系统环境下线程的创建和撤销熟悉windows系统提供的线程同步API使用windows系统提供的线程同步API解决实际问题2.2.2 实验准备知识:相关API函数介绍2.2.21等待对象等待对象(wait fuctions)函数包括等待一个对象(WaitForSingleObject()和等待多对象(WaitForMultipleObject()两个API函数。等待一个对象WaitForMultipleObject()用于等待一个对象。他等待的对象可
15、以为以下对象之一。Change notification:变化通知。Console input:控制台输入。Events:事件。Job:作业。Mutex:互斥信号量。Process:进程。Semaphore:计数信号量。Thread:线程。Waitable timer:定时器。 原型:DWORD WaitForSingleObject(HANDLE hHandle, /对象句柄DWORD dwMilliseconds /等待时间);参数说明:hHandle:等待对象的对象句柄。该对象句柄必须为SYNCHRONIZE访问。dwMilliseconds:等待时间,单位为ms。若改值为0,函数在测试
16、对象的状态后立即返回,若为INFINITE,函数一直等待下去,直到收到一个信号将其唤醒,如表2-1所示。 返回值:如果返回成功,其返回值说明是何种事件导致函数返回。表2-1 函数描述 访问 描述WAIT_ABANDONED 等待对象的是一个互斥(mutex)对象,该互斥对象没有被拥有它的线程释放,他被设置为不能被唤醒WAIT_OBJECT_0 指定对象被唤醒WAIT_TIMEOUT 超时用法举例:Staitic HANDLE hHandle1=NULL;DWORD dRes;dRes=WaitForSingleObject(hHandle1, 10); /等待对象的句柄为hHandle,等待时
17、间为1000ms等待多个对象WaitForMultipleObject()在指定时间内等待多个对象,他等待的对象与WaitForSingleObject()相同。原型:DWORD WaitForMultipleObject(DWORD nCount, /句柄数组中的句柄数XONST HANDLE *lpHandles, /指向对象句柄数组的指针BOOL fWaitAll, /等待类型DWORD dwMilliseconds /等待时间);参数说明:nCount:由指针*lpHandles指定的句柄数组中的句柄数,最大数是MAXIMUM_WAIT_OBJECTS。*lpHandles:指向对象句
18、柄数组的指针。fWAitAll:等待类型。若存为true,当由lpHandles数组指定的所有对象被唤醒时函数返回;若为FALSE,当由lpHandles数组制定的某一个对象被唤醒时函数返回,且有返回值说明事由哪个对象引起的函数返回。dwMilliseconds :等待时间。单位为ms。若该值为0,函数测试对象的状态后立即返回;若为INFINITE,函数一直等待下去,直到收到一个信号将其唤醒。 返回值:如果成功返回,其返回值说明是何种事件导致函数返回。各参数的描述如表2-2所示。表2-2各参数描述 访问 描述WAIT_OBJECT_0 to (WAIT_OBJECT 若bWaitAll为TRU
19、E,返回值说明所有被等待的对象均被唤醒;若_0+nCount-1) bWaitAll为FALSE。返回值减去WAIT_OBJECT_0说明lpHandles数组下标指定的对象满足等待条件。如果调用时多个对象同时被唤醒,则取多个对象中最小的那个数组下标WAIT_ABANDONED_0 to 若bWaitAll为TRUE,返回值说明所有被等带的对象均被唤醒,并且(WIAT_ABANDONED-0+NcOUNT-1) 至少有一个对象是没有约束的互斥对象;若bWaitAll为FALSE,返回值减去WAIT_ABANDONED_0说明lpHandles数组下标指定的没有约束的互斥对象满足等待条件WAIT
20、_TIMNEOUT 超时且参数bWaitAll指定的条件不能满足信号量对象(semaphore)信号量对象(semaphore)包括创建信号量(CreateSemaphore()打开信号量OpenSemaphore()及增加信号量的值(ReleaseSemaphore()函数。创建信号量CreateSemaphore()用于创建一个信号量。原型:HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,/安全属性LONG lInitialCount, /信号量对象初始值LONG liMaximumCount, /信号量
21、最大值LPCTSTR lpName/信号量名);参数说明:lpSemaphoreAttributes:指定安全属性,为null是,信号量得到一个默认的安全描述符。lInitialCount:指定信号量对象的初始值。该值必须大于等于0,小于等于lMaximumCount 。当其值大于0是,信号量被唤醒。当该函数释放了一个等待该信号量的线程时,lInitialCount值减1,当调用函数ReleaseSemaphore()时,按其指定的数量加一个值。lMaximumCount:指出该信号量的最大值,该值必须大于0.lpName:给出该信号量的名字。返回值:信号量创建成功,将返回该型号量的句柄。如果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 实验 指导
链接地址:https://www.31ppt.com/p-2882197.html