进程上下文与线程上下文

6.1.2  线程上下文

操作系统管理很多进程的执行。有些进程是来自各种程序、系统应用程序的单独进程,而某些进程来自被分解为很多进程的应用或程序。当一个进程从内核中移出,另一个进程成为活动的,这些进程之间便发生了上下文切换。操作系统必须记录重启进程和启动新进程使之活动所需要的所有信息。这些信息被称作上下文,它描述了进程的现有状态。当进程成为活动的,它可以继续从被抢占的位置开始执行。进程的上下文信息包括:

进程id

指向可执行文件的指针

静态和动态分配的变量的内存

处理器寄存器

进程的上下文的多数信息都与地址空间的描述有关。进程的上下文使用很多系统资源,而且会花费一些时间来从一个进程的上下文切换到另一个进程的上下文。线程也有上下文。表6-1将线程上下文和第5章讨论的进程上下文进行了对比。当线程被抢占时,就会发生线程之间的上下文切换。如果线程属于相同的进程,它们共享相同的地址空间,因为线程包含在它们所属于的进程的地址空间内。这样,进程需要恢复的多数信息对于线程而言是不需要的。尽管进程和它的线程共享了很多内容,但最为重要的是其地址空间和资源,有些信息对于线程而言是本地且唯一的,而线程的其他方面包含在进程的各个段的内部。

6-1

上下文内容

    

线    

指向可执行文件的指针

x

 

x

x

内存(数据段和堆)

x

 

状态

x

x

优先级

x

x

程序I/O的状态

x

 

授予权限

x

 

调度信息

x

 

审计信息

x

 

有关资源的信息

● 文件描述符

● /写指针

x

 

有关事件和信号的信息

x

 

寄存器组

● 栈指针

● 指令计数器

● 诸如此类

x

x


对线程唯一或本地的信息包括线程id、处理器寄存器(当线程执行时寄存器的状态,包括程序计数器和栈指针)、线程状态及优先级、线程特定数据(thread-specific dataTSD)。线程id是在创建线程时指定的。线程能够访问它所属进程的数据段,因此线程可以读写它所属进程的全局声明数据。进程中一个线程做出的任何改动都可以被进程中的所有线程以及主线程获得。在多数情况下,这要求某种类型的同步以防止无意的更新。线程的局部声明变量不应当被任何对等线程访问。它们被放置到线程栈中,而且当线程完成时,它们便会被从栈中移走。

注意:

线程间的同步将在第7章中讨论。

TSD是一种结构体,包含线程私有的数据和信息。TSD可以包含进程全局数据的私有副本,还可以包含线程的信号掩码。信号掩码用来识别特定类型的信号,这些信号在发送给进程时不会被该线程接收。否则,如果操作系统给进程发送一个信号,进程的地址空间中的所有线程也会接收到那个信号。线程会接收所有没有被掩码遮蔽的信号。

线程与它所属的进程共享代码段和栈段。它的指令指针指向进程的代码段的某个位置,是下一条可执行的线程指令,而且栈指针指向进程栈中线程的栈的顶部位置。线程还可以访问任何环境变量。进程的所有资源(例如文件描述符)都将与线程共享。

展开阅读全文

没有更多推荐了,返回首页