我是靠谱客的博主 狂野咖啡豆,最近开发中收集的这篇文章主要介绍操作系统学习笔记 第二章:进程管理(王道考研),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文章基于 2019 王道考研 操作系统
考试复习推荐资料:操作系统复习总结 - 百度文库 (baidu.com)


需要相关电子书的可以关注我的公众号BaretH后台回复操作系统
image-20210616202753852
第一章:操作系统概述
后续章节陆续推出…


二、进程管理

    • 2.1 进程的基本概念
      • 2.1.1 进程的定义
      • 2.1.2 进程的组成
      • 2.1.3 进程的特征
      • 2.1.4 进程的组织方式
    • 2.2 进程的状态及转换
      • 2.2.1 进程的状态
      • 2.2.2 进程状态转换
    • 2.3 进程控制
      • 2.3.1 什么是进程控制
      • 2.3.2 进程控制的实现—原语
      • 2.3.3 进程控制相关原语
    • 2.4 进程通信
      • 2.4.1 什么是进程通信
      • 2.4.2 共享存储
      • 2.4.3 消息传递
      • 2.4.4 管道通信
    • 2.5 进程同步与互斥
      • 2.4.1 什么是同步、互斥
      • 2.4.2 进程互斥的软件实现
      • 2.4.3 进程互斥的硬件实现
    • 2.6 信号量机制
      • 2.6.1 整形信号量
      • 2.6.2 记录型信号量
      • 2.6.3 信号量实现进程同步、互斥、前驱关系
    • 2.7 进程同步互斥经典问题
      • 2.7.1 生产者消费者问题
      • 2.7.2 多生产者多消费者
      • 2.7.3 吸烟者问题
      • 2.7.4 读者-写者问题
      • 2.7.5 哲学家进餐问题
    • 2.8 管程
    • 2.9 线程和多线程模型
      • 2.9.1 线程的引入
      • 2.9.2 引入线程机制后的变化
      • 2.9.3 线程属性
      • 2.9.4 线程的实现方式
      • 2.9.5 多线程模型


image-20210607094024299

2.1 进程的基本概念

image-20210607094710879

单道程序阶段:

image-20210321233657343

引入多道程序技术后:

image-20210321233804117

2.1.1 进程的定义

在多道程序环境下,允许多个程序并发执行,为了方便操作系统管理完成各程序并发执行,引入了进程Process的概念,实现操作系统的并发性和共享性(最基本的两个特性)
image-20210321234127572

从不同的角度,进程可以有不同的定义,比较典型的定义有:

  1. 进程是程序的一次执行过程
  2. 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  3. 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位

引入进程实体的概念后,我们可以把传统操作系统中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位

2.1.2 进程的组成

为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构称为进程控制块(Process Control Block,PCB)。系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。PCB是进程存在的唯一标志。相应地,由程序段、相关数据段PCB三部分构成了进程映像(进程实体)。所谓创建进程,实质上是创建进程映像中的PCB;而撤销进程,实质上是撤销进程的PCB.值得注意的是,进程映像是静态的,进程则是动态的。

image-20210607095643863

image-20210607095537249

PCB的组成

image-20210607095406054

程序段、数据段的组成

image-20210607095427814

2.1.3 进程的特征

image-20210607095702731

2.1.4 进程的组织方式

image-20210607094330549

进程的组织——链接方式:

image-20210607094424823

进程的组织——索引方式:

image-20210607094502826



2.2 进程的状态及转换

image-20210614105503190

2.2.1 进程的状态

进程在其生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变化,使得进程的状态也在不断地发生变化,通常进程有以下五种状态,前三种是进程的基本状态:

  1. 运行态:进程正在处理机上运行。在单处理机环境下,每个时刻最多只有一个进程处于运行态。
  2. 就绪态:进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即运行。系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列
  3. 阻塞态,又称等待态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行
  4. 创建态:进程正在被创建,尚未转到就绪态。创建进程通常需要多个步骤:首先申请个空白的PCB,并向PCB中填写些控制和管理进程的信息;然后由系统为该进程分配运行时所必需的资源;最后把该进程转入就绪态
  5. 结束态:进程正从系统中消失,可能是进程正常结束或其他原因中断退出运行。进程需要结束运行时,系统首先必须置该进程为结東态,然后再进一步处理资源释放和回收等工作

基本状态转换图

image-20210614105747339

五状态转换图

image-20210607100413639

image-20210406151734138

2.2.2 进程状态转换

image-20210321235825682

image-20210607102346548



2.3 进程控制

image-20210607102215132

2.3.1 什么是进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

image-20210607100712457

2.3.2 进程控制的实现—原语

在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。

image-20210607100802045

如何实现原语的“原子性”
在这里插入图片描述

正常情况下,CPU每执行完一条指令都会例行检查是否有中断信号需要处理,如果有, 则暂停运行当前这段程序,转而执行相应的中断处理程序。而当CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。这样,关中断、开中断之间的这些指令序列就是不可被中断的,这就实现了“原子性“

2.3.3 进程控制相关原语

image-20210607102229854

创建原语

撤销原语

image-20210607102016184

阻塞&唤醒原语(成对出现)

image-20210607102044005

进程切换

image-20210607102112947



2.4 进程通信

image-20210607111004813

2.4.1 什么是进程通信

进程通信是指进程之间的信息交换

image-20210607102903175

PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三类:共享存储、消息传递、管道通信

2.4.2 共享存储

在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(如P操作、V操作),对共享空间的写/读进行控制。共享存储又分为两种:低级方式的共享是基于数据结构的共享;高级方式的共享则是基于存储区的共享。操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则由用户自己安排读/写指令完成。

image-20210607110245588

2.4.3 消息传递

在消息传递系统中,进程间的数据交换是以格式化的消息(Message)单位的。若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进行数据交换

  1. 直接通信方式:发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息
  2. 间接通信方式:发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称为信箱,这种通信方式又称信箱通信方式。该通信方式广泛应用于计算机网络中,相应的通信系统称为电子邮件系统

image-20210607110318775

2.4.4 管道通信

管道通信是消息传递的一种特殊方式。所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入(写)管道;而接收管道输出的接收进程(即读进程)则从管道中接收(读)数据。为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥同步确定对方的存在

image-20210607110300803



2.5 进程同步与互斥

2.4.1 什么是同步、互斥

image-20210520202528157

1️⃣ 什么是进程同步

在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。例如,让系统计算1+2×3,假设系统产生两个进程:一个是加法进程,一个是乘法进程要让计算结果是正确的,一定要让加法进程发生在乘法进程之后,但实际上操作系统具有异步性,若不加以制约,加法进程发生在乘法进程之前是绝对有可能的,因此要制定一定的机制去约束加法进程,让它在乘法进程完成之后才发生,而这种为了协调进程之间的相互制约关系的机制就是 进程同步

同步亦称直接制约关系,是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系源于它们之间的相互合作。

image-20210520202154604

2️⃣ 什么是进程互斥

互斥也称间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。

我们把一个时间段内只允许一个进程使用的资源称为临界资源,进程中访问临界资源的代码段称为临界区。许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。

image-20210520202414972

例如,在仅有一台打印机的系统中,有两个进程A和进程B,若进程A需要打印时,系统已将打印机分配给进程B,则进程A必须阻塞。一旦进程B将打印机释放,系统便将进程A唤醒,并将其由阻塞态变为就绪态。

为禁止两个进程同时进入临界区,同步机制应遵循以下准则:

  1. 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
  2. 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待
  3. 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区
  4. 让权等待。当进程不能进入临界区时,应立即释放处理器,防止进程忙等待

2.4.2 进程互斥的软件实现

image-20210607152425332

1️⃣ 单标志法

image-20210520202748079

image-20210520202830107

2️⃣ 双标志先检查法

image-20210520203204490

3️⃣ 双标志后检查法

image-20210520203322928

4️⃣ Peterson算法

image-20210520203743991

2.4.3 进程互斥的硬件实现

image-20210607152949171

1️⃣ 中断屏蔽方法

image-20210520212324961

2️⃣ TestAndSet

image-20210520214805282

3️⃣ Swap指令

image-20210520214928058



2.6 信号量机制

信号量机制的引入

image-20210607195234978

image-20210607195223292

image-20210607195646557

2.6.1 整形信号量

image-20210607195417700

2.6.2 记录型信号量

image-20210607195510742

image-20210607195621582

2.6.3 信号量实现进程同步、互斥、前驱关系

image-20210607202443940

1️⃣ 信号量实现进程互斥

image-20210607202543222

2️⃣ 信号量实现进程同步

image-20210520221933013

image-20210520222129149

3️⃣ 信号量实现前驱关系

image-20210520222329918



2.7 进程同步互斥经典问题

2.7.1 生产者消费者问题

image-20210612083639396

image-20210612083557246

semaphore mutex = 1;	// 互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n;	// 同步信号量,表示空闲缓冲区的数量
semaphore full = 0;		// 同步信号量,表示产品的数量,也即非空缓冲区的数量

image-20210612083831419

image-20210612083908144

image-20210520234308000

2.7.2 多生产者多消费者

image-20210520234424999

image-20210612083953030

image-20210520234831902

image-20210612084124488

image-20210520235222212

image-20210612084151420

2.7.3 吸烟者问题

image-20210521131313102

image-20210612084255708

image-20210612084307577

image-20210612084323236

image-20210612084332817

2.7.4 读者-写者问题

image-20210612084356907

image-20210612084600728

image-20210612084624324

image-20210612084423883

image-20210612084435907

image-20210612084446638

2.7.5 哲学家进餐问题

image-20210612084656230

image-20210612084718770

如何避免死锁发生?

  1. 可以对哲学家进程施加一些限制 条件,比如最多允许四个哲学家同 时进餐。这样可以保证至少有一个 哲学家是可以拿到左右两只筷子的
  2. 要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这就避免了占有一支后再等待另一只的情况
  3. 仅当一个哲学家左右两支筷子都可用时才允许他抓起筷子

image-20210612085002753

image-20210612085018417



2.8 管程

image-20210607203645665

image-20210607203523318

image-20210607203549156

image-20210521145607167

image-20210607203633013

image-20210612090853749



2.9 线程和多线程模型

image-20210607111134418

2.9.1 线程的引入

引入进程的目的是为了更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

引入线程后,进程的内涵发生了改变,进程只作为除CPU外的系统资源的分配单元,而线程则作为处理机的分配单元。由于一个进程内部有多个线程,若线程的切换发生在同一个进程内部,则只需要很少的时空开销。

image-20210607111341269

image-20210607111455551

引入线程后:

image-20210607111547925

image-20210607112520887

2.9.2 引入线程机制后的变化

image-20210607112542069

1️⃣ 并发性方面

image-20210607112058959

2️⃣ 系统开销方面

image-20210607112109241

3️⃣ 资源分配调度方面

image-20210607112121215

2.9.3 线程属性

image-20210607112723461

2.9.4 线程的实现方式

线程的实现可以分为两类:用户级线程(User-Level Thread,ULT)和内核级线程(Kernel-Level Thread,KLT)

用户级线程:在用户级线程中,有关线程管理(线程的创建、撤消和切换等)的所有工作都由应用程序完成,内核意识不到线程的存在。应用程序可以通过使用线程库设计成多线程程序。通常,应用程序从单线程开始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程。

image-20210607113256101

内核级线程:在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及其内部的每个线程维护上下文信息,调度也在内核基于线程架构的基础上完成。

image-20210607113247222

组合方式:有些系统中使用组合方式的多线程实现。线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于等于用户级线程的数目)内核级线程上。

image-20210607113314021

2.9.5 多线程模型

有些系统同时支持用户线程和内核线程,由此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式

1️⃣ 多对一模型

image-20210607113453502

2️⃣ 一对一模型

image-20210607113537276

3️⃣ 多对多模型

image-20210607113553067

最后

以上就是狂野咖啡豆为你收集整理的操作系统学习笔记 第二章:进程管理(王道考研)的全部内容,希望文章能够帮你解决操作系统学习笔记 第二章:进程管理(王道考研)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部