上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
7.2 关键区段概述
Critical Section(关键区段)是一段可执行的代码。这段代码在执行过程中,不能被打断,否则可能会产生严重问题。一般情况下,关键区段内的代码往往对全局的数据进行修改或读取,这些数据为系统中所有的线程共享,如果在修改的过程中被打断,可能会导致这些全局数据处于一种不一致的状态。
在当前版本的Hello China的设计中,为了确保操作系统核心数据结构的一致性,实现了关键区段。如果在一段代码中涉及修改全局变量,比如内存管理数据结构等,就需要把这段代码作为关键区段来对待。下列两个宏:
__ENTER_CRITICAL_SECTION(objptr,flags) __LEAVE_CRITICAL_SECTION(objptr,flags)
用来完成关键区段的保护。在一段代码的开始部分,调用__ENTER_CRITICAL_SECTION宏,就进入了关键区段,执行过程中不会受到任何干扰。一旦代码执行完毕,调用__LEAVE_CRITICAL_SECTION宏,离开关键区段。其中,objptr是一个对象指针,目前没有使用(代码中,可以把该变量设置为NULL,该变量的作用,在本书后续部分介绍);flags变量是一个本地声明的变量,用来保存EFLAGS寄存器的值。比如nKernelObject是一个全局变量,修改时,需要使用关键区段进行保护,可以采用如下代码:
DWORD dwFlags; __ENTER_CRITICAL_SECTION(NULL,dwFlags) nKernelObject+=100; __LEAVE_CRITICAL_SECTION(NULL,dwFlags)
在接下来的几节中,我们将详细介绍关键区段产生的原因以及当前版本Hello China关键区段的实现方式。在本章的后面部分,我们对Power PC环境下的互斥机制进行了简单的描述,以加深读者对该部分的理解。