资源预览内容
第1页 / 共80页
第2页 / 共80页
第3页 / 共80页
第4页 / 共80页
第5页 / 共80页
第6页 / 共80页
第7页 / 共80页
第8页 / 共80页
第9页 / 共80页
第10页 / 共80页
亲,该文档总共80页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,第3章 Windows2000/XP 进程、线程和处理机管理,权义宁西安电子科技大学计算机学院,2,3.1 进程同步与进程间通信3.2 线程调度,3,3.1 进程同步与进程间通信,3.1.1 Windows 2000/XP的进程互斥和同步3.1.2 Windows 2000/XP的信号(signal)3.1.3 Windows 2000/XP基于文件映射的共享存储区3.1.4 Windows 2000/XP管道3.1.5 Windows 2000/XP邮件槽3.1.6 Windows 2000/XP套接字3.1.7 剪帖板(Clipboard),返回,4,3.1.1 Windows 2000/XP的进程互斥和同步,返回,对象状态可分成可用和不可用两种。对象可用(signaled state)表示该对象不被任何线程使用或所有;而对象不可用(nonsignaled state)表示该对象被某线程使用。,对象名称是由用户给出的字符串。不同进程中用同样的名称来创建或打开对象,从而获得该对象在本进程的句柄。,在Windows 2000/XP中提供了互斥对象、信号量对象和事件对象等三种同步对象和相应的系统调用,用于进程和线程同步。从本质上讲,这组同步对象的功能是相同的,它们的区别在于适用场合和效率会有所不同。,5,3.1.1.1 互锁变量访问3.1.1.2 临界区对象(Critical Section)3.1.1.3 互斥对象(Mutex)3.1.1.4 信号量对象(Semaphore)3.1.1.5 事件对象(Event),6,互锁变量访问是最基本的互斥手段,其他的互斥和共享机制都是以它为基础的。它相当于硬件TS指令。用于对整型变量的操作,可避免线程间切换对操作连续性的影响。这组互锁变量访问API包括:InterlockedExchange进行32位数据的先读后写原子操作;InterlockedExchangePointer对指针的Exchange原子操作;InterlockedCompareExchange依据比较结果进行赋值的原子操作;InterlockedCompareExchangePointer对指针的CompareExchange原子操作;InterlockedExchangeAdd先加后存结果的原子操作;InterlockedDecrement先减1后存结果的原子操作;InterlockedIncrement先加1后存结果的原子操作。,3.1.1.1 互锁变量访问,返回,下面是InterlockedExchange()的汇编结果:17: InterlockedExchange(&lCounter, lTemp);0040109A mov esi,esp0040109C mov eax,dword ptr ebp-80040109F push eax; lTemp压栈004010A0 push offset lCounter (004299ec); lCounter地址压栈 004010A5 call dword ptr _imp_InterlockedExchange8 (0042c178)004010AB cmp esi,esp004010AD call _chkesp (00403940); 这个函数就一条指令77E66AC3 mov ecx,dword ptr esp+4; 取lCounter的地址77E66AC7 mov edx,dword ptr esp+8; 取lTemp77E66ACB mov eax,dword ptr ecx; 取lCounter77E66ACD nop77E66ACE cmpxchg dword ptr ecx,edx; 比较交换指令77E66AD1 jne 77E66ACD77E66AD3 ret 8,实例:2001-08-12 InterlockedIncrement.cpp,8,3.1.1.2 临界区对象(Critical Section),只能用于在同一进程内使用的临界区,同一进程内各线程对它的访问是互斥进行的。相关API包括:InitializeCriticalSection对临界区对象进行初始化;EnterCriticalSection等待占用临界区的使用权,得到使用权时返回;TryEnterCriticalSection非等待方式申请临界区的使用权;申请失败时,返回0;LeaveCriticalSection释放临界区的使用权;DeleteCriticalSection释放与临界区对象相关的所有系统资源。,返回,实例:2001-08-12 CriticalSection.cpp,9,3.1.1.3 互斥对象(Mutex),互斥对象相当于互斥信号量,在一个时刻只能被一个线程使用。有关的API:CreateMutex创建一个互斥对象,返回对象句柄;OpenMutex返回一个已存在的互斥对象的句柄,用于后续访问;ReleaseMutex释放对互斥对象的占用,使之成为可用;,返回,实例:2001-08-14 Mutex.cpp,10,3.1.1.4 信号量对象(Semaphore),信号量对象的取值在0到指定最大值之间,用于限制并发访问的线程数。有关的API:CreateSemaphore创建一个信号量对象,指定最大值和初值,返回对象句柄;OpenSemaphore返回一个已存在的信号量对象的句柄,用于后续访问;ReleaseSemaphore释放对信号量对象的占用;,返回,实例:2001-08-14 Semaphore.cpp,11,3.1.1.5 事件对象(Event),事件对象相当于触发器,可通知一个或多个线程某事件的出现。有关的API:CreateEvent创建一个事件对象,返回对象句柄;OpenEvent返回一个已存在的事件对象的句柄,用于后续访问;SetEvent和PulseEvent设置指定事件对象为可用状态;ResetEvent设置指定事件对象为不可用状态;手工复位,并唤醒所有等待线程;,返回,实例:2001-08-14 Event.cpp,12,3.1.1.6 同步对象等待,对于这些同步对象,Windows 2000/XP提供了两个统一的等待操作WaitForSingleObject和WaitForMultipleObjects。(1) WaitForSingleObject在指定的时间内等待指定对象为可用状态(signaled state); DWORD WaitForSingleObject( HANDLE hHandle, / handle of object to wait for DWORD dwMilliseconds / time-out interval in milliseconds );,返回,13,(2) WaitForMultipleObjects在指定的时间内等待多个对象为可用状态; DWORD WaitForMultipleObjects( DWORD nCount, /对象句柄数组中的句柄数; CONST HANDLE *lpHandles, / 指向对象句柄数组的指针,数组中可包括多种对象句柄; BOOL bWaitAll, / 等待标志:TRUE表示所有对象同时可用,FALSE表示至少一个对象可用; DWORD dwMilliseconds / 等待超时时限; );,14,3.1.2 Windows 2000/XP的信号(signal),3.1.2.1 SetConsoleCtrlHandler和GenerateConsoleCtrlEvent3.1.2.2 signal和raise,返回,信号是进程与外界的一种低级通信方式。进程可发送信号,每个进程都有指定信号处理例程。信号通信是单向和异步的。Windows 2000/XP有两组与信号相关的系统调用,分别处理不同的信号。,15,3.1.2.1 SetConsoleCtrlHandler和GenerateConsoleCtrlEvent,返回,SetConsoleCtrlHandler在本进程的处理例程(HandlerRoutine)列表中定义或取销用户定义的处理例程;如:缺省时,它有一个CTRL+C输入的处理例程,我们可利用本调用来忽视或恢复CTRL+C输入的处理;GenerateConsoleCtrlEvent发送信号到与本进程共享同一控制台的控制台进程组;,16,处理信号列表(5种),实例:2001-08-15 SetConsoleCtrlHandler.cpp该程序可改信号处理例程。主程序会发送一个Ctrl-C信号。对Ctrl-C信号的处理是一个响声,对关窗口信号的处理是显示一段提示。,17,3.1.2.2 signal和raise,返回,signal设置中断信号处理例程;如:SIGINT(CTRL+C)、SIGABRT异常中止等信号的处理;raise给本进程发送一个信号;UNIX中的kill可向其他进程发信号,但在Windows 2000/XP中没有kill。处理信号列表(6种),实例:2001-08-14 raise.cpp,18,3.1.3 Windows 2000/XP基于文件映射的共享存储区,返回,将整个文件映射为进程虚拟地址空间的一部分来加以访问。在CreateFileMapping和OpenFileMapping时可以指定对象名称。CreateFileMapping为指定文件创建一个文件映射对象,返回对象指针;OpenFileMapping打开一个命名的文件映射对象,返回对象指针;MapViewOfFile把文件映射到本进程的地址空间,返回映射地址空间的首地址;这时可利用首地址进行读写;FlushViewOfFile可把映射地址空间的内容写到物理文件中;UnmapViewOfFile拆除文件映射与本进程地址空间间映射关系;随后,可利用CloseHandle关闭文件映射对象;,19,共享存储区实例,http:/www.microsoft.com/msj/defaultframe.asp?page=/msj/1198/wicked/wicked1198.htm&nav=/msj/1198/newnav.htm在CsharedMemory:Create中:SharedMem.cpp: Line 71: CreateFileMapping: 创建文件映射对象;SharedMem.cpp: Line 92: MapViewOfFile: 映射文件;在CsharedMemory:Delete中:SharedMem.cpp: Line 166: UnmapViewOfFile: 拆除文件映射;SharedMem.cpp: Line 168: CloseHandle: 关闭文件映射对象;在CsharedMemory:Write和CsharedMemory:Read中:SharedMem.cpp: Line 206和226: CopyMemory进行数据传送;,2001-08-16 Nov98Wicked-FileMapping.exe,20,3.1.4 Windows 2000/XP管道,Windows 2000/XP提供无名管道和命名管道两种管道机制。Windows 2000/XP的无名管道类似于UNIX系统的管道,但提供的安全机制比UNIX管道完善。利用CreatePipe可创建无名管道,并得到两个读写句柄;然后利用ReadFile和WriteFile可进行无名管道的读写。,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号