操作系统实验报告_第1页
操作系统实验报告_第2页
操作系统实验报告_第3页
操作系统实验报告_第4页
操作系统实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《操作系统》试验汇报试验序号:3试验项目名称:Windows基本进程管理学号姓名邝沃佳专业、班软金二班试验地点1-418指导教师李远敏试验时间/11/17一、试验目标及要求经过观察任务管理器,来观察各个进程动态信息。二、试验设备(环境)及要求一台WindowsXP操作系统计算机。计算机装有MicrosoftVisualStudioC++6.0专业版或企业版。三、试验内容与步骤预备知识·任务管理器,了解用户计算机上正在运行程序和进程相关信息。·Windows环境中编程。1)线程创建CreateThread()完成线程创建。它在调用进程地址空间上创建一个线程,执行指定函数,并返回新建立线程句柄。原型:

HANDLECreateThead(

LPSECURITY

ATTRIBUTESlpThreadAttributes,

//安全属性指针

DWORDdwStackSize,

//线程堆栈大小

LPTHREAD

STAPT

ROUTINElpStartAddress,

//线程所要执行函数

LPVOIDlpParameter,

//线程对应函数要传递参数

DWORDdwCreationFlags,

//线程创建后所处状态

LPDWORDlpThreadId,

//线程标识符指针);参数说明:(1)lpThreadAttributes:为线程指定安全属性。为NULL时,线程得到一个默认安全描述符。(2)dwStackSize;线程堆栈大小。其值为0时,其大小与调用该线程线程堆栈大小相同。(3)lpStartAddress:指定线程要执行函数。(4)lpParameter:函数中要传递参数。(5)dwCreationFlags:指定线程创建后所处状态。若为CREATE

SUSPENDED,表示创建后处于挂起状态,用ResumeThread()激活后线程才可执行。若该值设为0,表示线程创建后立刻执行。(6)lpThreadId:用一个32位变量接收系统返回线程标识符,若该值设为NULL,系统不返回线程标识符。返回值:

假如线程创建成功,将返回该线程句柄;假如失败,系统返回NULL,

能够调用函数GetLastError查询失败原因。使用方法举例:static

HANDLEhHandle1=NULL;

//用于存放线程返回句柄变量DWORDdwThreadID1;

//用于存放线程标识符变量//创建一个名为ThreadName1线程hHandle1=CreateThread(LPSECURITY

ATTRIBUTES)NULL,

0,

(LPTHREAD

STAPT

ROUTINE)ThreadNamel,

(LPVOID)NULL,

0,&dwThreadID1);2)撤消线程ExitThread();用于撤消当前线程。原型:

VOIDExitThread(

DWORDdwExitCode

//线程返回码);

参数说明:dwExitCode:指定线程返回码,能够调用GetExitCodeThread()查询返回码含义。返回值:

该函数没有返回值。使用方法举例:ExitThread(0);

//参数0表示要撤消进程中全部线程3)终止线程TerminateThread()用于终止当前线程。该函数与ExitThread()区分在于,

ExitThread()在撤消线程时将该线程所拥有资源全部偿还给系统,而

TerminateThread()不偿还资源。

原型:

BOOLTerminateThread(

HANDLE

hThread,

//线程句柄

DWORD

dwExitCode

//线程返回码);

参数说明:(1)hThread:要终止线程线程句柄。(2)dwExitCode:指定线程返回码,能够调用GetExitCodeThread()查询返回码含义。返回值:函数调用成功,将返回一个非0值;若失败,返回0,能够调用函数GetLastError()查询失败原因。4)挂起线程Sleep()用于挂起当前正在执行线程。原型:

VOIDSleep(

DWORDdwMilliseconds

//挂起时间);

参数说明:

dwMilliseconds:指定挂起时间,单位为ms(毫秒)。返回值:该函数无返回值。

5)关闭句柄

函数CloseHandle()用于关闭已打开对象句柄,其作用与释放动态申请内存空间类似,这么能够释放系统资源,使进程安全运行。原型:

BOOLCLoseHandle(

HANDLE

hObject

//要关闭对象句柄);参数说明:

hObject:已打开对象句柄。返回值:

假如函数调用成功,则返回值为非0值;假如函数调用失败,则返回值为0。若要得到更多错误信息,调用函数GetLastError()查询。3、试验内容

使用系统调用CreatThread()创建一个子线程,并在子线程序中显示:Thread

isRuning!。为了能让用户清楚地看到线程运行情况,使用Sleep()使线程挂起5s,之后使用ExitThread(0)撤消线程。4、试验要求

能正确使用CreatThread()、ExitThread()及Sleep()等系统调用,深入了解进程与线程理论。5、试验指导

本试验在WindowsXP、Microsoft

VisualC++6.0环境下实现,利用WindowsSDK(SystemDevelopmentKit)提供API(ApplicationProgramInterface,应用程序接口)完成程序功效。试验在WindowsXP环境下安装MicrosoftVisualC++6.0后进行,因为MicrosoftVisualC++6.0是一个集成开发环境,其中包含了WindowsSDK全部工具和定义,所以安装了MicrosoftVisualC++6.0后不用特意安装SDK。试验中全部API是操作系统提供用来进行应用程序开发系统功效接口。(1)首先开启安装好MicrosoftVisualC++6.0。(2)在MicrosoftVisualC++6.0环境下选择File→New命令,然后在Project选项卡中选择Win32ConsoleApplication建立一个控制台工程文件。(3)因为CreatThread()等函数是MicrosoftWindows操作系统系统调用,所以选择AnapplicationthatsupportsMFC,之后单击Finish按钮.(4)之后将打开MicrosoftVisualC++6.0编辑环境,按本试验要求编辑C程序,之后编译、链接并运行该程序即可。6、

试验总结

在Windows系统中进程是资源拥有者,线程是系统调度单位。进程创建后,其根本程也随即被创建。在该试验中,又创建了一个名为ThreadNamel子线程,该子线程与根本程并发被系统调度。为了能看到子线程运行情况,在根本程创建子线程后,将根本程挂起5s以确保子线程能够运行完成,之后调用Exit

Thread(0)将全部线程(包含主、子线程序)撤消。7、试验展望

能够深入完善程序功效,请思索以下问题。(1)怎样向线程对应函数传递参数?一个参数怎样传递,多个参数又怎样传递?(2)深入了解线程与进程概念,在Windows环境下何时使用进程,何时使用线程?

试验六

线程同时1、试验目标(1)深入掌握Windows系统环境下线程创建与撤消。(2)熟悉Windows系统提供线程同时API。(3)使用Windows系统提供线程同时API处理实际问题。2、试验准备知识:相关API函数介绍①等候对象等候对象(waitfunctions)函数包含等候一个对象(WaitForSingleObject())和等候多个对象(WaitForMultipleObject())两个API函数。1)等候一个对象WaitForSingleObject()用于等候一个对象。它等候对象能够为以下对象之一。·Changeontification:改变通知。·Consoleinput:控制台输入。·Event:事件。·Job:作业。·Mutex:互斥信号量。·Process:进程。·Semaphore:计数信号量。·Thread:线程。·Waitabletimer:定时器。原型:DWORDWaitForSingleObject(

HANDLE

hHandle,

//对象句柄

DWORD

dwMilliseconds

//

等候时间);

参数说明:(1)hHandle:等候对象对象句柄。该对象句柄必须为SYNCHRONIZE访问。(2)dwMilliseconds:等候时间,单位为ms。若该值为0,函数在测试对象状态后立刻返回,若为INFINITE,函数一直等候下去,直到接收到一个信号将其唤醒,如表2-1所表示。

返回值:假如成功返回,其返回值说明是何种事件造成函数返回。

表2-1

函数描述访问描述WAIT

ABANDONED等候对象是一个互斥(Mutex)对象,该互斥对象没有被拥有它线程释放,它被设置为不能被唤醒WAIT

OBJECT

0

指定对象被唤醒WAIT

TIMEOUT

超时使用方法举例:Static

HANDLEhHandlel=NULL;DWORD

dRes;dRes=WaitForSingleObject(hHandlel,10);

//等候对象句柄为hHandlel,等候时间为10ms2)等候对个对象WaitForMultiple()bject()在指定时间内等候多个对象,它等候对象与WaitForSingleObject()相同。原型:

DWORD

WaitForMultipleObjects(DWORDnCount,

//句柄数组中句柄数CONSTHANDLE*lpHandles,

//指向对象句柄数组指针BOOLfWaitAll,

//等候类型DWORDdwMilliseconds

//等候时间);参数说明:(1)nCount:由指针*lpHandles指定句柄数组中句柄数,最大数是MAXIMUM

WAIT

OBJECTS。(2)*lpHandles:指向对象句柄数组指针。(3)fWaitAll:等候类型。若为TRUE,当由lpHandles数组指定全部对象被唤醒时函数返回;若为FALSE,当由lpHandles数组指定某一个对象被唤醒时函数返回,且由返回值说明是因为哪个对象引发函数返回。(4)dwMilliseconds:等候时间,单位为ms。若该值为0,函数测试对象状态后立刻返回;若为INFINITE,函数一直等候下去,直到接收到一个信号将其唤醒。

返回值:、

假如成功返回,其返回值说明是何种事件造成函数返回。

各参数描述如表2-2所表示。

表2-2

各参数描述访问描述WAIT

OBJECT

0to(WAIT

OBJECT

0+nCount-1)若bWaitAll为TRUE,返回值说明全部被等候对象均被唤醒;若bWaitAll为FALSE,返回值减去WAITOBJECT

0说明lpHandles数组下标指定对象满足等候条件。假如调用时多个对象同时被唤醒,则取多个对象中最小那个数组下标WAIT

ABANDONED

0to(WAIT

ABANDONED

0+nCount-1)若bWaitAll为TRUE,返回值说明全部被等候对象均被唤醒,而且最少有一个对象是没有约束互斥对象;若bWaitAll为FALSE,返回值减去WAIT

ABANDONED0说明lpHandles数组下标指定没有约束互斥对象满足等候条件WAIT

TIMEOUT超时且参数bWaitAll指定条件不能满足

②信号量对象(Semaphore)信号量对象(Semaphore)包含创建信号量(CreateSemaphore())、打开信号量(OpenSemaphore())及增加信号量值(ReleaseSemaphore())API函数。1)创建信号量CreateSemaphore())用于创建一个信号量。原型:

HANDLECreateSemaphore(LPSECURITY

ATTRIBUTESlpSemaphoreAttributes,

//安全属性LONGlInitialCount,

//信号量对象初始值

LONGlMaximumCount,

//信号量最大值LPCTSTR

lpName

//信号量名);参数说明:(1)lpSemaphoreAttributes:指定安全属性,为NULL时,信号量得到一个默认安全描述符。(2)lInitialCount:指定信号量对象初始值。该值必须大于等于0,小于等于lMaximumCount。当其值大于0时,信号量被唤醒。当该函数释放了一个等候该信号量线程时,lInitialCount值减1,当调用函数ReleaseSemaphore()时,按其指定数量加一个值。(3)lMaximumCount:指出该信号量最大值,该值必须大于0。(4)lpName:给出信号量名字。返回值:信号量创建成功,将返回该信号量句柄。假如给出信号量名是系统已经存在信号量,将返回这个已存在信号量句柄。假如失败,系统返回NULL,能够调用函数GetLastError()查询失败原因。使用方法举例:StaticHANDLEhHandlel=NULL;

//定义一个句柄//创建一个信号量,其初始值为0,最大值为5,信号量名字为“SemphoreNamel”HHandle=CreateSemaphore(NULL,0,5,“SemphoreNamel”);

2)打开信号量OpenSemaphore()用于打开一个信号量。原型:

HANDLEOpenSemaphore(DWORDdWDesiredAccess,

//访问标志BOOLbInheritHandle,

//继承标志LPCTSTRlpName

//信号量名);

参数说明:(1)dwDesiredAccess:指出打开后要对信号量进行何种访问,如表2-3所表示。

表2-3

访问状态访问描述SEMAPHORE

ALL

ACCESS能够进行任何对信号量访问SEMAPHORE

MODIFY

STATE可使用ReleaseSemaphore()修改信号量值,使信号量成为可用状态SYNCHRONIZE使用等候函数(waitfunctions),等候信号量成为可用状态(2)bInheritHandle:指出返回信号量句柄是否能够继承。(3)lpName:给出信号量名字。返回值:信号量打开成功,将返回该号量句柄;假如失败,系统返回NULL,能够调用函数GetLastError()查询失败原因。使用方法举例:static

HANDLEhHandlel=NULL;//打开一个名为“SemphoreNamel”信号量,之后可使用ReleaseSemaphore()函数增加信号量值hHandlel=OpenSemaphore(SEMAPHORE

MODIFY

STATE,NULL,“SemphoreNamel”);3)增加信号量值

ReleaseSemaphore()用于增加信号量值。原型:BOOLReleaseSemaphore(HANDLEhSemaphore,

//信号量对象句柄LONGlReleaseCount,

//信号量要增加数值LPLONGlpPreviousCount

//信号量要增加数值地址);参数说明:(1)hSemaphore:创建或打开信号量时给出信号量对象句柄。WindowsNT中提议要使用SEMAPHORE

MODIFY

STATE访问属性打开该信号量。(2)IReleaseCount:信号量要增加数值。该值必须大于0。假如增加该值后,大于信号量创建时给出lMaximumCount值,则增加操作失效,函数返回FALSE。(3)LpPreviousCounte:接收信号量值一个32位变量。若不需要接收该值,能够指定为NULL。返回值:假如成功,将返回一个非0值;假如失败,系统返回0,能够调用函数GetLastError()查询失败原因。使用方法举例:

static

HANDLEhHandlel=NULL;BOOLrc;Rc=ReleaseSemaphore(hHandlel,l,NULL);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论