1、本章以本章以UNIXSystemV为主,介绍为主,介绍UNIX的进程和存的进程和存储管理方法。储管理方法。6.1UNIX进程和存储管理简介进程和存储管理简介UNIX系统的核心部分从整体上说可以分为两大部分,系统的核心部分从整体上说可以分为两大部分,即即“静静”的文件系统和的文件系统和“动动”的进程控制系统。文的进程控制系统。文件系统主要用来存放、管理那些暂时不被处理机执件系统主要用来存放、管理那些暂时不被处理机执行的程序和数据,它为程序和数据文件分配空间,行的程序和数据,它为程序和数据文件分配空间,控制文件存取和为用户检索信息。而进程控制系统控制文件存取和为用户检索信息。而进程控制系统则负责为
2、将要执行的程序和数据文件分配内存空间,则负责为将要执行的程序和数据文件分配内存空间,并负责进程调度、控制并发进程的执行速度和分配并负责进程调度、控制并发进程的执行速度和分配必要的资源,以及负责进程通信和内存管理等。必要的资源,以及负责进程通信和内存管理等。UNIX的进程控制系统与文件系统之间通过系统调的进程控制系统与文件系统之间通过系统调用来互相作用。先介绍用来互相作用。先介绍UNIX的进程控制系统部分。的进程控制系统部分。UNIX系统把一个程序看作是一个可执行文件,而把系统把一个程序看作是一个可执行文件,而把一个进程看作是程序的执行或执行中的程序实例。一个进程看作是程序的执行或执行中的程序实
3、例。但是,从静态的观点看,但是,从静态的观点看,CPU把进程解释为由一组把进程解释为由一组机器指令、数据和堆栈结构组成的集合,及其上下机器指令、数据和堆栈结构组成的集合,及其上下文。系统核心调度进程占据文。系统核心调度进程占据CPU。由于调度并不一。由于调度并不一定是在每个进程执行完毕时发生,因此,系统内同定是在每个进程执行完毕时发生,因此,系统内同时有多个进程在执行。而且,若干个进程可以同时时有多个进程在执行。而且,若干个进程可以同时调用一个子程序。调用一个子程序。和其他所有操作系统一样,和其他所有操作系统一样,UNIX操作系统只有在其操作系统只有在其内核装入内存后才能开始运行。内核装入内存
4、后才能开始运行。为了使操作系统内核能在每次开机时顺利地装入内存,为了使操作系统内核能在每次开机时顺利地装入内存,用户必须事先把用户必须事先把UNIX操作系统的执行代码以文件操作系统的执行代码以文件方式存储在计算机硬盘设备中,并对计算机系统中方式存储在计算机硬盘设备中,并对计算机系统中的相应资源,例如高速缓存、交换区等进行初始化。的相应资源,例如高速缓存、交换区等进行初始化。这一过程被称为操作系统的安装过程。一个商用的这一过程被称为操作系统的安装过程。一个商用的操作系统都有自己的自动安装程序。用户在购买了操作系统都有自己的自动安装程序。用户在购买了操作系统之后,只要按照操作系统程序的提示和说操作
5、系统之后,只要按照操作系统程序的提示和说明,一般都能进行系统安装。因此,本章的进程运明,一般都能进行系统安装。因此,本章的进程运行和存储管理都是假定在一个已完全安装完毕的操行和存储管理都是假定在一个已完全安装完毕的操作系统基础上进行的。作系统基础上进行的。在一个已安装好在一个已安装好UNIX系统的操作系统中,启动电源系统的操作系统中,启动电源意味着系统引导程序开始系统自举,引导在外存硬意味着系统引导程序开始系统自举,引导在外存硬盘中的操作系统进入内存。这一过程是一个启动盘中的操作系统进入内存。这一过程是一个启动UNIX系统、设置和初始化各种数据结构与表格、系统、设置和初始化各种数据结构与表格、
6、建立控制建立控制UNIX系统内核运行的控制进程(在系统内核运行的控制进程(在UNIX系统中,把核心进程称为系统中,把核心进程称为0#进程),和建立控制终进程),和建立控制终端进程与端进程与Shell进程(用户交互进程)运行的进程(用户交互进程)运行的1#进程。进程。最后,系统在建立了最后,系统在建立了0#进程和进程和1#进程等之后,将出进程等之后,将出现相应的提示符,以等待用户输入命令来执行和处现相应的提示符,以等待用户输入命令来执行和处理用户应用程序。理用户应用程序。UNIX系统在初始过程中的运行如图系统在初始过程中的运行如图6.1所示。图中,所示。图中,当系统创建了当系统创建了1#进程之后
7、,进程之后,1#进程将会调用相应的进程将会调用相应的终端管理进程,为终端管理进程,为UNIX系统的不同终端创建相应系统的不同终端创建相应的终端管理进程和的终端管理进程和Shell进程,从而使每个终端上的进程,从而使每个终端上的用户都可以在用户都可以在Shell的管理下交互使用的管理下交互使用UNIX系统。系统。图图6.1UNIX中各进程的关系中各进程的关系Shell程序将为用户提供解释执行用户命令的交互工程序将为用户提供解释执行用户命令的交互工具。随着用户命令,例如具。随着用户命令,例如“cp”等的输入,系统将等的输入,系统将为该命令建立一个执行该命令的用户进程。如果这为该命令建立一个执行该命
8、令的用户进程。如果这个用户进程抢不到处理器,则个用户进程抢不到处理器,则Shell进程会自动退出进程会自动退出处理器,进入等待队列,以便用户进程执行。在用处理器,进入等待队列,以便用户进程执行。在用户进程执行结束后,户进程执行结束后,Shell进程又恢复执行,并显示进程又恢复执行,并显示提示符和等待用户的下一条命令输入。提示符和等待用户的下一条命令输入。UNIX系统系统的所有进程都是在上述执行过程中产生和消亡。的所有进程都是在上述执行过程中产生和消亡。由图由图6.1可以看到,在可以看到,在UNIX系统中还未创建出其他新系统中还未创建出其他新用户进程之前,只有用户进程之前,只有0#进程、进程、1
9、#进程以及终端管理进程以及终端管理进程与进程与Shell进程存在。其中,终端管理进程与进程存在。其中,终端管理进程与Shell进程是进程是1#进程的子进程,这是因为在进程的子进程,这是因为在UNIX系统中,系统中,除了除了0#进程和进程和1#进程之外,其他进程都是由父进程进程之外,其他进程都是由父进程创建的。人们也称创建的。人们也称1#进程是所有用户进程的祖先。进程是所有用户进程的祖先。UNIX操作系统的操作系统的0#进程在核心态下运行,而进程在核心态下运行,而1#进程进程以及由以及由1#进程衍生的其他进程都可在用户态和核心进程衍生的其他进程都可在用户态和核心态两种执行模式下执行。态两种执行模
10、式下执行。在不同的执行模式下执行时,同一进程使用不同的堆在不同的执行模式下执行时,同一进程使用不同的堆栈和不同的管理数据结构。在两种不同模式下执行栈和不同的管理数据结构。在两种不同模式下执行的程序不能互相访问各自的堆栈,它们之间的参数的程序不能互相访问各自的堆栈,它们之间的参数传递往往需要借助通用寄存器等硬件。两态之间的传递往往需要借助通用寄存器等硬件。两态之间的主要区别是,用户态下的进程能存取它们自己的指主要区别是,用户态下的进程能存取它们自己的指令与数据,但不能存取核心指令和数据。然而,核令与数据,但不能存取核心指令和数据。然而,核心态下的进程能存取核心和用户地址。另外,某些心态下的进程能
11、存取核心和用户地址。另外,某些机器的指令是特权指令,在用户态下执行会引起错机器的指令是特权指令,在用户态下执行会引起错误,只能在核心态下执行。另外,在后面的章节中误,只能在核心态下执行。另外,在后面的章节中将会看到,核心态模式享有比用户态模式高的优先将会看到,核心态模式享有比用户态模式高的优先级。因此,尽管是同一进程,有时仍把它分开称为级。因此,尽管是同一进程,有时仍把它分开称为用户进程和系统进程(核心进程)。用户进程和系统进程(核心进程)。进程与进程与1#进程是进程是UNIX系统中最重要的两个进程。其系统中最重要的两个进程。其中,中,0#进程是进程是UNIX系统中唯一只在核心态下执行系统中唯
12、一只在核心态下执行的进程。它有三种功能,除了在初始化时创建的进程。它有三种功能,除了在初始化时创建1#进进程之外,还负责调度分配处理器以及负责进程交换。程之外,还负责调度分配处理器以及负责进程交换。有关有关UNIX进程调度和交换功能将在本章后续部分进程调度和交换功能将在本章后续部分介绍。介绍。UNIX进程的核心态和用户态之间的转换靠中断以及进程的核心态和用户态之间的转换靠中断以及硬件设置等方法完成,当用户进程由用户态转向核硬件设置等方法完成,当用户进程由用户态转向核心态执行时,需要依靠中断或后述的陷阱来实现。心态执行时,需要依靠中断或后述的陷阱来实现。在核心态执行的进程只有通过设置程序状态寄存
13、器在核心态执行的进程只有通过设置程序状态寄存器PSW才能回到用户态。它们之间的关系如图才能回到用户态。它们之间的关系如图6.2所所示。示。图图6.2UNIX进程的核心态与用户态之间的转换进程的核心态与用户态之间的转换系统在逻辑上由四个模块组成。即与文件系统的接口系统在逻辑上由四个模块组成。即与文件系统的接口部分,进程本身的控制部分,包括进程的创建、进部分,进程本身的控制部分,包括进程的创建、进程调度和进程的撤消等,第三部分是进程间控制部程调度和进程的撤消等,第三部分是进程间控制部分,包括进程间的互斥、同步和通信等,第四部分分,包括进程间的互斥、同步和通信等,第四部分是存储管理部分。进程控制系统
14、模块结构如图是存储管理部分。进程控制系统模块结构如图6.3所示。所示。图图6.3进程控制系统进程控制系统进程控制系统与文件系统的接口有两个,一个是在系进程控制系统与文件系统的接口有两个,一个是在系统内部与文件系统直接发生联系的有关表格和数据统内部与文件系统直接发生联系的有关表格和数据结构。另一个则是通过系统调用界面,也就是中断结构。另一个则是通过系统调用界面,也就是中断和陷阱(和陷阱(InterruptTrap)总控部分与文件系统)总控部分与文件系统发生联系。以便把待执行的文件读入内存,或把已发生联系。以便把待执行的文件读入内存,或把已经执行完毕的程序和结果写入文件系统长期保存。经执行完毕的程
15、序和结果写入文件系统长期保存。调度模块的作用是分配调度模块的作用是分配CPU。显然,在进行资源分配。显然,在进行资源分配、特别是、特别是CPU分配时要按照一种既公平合理又有分配时要按照一种既公平合理又有很高效率的分配原则。在很高效率的分配原则。在UNIX系统中,这个调度系统中,这个调度原则就是按照进程的优先级,每次调度具有最高优原则就是按照进程的优先级,每次调度具有最高优先级的进程去占有处理机。每一个进程,从它被创先级的进程去占有处理机。每一个进程,从它被创建的那一时刻起,就具有了一个随时间动态变化的建的那一时刻起,就具有了一个随时间动态变化的优先级。在优先级。在UNIXSystem中,系统有
16、两个时机中,系统有两个时机计算各进程的优先级。这两个时机是:计算各进程的优先级。这两个时机是:(1)每秒钟一次的时间片结束发生时钟中断时,对那每秒钟一次的时间片结束发生时钟中断时,对那些优先级大于某个常数的进程进行重新计算。些优先级大于某个常数的进程进行重新计算。(2)当前执行进程请求系统调用后,从中断和陷阱总当前执行进程请求系统调用后,从中断和陷阱总控程序返回当前执行的用户态时,重新计算当前执控程序返回当前执行的用户态时,重新计算当前执行进程的优先级。行进程的优先级。这里要指出的一点是,系统计算各进程优先级的时间这里要指出的一点是,系统计算各进程优先级的时间并不总是发生进程调度的时间。并不总
17、是发生进程调度的时间。UNIXSystem中引起进程调度的情况有五种:中引起进程调度的情况有五种:(1)当前执行进程申请内存等系统资源未得到满足,当前执行进程申请内存等系统资源未得到满足,从而自己调用从而自己调用sleep过程过程,放弃处理机进入睡眠状态。放弃处理机进入睡眠状态。(2)为了与其他并发进程保持同步,调用了为了与其他并发进程保持同步,调用了wait或或stop过程等,从而主动放弃了处理机而进入睡眠状态。过程等,从而主动放弃了处理机而进入睡眠状态。(3)当系统发现系统中某进程的优先级已高于当前执当系统发现系统中某进程的优先级已高于当前执行进程的优先级时,系统设置一个名叫行进程的优先级
18、时,系统设置一个名叫runrun的调的调度标志。但是,系统并不在度标志。但是,系统并不在runrun标志刚被设置时标志刚被设置时就开始调度。它要等待到系统在核心态下的程序执就开始调度。它要等待到系统在核心态下的程序执行完毕,由核心态转入用户态时,也就是在中断陷行完毕,由核心态转入用户态时,也就是在中断陷入总控处理程序结束之前的瞬间,检查入总控处理程序结束之前的瞬间,检查runrun标志标志并进行调度。并进行调度。(4)时间片用完,且当前进程的优先级低于其他就绪时间片用完,且当前进程的优先级低于其他就绪进程。进程。(5)当前进程调用当前进程调用exit,自我终止时。,自我终止时。进程通信是进程通
19、信是UNIXSystem的一个重要组成部分。的一个重要组成部分。进程通信既包括用来控制各并发进程执行速度和资进程通信既包括用来控制各并发进程执行速度和资源共享与竞争的低级通信,也包括进程之间大量传源共享与竞争的低级通信,也包括进程之间大量传递信息的高级通信。递信息的高级通信。UNIX系统在核心态下执行时,系统进程只能借助系统在核心态下执行时,系统进程只能借助sleep原语和原语和wakeup(或(或set-run)原语实现同步。)原语实现同步。sleep原语使当前执行进程以指定原因和优先数睡原语使当前执行进程以指定原因和优先数睡眠,而眠,而wakeup则唤醒在指定原因上睡眠的所有进则唤醒在指定
20、原因上睡眠的所有进程。用户进程不能使用程。用户进程不能使用sleep原语和原语和wake-up原语。原语。用户进程之间要实现同步通信的话,一种办法是利用户进程之间要实现同步通信的话,一种办法是利用系统核心提供的软中断信号进行通信。用系统核心提供的软中断信号进行通信。UNIXSystem为用户使用软中断通信提供了相应的系为用户使用软中断通信提供了相应的系统调用。另一种办法是调用系统调用统调用。另一种办法是调用系统调用wait或或sleep使使得当前执行进程进入等待状态,直到所等待事件发得当前执行进程进入等待状态,直到所等待事件发生时由核心唤醒或睡眠到一定时间后自动唤醒。用生时由核心唤醒或睡眠到一
21、定时间后自动唤醒。用户进程之间实现同步的高级办法是使用户进程之间实现同步的高级办法是使用System提提供的信号量方法。供的信号量方法。System中的中的IPC模块为进程间模块为进程间的大量信息传送提供了众多的系统调用。的大量信息传送提供了众多的系统调用。除了上述通信手段之外,除了上述通信手段之外,UNIX还提供了一种称之为还提供了一种称之为管道(管道(pipe)的信息传送手段。它以临时文件的方)的信息传送手段。它以临时文件的方式,实现同一主机内的进程之间批量数据的单向、式,实现同一主机内的进程之间批量数据的单向、先进先出方式的无格式字符流传送。先进先出方式的无格式字符流传送。存储管理模块控
22、制存储分配。任何一个待执行进程,存储管理模块控制存储分配。任何一个待执行进程,如果它不能在内存中占据必需的容量,它是不能执如果它不能在内存中占据必需的容量,它是不能执行的。换句话说,行的。换句话说,CPU绝对不会执行一个全部内绝对不会执行一个全部内容都在外存的进程。然而,内存是一种有限而又昂容都在外存的进程。然而,内存是一种有限而又昂贵的资源,它不可能容纳系统中全部活动进程。存贵的资源,它不可能容纳系统中全部活动进程。存储管理系统必须决定把哪一个进程的哪一部分留在储管理系统必须决定把哪一个进程的哪一部分留在内存中,而把哪一部分放在外存。也就是说,存储内存中,而把哪一部分放在外存。也就是说,存储
23、管理部分管理进程在内存和外存之间的信息转移,管理部分管理进程在内存和外存之间的信息转移,以便所有进程都得到公平执行的机会。以便所有进程都得到公平执行的机会。下面先介绍下面先介绍UNIX系统的进程结构。系统的进程结构。6.2UNIX进程结构进程结构本节将进一步介绍本节将进一步介绍UNIXSystem进程的静态构成,进程的静态构成,定义进程上下文及其状态转换等。定义进程上下文及其状态转换等。6.2.1进程的概念进程的概念在在UNIX系统中,进程被赋予了下述特定的含义和特系统中,进程被赋予了下述特定的含义和特性:性:(1)一个进程是对一个程序的执行。一个进程是对一个程序的执行。(2)一个进程的存在意
24、味着在所谓的一个进程的存在意味着在所谓的“proc”数组数组(PCB的常驻内存部分)中有一个非零的结构存在的常驻内存部分)中有一个非零的结构存在,它包含着相应的进程控制信息。,它包含着相应的进程控制信息。(3)对于每一个进程有一个被称为对于每一个进程有一个被称为U区或区或user结构的结构的数据结构。这个数据结构放置该进程的私用控制信数据结构。这个数据结构放置该进程的私用控制信息,且在进程被创建时才会由系统分配相应的域。息,且在进程被创建时才会由系统分配相应的域。(4)一个进程可以生成或消灭其子进程。一个进程可以生成或消灭其子进程。(5)一个进程是获得和释放各种系统资源的基本单位。一个进程是获
25、得和释放各种系统资源的基本单位。上述第上述第(1)点是反映进程动态特性的,而第点是反映进程动态特性的,而第(2)点与第点与第(3)点又反映了进程的静态特性。第点又反映了进程的静态特性。第(4)点与第点与第(5)点点反映了反映了UNIX系统的进程之间的关系以及系统的进程之间的关系以及UNIX没有没有作业概念的特性。事实上,由第作业概念的特性。事实上,由第3章可知,一个进章可知,一个进程的静态描述是由三部分组成的,即进程状态控制程的静态描述是由三部分组成的,即进程状态控制块块PCB(栈段),进程的程序文本(正文)段以及(栈段),进程的程序文本(正文)段以及进程的数据段。在第进程的数据段。在第3章中
26、,把这三部分统称为进章中,把这三部分统称为进程上下文,而进程的动态特性则定义为在进程上下程上下文,而进程的动态特性则定义为在进程上下文中的执行。文中的执行。首先介绍首先介绍UNIXSystem进程的虚拟地址结构。进程的虚拟地址结构。由于由于UNIXSystem进程的虚拟地址结构是依赖于硬进程的虚拟地址结构是依赖于硬件,因此,如果不作特别说明,本文默认那些与硬件,因此,如果不作特别说明,本文默认那些与硬件有关的部分都是依赖于件有关的部分都是依赖于VAX11的。的。6.2.2进程的虚拟地址结构进程的虚拟地址结构如上所述,如上所述,UNIXSystem的进程由三个逻辑段组的进程由三个逻辑段组成:即存
27、放状态控制块的栈段、存放成:即存放状态控制块的栈段、存放CPU执行指执行指令集合的正文段以及被执行指令所访问的数据段。令集合的正文段以及被执行指令所访问的数据段。UNIXSystem中,一个进程的虚拟地址空间被分中,一个进程的虚拟地址空间被分成若干个逻辑区(成若干个逻辑区(logicalregion)来存放上述三个)来存放上述三个逻辑段。区是进程虚拟地址空间上的一段连续区域,逻辑段。区是进程虚拟地址空间上的一段连续区域,它是被共享、保护以及进行内存分配和地址变换的它是被共享、保护以及进行内存分配和地址变换的独立实体。正文、数据和栈分别存放于各自的区中。独立实体。正文、数据和栈分别存放于各自的区
28、中。这里,要强调的一点是进程的虚拟地址在各区之内是这里,要强调的一点是进程的虚拟地址在各区之内是连续的。连续的。为了管理每个进程中的区,系统设有一个称为区表的为了管理每个进程中的区,系统设有一个称为区表的数据结构,每个在系统中存在的区都在该表中占有数据结构,每个在系统中存在的区都在该表中占有一个表项。区表包括下列内容:一个表项。区表包括下列内容:(1)区的类型,指明该区存放正文段、数据段或私有区的类型,指明该区存放正文段、数据段或私有数据及栈段。数据及栈段。(2)区的长度。区的长度。(3)区所对应页表的内存始址。区所对应页表的内存始址。(4)区的状态,包括是否已被调入内存,是否正在调区的状态,
29、包括是否已被调入内存,是否正在调入内存过程中,是否被锁住,以及是否正在被请求入内存过程中,是否被锁住,以及是否正在被请求调入内存等。调入内存等。(5)共享位,给出共享该区的进程数。共享位,给出共享该区的进程数。(6)文件系统指针,指向外存中与该区对应的数据文文件系统指针,指向外存中与该区对应的数据文件。件。区表如图区表如图6.4所示。所示。图图6.4系统区表系统区表在系统创建新进程时,核心将从区表中分配相应的表在系统创建新进程时,核心将从区表中分配相应的表项给所创建的进程。项给所创建的进程。为了把区表和进程联系起来,当进程中的某个逻辑段为了把区表和进程联系起来,当进程中的某个逻辑段在区表中分得
30、表项并填写了相关栏目之后,将把该在区表中分得表项并填写了相关栏目之后,将把该表项的内存地址返回到进程的表项的内存地址返回到进程的proc结构中。结构中。proc结结构中与区表项有关的还有该段在虚存空间的起始地构中与区表项有关的还有该段在虚存空间的起始地址,内存中的页表地址及页表长度等。关于址,内存中的页表地址及页表长度等。关于proc结结构,将在后面讲述。构,将在后面讲述。把区表和进程把区表和进程proc结构分开的原因之一是便于共享,结构分开的原因之一是便于共享,因为每个逻辑区(段)在不同的进程中对应的虚拟因为每个逻辑区(段)在不同的进程中对应的虚拟地址是不同的,但它们却可以通过区表而对应变换
31、地址是不同的,但它们却可以通过区表而对应变换到同一物理内存空间。区表和进程到同一物理内存空间。区表和进程proc结构的关系结构的关系如图如图6.5所示。所示。图图6.5区表与进程区表与进程proc结构结构在系统创建一个进程或让一个进程共享其他进程的某在系统创建一个进程或让一个进程共享其他进程的某个段时,在分配区表项后或在改变有关区表项共享个段时,在分配区表项后或在改变有关区表项共享计数位后,把这些区表项与有关进程连接起来。对计数位后,把这些区表项与有关进程连接起来。对新进程的连接是在创建新进程的连接是在创建proc结构时填写区表项地址,结构时填写区表项地址,该区表项对应逻辑段的虚拟地址、所需页
32、表的内存该区表项对应逻辑段的虚拟地址、所需页表的内存始址、逻辑段长度等。对共享段的连接只要填写区始址、逻辑段长度等。对共享段的连接只要填写区表项地址、页表内存始址和长度即可。但是,共享表项地址、页表内存始址和长度即可。但是,共享段的虚拟地址在不同的进程中是不一样的。段的虚拟地址在不同的进程中是不一样的。在区表的讨论中,大家也可能注意到一点,即在区表的讨论中,大家也可能注意到一点,即UNIXSystem中的区和段页式管理中的段非常相像。中的区和段页式管理中的段非常相像。所不同的是,段页式管理中的虚拟地址空间是二维所不同的是,段页式管理中的虚拟地址空间是二维的,而的,而UNIXSystem的各个进
33、程的分区虚拟地址的各个进程的分区虚拟地址仍是一维的。另外,仍是一维的。另外,UNIXSystem的分区并不是的分区并不是由用户按照段的逻辑功能独立定义,而是由系统设由用户按照段的逻辑功能独立定义,而是由系统设计人员预先设置好的。计人员预先设置好的。6.2.3进程上下文进程上下文UNIXSystem的进程上下文是由正文段,也就是的进程上下文是由正文段,也就是CPU执行指令的集合、核心数据结构、和有关寄执行指令的集合、核心数据结构、和有关寄存器的内容与数据段组成。存器的内容与数据段组成。1.进程上下文的基本结构进程上下文的基本结构进程上下文的各个部分按照一定的规则分布在进程虚进程上下文的各个部分按
34、照一定的规则分布在进程虚拟空间的不同位置上。对于不同的机器和硬件结构,拟空间的不同位置上。对于不同的机器和硬件结构,进程上下文的分布规则不同。例如,在进程上下文的分布规则不同。例如,在VAX-11型型机上,其虚拟地址空间划分为进程空间和系统空间机上,其虚拟地址空间划分为进程空间和系统空间两大部分。其寻址范围为两大部分。其寻址范围为232个单元,即个单元,即4096M位。位。其中,虚拟空间的低位地址的半部分(其中,虚拟空间的低位地址的半部分(0231-1)是进程虚拟空间,其余为所有进程共享的系统空间,是进程虚拟空间,其余为所有进程共享的系统空间,操作系统核心程序占据这个区。操作系统核心程序占据这
35、个区。进程虚拟空间又分为程序区进程虚拟空间又分为程序区P0和控制区和控制区P1,其中,其中P0区区用来放用户程序,也就是进程上下文中的正文段代用来放用户程序,也就是进程上下文中的正文段代码。这个段的起始虚址为码。这个段的起始虚址为0,且可以动态地向高地,且可以动态地向高地址方向增长。址方向增长。P1区容纳各种方式的栈以及存放受保区容纳各种方式的栈以及存放受保护的进程专用代码和数据,护的进程专用代码和数据,P1区从区从231-1单元开始向单元开始向低地址方向增长。进程空间基本结构如图低地址方向增长。进程空间基本结构如图6.6。在图在图6.6中,核心态栈(中,核心态栈(kernalstack)是该
36、进程执行)是该进程执行核心程序时,保留的核心栈副本。该栈中装有进程核心程序时,保留的核心栈副本。该栈中装有进程调用核心函数时用到的有关参数等,另外,还包括调用核心函数时用到的有关参数等,另外,还包括系统调用的调用序列。设置核心栈的目的是使进程系统调用的调用序列。设置核心栈的目的是使进程在执行了不同调用顺序的核心函数之后,仍能返回在执行了不同调用顺序的核心函数之后,仍能返回到原来的用户态下执行。核心栈具有多个层次,其到原来的用户态下执行。核心栈具有多个层次,其中每层可保留一次调用或中断处理后,返回被中断中每层可保留一次调用或中断处理后,返回被中断程序处继续执行所必需的有关寄存器的值。程序处继续执
37、行所必需的有关寄存器的值。图图6.6进程空间结构进程空间结构用户栈含有在用户态下执行时函数调用的参数、局部用户栈含有在用户态下执行时函数调用的参数、局部变量及其他数据。图变量及其他数据。图6.7给出了执行给出了执行copy程序时用户程序时用户栈和核心栈的变化例。图栈和核心栈的变化例。图6.7的左侧描述了当由的左侧描述了当由main(argc,argv)过程调用过程调用copy(old,new),过程过程copy(old,new)更进一步调用库函数更进一步调用库函数write()来调用来调用write的内部结构。系统调用使用专门的陷阱指令的内部结构。系统调用使用专门的陷阱指令trap,执行,执行
38、trap指令将产生一个中断,使得进程的指令将产生一个中断,使得进程的执行模式由用户态转换为核心态。执行模式由用户态转换为核心态。然后,用户态执行转变为核心程序执行然后,用户态执行转变为核心程序执行,并使用核心并使用核心栈。栈。由于内核保护的原因,用户栈和核心栈之间不能互相由于内核保护的原因,用户栈和核心栈之间不能互相传递参数。因此,如果要把用户程序中的参数传递传递参数。因此,如果要把用户程序中的参数传递给核心函数,必须通过通用寄存器和进程的给核心函数,必须通过通用寄存器和进程的PCB结结构。构。图图6.7执行执行copy程序时用户栈和核心栈的变化程序时用户栈和核心栈的变化进程空间的用户进程正文
39、段、数据段、用户栈、核心进程空间的用户进程正文段、数据段、用户栈、核心栈以及有关的专用代码和数据是以进程为单位独立栈以及有关的专用代码和数据是以进程为单位独立的。它们根据需要换进换出内存。的。它们根据需要换进换出内存。在系统虚拟空间部分存放的进程上下文部分是:系统在系统虚拟空间部分存放的进程上下文部分是:系统程序用页表、进程页表、程序用页表、进程页表、proc结构、核心正文段和结构、核心正文段和数据段等。系统虚拟空间的内容常驻内存,不因内数据段等。系统虚拟空间的内容常驻内存,不因内存的大小或执行情况而换进换出。另外,由于核心存的大小或执行情况而换进换出。另外,由于核心正文段和与它们有关的数据结
40、构、系统页表是被所正文段和与它们有关的数据结构、系统页表是被所有进程共享的,在有进程共享的,在UNIX系统中,不把它们看作进系统中,不把它们看作进程上下文的一部分。程上下文的一部分。2.进程上下文的组成部分进程上下文的组成部分进程上下文由进程上下文由proc结构、结构、user结构、用户栈和核心栈结构、用户栈和核心栈的内容、用户地址空间的正文段、数据段、硬件寄的内容、用户地址空间的正文段、数据段、硬件寄存器的内容以及区表和页表等组成。存器的内容以及区表和页表等组成。proc结构结构UNIX的的proc结构和结构和user结构相当于在第结构相当于在第3章中介绍的章中介绍的进程控制块进程控制块PC
41、B。之所以把进程控制块分成两部分。之所以把进程控制块分成两部分的原因是的原因是user结构中主要包含那些只有进程执行时结构中主要包含那些只有进程执行时才被使用的控制信息,从而,这些信息可以不必常才被使用的控制信息,从而,这些信息可以不必常驻内存而节省内存空间。驻内存而节省内存空间。UNIXSystem的的proc结构主要包括以下各项:结构主要包括以下各项:(1)标识进程的状态用的状态位。标识进程的状态用的状态位。UNIXSystem共共有有9个状态编码。个状态编码。(2)若干用户标识号,简称若干用户标识号,简称UID或用户或用户ID。这些用户。这些用户标识号指出该进程属于哪一组用户,具有何种特
42、权,标识号指出该进程属于哪一组用户,具有何种特权,例如是否可以互相发送软中断等等。例如是否可以互相发送软中断等等。(3)若干进程标识号,简称若干进程标识号,简称PID或进程或进程ID,说明进程,说明进程相互间的关系。相互间的关系。(4)存储区位置和长度,指明进程在内存或在外存中存储区位置和长度,指明进程在内存或在外存中的位置及大小。这些信息在进程换入换出,以及状的位置及大小。这些信息在进程换入换出,以及状态转换等时用到。态转换等时用到。(5)调度参数,包括优先数等。核心用它们决定进程调度参数,包括优先数等。核心用它们决定进程转换到核心态和用户态的次序以及占有处理机的次转换到核心态和用户态的次序
43、以及占有处理机的次序。序。(6)软中断信号项,记录发向一个进程的所有未处理软中断信号项,记录发向一个进程的所有未处理的软中断信号。的软中断信号。(7)各种计时项,给出进程执行时间和系统资源的利各种计时项,给出进程执行时间和系统资源的利用情况。这些信息用来为进程计账、计算调度优先用情况。这些信息用来为进程计账、计算调度优先权,以及发送计时信号等。权,以及发送计时信号等。(8)user结构的起始地址项。结构的起始地址项。(9)进程页表指针,用于进程页表指针,用于CPU访问内存时的地址变换。访问内存时的地址变换。user结构结构user结构则主要包括以下各项结构则主要包括以下各项(1)指向指向pro
44、c结构的指针,标识出对应于该结构的指针,标识出对应于该user结构的结构的proc结构。结构。(2)一个含有系统调用结果的返回值项,当系统调用执一个含有系统调用结果的返回值项,当系统调用执行结束之后,所得结果存放该项中以便用户程序可行结束之后,所得结果存放该项中以便用户程序可以使用。以使用。(3)与用户标识有关的若干项,它们决定进程的各种权与用户标识有关的若干项,它们决定进程的各种权限,如存取权限等。限,如存取权限等。(4)与文件结构有关的若干项,它们描述文件的当前目与文件结构有关的若干项,它们描述文件的当前目录和当前根,以及进程的文件系统环境。录和当前根,以及进程的文件系统环境。(5)与文件
45、读写有关的若干项,描述所要传送的数据量,与文件读写有关的若干项,描述所要传送的数据量,在用户空间的源在用户空间的源(或目的)数据的数组地址、读写的或目的)数据的数组地址、读写的文件字节数、读写方式、缓冲区长度与地址等。文件字节数、读写方式、缓冲区长度与地址等。(6)用户文件描述符表,记录该进程已打开的文件。用户文件描述符表,记录该进程已打开的文件。(7)中断及软中断处理的有关参数,依靠这些参数,中断及软中断处理的有关参数,依靠这些参数,进程对所收到的软中断信号作出不同的反应。进程对所收到的软中断信号作出不同的反应。(8)出错管理项,记录系统调用过程中遇到的错误,出错管理项,记录系统调用过程中遇
46、到的错误,以便系统或进程做相应的处理。以便系统或进程做相应的处理。(9)对该进程创建的所有文件设置许可权方式字段的对该进程创建的所有文件设置许可权方式字段的屏蔽模式项。屏蔽模式项。(10)与上下文切换、现场保护有关的各项,它们保存与上下文切换、现场保护有关的各项,它们保存通用寄存器的用户区地址,保存各种寄存器的当前通用寄存器的用户区地址,保存各种寄存器的当前值,进程的核心栈和用户栈指针,程序计数器和处值,进程的核心栈和用户栈指针,程序计数器和处理机状态字等当前值。理机状态字等当前值。(11)各种计时项,记录进程及其后代在用户态和核心各种计时项,记录进程及其后代在用户态和核心态下执行时各自所用的
47、时间。态下执行时各自所用的时间。(12)进程数据段、正文段、栈段长度。进程数据段、正文段、栈段长度。由以上由以上proc结构与结构与user结构的组成可知,结构的组成可知,proc结构中结构中存放的是系统感知进程存在所必需的数据和信息,存放的是系统感知进程存在所必需的数据和信息,而而user结构中存放的是进程执行时所必需的各种控结构中存放的是进程执行时所必需的各种控制数据和信息。因此,系统在内存中开辟有专用的制数据和信息。因此,系统在内存中开辟有专用的proc结构区域,使结构区域,使proc结构常驻内存且系统可存取结构常驻内存且系统可存取访问任一访问任一proc结构。而结构。而user结构则不
48、常驻内存,且结构则不常驻内存,且只有当一个进程被创建成功时,系统才为其分配只有当一个进程被创建成功时,系统才为其分配user结构空间。结构空间。user结构的各项只能由其执行中的结构的各项只能由其执行中的进程自己访问存取。关于用户栈和核心栈已在上一进程自己访问存取。关于用户栈和核心栈已在上一小节中作了说明,这里不再重复。小节中作了说明,这里不再重复。寄存器内容寄存器内容进程上下文所包含的寄存器内容有:进程上下文所包含的寄存器内容有:(1)程序计数器程序计数器PC的内容,指出的内容,指出CPU将要执行的下条将要执行的下条指令的虚拟地址。指令的虚拟地址。(2)处理机状态寄存器的内容,称为处理机状态
49、字处理机状态寄存器的内容,称为处理机状态字PSW,PSW给出机器与该进程相关联的硬件状态。给出机器与该进程相关联的硬件状态。PSW包含当前执行进程的访问方式,即是在核心态包含当前执行进程的访问方式,即是在核心态下还是在用户态下执行。另外,还包含中断优先级,下还是在用户态下执行。另外,还包含中断优先级,以及中断或陷入之前的访问方式等。以及中断或陷入之前的访问方式等。(3)栈指针,指向栈中下一项的当前地址。至于指针栈指针,指向栈中下一项的当前地址。至于指针是指向核心栈还是用户栈,则由是指向核心栈还是用户栈,则由CPU执行方式确执行方式确定。定。(4)通用寄存器,用来存放进程在执行期间所产生的通用寄
50、存器,用来存放进程在执行期间所产生的中间结果或参数。例如,通用寄存器中间结果或参数。例如,通用寄存器R0和和R1就是就是在用户进程与系统进程之间传递参数和返回值时用在用户进程与系统进程之间传递参数和返回值时用的。的。区表和页表区表和页表区表和页表也是进程上下文的内容之一。它们定义了区表和页表也是进程上下文的内容之一。它们定义了进程各部分从虚拟地址到物理地址的映射。如果存进程各部分从虚拟地址到物理地址的映射。如果存在多个进程共享某个公用区(正文区或数据区),在多个进程共享某个公用区(正文区或数据区),那么这个公用区将是每个进程上下文的一部分(注那么这个公用区将是每个进程上下文的一部分(注意,这对