什么是守卫区域以及它与关键区域的区别?

时间:2014-07-14 10:28:11

标签: windows multithreading

Threre是Windows中的"guarded region"概念,类似于关键区域。谁知道它与Critical有何不同?

1 个答案:

答案 0 :(得分:4)

回想一下,任何现代操作系统上的进程都由几个组件组成。我们感兴趣的是:

  • code:正在执行的程序的主体,
  • 内存:代码以及与执行相关的数据(堆和堆栈)存储在进程的持续时间内,
  • thread:执行上下文,即与该上下文相关的CPU状态和内存位(例如堆栈),
  • 信号槽:一种处理结构,用于保存线程相互发出的信号,每个线程都有一个这样的结构(即,它是线程的一个存储位)

在一个过程中,可能存在这些对象的多个实例;通常,代码和内存可由进程中的所有现有线程访问。在任何时候,可能存在与CPU上的可用核心一样多的活动线程(即,并发执行)。如果这些线程属于同一进程,则在访问相同的内存或代码段时可能会产生干扰。为此,Windows实现了所谓的critical sections,它基本上是受保护的代码块(它与Java中 synchronized 代码块的概念非常相似)。

但是,当信号被触发或发布给它们时,线程也可能从其当前执行代码路径转移。在Windows上,APC是该信令机制的一种形式。有保护的部分可用于确保线程在能够处理这些信号之前完成给定的代码块(在这种情况下为APC)。

因此,虽然一个关键部分将阻止除活动部分之外的任何其他线程同时执行受保护的代码部分,但是一个受保护的部分将确保当前线程一旦启动它就不会执行除受保护的代码之外的任何其他代码。

作为一个简单的类比,想象一下代码部分就像建筑物中的平面(流程代码)。进入受到严格保护的密码的人(线程)将锁定公寓的大门,从而防止任何其他人在她仍在室内时进入。如果代码受到保护,那么操作系统将锁定该人的手机,阻止她在实际离开公寓之前接听电话。

关键部分的典型场景是需要专门访问特定资源(套接字,文件句柄,内存数据结构)。对于APC,类似地,受保护的部分可以防止线程在APC执行中尝试访问其中一个此类资源时阻止线程自身干扰。