## 注意
从管道读数据是一次性操作,数据一旦被读取,就释放空间以便写更多数据。普通管道只允许单向通信,若要实现两个进程双向通信,则需要定义两个管道。
<!-- page: 55 -->
## 4. 信号
信号(Signal)是一种用于通知进程发生了某个事件的机制。不同的系统事件对应不同的信号类型,每类信号对应一个序号。例如,Linux 定义了 30 种信号,分别用序号 $1 \sim 30$ 表示。
在进程的PCB中,用至少 $n$ 位向量记录该进程的待处理信号,如Linux使用一个32位的int型变量表示。若给某个进程发送一个信号,则把该类信号对应的位修改为1。一旦该信号被处理,就把对应的位修改为0。此外,还用另一个 $n$ 位向量记录被阻塞(被屏蔽)的信号。当某个位为1时,表示该位对应的信号类型将被进程忽略,无须响应。
接下来探讨信号是如何发送的,主要有两种方式:
1)内核给某个进程发送信号。当内核检测到某个特定的系统事件时,就给进程发送信号。例如,若进程使用非法指令,则内核给该进程发送SIGILL信号(序号为4)。
2)一个进程给另一个进程发送信号。进程可以调用kill函数,要求内核发送一个信号给目的进程(需要指明接收进程的PID和信号的序号)。当然,进程也可给自己发送信号。
当操作系统把一个进程从内核态切换到用户态时(如系统调用返回时),会检查该进程是否有未被阻塞的待处理信号,若有,则强制进程接收信号,并立即处理信号(若有多个待处理信号,则通常先处理序号更小的信号)。信号的处理方式有两种:
1)执行默认的信号处理程序。操作系统为每类信号预设了默认的信号处理程序。例如,收到SIGILL信号的默认操作就是终止进程。
2)执行进程定义的信号处理程序。进程可为某类信号自定义信号处理程序。例如,进程可以定义收到SIGILL信号时输出“hello world”,而不是终止进程。
信号处理程序运行结束后,通常会返回进程的下一条指令继续执行。
## 2.1.6 线程和多线程模型
### 1. 线程的基本概念
引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程(Threads)的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
线程最直接的理解就是轻量级进程,它是一个基本的 CPU 执行单元,也是程序执行流的最小单元,由线程 ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
引入线程后,进程的内涵发生了改变,进程只作为除CPU外的系统资源的分配单元,而线程则作为CPU的分配单元。由于一个进程内部有多个线程,若线程的切换发生在同一个进程内部,则只需要很少的时空开销。下面从几个方面对线程和进程进行比较。
### 2. 线程与进程的比较
**流程图** 进程和线程的比较(2012)
1)调度。在传统的操作系统中,拥有资源和独立调度的基本单位都是进程,每次调度都要进行上下文切换,开销较大。在引入线程的操作系统中,线程是独立调度的基本单位,而线程切换的代价远低于进程。在同一进程中,线程的切换不会引起进程切换。但从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
<!-- page: 56 -->
2)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,一个进程中的多个线程之间也可并发执行,甚至不同进程中的线程也能并发执行,从而使操作系统具有更好的并发性,提高了系统资源的利用率和系统的吞吐量。
3)拥有资源。进程是系统中拥有资源的基本单位,而线程不拥有系统资源(仅有一点必不可少、能保证独立运行的资源),但线程可以访问其隶属进程的系统资源,这主要表现在属于同一进程的所有线程都具有相同的地址空间。要知道,若线程也是拥有资源的单位,则切换线程就需要较大的时空开销,线程这个概念的提出就没有意义。
4)独立性。每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问。某个进程中的线程对其他进程不可见。同一进程中的不同线程是为了提高并发性及进行相互之间的合作而创建的,它们共享进程的地址空间和资源。
5)系统开销。在创建或撤销进程时,系统都要为之分配或回收进程控制块(PCB)及其他资源,如内存空间、I/O设备等。操作系统为此所付出的开销,明显大于创建或撤销线程时的开销。类似地,在进程切换时涉及进程上下文的切换,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须操作系统的干预。
6)支持多处理器系统。对于传统单线程进程,不管有多少个CPU,进程只能运行在一个CPU上。对于多线程进程,可将进程中的多个线程分配到多个CPU上执行。
## 3. 线程的属性
多线程操作系统中的进程已不再是一个基本的执行实体,但它仍具有与执行相关的状态。所谓进程处于“执行”状态,实际上是指该进程中的线程正在执行。线程的主要属性如下:
### 闭锁适应
线程所拥有资源的特点(2011、2024)
1)线程是一个轻型实体,它不拥有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录线程执行的寄存器和栈等现场状态。
2)不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统将它们创建成不同的线程。
3)同一进程中的各个线程共享该进程所拥有的资源。
4)线程是CPU的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。
5)一个线程被创建后,便开始了它的生命周期,直至终止。线程在生命周期内会经历阻塞态、就绪态和运行态等各种状态变化。
为什么线程的提出有利于提高系统并发性?可以这样来理解:由于有了线程,线程切换时,有可能发生进程切换,也有可能不发生进程切换,平均而言每次切换所需的开销就变小了,因此能够让更多的线程参与并发,而不会影响到响应时间等问题。
## 4. 线程的状态与转换
与进程一样,各线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。相应地,线程在运行时也具有下面三种基本状态。
执行态:线程已获得CPU而正在运行。
就绪态:线程已具备各种执行条件,只需再获得CPU便可立即执行。
阻塞态:线程在执行中因某事件受阻而处于暂停状态。
<!-- page: 57 -->
线程这三种基本状态之间的转换和进程基本状态之间的转换是一样的。
## 5. 线程的组织与控制
### (1)线程控制块
**创建领域** ▶ **线程的特点(2019、2024)**
与进程类似,系统也为每个线程配置一个线程控制块 TCB,用于记录控制和管理线程的信息。线程控制块通常包括:①线程标识符;②一组寄存器,包括程序计数器、状态寄存器和通用寄存器;③线程运行状态,用于描述线程正处于何种状态;④优先级;⑤线程专有存储区,线程切换时用于保存现场等;⑥堆栈指针,用于过程调用时保存局部变量及返回地址等。
同一进程中的所有线程都能访问进程的地址空间和全局变量。但是,每个线程都拥有自己的堆栈,且互不共享(可以这么理解:线程的堆栈被包含在进程的地址空间内,因此同一进程中的各个线程事实上可以访问彼此的堆栈,但编程规范通常不推荐这么做)。
### (2)线程的创建
线程也是具有生命期的,它由创建而产生,由调度而执行,由终止而消亡。相应地,在操作系统中就有用于创建线程和终止线程的函数(或系统调用)。
用户程序启动时,通常仅有一个称为初始化线程的线程正在执行,其主要功能是用于创建新线程。在创建新线程时,需要利用一个线程创建函数,并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小、线程优先级等。线程创建函数执行完后,将返回一个线程标识符。
### (3)线程的终止
当一个线程完成自己的任务后,或线程在运行中出现异常而要被强制终止时,由终止线程调用相应的函数执行终止操作。但是有些线程(主要是系统线程)一旦被建立,便一直运行而不会被终止。通常,线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止线程才与资源分离,此时的资源才能被其他线程利用。
被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。
## 6. 线程的实现方式
**创建领域** ▶ **两种线程的特点与比较(2019)**
线程的实现可以分为两类:用户级线程(User-Level Thread,ULT)和内核级线程(Kernel-Level Thread,KLT)。内核级线程也称内核支持的线程。
### (1)用户级线程(ULT)
通俗地说,用户级线程就是“从用户视角能看到的线程”。在用户级线程中,有关线程管理(创建、撤销和切换等)的所有工作都由应用程序在用户空间内(用户态)完成,无须操作系统干预,内核意识不到线程的存在。应用程序可以通过使用线程库设计成多线程程序。通常,应用程序从单线程开始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程。图2.5(a)说明了用户级线程的实现方式。
对于设置了用户级线程的系统,其调度仍然以进程为单位进行,各个进程轮流执行一个时间片。假设进程A包含1个用户级线程,进程B包含100个用户级线程,这样,进程A中线程的运行时间将是进程B中各线程运行时间的100倍,因此对线程来说实质上是不公平的。
这种实现方式的优点如下:①线程切换不需要转换到内核空间,节省了模式切换的开销。②调度算法可以是进程专用的,不同的进程可根据自身的需要,对自己的线程选择不同的调度算法。③用户级线程的实现与操作系统平台无关,对线程管理的代码是属于用户程序的一部分。
<!-- page: 58 -->
(a) 用户级方式
(b) 内核级方式
(c) 组合方式
图2.5 用户级线程和内核级线程
这种实现方式的缺点如下:①系统调用的阻塞问题,当线程执行一个系统调用时,不仅该线程被阻塞,进程内的所有线程也都被阻塞。②不能发挥多CPU的优势,内核每次分配给一个进程的仅有一个CPU,因此进程中仅有一个线程能执行。
(2)内核级线程(KLT)
在操作系统中,无论是系统进程还是用户进程,都是在操作系统内核的支持下运行的,与内核紧密相关。内核级线程同样也是在内核的支持下运行的,线程管理的所有工作也是在内核空间内(内核态)实现的。操作系统也为每个内核级线程设置一个线程控制块TCB,内核根据该控制块感知某线程的存在,并对其加以控制。图2.5(b)说明了内核级线程的实现方式。
这种实现方式的优点如下:①能发挥多CPU的优势,内核能同时调度同一进程中的多个线程并行执行。②若进程中的一个线程被阻塞,则内核可以调度该进程中的其他线程占用CPU,也可运行其他进程中的线程。③内核支持线程具有很小的数据结构和堆栈,线程切换比较快、开销小。④内核本身也可采用多线程技术,可以提高系统的执行速度和效率。
这种实现方式的缺点如下:同一进程中的线程切换,需要从用户态转到内核态进行,系统开销较大。这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核实现的。
(3)组合方式
有些系统使用组合方式的多线程实现。在组合实现方式中,内核支持多个内核级线程的建立、调度和管理,同时允许用户程序建立、调度和管理用户级线程。一些内核级线程对应多个用户级线程,这是用户级线程通过时分多路复用内核级线程实现的。同一进程中的多个线程可以同时在多CPU上并行执行,且在阻塞一个线程时不需要将整个进程阻塞,所以组合方式能结合KLT和ULT的优点,并且克服各自的不足。图2.5(c)展示了这种组合实现方式。
在线程实现方式的介绍中,提到了通过线程库来创建和管理线程。线程库(thread library)是为程序员提供创建和管理线程的API。实现线程库主要的方法有如下两种:
①在用户空间中提供一个没有内核支持的库。这种库的所有代码和数据结构都位于用户空间中。这意味着,调用库内的一个函数只导致用户空间中的一个本地函数的调用。
②实现由操作系统直接支持的内核级的一个库。对于这种情况,库内的代码和数据结构位于内核空间。调用库中的一个API函数通常会导致对内核的系统调用。
目前使用的三种主要线程库是:POSIX Pthreads、Windows API、Java。Pthreads 作为 POSIX
<!-- page: 59 -->
标准的扩展,可以提供用户级或内核级的库。Windows API 是用于 Windows 系统的内核级线程库。Java 线程 API 允许线程在 Java 程序中直接创建和管理。JVM 实例通常运行在宿主操作系统之上,Java 线程 API 通常采用宿主系统的线程库来实现,因此在 Windows 系统中 Java 线程通常采用 Windows API 来实现,在类 UNIX 系统中采用 Pthreads 来实现。
## 7. 多线程模型
在同时支持用户级线程和内核级线程的系统中,用户级线程和内核级线程连接方式的不同,形成了下面三种不同的多线程模型。
1)多对一模型。将多个用户级线程映射到一个内核级线程,如图 2.6(a) 所示。每个进程只被分配一个内核级线程,线程的调度和管理在用户空间完成。仅当用户线程需要访问内核时,才将其映射到一个内核级线程上,但每次只允许一个线程进行映射。
优点:线程管理是在用户空间进行的,无须切换到内核态,因此效率比较高。
缺点:若一个线程在访问内核时发生阻塞,则整个进程都会被阻塞;在任何时刻,只有一个线程能够访问内核,多个线程不能同时在多个 CPU 上运行。
2)一对一模型。将每个用户级线程映射到一个内核级线程,如图 2.6(b) 所示。每个进程有与用户级线程数量相同的内核级线程,线程切换由内核完成,需要切换到内核态。
优点:当一个线程被阻塞后,允许调度另一个线程运行,所以并发能力较强。
缺点:每创建一个用户线程,相应地就需要创建一个内核线程,开销较大。
3)多对多模型。将 $n$ 个用户级线程映射到 $m$ 个内核级线程上,要求 $n \geqslant m$,如图 2.6(c) 所示。特点:既克服了多对一模型并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点。此外,还拥有上述两种模型各自的优点。
(a) 多对一模型
(b) 一对一模型
(c) 多对多模型
图 2.6 多线程模型
## 2.1.7 本节小结
本节开头提出的问题的参考答案如下。
1)为什么要引入进程?
在多道程序设计的背景下,进程之间需要共享系统资源,因此会导致各程序在执行过程中出现相互制约的关系,程序的执行会表现出间断性等特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是静态的概念,无法描述程序在内存中的执行情况,即无法从程序的字面上看出它何时执行、何时停顿,也无法看出它与其他执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质乃至更好地支持和管理多道程序的并发执行,便引入了进程的概念。
<!-- page: 60 -->
2)什么是进程?进程由什么组成?
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码本身,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
一个进程实体由程序段、相关数据段和PCB三部分构成,其中PCB是标志一个进程存在的唯一标识,程序段是进程运行的程序的代码,数据段则存储程序运行过程中相关的一些数据。
3)进程是如何解决问题的?公众号:小兔网盘免费分享无水印PDF
进程将能够识别程序运行状态的一些变量存放在PCB中,通过这些变量系统能够更好地了解进程的状况,并在适当时机进行进程的切换,以避免一些资源的浪费,甚至划分为更小的调度单位——线程来提高系统的并发度。
本节主要介绍什么是进程,并围绕这个问题进行一些阐述和讨论,为下一节讨论的内容做铺垫,但之前未学过相关课程的读者可能比较费解,到现在为止对进程这个概念还未形成比较清晰的认识。接下来,我们再用一个比较熟悉的概念来类比进程,以便大家能彻底理解本节的内容到底在讲什么,到底解决了什么问题。
我们用“人的生命历程”来类比进程。首先,人的生命历程一定是一个动态的、过程性的概念,要研究人的生命历程,先要介绍经历这个历程的主体是什么。主体当然是人,相当于经历进程的主体是进程映像,人有自己的身份,相当于进程映像里有PCB;人生历程会经历好几种状态:出生的时候、弥留的时候、充满斗志的时候、发奋图强的时候及失落的时候,相当于进程有创建、撤销、就绪、运行、阻塞等状态,这几种状态会发生改变,人会充满斗志而转向发奋图强,发奋图强获得进步之后又会充满斗志预备下一次发奋图强,或者发奋图强后遇到阻碍会进入失落状态,然后在别人的开导之下又重新充满斗志。类比进程,会由就绪态转向运行态,运行态转向就绪态,或者运行态转向阻塞态,然后在别的进程帮助下返回就绪态。若我们用“人生历程”这个过程的概念去类比进程,则对进程的理解就更深一层。前面生活化的例子可以帮我们理解进程的实质,但它毕竟有不严谨的地方。一种较好的方式是,在类比进程和人生历程后,再看一遍前面较为严谨的书面阐述和讨论,这样对知识的掌握会更加准确而全面。
这里再给出一些学习计算机科学知识的建议。学习时,很多同学会陷入一个误区,即只注重对定理、公式的应用,而忽视对基础概念的理解。这是我们从小到大应付考试而培养出的一个毛病,因为熟练应用公式和定理对考试有立竿见影的效果。公式、定理的应用固然重要,但基础概念的理解能让我们透彻地理解一门学科,更利于我们产生兴趣,培养创造性思维。
2.1.8 本节习题精选
一、单项选择题
01. 一个进程映像是( )。
A. 由协处理器执行的一个程序
B. 一个独立的程序 + 数据集
C. PCB结构与程序和数据的组合
D. 一个独立的程序
02. 进程之间交换数据不能通过()途径进行。
A. 共享文件
B. 消息传递
C. 访问进程地址空间
D. 访问共享存储区
03. 进程与程序的根本区别是( )。
A. 静态和动态特点
B. 是不是被调入内存
C. 是不是具有就绪、运行和等待三种状态
D. 是不是占有处理器
<!-- page: 61 -->
04. 下列关于进程的描述中,最不符合操作系统对进程的理解的是( )。
A. 进程是在多程序环境中的完整程序
B. 进程可以由程序,数据和PCB描述
C. 线程(Thread)是一种特殊的进程
D. 进程是程序在一个数据集合上的运行过程,它是系统进行资源分配和调度的一个独立单元
05. 下列关于并发进程特性的叙述中,正确的是( )。
A. 进程是一个动态过程,其生命周期是连续的
B. 并发进程执行完毕后,一定能够得到相同的结果
C. 并发进程对共享变量的操作结果与执行速度无关
D. 并发进程的运行结果具有不可再现性
06. 下列关于进程的叙述中,正确的是( )。
A. 进程获得处理器运行是通过调度得到的
B. 优先级是进程调度的重要依据,一旦确定就不能改动
C. 在单处理器系统中,任何时刻都只有一个进程处于运行态
D. 进程申请处理器而得不到满足时,其状态变为阻塞态
07. 并发进程执行的相对速度是( )。
A. 由进程的程序结构决定的
B. 由进程自己来控制的
C. 与进程调度策略有关
D. 在进程被创建时确定的
08. 下列任务中,( )不是由进程创建原语完成的。
A. 申请 PCB 并初始化
B. 为进程分配内存空间
C. 为进程分配 CPU
D. 将进程插入就绪队列
09. 下列关于进程和程序的叙述中,错误的是( )。
A. 一个进程在其生命周期中可执行多个程序
B. 一个进程在同一时刻可执行多个程序
C. 一个程序的多次运行可形成多个不同的进程
D. 一个程序的一次执行可产生多个进程
10. 下列选项中,导致创建新进程的操作是( )。
I. 用户登录
II. 高级调度发生时
III. 操作系统响应用户提出的请求
IV. 用户打开了一个浏览器程序
A. 仅 I 和 IV
B. 仅 II 和 IV
C. I、II 和 IV
D. 全部
11. 操作系统是根据( )来对并发执行的进程进行控制和管理的。
A. 进程的基本状态
B. 进程控制块
C. 多道程序设计
D. 进程的优先权
12. 在任何时刻,一个进程的状态变化( )引起另一个进程的状态变化。
A. 必定
B. 一定不
C. 不一定
D. 不可能
13. 在单处理器系统中,若同时存在 10 个进程,则处于就绪队列中的进程最多有( )个。
A. 1
B. 8
C. 9
D. 10
14. 一个进程释放了一台打印机,它可能改变( )的状态。
A. 自身进程
B. 输入/输出进程
C. 另一个等待打印机的进程
D. 所有等待打印机的进程
15. 系统进程所请求的一次 I/O 操作完成后,将使进程状态从( )。
<!-- page: 62 -->
A. 运行态变为就绪态
B. 运行态变为阻塞态
C. 就绪态变为运行态
D. 阻塞态变为就绪态
16. 一个进程的基本状态可以从其他两种基本状态转变过去,这个基本的状态一定是( )。
A. 运行态
B. 阻塞态
C. 就绪态
D. 终止态
17. 在分时系统中,通常处于( )的进程最多。
A. 运行态
B. 就绪态
C. 阻塞态
D. 终止态
18. 并发进程失去封闭性,是指( )。
A. 多个相对独立的进程以各自的速度向前推进
B. 并发进程的执行结果与速度无关
C. 并发进程执行时,在不同时刻发生的错误
D. 并发进程共享变量,其执行结果与速度有关
19. 通常用户进程被建立后,( )。
A. 使一直存在于系统中,直到被操作人员撤销
B. 随着进程运行的正常或不正常结束而撤销
C. 随着时间片轮转而撤销与建立
D. 随着进程的阻塞或者唤醒而撤销与建立
20. 进程在处理器上执行时,( )。
A. 进程之间是无关的,具有封闭特性
B. 进程之间都有交互性,相互依赖、相互制约,具有并发性
C. 具有并发性,即同时执行的特性
D. 进程之间可能是无关的,但也可能是有交互性的
21. 下列关于父进程和子进程的叙述中,正确的是( )。
A. 为了标志父子关系,可让子进程和父进程拥有相同的 PID
B. 父进程和子进程是相互独立的,可以并发执行
C. 撤销子进程时,一定会同时撤销父进程
D. 父进程创建了子进程,要等父进程执行完后,子进程才能执行
22. 若一个进程实体由PCB、共享正文段、数据堆段和数据栈段组成,请指出下列C语言程序中的内容及相关数据结构各位于哪一段中。
I. 全局赋值变量( )
II. 未赋值的局部变量( )
III. 函数调用实参传递值( )
IV. 用malloc()要求动态分配的存储区( )
V. 常量值(如1995,"string")( )
VI. 进程的优先级( )
A. PCB
B. 正文段
C. 堆段
D. 栈段
23. 同一程序经过多次创建,运行在不同的数据集上,形成了( )的进程。
A. 不同
B. 相同
C. 同步
D. 互斥
24. PCB 是进程存在的唯一标志,下列( )不属于PCB。
A. 进程 ID
B. CPU 状态
C. 堆栈指针
D. 全局变量
25. 一个计算机系统中,进程的最大数量主要受到( )限制。
A. 内存大小
B. 用户数目
C. 打开的文件数
D. 外部设备数量
26. 进程创建完成后会进入一个序列,这个序列称为( )。
A. 阻塞队列
B. 挂起序列
C. 就绪队列
D. 运行队列
27. 进程自身决定( )。
关注公众号【考研小舟】
免费考研资料&无水印PDF
<!-- page: 63 -->
A. 从运行态到阻塞态
B. 从运行态到就绪态
C. 从就绪态到运行态
D. 从阻塞态到就绪态
28. 下列关于原语操作的叙述中,错误的是( )。
A. 操作系统使用原语时进程进行管理和控制
B. 原语在执行过程中不允许被中断
C. 原语在内核态下执行,常驻内存
D. 原语被定义为“原子操作”,意思是其执行速度非常快
29. 用信箱实现进程间互通信息的通信机制要有两个通信原语,它们是( )。
A. 发送原语和执行原语
B. 就绪原语和执行原语
C. 发送原语和接收原语
D. 就绪原语和接收原语
30. 速度最快的进程通信方式是( )。
A. 消息传递
B. Socket
C. 共享内存
D. 管道
31. 信箱通信是一种( )通信方式。
A. 直接通信
B. 间接通信
C. 低级通信
D. 信号量
32. 下列关于信号发送和处理的描述中,错误的是( )。
A. 一个进程可以给自己发送信号
B. 操作系统的内核可以给进程发送信号
C. 操作系统的内核对每种信号都有默认处理程序
D. 用户可以对每种信号自定义处理函数
33. 下列关于信号的处理的描述中,错误的是( )。
A. 当进程从内核态转为用户态时,会检查是否有待处理的信号
B. 当进程从用户态转为内核态时,也会检查是否有待处理的信号
C. 操作系统对某些信号的处理是可以忽略的
D. 操作系统允许进程通过系统调用,自定义某些信号的处理程序
34. 下面的叙述中,正确的是( )。
A. 引入线程后,处理器只能在线程间切换
B. 引入线程后,处理器仍在进程间切换
C. 线程的切换,不会引起进程的切换
D. 线程的切换,可能引起进程的切换
35. 下列关于线程的叙述中,正确的是( )。
A. 线程包含CPU现场,可以独立执行程序
B. 每个线程都有自己独立的地址空间
C. 每个进程只能包含一个线程
D. 同一进程中的线程间通信也必须使用系统调用函数
36. 下面的叙述中,正确的是( )。
A. 线程是比进程更小的能独立运行的基本单位,可以脱离进程独立运行
B. 引入线程可提高程序并发执行的程度,可进一步提高系统效率
C. 线程的引入增加了程序执行时的时空开销
D. 一个进程一定包含多个线程
37. 下面的叙述中,正确的是( )。
A. 同一进程内的线程可并发执行,不同进程的线程只能串行执行
<!-- page: 64 -->
B. 同一进程内的线程只能串行执行,不同进程的线程可并发执行
C. 同一进程或不同进程内的线程都只能串行执行
D. 同一进程或不同进程内的线程都可以并发执行
38. 下列选项中,( )不是线程的优点。
A. 提高系统并发性
B. 节约系统资源
C. 便于进程通信
D. 增强进程安全性
39. 下列关于进程和线程的说法中,正确的是( )。
A. 一个进程可以包含一个或多个线程,一个线程可以属于一个或多个进程
B. 多线程技术具有明显的优越性,如速度快、通信简便、设备并行性高等
C. 由于线程不作为资源分配单位,线程之间可以无约束地并行执行
D. 线程也称轻量级进程,因为线程都比进程小
40. 在下列描述中,( )并不是多线程系统的特长。
A. 利用线程并行地执行矩阵乘法运算
B. Web 服务器利用线程响应 HTTP 请求
C. 健盘驱动程序为每个正在运行的应用配备一个线程,用以响应该应用的键盘输入
D. 基于 GUI 的调试程序用不同的线程分别处理用户输入、计算和跟踪等操作
41. 在进程转换时,下列( )转换是不可能发生的。公众号:小兔网盘 免费分享无水印PDF
A. 就绪态 → 运行态
B. 运行态 → 就绪态
C. 运行态 → 阻塞态
D. 阻塞态 → 运行态
42. 当( )时,进程从执行状态转变为就绪态。
A. 进程被调度程序选中
B. 时间片到
C. 等待某一事件
D. 等待的事件发生
43. 两个合作进程(Cooperating Processes)无法利用( )交换数据。
A. 文件系统
B. 共享内存
C. 高级语言程序设计中的全局变量
D. 消息传递系统
44. 以下可能导致一个进程从运行态变为就绪态的事件是( )。
A. 一次 I/O 操作结束
B. 运行进程需做 I/O 操作
C. 运行进程结束
D. 出现了比现在进程优先级更高的进程
45. ( )必会引起进程切换。
A. 一个进程创建后,进入就绪态
B. 一个进程从运行态变为就绪态
C. 一个进程从阻塞态变为就绪态
D. 以上答案都不对
46. 进程处于( )时,它处于非阻塞态。
A. 等待从键盘输入数据
B. 等待协作进程的一个信号
C. 等待操作系统分配 CPU 时间
D. 等待网络数据进入内存
47. 一个进程被唤醒,意味着( )。
A. 该进程可以重新竞争 CPU
B. 优先级变大
C. PCB 移动到就绪队列之前
D. 进程变为运行态
48. 进程创建时,不需要做的是( )。
A. 填写一个该进程的进程表项
B. 分配该进程适当的内存
C. 将该进程插入就绪队列
D. 为该进程分配 CPU
49. 计算机系统中两个协作进程之间不能用来进行进程间通信的是( )。
<!-- page: 65 -->
A. 数据库
B. 共享内存
C. 消息传递机制
D. 管道
50. 下面关于用户级线程和内核级线程的描述中,错误的是( )。
A. 采用轮转调度算法,进程中设置内核级线程和用户级线程的效果完全不同
B. 跨进程的用户级线程调度也不需要内核参与,控制简单
C. 用户级线程可以在任何操作系统中运行
D. 若系统中只有用户级线程,则CPU的调度对象是进程
51. 在内核级线程相对于用户级线程的优点的如下描述中,错误的是( )。
A. 同一进程内的线程切换,系统开销小
B. 当内核线程阻塞时,CPU将调度同一进程中的其他内核线程执行
C. 内核级线程的程序实体可以在内核态运行
D. 对多处理器系统,核心可以同时调度同一进程的多个线程并行运行
52. 下列关于用户级线程相对于内核级线程的优点的描述中,错误的是( )。
A. 一个线程阻塞不影响另一个线程的运行
B. 线程的调度不需要内核直接参与,控制简单
C. 线程切换代价小
D. 允许每个进程定制自己的调度算法,线程管理比较灵活
53. 下列关于用户级线程的优点的描述中,不正确的是( )。
A. 线程切换不需要切换到内核态
B. 支持不同的应用程序采用不同的调度算法
C. 在不同操作系统上不经修改就可直接运行
D. 同一个进程内的多个线程可以同时调度到多个处理器上执行
54. 下列选项中,可能导致用户级线程切换的事件是( )。
A. 系统调用
B. I/O 请求
C. 异常处理
D. 线程同步
55. 下列关于用户级线程的描述中,错误的是( )。
A. 用户级线程由线程库进行管理
B. 用户级线程只有在创建和调度时需要内核的干预
C. 操作系统无法直接调度用户级线程
D. 线程库中线程的切换不会导致进程切换
56. 下面的说法中,正确的是( )。
A. 不论是系统支持的线程还是用户级线程,其切换都需要内核的支持
B. 线程是资源分配的单位,进程是调度和分派的单位
C. 不管系统中是否有线程,进程都是拥有资源的独立单位
D. 在引入线程的系统中,进程仍是资源调度和分派的基本单位
57. 在多对一的线程模型中,当一个多线程进程中的某个线程被阻塞后,( )。
A. 该进程的其他线程仍可继续运行
B. 整个进程都将阻塞
C. 该阻塞线程将被撤销
D. 该阻塞线程将永远不可能再执行
58. 并发性较好的多线程模型有( )。
I. 一对一模型
II. 多对一模型
III. 多对多模型
A. 仅I
B. I和II
C. I和III
D. I、II和III
59. 下列关于多对一模型的叙述中,错误的是( )。
A. 一个进程的多个线程不能并行运行在多个处理器上
<!-- page: 66 -->
B. 进程中的用户级线程由进程自己管理
C. 线程切换会导致进程切换
D. 一个线程的系统调用会导致整个进程阻塞
60.【2010 统考真题】下列选项中,导致创建新进程的操作是( )。
I. 用户登录成功
II. 设备分配
III. 启动程序执行
A. 仅 I 和 II
B. 仅 II 和 III
C. 仅 I 和 III
D. I、II、III
61.【2011 统考真题】在支持多线程的系统中,进程 P 创建的若干线程不能共享的是( )。
A. 进程 P 的代码段
B. 进程 P 中打开的文件
C. 进程 P 的全局变量
D. 进程 P 中某线程的线指针
62.【2012 统考真题】下列关于进程和线程的叙述中,正确的是( )。
A. 不管系统是否支持线程,进程都是资源分配的基本单位
B. 线程是资源分配的基本单位,进程是调度的基本单位
C. 系统级线程和用户级线程的切换都需要内核的支持
D. 同一进程中的各个线程拥有各自不同的地址空间