#+ C + # & I16"2#$ $
%+' #
和 E+ 字段是包含相同内容的不同数据结构:此地址空间中的所有存储区。前者将它们存储在链接列表
中,而后者将它们存储在红黑树中。红黑树是二叉树的一种。像所有二叉树一样,搜索给定元素的操作复杂度是
I()。有关红黑树的进一步讨论,请参阅本章后面的“存储区的列表和树”。
$$& (+#$ $$ )
$ $$ # L & #
IE+$$%+ $ + # &
$ *$ "E$
$$CA$ +AI& $ +#
"
尽管内核通常会避免使用两个数据结构来组织相同数据的额外负担,但是冗余在这里很方便。 数据结构(作
为链接列表)允许简单高效地遍历所有元素。另一方面,作为红黑树的 E+ 数据结构更适合搜索给定元素。存
储器区域将在本章后面详细讨论。内核没有复制 E$ 结构;只是包含的对象。将链接列表覆盖到树上,并
使用两者访问同一组数据,有时称为线索树。
#E$$$$ $+ & < "
E +# #
$& E < G#
所有的 E$ 结构都通过 字段以双链表形式串在一起。列表中的初始元素是 E 内存描述符,它描
述了 进程的地址空间。可以通过 E 防止该列表被同时访问,该列表在 G# 中定义。
"B
& <#* 1
+E$ $$< F $(GH6 $ $%H $
* E16#$" * $ #16
E$$$ #E+& E16 G#7
&$ 8$E$$$ 8$
与给定任务关联的内存描述符存储在任务的进程描述符的 字段中。(进程描述符由在F $(GH中定义
的 E$ 结构体表示。)因此,$%H 是当前进程的内存描述符。E()函数在 #()期间将
父进程的内存描述符复制到其子进程。 通过 G# 中的 E()宏从 E+ 缓存中分配
E$ 结构体。通常,每个进程都有唯一的 E$,因此也就是唯一的进程地址空间。
+#'I7,EM-16
N#. " :
+% ' $(C' $( :"+
$ $
进程可以选择通过 ()的 'I7,EM 标志与其子进程共享地址空间。该子过程被称为线程。回想一下第 . 章
“进程管理”,这本质上是正常进程与 ' $( 中所谓的线程之间的唯一区别;' $( 内核不会以其他方式区分它们。线
程是内核的常规进程,仅共享某些资源。
!'I7,EM <E16 *<
# & E16D
在指定 'I7,EM 的情况下,不调用 E(),并且进程的 字段设置为通过 E()中的逻辑指
向其父进程的内存描述符:
0