操作系统原理实验报告Word格式文档下载.docx
- 文档编号:15084010
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:37
- 大小:1.01MB
操作系统原理实验报告Word格式文档下载.docx
《操作系统原理实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统原理实验报告Word格式文档下载.docx(37页珍藏版)》请在冰豆网上搜索。
一、实验内容简要描述
(1)熟悉VC++、VisualStudio开发环境。
(2)使用相关函数创建和撤销线程。
(3)在一个进程中创建3个线程,名字分别为threada、threadb、threadc。
threada输出“helloworld!
”。
threadb输出“Mynameis…”。
threadc输出“Pleasewait…”,然后sleep5秒钟,接着输出“Iwakeup”。
二、程序设计
1、设计思路
该函数创建一个在调用进程的地址空间中执行的线程。
2、主要数据结构
HANDLECreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,
DWORDdwStackSize,
LPTHREAD_START_ROUTINElpStartAddress,
LPVOIDlpParameter,
DWORDdwCreationFlags,
LPDWORDlpThreadId
);
VOIDExitThread(DWORDdwExitCode);
VOIDSleep(DWORDdwMilliseconds);
三、实验结果
1、基本数据
lpThreadAttributes:
指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。
若lpThreadAttributes为NULL,则句柄不能被继承。
在WindowsNT中该结构的lpSecurityDescriptor成员定义了新进程的安全性描述符。
若lpThreadAttributes为NULL,则线程获得一个默认的安全性描述符。
dwStackSize:
定义原始堆栈提交时的大小(按字节计)。
系统将该值舍入为最近的页。
若该值为0,或小于默认时提交的大小,默认情况是使用与调用线程同样的大小。
更多的信息,请看ThreadStackSize。
lpStartAddress:
指向一个LPTHREAD_START_ROUTlNE类型的应用定义的函数,该线程执行此函数。
该指针还表示溃程进程中线程的起始地址。
该函数必须存在于远程进程中。
lpParameter:
定义一个传递给该迸程的32位值。
dwCreationFIags:
定义控制进程创建的附加标志。
若定义了CREATE_SUSPENDED标志,线程创建时处于挂起状态,并且直到ResumeThread函数调用时d能运行。
若该值为0,则该线程在创建后立即执行。
lpThreadId:
指向一个32位值,它接收该线程的标识符。
2.
源程序代码行数
完成该实验投入的时间(小时数)
与其他同学讨论次数
31
1
3、测试结果分析
四、实验体会
1、实验体会和收获
深入理解了线程与进程的概念,熟悉了在Windows环境下何时使用进程,何时使用线程,怎么创建和撤销线程。
五、源代码
#include<
>
iostream>
usingnamespacestd;
DWORDWINAPIta(LPVOIDargv)
{
cout<
<
"
HelloWorld!
\n"
;
}
DWORDWINAPItb(LPVOIDargv)
我的名字:
孙婷\n"
我的学号:
9\n"
DWORDWINAPItc(LPVOIDargv)
Pleasewait...\n"
Sleep(5000);
Iwakeup.\n"
intmain()
HANDLEthreada,threadb,threadc;
DWORDTEST;
threada=CreateThread(NULL,0,ta,NULL,0,0);
threadb=CreateThread(0,0,tb,0,0,0);
threadc=CreateThread(0,0,tc,0,0,0);
ExitThread(TEST);
return0;
实验二线程同步
2018年4月7日
1)在程序中使用CreateSemaphore(NULL,0,1,”SemaphoreName1”)创建一个名为SemaphoreName1的信号量,其初值为0。
2)使用OpenSemaphore(SYNCHRONIZE|SEMAPHORE__MODIFY_STA
TE,NULL,”SemaphoreName1”)打开该信号量。
3)创建一个子线程,主线程创建子线程后调WaitForSingleObject(hHandle,
INFINITE),这里等待时间设置为INFINITE表示要一直等待下去,直到该信号量被唤醒为止。
4)子线程sleep5秒钟,然后输出“Iamover.”结束,调用ReleaseSemaphore(hHandle1,1,NULL)释放信号量,使信号量的值加1。
A)等待一个对象
WaitForSingleObjects函数决定等待条件是否被满足。
如果等待条件并没有被满足,调用线程进人一个高效的等待状态,当等待满足条件时占用非常少的处理器时间。
在运行前,一个等待函数修改同步对象类型的状态。
修改仅发生在引起函数返回的对象身上。
例如,信号的计数减l。
WaitForSingleObject函数能等待的对象包括:
Changenotification(改变通告);
Consoleinput(控制台输入);
Event(事件);
Job(作业);
Mutex(互斥对象);
Process(进程);
Semaphore(信号量);
Thread(线程);
Waitabletimer(可等待定时器)。
当使用等待函数或代码直接或间接创建窗口时,一定要小心。
如果一个线程创建了任何窗口,它必须处理进程消息。
消息广播被发送到系统的所有窗口。
一个线程用没有超时的等待函数也许会引起系统死锁。
间接创建窗口的两个例子是DDE和COMCoInitialize。
因此,如果用户有一个创建窗口的线程,用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx函数,而不要用
SignalObjectAndWait函数。
B)等待多个对象
WaiForMultipleObjects函数当下列条件之一满足时返回:
(1)任意一个或全部指定对象处于信号态;
(2)超时间隔已过。
C)创建信号量
如果成功就传回一个handle,否则传回NULL。
不论哪一种情况,GetLastError都会传回一个合理的结果。
如果指定的Semaphore名称已经存在,则函数还是成功的,GetLastError会传回ERROR_ALREADY_EXISTS。
D)打开信号量
为现有的一个已命名信号机对象创建一个新句柄。
E)增加信号量的值
该函数将指定信号对象的计数增加一个指定的值。
DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);
DWORDWaitForMultipleObjects(
DWORDnCount,
CONSTHANDLE*lpHandles,
BOOLfWaitAll,
DWORDdwMilliSeconds
)
HANDLECreateSemaphore(
LPSECURITY_ATTRIBUTESlpAttributes,
LONGlInitialCount,
LONGlMaximumCount,
LPCTSTRlpName
HANDLEOpenSemaphore(
DWORDdwDesiredAccess,
n"
);
rc=ReleaseSemaphore(hHandle1,1,NULL);
Often,acriticalsectionobjectisusedtoprotectsharedresources。
通过定义在数据段中的一个CRITICAL_SECTION结构实现。
CRITICAL_SECTIONmyCritical;
并且在任何线程使用此临界区对象之前必须对它进行初始化。
voidInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
之后,任何线程访问临界区中数据的时候,必须首先调用EnterCriticalSection函数,申请进入临界区(又叫关键代码段,使用共享资源的任何代码都必须封装在此)。
在同一时间内,Windows只允许一个线程进入临界区。
所以在申请的时候,如果有另一个线程在临界区的话,EnterCriticalSection函数会一直等待下去,直到其他线程离开临界区才返回。
EnterCriticalSection函数用法如下:
voidEnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
当操作完成的时候,还要将临界区交还给Windows,以便其他线程可以申请使用。
这个工作由LeaveCriticalSection函数来完成。
voidLeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
当程序不再使用临界区对象的时候,必须使用DeleteCriticalSection函数将它删除。
voidDeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
b.使用互斥锁(Interlocked)
提供一种手段来保证值的递增(减)能够以原子操作方式来进行,也就是不中断地进行。
LONGInterlockedIncrement(LPLONGlpAddend);
试结果分析
熟练了Windows系统环境下线程的创建与撤销,熟悉了Windows系统提供的线程互斥API,使用Windows系统提供的线程互斥API解决实际问题。
staticintcount=5;
\pipe\\myPipe"
charInBuffer[50]="
charOutBuffer[50]="
DWORDBytesRead,BytesWrite;
hPipeHandle=CreateNamedPipe(
(LPCTSTR)lpName,
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED|WRITE_DAC,
PIPE_TYPE_MESSAGE|PIPE_R
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 原理 实验 报告