《操作系统设计与实现》(第三版)第二章 进程 重要概念汇总

1. 进程

1.1概念

进程是指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。多个进程间可以并发执行和交换信息。一个进程在运行时需要一定的资源(如CPU、存储空间及I/O设备等)

1.2进程的创建

进程的创建有四个主要原因:

①系统初始化

②正在运行的一个进程执行了创建进程的系统调用(在MINIX3系统中,只有一个系统调用来创建新的进程:fork)

③用户请求创建一个新进程(用户进程调用了fork系统调用)

④批处理作业的初始化

(注意:两个进程间地址空间是不共享的,但是有可能共享打开文件之类的资源)

1.3进程的终止

进程终止的原因:

①正常退出(自愿)

②出错退出(自愿)——进程发现了严重错误,例如编译程序foo.c,但是文件不存在,编译器会简单退出

③严重错误(非自愿)——由于进程引起的错误,通常是由于程序中的错误所致,例如除数为0,执行一条非法指令等等

④被其他进程杀死(非自愿)

1.3进程的层次结构

当进程创建了另外一个进程后,父进程和子进程就以某种形式继续保持关联。子进程自身可以创建更多的进程,组成一个进程的层次结构。注意:进程只有一个父进程!

在引导映像中有两个特殊的进程,再生服务器(reincarnation server)和init。

①再生服务器进程的任务是启动/重启驱动(drivers)和服务器(server),它初始时处于阻塞态,等待消息告诉它创建什么。

②init进程执行/etc/rc脚本,并向再生服务器发送命令启动引导映像中不存在的驱动和服务器。

1.4进程的状态

                      

进程三种状态的转换图:

①运行态(Running,在该时刻实际占用处理机)

②就绪态(Ready,可运行,因为其他进程正在运行而暂时被挂起)

③阻塞态(Blocked,除非某种外部事件发送生,否则即使CPU空闲也不能运行)

1.4.1进程状态转换

①就绪态->运行态:

处于就绪状态的进程,当进程调度程序为它分配了处理机后,该进程便由就绪状态变为运行态,正在执行的进程也称为当前进程。

②运行态→阻塞态:

正在执行的进程因发生某件事件而无法执行。例如:进程请求访问临界资源,而该资源正被其它进程访问,则请求该资源的进程将由执行状态转变为阻塞态。

③阻塞态->就绪态:

当一个进程等待的一个外部事件发生时(例如到达一些输入),该进程便由阻塞态变为就绪态。如果此时没有其他进程运行,则立即触发转为运行态。

④运行态→就绪态:

正在执行的进程,如果事件发生或中断而被暂停执行,该进程便由执行状态转变为就绪状态。(分时系统中,时间片用完;抢占调度方式中,优先权高抢占处理机)

1.4.2 进程的实现

为了实现进程模型,操作系统维持着一张表格(一个结构数组),即进程表(process table)。每个进程占用一个进程表项。该表项包含了进程的状态、程序计数器、栈指针、内存分配状况、打开文件状态、统计和调度信息、定时器和其他信号,以及进程由运行态到就绪态切换时所必须保存的其他信息。

2. 线程

2.1概念

线程(Thread)是进程的一个实体,是CPU调度和分配的基本单位。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。线程有时也称为轻量进程。 

3. 关系

3.1进程和线程的关系(重点!)

线程是属于进程的,一个线程只属于一个进程,而一个进程可以有多个线程,且至少有一个线程。线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其他线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一些在运行中必不可少的信息(如程序计数器、一组寄存器和堆栈)。线程在执行过程中,需要协调同步。不同进程的线程间要利用消息通信的办法实现同步

3.2进程和程序的关系(重点!)

① 程序只是一组指令的有序集合,它本身没有任何运行的含义,是一个静态的实体。而进程不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源/事件而处于等待状态,应完成任务而被撤销,反映了一个程序在一定数据集上运行的全部动态过程,但是,进程离开了程序也就没有了存在的意义。

② 程序可以作为一种软件资源长期保持着,而进程则是一次执行过程,它是暂时的,是动态的产生和终止的;进程具有并发性,而程序没有;

③ 程序和进程不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进程可以执行一个或几个程序

4. 进程间通信(IPC)

4.1竞争条件

两个多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序

4.2临界区与临界资源

临界资源的概念:一次仅允许一个进程使用的共享资源

临界区的概念:对共享内存进行访问的程序片段称为临界区/临界段(critical region/section)。

注:保证使用共享数据的并发进程能够正确和高效地进行操作,需要具有以下四个条件:

①任何两个进程不能同时处于临界区

②不应对CPU的速度和数目做任何假设

③临界区外的进程不得阻塞其他进程

④不得使进程在临界区外无休止地等待

5. 忙等待(busy waiting)形式的互斥

当一个进程在临界区中更新共享内存时,其他进程将不会进入其临界区,也不会带来任何麻烦

①关闭中断(理论上可行,实际不可行)

中断被关闭后,时钟中断也被屏蔽,CPU只有在发生时钟/其他中断时才会进行进程切换,因此关中断后CPU将不会被切换到其他进程。

缺点:关中断权力交给用户,忘记开中断,系统会瘫痪

②锁变量

共享锁,初值为0,1表示已有某个进程进入临界区。当一个进程想要进入临界区时,它首先测试这把锁。若锁的值为0,则进程将其置为1并进入临界区。若锁已经为1,则进程一直等待直到值变为0.

缺点:一个进程读锁变量的值并发现它为0,恰好在它将其置为1前,调度运行了另一个进程并将锁变量置为1,则此时可能存在同时有两个进程处于临界区中

③严格交替法

缺点:违反了条件三:临界区外的进程不得阻塞其他进程!!不可取

注:持续地检测一个变量直到它具有某一特定值就称为忙等待(busy waiting)。忙等待应该避免的,因为它会浪费CPU时间,只有在有理由预期等待时间很短时,才使用忙等待。一个适用忙等待的锁称为:自旋锁。

6. 睡眠(sleep)和唤醒(wakeup)

6.1优先级反转问题(priority inversion problem)

在某一时刻,L处于临界区,此时H变到就绪态准备运行。现在H开始忙等待,但由于当H就绪时L不会被调度,也无法离开临界区,所以H将永远忙等待下去

6.2生产者-消费者问题(有界缓冲区问题)

两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,负责将信息放入缓冲区;另一个是消费者,负责充缓冲区中取出信息。当缓冲区已满,此时生产者还想向其中放入一个新的数据项,让生产者睡眠,待消费者从缓冲区中取走一个/多个数据项时再唤醒它;

当缓冲区为空,此时消费者还想从缓冲区中取数据,让消费者睡眠,待生产者生产一些数据时再将其唤醒。

(为了跟踪缓冲区的数据项数,需要一个变量count。如果缓冲区最多存放N个数据项,则生产者将首先检查count是否达到N,若是,则生产者睡眠;否则生产者向缓冲区中放入一个数据项并将count+1;

消费者首先看count是否为0,若是则睡眠;否则从中取走一个数据项并把count-1

每个进程同时也检测另一个是否应睡眠,若不应睡眠则唤醒之)

用count的缺点:可能出现竞争条件,因为对count的访问未加限制

 

7. 信号量(semaphore)——编程

1)两种操作:down和up(p、v操作)

2)检查数值、改变数值以及可能发生的睡眠操作均用作单一的、不可分割的原子操作(atomic action)——保证一旦一个信号量操作开始,则在操作完成/阻塞前其他的进程均不允许访问该信号量。原子性对于解决同步问题和避免竞争条件是非常重要的!

3)用信号量解决生产者-消费者问题

①使用了三个信号量:

  1. full用来记录满的缓冲槽数目(初值=0)
  2. empty用来记录空的缓冲槽总数(初值=N)
  3. mutex用来确保生产者和消费者不会同时访问缓冲区(初值=1)

8. 进程间的同步与互斥(考点)

①进程间的同步关系

进程间的同步:相互合作的两个进程之间需要在某个/些确定点协调它们的工作,一个进程到达了该点后,除非另一进程已经完成了某些操作,否则就不得不停下来等待这些操作的完成

同步的主要特征:一个进程在某个点上等待另一进程提供信息,两进程间存在直接制约关系,其表现形式为进程—进程

②进程间的互斥关系

两个进程由于不能同时使用同一临界资源,只能在一个进程使用完了,另一进程才能使用,这种现象称为进程间的互斥

互斥的主要特征:争用资源,两进程间存在间接制约关系,其表现形式为进程-资源-进程

(互斥仅仅适用于管理共享资源的或一小段代码时。互斥是一个可以处于两态之一的变量:解锁和加锁。)

*PV是用于实现进程同步或互斥的低级原语

9. 哲学家就餐问题——编程

                                                          

哲学家的生活:吃饭和思考。当一个哲学家觉得饿时,他就试图分两次去取他左边和右边的叉子,每次拿一把,但不分次序。如果成功地获得了两把叉子,他就开始吃饭,吃完以后放下叉子继续思考。

——解决方案:使用了一个信号量数组:记录每个人的状态

优点:①避免死锁 ②每个科学家不存在饥饿问题

10. 进程调度

当多个进程处于就绪态而只有一个CPU时,操作系统就必须决定先运行哪一个进程。操作系统中做出这种决定的部分称为调度器(scheduler),它使用的算法成为调度算法(scheduling algorithm)

有些进程大部分时间花费在运算上,而有些进程大部分时间花费在等待I/O操作上。前者称为计算密集型(compute-bound),后者称为I/O密集型(I/O-bound)

注意:

①计算密集型进程通常具有较长的CPU运算时间,因而具有较少频度的I/O操作;

②I/O密集型进程之所以是I/O密集型的,是因为它们在I/O请求之间需要较少的CPU运算,而不是它们拥有比较长的I/O请求时间

10.1发生调度的情况

两种情况下,调度肯定会发生:

①当一个进程退出时

②当一个进程在I/O或信号量上阻塞时

其他三种情况,尽管调度在逻辑上不是必须的,但还是经常发生:

①当一个新进程创建时

②当一个I/O中断发生时

③当一个时钟中断发生时

注:1)当一个新进程创建时,重新评估优先级是理所当然的

       2)根据如何处理时钟中断把调度算法分为两类:非抢占式调度算法抢占式调度算法

10.2调度算法分类

①批处理:非抢占式调度算法/抢占式算法都适用,减少了进程切换,增强系统性能

②交互式:抢占式算法

③实时:有必须/至少满足的截止时间

10.2.1批处理系统中调度算法分类

10.2.1.1*先到先服务(first-come first-served)                                                    

先到先服务是非抢占式算法。进程按照它们请求CPU的顺序使用CPU

优点:易于理解,编程易实现

缺点:花费时间长

10.2.1.2最短作业优先(shortest job first,SJF)                                                   

最短作业优先是一种适用于运行时间可以预知的批作业的非抢占式调度算法。当输入队列中有若干个同等重要的作业将要被启动时,调度器应使用最短作业优先算法。

注:最短作业优先算法只有在所有作业同时启动时才是最优的                                                    

10.2.1.3最短剩余时间优先 (shortest remaining time next)                                                   

最短作业优先的抢占式版本是最短剩余时间优先算法。调度器总是挑选其剩余时间最短的那些进程运行,同样,在这里运行时间必须预知。当一个新作业到来时,它所需的总时间与当前运行程序的剩余时间比较,若新作业运行所需总时间<当前运行进程的剩余时间,那么当前进程被挂起,新作业启动运行。

10.2.1.4三级调度                                                        

准入调度器:决定哪些作业允许进入系统;

内存调度器:决定哪个进程留在内存而哪个进程换出到磁盘;

CPU调度器:在内存中选取下一个将要运行的进程

注:决定是否将进程调入内存的标准:

①换入/换出已经经过多长时间

②最近占用了多少CPU时间

③进程占用的空间有多大(小进程不用这样考虑)

④进程有多重要

10.2.2交互式系统中调度算法分类                                                             

10.2.2.1*时间片轮转调度(round robin)                                                        

每个进程被分配一个时间段,称为它的时间片(quantum),即该进程允许运行的时间。如果在时间片结束时进程仍在运行,则CPU将被抢占并分配给另一个进程。如果进程在时间片结束前阻塞/结束,则CPU当即进行切换

注:进程切换(process switch):有时也称为上下文切换(context switch),需要花费CPU时间

注:时间片设得太短会导致过多的进程切换,降低CPU的效率;设得太长又可能引起对短的交互请求的响应变差。将时间片设为20~50ms通常是一个比较合理的折中。

10.2.2.2*优先级调度(priority scheduling)                                                        

  基本思想:每个进程被赋予一个优先级,率先运行优先级最高的就绪进程。为了防止高优先级进程无休止地运行下去,调度器可能在每个时钟脉冲节拍时降低当前进程的优先级,如果这个动作导致其优先级低于次高优先级,则将进行进程切换。或者给每个进程设定一段它能够连续使用CPU的时间片,一旦这段时间用完,就运行次高优先级的进程。

   优先级分类:

静态:允许用户为了照顾别人而自愿降低其进程的优先级,但从未有人用过

动态:优先级可以被系统动态地确定,以达到某种目的

10.2.2.3其他调度                                                        

①多重队列调度

②最短进程优先

③保证调度算法

④彩票调度算法

④公平分享调度

10.2.3实时系统调度算法分类                                                             

实时系统分为:硬实时(hard real time)系统和软实时(soft real time)系统;前者意味着存在必须满足的时间限制,后者意味着偶尔超过时间限制是可以容忍的。实时系统要响应的事件进一步分为周期性(每隔一段固定时间发生)和非周期性(在不可预测的时间发送)

10.3策略与机制

调度机制(scheduling mechanism)和调度策略(scheduling policy)分开,将调度算法以某种形式参数化,而参数可以由用户进程来填写

进程控制块PCB的概念及其构成(考点)

11.进程管理块的概念及其构成(PCB,Process Control Block)(是进程存在的唯一标志)

概念

进程控制块是操作系统用于控制和管理进程的一种数据结构,是进程组成中最关键的部分,PCB是进程存在的唯一标志。操作系统根据PCB对进程实施控制和管理。进程的动态、并发等特征是利用PCB表现出来的

组成

包含一个特定进程的相关信息,如:

①进程状态、②程序计数器、③CPU寄存器、④CPU调度信息(如进程优先级、调度序列的指针和其他调度参数)、④内存管理信息(基址和界限寄存器的值、页表/段表)、记账信息(CPU时间、实际使用时间、时间界限、记账数据、作业/进程数量)、I/O状态信息

12.中断技术对并发的支持(考点)

在单中央处理器的多道程序系统中,要使多道程序能够并发执行,关键应使CPU能在这些程序之间不断地进行切换,让每道程序都有机会得到CPU。导致这种切换的动力主要来源于时钟中断。当然,也有一些系统不按时间片运行,而是按优先级或其他原则运行的,这种情况下,CPU的替换也主要发生在中断处理之时。

13.并发与并行(考点)

13.1并发与并行的概念

并行:同一时间点同时执行
并发:同一时间片段同时执行

13.2并发与并行的区别

并行:在多道程序环境下,多个程序同一时刻在不同CPU上同时执行(具有多个CPU/CPU核)

并发:在同一个CPU上同时(不是真正的同时,而是看起来是同时)运行多个程序

程序并发执行时具有的主要特征:

①并发程序在执行期间具有相互制约关系;

②程序与计算不再一一对应;

③并发程序执行结果不可在现(具有可分割性、不可再现性、失去封闭性)

13.3CPU与外部设备之间的并行

为实现CPU与外部设备并行工作,必须引入的基础硬件是通道

13.4 外部设备与外部设备之间的并行

13.5 例题

在单处理机系统中,可并行的是 (BCD)

A进程与进程  B处理机与设备  C处理机与通道  D设备与设备

①处理器与设备,是通过通道通讯的,处理器与设备、处理器与通道通讯,是相同的意思。

②设备与设备通讯,可以不通过处理器核心、直接通过DMA控制器等进行通讯。

发布了50 篇原创文章 · 获赞 46 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41949328/article/details/104302220