第8章UNIX操作系统 UNIX操作系统从一个非常简单的操作系统发展成为性能先进、功能强大、使用广泛的操 作系统,并成为事实上的多用户、多任务操作系统标准。 8.1内容辅导 8.1.1UNIX操作系统概述 1.UN1X系统的特点 NIX系统的特点如下: (1)UNIX是一个多用户、多任务的操作系统,每个用户都可同时执行多个进程,系统中 的进程数目在逻辑上不受限制。 (2)提供了精选的、丰富的系统功能,其中许多功能在实现思想上有其独到之处,且是高 效的。 (3)该系统用高级语言编写,使系统具有易读、易懂、易修改、易移植等一系列优点, 且系绕代码十分紧凑 (4)提供了良好的用户界面。该系统提供一种命令程序设计语言 SHELL作为用户界面 同时提供了系统调用作为用户程序与系统的接口。这些界面既能为用户提供各种服务,又相当 简洁。 (5)在UNIX系统中使用了树型结构的文件系统,它具有良好的安全性、保密性和可维护 性,在文件系统的实现方法上,也有较多创新。 (6)系统提供了多种通信机制,以满足各种进程通信的需要。 ⑦)在存储管理上,为提高内存利用率,提供了进程对换存储管理方式和请求调页的存储 管理方式,以实现虚拟存储器 2.UNX系统核心体系结构 整个UNIX系统可分成两大部分。第一部分是由用户程序和系统提供的服务构成的所谓核 外程序,形成了良好的系统环境:第二部分是操作系统,又称为核心,其中两个最主要的部分是 文件子系统和进程控制子系统。 用户程序可以通过高级语言的程序库或低级语言的直接系统调用进入核心。核心中的进 程控制子系统负责进程同步、进程间通信、进程调度和存储管理。文件子系统管理文件,包括 分配文件存储空间、控制对文件的存取以及为用户检索数据。文件子系统通过一个缓冲机制 同设备驱动部分交互作用。设备管理、进程管理及存储管理通过硬件控制接口与硬件交互作 用 8.1.2UNIX的进程 在INIX系统中,采用了段页式存储管理《在UNIX中将段称为区〉方式,因此一个进程实 体由若干个区组成,包括程序区、数据区、核区等。每个区又可分为若干页 1.进程的描述 在 UNIX System V中,将PCB分成进程表项和U区。除进程表项和U区外,管理进程的数 据结构还有本进程区表和系统区表 (1)进程表项 进程表项中的每个表目主要包含以下信息:标识进程状态的状态域:用户标识号,简称 UID或用户⑩D:进程标识号,简称PI或进程P:存储区位置和长度:调度参数(包括优先数 等);软中断信号域;各种计时域:指向U区的指针:事件描述域
第 8 章 UNIX 操作系统 UNIX 操作系统从一个非常简单的操作系统发展成为性能先进、功能强大、使用广泛的操 作系统,并成为事实上的多用户、多任务操作系统标准。 8.1 内容辅导 8.1.1 UNIX 操作系统概述 1.UNlX 系统的特点 UNIX 系统的特点如下: (1)UNIX 是一个多用户、多任务的操作系统,每个用户都可同时执行多个进程,系统中 的进程数目在逻辑上不受限制。 (2)提供了精选的、丰富的系统功能,其中许多功能在实现思想上有其独到之处,且是高 效的。 (3)该系统用高级语言编写,使系统具有易读、易懂、易修改、易移植等一系列优点, 且系绕代码十分紧凑。 (4)提供了良好的用户界面。该系统提供一种命令程序设计语言 SHELL 作为用户界面; 同时提供了系统调用作为用户程序与系统的接口。这些界面既能为用户提供各种服务,又相当 简洁。 (5)在 UNIX 系统中使用了树型结构的文件系统,它具有良好的安全性、保密性和可维护 性,在文件系统的实现方法上,也有较多创新。 (6)系统提供了多种通信机制,以满足各种进程通信的需要。 (7)在存储管理上,为提高内存利用率,提供了进程对换存储管理方式和请求调页的存储 管理方式,以实现虚拟存储器。 2.UNlX 系统核心体系结构 整个 UNIX 系统可分成两大部分。第一部分是由用户程序和系统提供的服务构成的所谓核 外程序,形成了良好的系统环境:第二部分是操作系统,又称为核心,其中两个最主要的部分是 文件子系统和进程控制子系统。 用户程序可以通过高级语言的程序库或低级语言的直接系统调用进入核心。核心中的进 程控制子系统负责进程同步、进程间通信、进程调度和存储管理。文件子系统管理文件,包括 分配文件存储空间、控制对文件的存取以及为用户检索数据。文件子系统通过一个缓冲机制 同设备驱动部分交互作用。设备管理、进程管理及存储管理通过硬件控制接口与硬件交互作 用。 8.1.2 UNIX 的进程 在 UNIX 系统中,采用了段页式存储管理〈在 UNIX 中将段称为区〉方式,因此一个进程实 体由若干个区组成,包括程序区、数据区、核区等。每个区又可分为若干页。 1.进程的描述 在 UNIX System V 中,将 PCB 分成进程表项和 U 区。除进程表项和 U 区外,管理进程的数 据结构还有本进程区表和系统区表。 (1)进程表项 进程表项中的每个表目主要包含以下信息:标识进程状态的状态域;用户标识号,简称 UID 或用户 ID;进程标识号,简称 PID 或进程 P;存储区位置和长度;调度参数(包括优先数 等);软中断信号域;各种计时域;指向 U 区的指针;事件描述域
(2)U区 U区中的各个域进一步刻画了进程的特性,U区主要包含以下信息:指向进程表项的指针:真 正用户标识符( real user ID)及有效用户标识符( effective user ID):用户文件描述符表 当前目录和当前根:计时器域:一些输入/输出参数;限制域;出错域:返回值域:信号处理 数组。 (3)系统区表 UNIX System V把一个进程的虚地址空间划分为若干连续的逻辑区,有正文区、数据区 核区等。这些区是可被共享和保护的独立实体,多个进程可以共享一个区。为了对区进行管理, 在核心中设置了一个系统区表(简称区表),各表项中记录了描述活动区的有关信息:区的类型 和大小:区的状态(一个区具有这样几种状态:锁住、在请求中、在装入过程中、有效):区 在物理存储器中的位置;引用计数:指向文件索引节点的指针 (4)本进程区表 为了记录进程的每个区在进程中的虚地址,并通过它找到该区在物理存储器中的实地址, 系统为每个进程配置了一张进程区表,表中每一项记录一个区的起始虚地址及指向系统区表 中对应区表项的指针。这样,核心通过查找本进程区表和系统区表,便可将区的逻辑地址变换 为物理地址。这里使用两张表来对区地址进行映像是为了便于实现区的共享。 2.进程状态及其转换 在 UNIX System V中,为进程设置了9种状态: (1)创建状态:进程刚被创建时,进程已经存在,但尚未完全获得运行所必须具有的资源 因此它既不是就绪状态,也不是睡眠状态。这个状态可被认为是进程的初始状态。 (2)内存中就绪:进程己在内存中且处于就绪状态。对于新创建的进程,若系统有足够的 内存,核心便将它装入内存,从而使新进程转入内存中就绪状态 (3)就绪且换出:进程处于就绪状态,但被换出到外存中。在创建新进程时,若无足够的 内存,核心便将新进程安置在外存对换区中,并赋予就绪且换出状态。此外,原已在内存中的进 程,可能因内存紧张而被换出,同样也成为就绪且换出状态 (4)核心态执行:进程在核心态下执行。 (5)用户态执行:进程在用户态下执行 (6)内存中睡眠进程已在内存中且正处于睡眠状态。例如,进程所执行的系统调用涉及 到I/0操作,而进程又须等待U0操作的完成,则进程将进入内存中睡眠 (7)睡眠且换出当内存紧张时,在内存中睡眠的进程,首先被核心换出到外存上,以腾出 内存。此时,进程将变为睡眠且换出状态。 (⑧)被剥夺状态当进程从核心态返回用户态时,核心剥夺了该进程的处理机,使该进程处 于被剥夺状态。 (9)僵死状态进程执行了exit系统调用后,便处于僵死状态。此时,进程已不存在,但它 留下一些含有状态码和一些计时统计信息的记录,供父进程收集 3.进程上下文 当一个进程在执行时,可看作是在它的进程上下文中执行。一个进程的上下文〈 context 由三部分组成:用户级上下文、寄存器上下文和系统级上下文。 (1)用户级上下文:用户级上下文是由进程虚地址空间中的正文、数据、用户校和共享 存储区组成。在采用对换和请求调页存储管理方式时,只有进程的部分虚地址空间驻留在内 存。但无论它是否驻留在内存,都属于用户级上下文的组成部分 (2)寄存器上下文:寄存器上下文主要由CPU中的一些寄存器内容构成。主要的寄存器有 程序寄存器:处理机状态寄存器:栈指针;通用寄存器 (3)系统级上下文:系统级上下文可分为静态和动态两部分
(2)U 区 U 区中的各个域进一步刻画了进程的特性,U 区主要包含以下信息:指向进程表项的指针;真 正用户标识符(real user ID)及有效用户标识符(effective user ID);用户文件描述符表; 当前目录和当前根;计时器域;一些输入/输出参数;限制域;出错域;返回值域;信号处理 数组。 (3)系统区表 UNIX System V 把一个进程的虚地址空间划分为若干连续的逻辑区,有正文区、数据区、 核区等。这些区是可被共享和保护的独立实体,多个进程可以共享一个区。为了对区进行管理, 在核心中设置了一个系统区表(简称区表),各表项中记录了描述活动区的有关信息:区的类型 和大小;区的状态(一个区具有这样几种状态:锁住、在请求中、在装入过程中、有效);区 在物理存储器中的位置;引用计数;指向文件索引节点的指针。 (4)本进程区表 为了记录进程的每个区在进程中的虚地址,并通过它找到该区在物理存储器中的实地址, 系统为每个进程配置了一张进程区表,表中每一项记录一个区的起始虚地址及指向系统区表 中对应区表项的指针。这样,核心通过查找本进程区表和系统区表,便可将区的逻辑地址变换 为物理地址。这里使用两张表来对区地址进行映像是为了便于实现区的共享。 2.进程状态及其转换 在 UNIX System V 中,为进程设置了 9 种状态: (1)创建状态:进程刚被创建时,进程已经存在,但尚未完全获得运行所必须具有的资源, 因此它既不是就绪状态,也不是睡眠状态。这个状态可被认为是进程的初始状态。 (2)内存中就绪:进程己在内存中且处于就绪状态。对于新创建的进程,若系统有足够的 内存,核心便将它装入内存,从而使新进程转入内存中就绪状态。 (3)就绪且换出:进程处于就绪状态,但被换出到外存中。在创建新进程时,若无足够的 内存,核心便将新进程安置在外存对换区中,并赋予就绪且换出状态。此外,原已在内存中的进 程,可能因内存紧张而被换出,同样也成为就绪且换出状态。 (4)核心态执行:进程在核心态下执行。 (5)用户态执行:进程在用户态下执行。 (6)内存中睡眠进程已在内存中且正处于睡眠状态。例如,进程所执行的系统调用涉及 到 I/O 操作,而进程又须等待 UO 操作的完成,则进程将进入内存中睡眠。 (7)睡眠且换出当内存紧张时,在内存中睡眠的进程,首先被核心换出到外存上,以腾出 内存。此时,进程将变为睡眠且换出状态。 (8)被剥夺状态当进程从核心态返回用户态时,核心剥夺了该进程的处理机,使该进程处 于被剥夺状态。 (9)僵死状态进程执行了 exit 系统调用后,便处于僵死状态。此时,进程已不存在,但它 留下一些含有状态码和一些计时统计信息的记录,供父进程收集。 3. 进程上下文 当一个进程在执行时,可看作是在它的进程上下文中执行。一个进程的上下文〈context〉 由三部分组成:用户级上下文、寄存器上下文和系统级上下文。 (1)用户级上下文:用户级上下文是由进程虚地址空间中的正文、数据、用户校和共享 存储区组成。在采用对换和请求调页存储管理方式时,只有进程的部分虚地址空间驻留在内 存。但无论它是否驻留在内存,都属于用户级上下文的组成部分。 (2)寄存器上下文:寄存器上下文主要由 CPU 中的一些寄存器内容构成。主要的寄存器有: 程序寄存器;处理机状态寄存器;栈指针;通用寄存器。 (3)系统级上下文:系统级上下文可分为静态和动态两部分:
①静态部分:在进程的整个生命期中,系统级上下文的静态部分只有一个,其大小保持不 变,它由三部分组成:进程表项、U区和本进程区表项、系统区表项和页表 ②动态部分:在进程的整个生命期中,系统级上下文动态部分的数目是可变的。它包括 核心钱和若干层寄存器上下文。 4.进程控制 在 UNIX System V中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的基 本单位。为了对进程进行控制,UNIX提供了一系列系统功能调用,用户可以利用它们来实现 创建一个进程"或"终止一个进程的执行”等功能。 用于对进程实施控制的主要系统调用有: (1)系统调用fork 在UNIX系统中,除了0进程外,其他所有进程都是被另一个进程利用fork创建的。0进 程是一个特殊的系统进程,它在系统引导时被创建的。系统初启时,0进程又创建1进程,此 后0进程就变为对换进程,而1进程就变为系统的始祖进程。UNIX利用fork为每个终端创建 个子进为用户服务,如等待用户登录、执行 shell命令执行程序等。此后,每个终端子进程 又可利用fork来创建它的子进程,从而可形成一棵进程树 (2)系统调用exec fork系统调用只是将父进程的上下文复制到新进程中,因此执行完fork时,父子进程具 有完全相同的正文区、数据区及用户校区。若要使新进程执行的程序不同于父进程,可以使用 exec系列系统功能调用。exec系列中的系统调用都完成同样的功能,它们把一个新的程序装 入调用进程的内存空间,以改变调用进程的执行代码,从而使调用进程执行新引入的程序功 能。如果exec调用成功,调用进程将被覆盖,然后从新引入程序的入口开始执行。这就产生了 个新进程,它的进程标识符与调用进程相同,但所执行的程序代码不同。这就是说,exec没 有建立一个与调用进程并发执行的新进程,而是用新进程取代了老进程。这一组系统调用的主 要差别在于给出参数的数目和形式不同,给出参数的形式有两种,一种是直接给出指向每个参 数的指针,另一种是给出指向参数表的指针。 (3)系统调用exit 对于一般的用户进程,在其任务完成后应尽快撤消。为了及时回收进程所占用的资源并减少父 进程的干预,UNIX系统利用exit来实现进程的自我终止。通常,父进程在创建子进程时,应在 子进程的末尾安排一条exit,使子进程自我终止。 (4)系统调用wait 系统调用wait用于将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为 止。如果在wait调用前,已有子进程暂停或终止,则调用进程作适当处理后便返回。 5.进程调度 UNIX系统是单纯的分时系统,因而未设置作业调度。对进程的调度采用多级反馈队列轮 转调度方式。相应地,在系统中便为就绪进程设置了多个就绪队列。调度程序在进行调度时, 总是先从最高优先级队列中取出排在队列最前面的进程。仅当最高优先级队列中没有进程时, 才从次高优先级队列中找出其队首进程,令它执行一个时间片后,又剥夺该进程的执行,然后 再从优先级最高的队列中取出下一个就绪进程投入运行 (1)进程优先级的分类 在UNIX系统中,进程的优先级分为两类:核心优先级(又分为可中断和不可中断两类优先 级)和用户优先级(又可分成n+1级,其中第0级为最高优先级,第n级的优先级最低)。 (2)优先级的计算 UNIX SystemⅤ中的用户优先级是可变的,它随着占用CPU时间的增加而降低。核心每隔1 秒钟便根据一个衰减函数来调整每个进程的最近CPU使用时间,并按下述公式对各进程重新
①静态部分:在进程的整个生命期中,系统级上下文的静态部分只有一个,其大小保持不 变,它由三部分组成:进程表项、U 区和本进程区表项、系统区表项和页表。 ②动态部分:在进程的整个生命期中,系统级上下文动态部分的数目是可变的。它包括: 核心钱和若干层寄存器上下文。 4. 进程控制 在 UNIX System V 中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的基 本单位。为了对进程进行控制,UNIX 提供了一系列系统功能调用,用户可以利用它们来实现 "创建一个进程"或"终止一个进程的执行"等功能。 用于对进程实施控制的主要系统调用有: (1)系统调用 fork 在 UNIX 系统中,除了 0 进程外,其他所有进程都是被另一个进程利用 fork 创建的。0 进 程是一个特殊的系统进程,它在系统引导时被创建的。系统初启时,0 进程又创建 1 进程,此 后 0 进程就变为对换进程,而 1 进程就变为系统的始祖进程。UNIX 利用 fork 为每个终端创建 一个子进为用户服务,如等待用户登录、执行 shell 命令执行程序等。此后,每个终端子进程 又可利用 fork 来创建它的子进程,从而可形成一棵进程树。 (2)系统调用 exec fork 系统调用只是将父进程的上下文复制到新进程中,因此执行完 fork 时,父子进程具 有完全相同的正文区、数据区及用户校区。若要使新进程执行的程序不同于父进程,可以使用 exec 系列系统功能调用。exec 系列中的系统调用都完成同样的功能,它们把一个新的程序装 入调用进程的内存空间,以改变调用进程的执行代码,从而使调用进程执行新引入的程序功 能。如果 exec 调用成功,调用进程将被覆盖,然后从新引入程序的入口开始执行。这就产生了 一个新进程,它的进程标识符与调用进程相同,但所执行的程序代码不同。这就是说,exec 没 有建立一个与调用进程并发执行的新进程,而是用新进程取代了老进程。这一组系统调用的主 要差别在于给出参数的数目和形式不同,给出参数的形式有两种,一种是直接给出指向每个参 数的指针,另一种是给出指向参数表的指针。 (3)系统调用 exit 对于一般的用户进程,在其任务完成后应尽快撤消。为了及时回收进程所占用的资源并减少父 进程的干预,UNIX 系统利用 exit 来实现进程的自我终止。通常,父进程在创建子进程时,应在 子进程的末尾安排一条 exit,使子进程自我终止。 (4)系统调用 wait 系统调用 wait 用于将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为 止。如果在 wait 调用前,已有子进程暂停或终止,则调用进程作适当处理后便返回。 5.进程调度 UNIX 系统是单纯的分时系统,因而未设置作业调度。对进程的调度采用多级反馈队列轮 转调度方式。相应地,在系统中便为就绪进程设置了多个就绪队列。调度程序在进行调度时, 总是先从最高优先级队列中取出排在队列最前面的进程。仅当最高优先级队列中没有进程时, 才从次高优先级队列中找出其队首进程,令它执行一个时间片后,又剥夺该进程的执行,然后, 再从优先级最高的队列中取出下一个就绪进程投入运行。 (1)进程优先级的分类 在 UNIX 系统中,进程的优先级分为两类:核心优先级(又分为可中断和不可中断两类优先 级)和用户优先级(又可分成 n+1 级,其中第 0 级为最高优先级,第 n 级的优先级最低)。 (2)优先级的计算 UNIX System V 中的用户优先级是可变的,它随着占用 CPU 时间的增加而降低。核心每隔 1 秒钟便根据一个衰减函数来调整每个进程的最近 CPU 使用时间,并按下述公式对各进程重新
计算其用户优先数(优先数越大,优先级越低:优先数越小,优先级越高)。 decay( CPU)=CPU/2 优先数=最近使用CP的时间/2+基本用户优先数 核心首先从处于内存就绪"或"被剥夺”状态的进程中选择一个优先级最高的进程。若系 统中同时有多个进程都具有最高优先级,则核心将选择其中处于就绪状态最久的进程,将它从 所在队列中移出,恢复其上下文,使之执行。 (3)进程切换 在操作系统中,凡是要进行中断处理和系统调用时,都将涉及到进程上下文的保存和恢复 此时系统所保存和恢复的是同属于一个进程的上下文。而在进程调度之后实现进程则是另 个进程的上下文,这一进程取决于调度程序所选中的是哪一个进程。 ①进程上下文的保存与恢复 不论发生了哪种中断(如I/0设备中断、程序中断〉,如果处理机运行级低于该中断的级别 则处理机将响应该中断,并提高处理机的运行级,以屏蔽其他中断。 ②进程上下文的切换 总的说来,引起进程上下文切换的原因,都是由于核心进行了进程调度而选中了一个新的 进程运行。在NIX系统中,由于采用了可剥夺的调度方式,因而引起进程调度的原因有时间片 完、当前进程执行了 sleep例程、进程执行完等,它们都会导致进程上下文的切换。 6.进程的同步与通信 在 UNIX SyStem V中,进程的同步与通信提供了软中断信号和管道机制以及新的进程通 信机构,简称IPC( Interprocess Comnmication)。它由三部分组成:消息机制、共享存储器机 制和信号量机制 (1)软中断信号:软中断信号(简称信号)是一种实现进程间简单通信的设施,用于通知 对方发生了异常事件。UNIX系统V中,共有19个软中断信号。软中断是对硬件中断的一种模 拟,发送软中断就是向接收进程的进程表项结构中的相应项发送一个软中断信号。如果用户进 程发送的软中断信号大于19,则接收进程不予理睬,从而发送无效。接收进程在收到软中断信 号后,将按照事先的规定去执行一个软中断处理程序。但是软中断处理程序不像硬件中断处理 程序那样,收到中断信号后立即被启动,它必须等到接收进程执行时才能生效。另外,一个进程 自己也可以向自己发送软中断信号,以便在某些意外的情况下,进程能转入规定好的处理程 序 (2)管道:用信号来处理异常事件或错误是非常合适的,但用它来处理进程之间的大量信 息传送就显得非常不适宜。为此,UNIX又提供了一种称作管道的机构。所谓管道是指能连接 某些读进程和写进程的、专门用于进程通信的共享文件(又称pipe文件)。它允许读/写进程 按先进先出的方式传送数据,即写进程从管道的一端向管道写入数据流,读进程从管道的另 端读出数据流。管道的类型有无名管道和有名管道,进程可利用pipe系统调用来建立一个无 名管道:对无名管道的读写涉及到对pipe文件大小的限制:进程互斥;进程写管道和进程读 管道 3)消息:消息是一个格式化的可变长的信息单元。消息机制允许由一个进程给其他任 何进程发送一个消息。当一个进程收到多个消息时,可将它们排成一个消息队列。在UNIX中 消息机制向用户提供了四个系统调用,分别用于建立、发送和接收消息等。 消息有消息首部和消息队列头标,在UNIX系统中,每一个消息队列都有一个称为关键字 ey)的名字,关键字是由用户指定的。此外,消息队列还有一消息队列描述符,其作用与用户 文件描述符一样,也是为了方便用户和系统对消息队列的访问。进程可利用系统调用 meget 来建立一消息队列,或者获取一消息队列的描述符:用 msgsnd()系统调用向指定的消息队列 发送一个消息,并将发送消息链接到该消息队列的尾部;用 msgrcv(系统调用从指定的消息
计算其用户优先数(优先数越大,优先级越低:优先数越小,优先级越高)。 decay(CPU)=CPU/2 优先数=最近使用 CPU 的时间/2+基本用户优先数 核心首先从处于"内存就绪"或"被剥夺"状态的进程中选择一个优先级最高的进程。若系 统中同时有多个进程都具有最高优先级,则核心将选择其中处于就绪状态最久的进程,将它从 所在队列中移出,恢复其上下文,使之执行。 (3)进程切换 在操作系统中,凡是要进行中断处理和系统调用时,都将涉及到进程上下文的保存和恢复, 此时系统所保存和恢复的是同属于一个进程的上下文。而在进程调度之后实现进程则是另一 个进程的上下文,这一进程取决于调度程序所选中的是哪一个进程。 ①进程上下文的保存与恢复 不论发生了哪种中断(如 I/0 设备中断、程序中断〉,如果处理机运行级低于该中断的级别, 则处理机将响应该中断,并提高处理机的运行级,以屏蔽其他中断。 ②进程上下文的切换 总的说来,引起进程上下文切换的原因,都是由于核心进行了进程调度而选中了一个新的 进程运行。在 UNIX 系统中,由于采用了可剥夺的调度方式,因而引起进程调度的原因有时间片 完、当前进程执行了 sleep 例程、进程执行完等,它们都会导致进程上下文的切换。 6.进程的同步与通信 在 UNIX System V 中, 进程的同步与通信提供了软中断信号和管道机制以及新的进程通 信机构,简称 IPC(Interprocess Comnmication)。它由三部分组成:消息机制、共享存储器机 制和信号量机制。 (1)软中断信号:软中断信号(简称信号)是一种实现进程间简单通信的设施,用于通知 对方发生了异常事件。UNIX 系统 V 中,共有 19 个软中断信号。软中断是对硬件中断的一种模 拟,发送软中断就是向接收进程的进程表项结构中的相应项发送一个软中断信号。如果用户进 程发送的软中断信号大于 19,则接收进程不予理睬,从而发送无效。接收进程在收到软中断信 号后,将按照事先的规定去执行一个软中断处理程序。但是软中断处理程序不像硬件中断处理 程序那样,收到中断信号后立即被启动,它必须等到接收进程执行时才能生效。另外,一个进程 自己也可以向自己发送软中断信号,以便在某些意外的情况下,进程能转入规定好的处理程 序。 (2)管道:用信号来处理异常事件或错误是非常合适的,但用它来处理进程之间的大量信 息传送就显得非常不适宜。为此,UNIX 又提供了一种称作管道的机构。所谓管道是指能连接 某些读进程和写进程的、专门用于进程通信的共享文件(又称 pipe 文件〉。它允许读/写进程 按先进先出的方式传送数据,即写进程从管道的一端向管道写入数据流,读进程从管道的另一 端读出数据流。管道的类型有无名管道和有名管道,进程可利用 pipe 系统调用来建立一个无 名管道;对无名管道的读写涉及到对 pipe 文件大小的限制;进程互斥;进程写管道和进程读 管道。 (3)消息:消息是一个格式化的可变长的信息单元。消息机制允许由一个进程给其他任 何进程发送一个消息。当一个进程收到多个消息时,可将它们排成一个消息队列。在 UNIX 中, 消息机制向用户提供了四个系统调用,分别用于建立、发送和接收消息等。 消息有消息首部和消息队列头标,在 UNIX 系统中,每一个消息队列都有一个称为关键字 (key)的名字,关键字是由用户指定的。此外,消息队列还有一消息队列描述符,其作用与用户 文件描述符一样,也是为了方便用户和系统对消息队列的访问。进程可利用系统调用 msgget 来建立一消息队列,或者获取一消息队列的描述符;用 msgsnd( )系统调用向指定的消息队列 发送一个消息,并将发送消息链接到该消息队列的尾部;用 msgrcv()系统调用从指定的消息
队列中接收指定类型的消息;用户在建立了消息队列后,可利用 nsgct系统调用来读取它的 状态信息并进行修改,如査询消息队列描述符、修改消息队列的许可权等。 (4)共享存储区:共享存储区是UNⅨX系统中通信速度最高的一种通信机制。该机制可使 若干进程共享主存中的某一个区域,且使该区域出现在多个进程的虚地址空间中。另一方面, 个进程的虚地址空间中又可连接多个共享存储区,每个共享存储区都有自己的名字。当进程 间欲利用共享存储区进行通信时,须首先在主存中建立一共享存储区,然后将它附接到自己的 虚地址空间上。此后,进程对该区的访问操作,与对其虚地址空间的其他部分的操作完全相同 进程之间以后便可通过对共享存储区中数据的读/写来进行直接通信。当用户需要使用该机制 时,必须自己设置这种设施,才能保证实现正确的通信。 当进程要利用共享存储区进行通信时,应先利用系统调用 shmget建立一共享存储区。如 果该共享存储区已由其他进程建立,则返回其描述符 shmi:进程在建立了一共享存储区并获 得了其描述符后,还须利用系统调用 shmat(将共享存储区附接到进程的虚地址空间上。此后 共享存储区便成为进程虚地址空间的一部分。进程可采用与其他虚地址空间一样的存取方法 来存取它。当进程不再需要共享存储区时,应利用系统调用 shmdt o将共享存储区与进程断 接:如同消息机制一样,可以用 sheet10系统调用对共享存储区的状态信息进行读取和修改。 当所有进程都与共享存储区断接时,便可删除该共享存储区 (5)信号量 NIX System V中采用的是信号量集机制,即由一组信号量构成的信号量集。传统的信号 量机制是对信号量施加P和V操作,而 System V中是利用 semop o系统调用来对指定信号量 进行操作。 用户可利用系统调用 semget0来建立信号量集;一旦信号量集被创建成功,便可利用 semop o系统调用对这组信号量进行操作。 8.1.3存储器管理 在早期的UNX系统中,为提高内存的利用率,己提供了内存与外存之间的进程对换机制 在 UNIX SystemⅤ中,除保留了对换功能外,还支持请求调页的存储管理方式,内存空间的分配 与回收均以页为单位进行。每个页面的大小随版本不同而异,一般在512B-4KB之间。 1.请求调页管理的数据结构 在UNIX系统中,为实现请求调页,核心配置了四种数据结构 (1)页表: UNIX SyStem V将进程的每个区分为若干页,以将它们分配到不相邻的物理块 中,为此每个区设置了一张页表。为了支持请求调页,每个页表项中需包含以下字段:物理块 号、年龄位、访问位、修改位、有效位、写时拷贝位和保护位 (2)磁盘块描述表:在UNIX系统中,每个页表项对应一个磁盘块描述项,其中记录了各页 面的磁盘拷贝所在的磁盘块号。一个页面的内容或在一个对换设备的特定块中,或在一个可执 行文件中。如果该页在一个可执行文件中,此时磁盘块描述项中的存储器类型为File,设备块 号是该页在文件中的逻辑块号。如果该页面在对换设备上,则此时的存储器类型为Disk,对换 设备号和块号则用于指示该页面的拷贝所驻留的逻辑对换设备和相应的盘块号 (3)页面数据表:每个页面数据表项描述内存中的一个物理页,每个表项包含:页状态、 内存引用计数、逻辑设备和指向空闲页链表中下一个页面数据表项的指针和指向散列队列中 下一个页面数据表项的指针。 在系统初启时,核心将所有的页面数据表项链接为一个空闲页链表,形成空闲页缓冲池。 为给一个区分配一个物理页,核心从空闲链表之首摘下一个空闲页表项,修改其对换设备号和 块号后,将它放到相应的散列队列中 (4)对换使用表:对换设备上的每一页都占有对换使用表的一个表项,表项中含有一个引 用计数,其数值表示有多少页表项指向该页
队列中接收指定类型的消息;用户在建立了消息队列后,可利用 msgctl 系统调用来读取它的 状态信息并进行修改,如查询消息队列描述符、修改消息队列的许可权等。 (4)共享存储区:共享存储区是 UNIX 系统中通信速度最高的一种通信机制。该机制可使 若干进程共享主存中的某一个区域,且使该区域出现在多个进程的虚地址空间中。另一方面, 一个进程的虚地址空间中又可连接多个共享存储区,每个共享存储区都有自己的名字。当进程 间欲利用共享存储区进行通信时,须首先在主存中建立一共享存储区,然后将它附接到自己的 虚地址空间上。此后,进程对该区的访问操作,与对其虚地址空间的其他部分的操作完全相同。 进程之间以后便可通过对共享存储区中数据的读/写来进行直接通信。当用户需要使用该机制 时,必须自己设置这种设施,才能保证实现正确的通信。 当进程要利用共享存储区进行通信时,应先利用系统调用 shmget 建立一共享存储区。如 果该共享存储区已由其他进程建立,则返回其描述符 shmid;进程在建立了一共享存储区并获 得了其描述符后,还须利用系统调用 shmat()将共享存储区附接到进程的虚地址空间上。此后, 共享存储区便成为进程虚地址空间的一部分。进程可采用与其他虚地址空间一样的存取方法 来存取它。当进程不再需要共享存储区时,应利用系统调用 shmdt()将共享存储区与进程断 接;如同消息机制一样,可以用 shmctl()系统调用对共享存储区的状态信息进行读取和修改。 当所有进程都与共享存储区断接时,便可删除该共享存储区。 (5)信号量 UNIX System V 中采用的是信号量集机制,即由一组信号量构成的信号量集。传统的信号 量机制是对信号量施加 P 和 V 操作,而 System V 中是利用 semop()系统调用来对指定信号量 进行操作。 用户可利用系统调用 semget()来建立信号量集;一旦信号量集被创建成功,便可利用 semop()系统调用对这组信号量进行操作。 8.1.3 存储器管理 在早期的 UNIX 系统中,为提高内存的利用率,己提供了内存与外存之间的进程对换机制。 在 UNIX System V 中,除保留了对换功能外,还支持请求调页的存储管理方式,内存空间的分配 与回收均以页为单位进行。每个页面的大小随版本不同而异,一般在 512B-4KB 之间。 1.请求调页管理的数据结构 在 UNIX 系统中,为实现请求调页,核心配置了四种数据结构: (1)页表:UNIX System V 将进程的每个区分为若干页,以将它们分配到不相邻的物理块 中,为此每个区设置了一张页表。为了支持请求调页,每个页表项中需包含以下字段:物理块 号、年龄位、访问位、修改位、有效位、写时拷贝位和保护位。 (2)磁盘块描述表:在 UNIX 系统中,每个页表项对应一个磁盘块描述项,其中记录了各页 面的磁盘拷贝所在的磁盘块号。一个页面的内容或在一个对换设备的特定块中,或在一个可执 行文件中。如果该页在一个可执行文件中,此时磁盘块描述项中的存储器类型为 File,设备块 号是该页在文件中的逻辑块号。如果该页面在对换设备上,则此时的存储器类型为 Disk,对换 设备号和块号则用于指示该页面的拷贝所驻留的逻辑对换设备和相应的盘块号。 (3)页面数据表:每个页面数据表项描述内存中的一个物理页,每个表项包含:页状态、 内存引用计数、逻辑设备和指向空闲页链表中下一个页面数据表项的指针和指向散列队列中 下一个页面数据表项的指针。 在系统初启时,核心将所有的页面数据表项链接为一个空闲页链表,形成空闲页缓冲池。 为给一个区分配一个物理页,核心从空闲链表之首摘下一个空闲页表项,修改其对换设备号和 块号后,将它放到相应的散列队列中。 (4)对换使用表:对换设备上的每一页都占有对换使用表的一个表项,表项中含有一个引 用计数,其数值表示有多少页表项指向该页