★斗 記3第3章进程、线程和处理机管理 8 向勇 清华大学计算机科学与技术系 爷 2001-08-21
Microsoft Windows 2000/XP 1 第3章 进程、线程和处理机管理 向 勇 清华大学计算机科学与技术系 2001-08-21
★斗 831进程同步与进程间通信 32线程调度 8 爷
Microsoft Windows 2000/XP 2 3.1 进程同步与进程间通信 3.2 线程调度
★斗 3.1进程同步与进程间邂 31 Windows200的进程互斥和同步 312 Windows200XP的信号 (signal 3.13 Windows2000/XP基于文件映射的共享 存储区 314 Windows200XP管道 82315Wnd00d邮件槽 3,.6 Windows2000XP套接字 爷 317剪帖板( Clipboard) 返回
Microsoft Windows 2000/XP 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) 返回
33110m07020F的o*¥ 8进程互斥和同步 在 Windows200XP中提供了互斥对象、信号量对象 石和事件对象等三种同步对象和相应的系统调用,用于进 程和线程同步。从本质上讲,这组同步对象的功能是相 同的,它们的区别在于适用场合和效率会有所不同。 对象名称是由用户给出的字符串。不同进程中用同样的名 称来创建或打开对象,从而获得该对象在本进程的句柄。 对象状态可分成可用和不可用两种。对象可用( signaled state)表示该对象不被任何线程使用或所有;而对象不可 用( nonsignaled state)表示该对象被某线程使用。 爷 27 返回
Microsoft Windows 2000/XP 4 3.1.1 Windows 2000/XP的 进程互斥和同步 返回 对象状态可分成可用和不可用两种。对象可用(signaled state)表示该对象不被任何线程使用或所有;而对象不可 用(nonsignaled state)表示该对象被某线程使用。 对象名称是由用户给出的字符串。不同进程中用同样的名 称来创建或打开对象,从而获得该对象在本进程的句柄。 在Windows 2000/XP中提供了互斥对象、信号量对象 和事件对象等三种同步对象和相应的系统调用,用于进 程和线程同步。从本质上讲,这组同步对象的功能是相 同的,它们的区别在于适用场合和效率会有所不同
★斗 331锁变量访问 93.112临界区对象 Critical Section) 313互斥对象Mmey 3114信号量对象 Semaphore 83115事件对象Em 爷
Microsoft 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)
3311锁变量访。*¥ ≤y与钟变属访问是基本的后际手段其他的和共享机 →。型变量的操作,可避兔线程间切换对操作连续性的影响 8这组巨变量访间AP包括 Interlocked Exchange进行32位数据的先读后写原子操作 Interlocked EXchangePointer对指针的 Exchange原子操作 Interlocked Compare EXchange依据比较结果进行赋值的原子操作 NsX Interlocked Compare ExchangePointer对指针的 CompareExchange原子操作 Interlocked Exchange Add先加后存结果的原子操作 Interlocked Decrement先减1后存结果的原子操作; InterlockedIncrement先加1后存结果的原子操作 返回
Microsoft Windows 2000/XP 6 互锁变量访问是最基本的互斥手段,其他的互斥和共享机 制都是以它为基础的。它相当于硬件TS指令。用于对整 型变量的操作,可避免线程间切换对操作连续性的影响。 这组互锁变量访问API包括: InterlockedExchange进行32位数据的先读后写原子操作; InterlockedExchangePointer对指针的Exchange原子操作; InterlockedCompareExchange依据比较结果进行赋值的原子操作 ; InterlockedCompareExchangePointer对指针的 CompareExchange原子操作; InterlockedExchangeAdd先加后存结果的原子操作; InterlockedDecrement先减1后存结果的原子操作; InterlockedIncrement先加1后存结果的原子操作。 3.1.1.1 互锁变量访问 返回
下面是 InterlockedExchange o的汇编结果 17 InterlockedExchange(& Counter, 1Temp 0040109Amov esl, esp 0040109Cmov eax, dword ptr [ebp-8] 0040109F push eax 1Temp压栈 004010A0 push offset COunter (004299ec I Counter地址压栈 004010A5 call dword ptr[ imp InterlockedExchange@8(0042c178 004010 cmp esl, esp 004010AD call chkesp(00403940) 这个函数就一条指令 77E66AC3 mov ecx, dword ptr[esp+4];取 I Counter的地址 77E66AC7 mov edx, dword ptr [esp+8: EXITemp 77E66ACB mov eax, dword ptr Lecx 取 I Counter 77E66ACD nop 77E66ACE cmpxchg dword ptr [ecx], edx ;比较交换指令 77E66AD1 jne 77E66ACD 77E66AD3 ret 实例:2001-08-12 InterlockedIncrement. cpp
下面是InterlockedExchange()的汇编结果: 17: InterlockedExchange(&lCounter, lTemp); 0040109A mov esi,esp 0040109C mov eax,dword ptr [ebp-8] 0040109F push eax ; lTemp压栈 004010A0 push offset lCounter (004299ec) ; lCounter地址压栈 004010A5 call dword ptr [__imp__InterlockedExchange@8 (0042c178)] 004010AB cmp esi,esp 004010AD call __chkesp (00403940) ; 这个函数就一条指令 77E66AC3 mov ecx,dword ptr [esp+4] ; 取lCounter的地址 77E66AC7 mov edx,dword ptr [esp+8] ; 取lTemp 77E66ACB mov eax,dword ptr [ecx] ; 取lCounter 77E66ACD nop 77E66ACE cmpxchg dword ptr [ecx],edx ; 比较交换指令 77E66AD1 jne 77E66ACD 77E66AD3 ret 8 实例:2001-08-12 InterlockedIncrement.cpp
★斗 3.1.12临界区对象( Critical Section 只能用于在同一进程内使用的临界区,同一进 程内各线程对它的访问是互斥进行的。相关API 包括: Initialize CriticalSection对临界区对象进行初始化; Enter Criticalsection等待占用临界区的使用权,得到 使用权时返回; 8 TryEnter CriticalSection非等待方式申请临界区的使 用权;申请失败时,返回0; 92 Leave critica section释放临界区的使用权; 爷 Delete criticalsection释放与临界区对象相关的所有 27 系统资源。 实例:2001-08-12 CriticalSection. cpp 返回
Microsoft Windows 2000/XP 8 3.1.1.2 临界区对象(Critical Section) • 只能用于在同一进程内使用的临界区,同一进 程内各线程对它的访问是互斥进行的。相关API 包括: – InitializeCriticalSection对临界区对象进行初始化; – EnterCriticalSection等待占用临界区的使用权,得到 使用权时返回; – TryEnterCriticalSection非等待方式申请临界区的使 用权;申请失败时,返回0; – LeaveCriticalSection释放临界区的使用权; – DeleteCriticalSection释放与临界区对象相关的所有 系统资源。 实例:2001-08-12 CriticalSection.cpp 返回
31.13互斥对象( Mutey ·互斥对象相当于互斥信号量,在一个时刻只能 被一个线程使用。有关的API: CreateMutex刨建一个互斥对象,返回对象句柄 OpenMutex返回一个已存在的互斥对象的句柄,用 于后续访问; Releasemutex释放对互斥对象的占用,使之成为可 爷 实例:2001-08-14 Mutex. cpp 返回
Microsoft Windows 2000/XP 9 3.1.1.3 互斥对象(Mutex) • 互斥对象相当于互斥信号量,在一个时刻只能 被一个线程使用。有关的API: – CreateMutex创建一个互斥对象,返回对象句柄; – OpenMutex返回一个已存在的互斥对象的句柄,用 于后续访问; – ReleaseMutex释放对互斥对象的占用,使之成为可 用; 返回 实例:2001-08-14 Mutex.cpp
★斗 31.14倍号量对象(Sema伽hore) ·信号量对象的取值在0到指定最大值之间 用于限制并发访问的线程数。有关的API Create Semaphore创建一个信号量对象,指 定最大值和初值,返回对象句柄; 8 Open Semaphore返回一个已存在的信号量对 象的句柄,用于后续访问; Releasesemaphore释放对信号量对象的占用 92 爷 27 实例:2001-08-14 Semaphore. cpp 10 返回
Microsoft Windows 2000/XP 10 3.1.1.4 信号量对象(Semaphore) • 信号量对象的取值在0到指定最大值之间, 用于限制并发访问的线程数。有关的API: – CreateSemaphore创建一个信号量对象,指 定最大值和初值,返回对象句柄; – OpenSemaphore返回一个已存在的信号量对 象的句柄,用于后续访问; – ReleaseSemaphore释放对信号量对象的占用; 返回 实例:2001-08-14 Semaphore.cpp