原创
Windows2k下的同步机制
2008-4-7 13:28
4242
4
4
分类:
软件与OS
windows 2000在
同步机制上有一个非常独到的设计,kernel中实现mutual exclusive的关键是IRQL.这是MS的巧妙设计,系统中允许的每个线程都被
分配一个适合的IRQL,普通的user mode线程和系统线程均运行于Passive_LEVEL,这是最低一级的IRQL,而线程调度器运行在
Dispactch level,从dispatch level以上就是DIRQL,其中从第3级到26级是给设备的IRQL,最高级为
High Level,整个系统的irql分为0-31个level.在任何时候,内核中一个高irql的例程处于可运行状态,就会抢断低irql的例
程.这样对于windows2k来说,内核也 是可抢占的,而普通的unix系统都是内核不可抢占的.
实现kernel层同步机制的关键结构是
spin lock,一个线程在进入crtical section前或者需要访问共享的关键数据结构前,都获取spin lock才能够获准进入.如果
此时spin lock被 其他线程占用,则该线程简单的等待这个spin lock.在单cpu系统中spin lock的实现实际上完全是基于
IRQL来实现.但在SMP的系统中情况就变的复杂的多.
spin lock并不能完全满足执行体中的同步要求,因此,在执行体中ms提供了基于
调度对象的同步机制,一个线程可以通过在一个调度器对象上等待来实现与别的线程的同步.执行体中提供的调度器对象有多种,包括信号量,事件,mutex等
等.为了跟踪哪个线程在哪个对象上等待,windows2000利用dispatcher headers 和 wait blocks数据结构管理调度
器对象.他们定义在ntddk.h中
//
// Common dispatcher object header
//
// N.B. The size field contains the number of dwords in the structure.
//
typedef struct _DISPATCHER_HEADER {
UCHAR Type;
UCHAR Absolute;
UCHAR Size;
UCHAR Inserted;
LONG SignalState;
LIST_ENTRY WaitListHead;
} DISPATCHER_HEADER;
typedef struct _KWAIT_BLOCK {
LIST_ENTRY WaitListEntry;
struct _KTHREAD *RESTRICTED_POINTER Thread;
PVOID Object;
struct _KWAIT_BLOCK *RESTRICTED_POINTER NextWaitBlock;
USHORT WaitKey;
USHORT WaitType;
} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
dispatcher_header
包含对象的类型和等待在该对象上线程的列表信息.每个等待状态的线程都有一个wait block的列表,每个wait block表示一个等待的对象.
其中Thread指针指向拥有该等待块的线程,object指针指向该等待块表示的调度器对象,(线程正在等待这个对象),而WaitListEntry
维护一个在该调度器对象上等待的线程列表,所有等待该对象的线程被连成一个列表,这个列表的就是dispatcher header中
WaitListHead指向的那个列表.wait block中NextWaitBlock结构指向该线程的下一个等待块.一个线程可能在多个对象上等
待,对于每个对象都会有一个等待块表示,所有的等待块连成一个列表,其表头是线程的 KTHREAD结构中的Wait blocks结构.这样通过这两个
数据结构,系统可以很容易跟踪等待在同一调度器对象上的所有线程,和一个线程正在等待的所有调度器对象.
执行体的同步机制为用户模式的应用程序提供了同步支持,应用程序可以通过WaitForSingleObject或WaitForMultipleObjects API函数同步对共享资源的访问
文章评论(0条评论)
登录后参与讨论