2022年操作系统实验教案 .pdf





《2022年操作系统实验教案 .pdf》由会员分享,可在线阅读,更多相关《2022年操作系统实验教案 .pdf(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作系统原理实 验 教 案(基于 Windows2000/XP平台)讲授人:谢士春安排授课时间: 2011-2012(一)授课对象: 09 计算机科学与技术名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 48 页 - - - - - - - - - 第 II 页实验项目列表实验一 多线程的创建与撤销实验二 线程的同步实验三 线程的互斥实验四 生产者 -消费者问题实验五 进程通信实验六 动态链接库的建立和调试实验七 页面置换算法模拟实验八 文件的三种传输模式及性能比较实验九
2、 磁盘的读写附录部分(可扩充)附录 1 读者-写者问题附录 2 梨子苹果之 PV 操作附录 3 命名管道编程规范附录 4 DLL 编程规范名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 48 页 - - - - - - - - - 第 III 页名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 48 页 - - - - - - - - - 第 1 页实
3、验一线程的创建与撤销一、实验目的通过本实验熟悉Windows系统提供的线程创建与撤销等API 系统调用,掌握Windows系统环境下线程的创建与撤销方法。二、实验内容1. 熟悉开发环境Visual C+ 6.0 ;2. Windows系统环境下线程的创建与撤销方法;3.编程 :在主线程中调用CreateThread( )创建 1 个子线程,并在子线程中显示类似“Thread is running !”等字样。三、实验准备知识相关的 API 函数的函数原型:1. 线程创建函数HANDLE CreateThread(); HANDLE CreateThread( LPSECURITY_ATTRIB
4、UTES lpThreadAttributes, / pointer to security attributes DWORD dwStackSize , / initial thread stack size LPTHREAD_START_ROUTINE lpStartAddress, / pointer to thread function LPVOIDlpParameter , / argument for new thread DWORD dwCreationFlags, / creation flags LPDWORD lpThreadId/ pointer to receive t
5、hread ID ); 线程函数原型DWORD WINAPI Thread1Proc(LPVOID lpParameter) 2. 线程撤销函数VOID ExitThread( DWORD dwExitCode/ exit code for this thread );功能: 撤销一个线程。 该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C + + 资源(如 C + + 类对象)将不被撤消。说明:如果在主线程函数(main 函数)中调用ExitThread ,那么应用程序的主线程将停止运行。但是,如果进程中至少有一个线程还在运行,该进程将不会终止运行。3. 线程
6、终止函数TerminateThread(); 4. 线程挂起函数Sleep(); 进程主动放弃剩余的时间片。5. 关闭句柄函数CloseHandle( )。说明: 关闭一个对象句柄,只是将相应对象的引用数减一,并不意味着终结该对象,除非引用数减至零。四、程序源代码及注释名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 48 页 - - - - - - - - - 第 2 页【主要源代码参考】#include #include static HANDLE hThread1=N
7、ULL; /存放创建的子进程的句柄DWORD dwThreadID1; /存放创建的子进程的ID DWORD WINAPI Thread1Proc( LPVOID ); /子线程函数的声明int main() / 主线程/创建子线程hThread1 = CreateThread(NULL,0, Thread1Proc, NULL, 0,& dwThreadID1); Sleep(5000); CloseHandle(hThread1); / 关闭句柄ExitThread(0); / 撤销本线程return 0; /子线程的实现DWORD WINAPI Thread1Proc(LPVOID lp
8、Parameter ) coutThread is running!endl; return 0; 五、实验结果输出名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 48 页 - - - - - - - - - 第 3 页排版说明(小三、小四、五号)实验二线程的同步一、实验任务该实验完成Windows中多线程同步运行的验证。首先在主线程中创建一个子线程,成功创建后进入阻塞状态,直到子线程运行完毕后唤醒主线程。二、实验目的1进一步掌握Windows系统环境下线程的创建与撤消。
9、2熟悉 Windows系统提供的线程同步API。3使用 Windows系统提供的线程同步API 解决实际问题。三、实验准备知识1Wait 函数等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为受信(signaled )状态或超时为止。函数原型:DWORD WaitForSingleObject( HANDLE hHandle, / handle to object to wait for DWORD dwMilliseconds / time-out interval in milliseconds ); 功能:在指定的时间内等待一个对象。举例: WaitForSingleObjec
10、t(hThread,1000);/等待一个线程终止,等待1000 毫秒WaitForSingleObject(hMutex,INFINITE); /无限等待一个互斥对象,/直到变成“可信”DWORD WaitForMultipleObjects( DWORD nCount, / number of handles in the handle array CONST HANDLE *lpHandles, / pointer to the object-handle array BOOL fWaitAll, / wait flag DWORD dwMilliseconds / time-out i
11、nterval in milliseconds ); 功能:在指定时间内等待多个对象。举例: HANDLE h 3; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 48 页 - - - - - - - - - 第 4 页h0=hThread1; h1=hThread2; h2=hThread3; DWORD dw=WaitForMultipleObject(3,h,true,-1); 2信号量对象(Semaphore )信号量对象用于对资源进行计数,它的使用规则如下:?
12、 如果当前资源的数量大于0,则处于“受信”状态。? 如果当前资源数量是0,则“未受信”状态。所有等待此信号量的线程均进入等待状态(或称不可调度状态)。函数原型:HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, / pointer to security attributes LONG lInitialCount, / initial count LONG lMaximumCount, / maximum count LPCTSTR lpName / pointer to semaphore-object n
13、ame ); 功能:创建一个信号量。举例:hHandle1=CreateSemaphore(NULL,0,5,”Semaphore1” ); HANDLE OpenSemaphore( DWORD dwDesiredAccess, / access flag BOOL bInheritHandle, / inherit flag LPCTSTR lpName / pointer to semaphore-object name ); 功能:打开一个已存在的信号量。举例:hHandle2=OpenSemaphore(SEMAPHORE_MODIFY_STATE| SYNCHRONIZE,NULL
14、,SemaphoreName1); BOOL ReleaseSemaphore( HANDLE hSemaphore, / handle to the semaphore object LONG lReleaseCount, / amount to add to current count LPLONG lpPreviousCount / address of previous count ); 功能:对指定的信号量对象增值。举例:rc= ReleaseSemaphore(hHandle1,1,NULL);四、程序源代码及注释【主要源代码参考】/定义全局变量,诸线程均可访问static HAN
15、DLE hThread1; /子进程的句柄,作为主线程的局部变量也行名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 48 页 - - - - - - - - - 第 5 页static HANDLE hHandle1=NULL; /信号量的句柄,全局变量void func(); /子线程的声明int _tmain(int argc,TCHAR* argv,TCHAR* envp) int nRetCode=0; DWORD dwThreadID1; DWORD dRes,
16、err; hHandle1=CreateSemaphore(NULL,0,1,SemaphoreName1); /创建一个信号量if(hHandle1=NULL) printf(Semaphore Create Fail!n); else printf(Semaphore Create Success!n); hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,SemaphoreName1); if(hHandle1=NULL)printf(Semaphore Open Fail!n); else printf(Sema
17、phore Open Success!n); hThread1=CreateThread(LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)func, (LPVOID)NULL, 0,&dwThreadID1); /创建子线程if (hThread1=NULL) printf(Thread1 create Fail!n); else printf(Thread1 create Success!n); dRes=WaitForSingleObject(hHandle1,INFINITE); /主线程等待子线程结束err=GetLastE
18、rror(); printf(WaitForSingleObject err=%dn,err); if(dRes=WAIT_TIMEOUT) printf(TIMEOUT!dRes=%dn,dRes); else if(dRes=WAIT_OBJECT_0) printf(WAIT_OBJECT!dRes=%dn,dRes); else if(dRes=WAIT_ABANDONED) printf(WAIT_ABANDONED!dRes=%dn,dRes); else printf(dRes=%dn,dRes); CloseHandle(hThread1); CloseHandle(hHand
19、le1); ExitThread(0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 48 页 - - - - - - - - - 第 6 页return nRetCode; /实现子线程void func() BOOL rc; DWORD err; printf(Now In Thread !n); rc=ReleaseSemaphore(hHandle1,1,NULL); /子线程唤醒主线程err=GetLastError(); printf(ReleaseSem
20、aphore err=%dn,err); if(rc=0) printf(Semaphore Release Fail!n); else printf(Semaphore Release Success!rc=%dn,rc); 五、实验结果输出实验三线程的互斥一、实验任务完成两个子线程之间的互斥。在主线程中使用系统调用CreateThread ()创建两个子线程,并使两个子线程互斥的使用全局变量count 。二、实验目的1熟练掌握Windows系统环境下线程的创建与撤销。2熟悉 Windows系统提供的线程互斥API。3使用 Windows系统提供的线程互斥API 解决实际问题。三、实验准备知
21、识1使用临界区对象(Criticalsection )名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 48 页 - - - - - - - - - 第 7 页Critical Section Object , A segment of code that is not reentrant and therefore does not support concurrent access by multiple threads. Often, a critical secti
22、on object is used to protect shared resources。通过定义在数据段中的一个CRITICAL_SECTION 结构实现。CRITICAL_SECTION myCritical ;并且在任何线程使用此临界区对象之前必须对它进行初始化。void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection ); 之后, 任何线程访问临界区中数据的时候,必须首先调用EnterCriticalSection 函数, 申请进入临界区(又叫关键代码段,使用共享资源的任何代码都必须封装在此)。在同一时间内
23、, Windows 只允许一个线程进入临界区。所以在申请的时候,如果有另一个线程在临界区的话, EnterCriticalSection 函数会一直等待下去,直到其他线程离开临界区才返回。EnterCriticalSection 函数用法如下:void EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection); 当操作完成的时候,还要将临界区交还给Windows ,以便其他线程可以申请使用。这个工作由 LeaveCriticalSection 函数来完成。void LeaveCriticalSection( LPCRITICAL_S
24、ECTION lpCriticalSection); 当程序不再使用临界区对象的时候,必须使用DeleteCriticalSection 函数将它删除。void DeleteCriticalSection( LPCRITICAL_SECTION lpCriticalSection); 2使用互斥锁(Interlocked )提供一种手段来保证值的递增(减)能够以原子操作方式来进行,也就是不中断地进行。LONG InterlockedIncrement( LPLONG lpAddend ) ; / 增一操作LONG InterlockedDecrement( LPLONG lpAddend);
25、/ 减一操作LONG InterlockedExchangeAdd ( PLONG Addend, / pointer to the addend LONG Increment / increment value ); /增减任意值四、程序源代码及注释【主要源代码参考】这里以使用临界区对象为例static int count=5; / 共享变量static HANDLE h1 ,h2; / 两个子进程的句柄变量LPCRITICAL_SECTION hCriticalSection; /定义指向临界区对象的地址指针CRITICAL_SECTION Critical; /定义临界区void fun
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年操作系统实验教案 2022 操作系统 实验 教案

限制150内