操作系统实验报告.docx
- 文档编号:29739606
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:14
- 大小:53.15KB
操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
操作系统实验报告
《操作系统》实验报告
实验序号:
3 实验项目名称:
Windows基本进程管理
学 号
1207122219
姓 名
邝沃佳
专业、班
软金二班
实验地点
1-418
指导教师
李远敏
实验时间
2014/11/17
一、实验目的及要求
通过观察任务管理器,来观察各个进程的动态信息。
二、实验设备(环境)及要求
(1)一台WindowsXP操作系统的计算机。
(2)计算机装有MicrosoftVisualStudioC++6.0专业版或企业版。
三、实验内容与步骤
1、预备知识
·任务管理器,了解用户计算机上正在运行的程序和进程的相关信息。
·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(SystemDevelopment Kit)提供的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,等待时间为10ms
2)等待对个对象
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时,信号量得到一个
默认的安全描述符。
XX文库-让每个人平等地提升自我
(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
2、实验编程
能正确使用等待对象WaitForSingleObject()或WaitForMultipleObject()及信号量对象CreateSemaphore()、OpenSemaphore()、ReleaseSemaphore()等系统调用,进一步理解线程的同步。
#include
#include
usingnamespacestd;
DWORDWINAPIFunc(LPVOIDp);
typedefstruct
{
intfirstArgu;
longsecArgu;
}MyType,*pMyType;
voidmain()
{
MyTypeMyTypeArgu={0};
MyTypeArgu.firstArgu=1;
MyTypeArgu.secArgu=100000000;
CreateThread(NULL,0,Func,&MyTypeArgu,0,NULL);
Sleep(5000);
cout<<"该线程已删除……"< ExitThread(0); } DWORDWINAPIFunc(LPVOIDp) { MyTypeparam={0}; MoveMemory(¶m,p,sizeof(param)); intintValue=param.firstArgu; longlongValue=param.secArgu; cout<<"Threadisrunning,线程正在运行,5秒钟后该线程自动删除"< cout<<"现在输出该线程函数传递的两个参数"< cout<<"firstArgu="< cout<<"请等待……"< return0; } 四、程序调试(结果及分析) 五、总结与体会 六、教师评语 签名: 日期: 成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)