2、操作系统原理知识复习(day02)--进程、线程、CPU调度、进程调度

911 阅读19分钟

第二章:进程、线程、调度

1、进程的定义、组成、组织方式、特征

1.1、知识概览

image.png

1.2、进程的定义

在计算机发展史上,进程是为了解决什么问题被引入的呢?

回顾: 在早期计算机中,只支持单道程序(顺序执行),计算机中CPU、I/O设备、内存等资源都为该程序服务,之后操作系统引入多道程序后,计算机中从而可以有多道程序并发的执行,操作系统为了管理这些程序就需要找到各个程序的存放位置,并且CPU、I/O设备、内存等资源为多个程序服务,从而操作系统也需要记录每个程序所使用的这些资源的详细信息,因此为了方便管理程序之间的并发执行,所以我们引入进程和进程实体的概念。

系统为每个运行的程序配置一个数据结构,成为进程块(PCB),用来描述进程的各种信息(如程序代码存放位置)。我们知道程序是由程序段和数据段组成的,程序段存的是程序的机器指令,数据段存放的是执行过程中的数据。而进程实体就是由程序段+数据段+pcb(进程控制块)。一般情况下,将进程实体【进程映像】就简称为进程

image.png

我们常说的创建进程其实就是创建pcb,撤销进程就是撤销pcb。所以PCB是进程存在的唯一标志,所以进程是程序的一次执行过程他是动态的而进程实体是静态的

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

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

1.3、进程组成

每个进程由哪些部分组成?

  • 程序段:存储程序本身的机器指令
  • 数据段:存储运行过程中的常量,变量
  • 进程控制块pcb
    • 进程描述信息:进程标识符PID,用户标识符UID(进程的编号和使用该进程用户的编号
    • 进程控制和管理信息:进程当前的状态,进程的优先级
    • 资源分配清单:程序段指针,数据段指针,键盘,鼠标
    • 处理机相关信息:各种寄存器的值

注意:与进程管理相关的数据都保存在pcb中,与程序本身有关的数据保存在程序段和数据段

PID-Windows查看:

image.png

或:

image.png

1.4、进程的组织方式

系统中的每个进程是如何被组织起来的?

1,连接方式

  • 按照进程状态将pcb分为多个队列
  • 操作系统持有指向各个队列指针

image.png

2,索引方式:

  • 根据进程状态不同,建立几张索引表
  • 操作系统持有指向各个索引表指针

image.png

1.5、进程的特征

相比于程序,进程由哪些特征?

  • 动态性:进程是程序的一次执行过程,是动态的产生,变化和消亡的
  • 并发性:进程中有多个进程实体,各个进程可以并发执行
  • 独立性:进程是能独立运行,独立获得资源,独立接受调度的基本单位
  • 异步性:各个进程各自独立,以不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题
  • 结构性:每个进程都会配置也高pcb,进程都是由:程序段,数据段,pcb组成

注意:动态性是进程最基本的特征,进程是资源分配,接受调度的基本单位异步性会导致并发程序执行结果的不确定性

2、进程的状态与转换

2.1、知识总览

image.png

2.2、进程的三种基本状态

进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时又需要等待CPU服务,可见,进程的状态是会有各种变化。为了方便对各个进程的管理,操作系统需要将进程合理地划分为几种状态。

进程的三种基本状态:

image.png

注意:

  • 运行态:单核处理机环境下,每一时刻最多只有一个进程处于运行态。( 双核环境下可以同时有2个进程处于运行态)
  • 就绪态:进程已经拥有了除CPU之外所有需要的资源,一旦获得处理机,即可立即进入运行态开始运行。即:万事俱备,只欠CPU
  • 阻塞态:如:等待操作系统分配打印机、等待读磁盘操作的结果。CPU是计算机中最昂贵的部件,为了提高CPU的利用率,需要先将其他进程需要的资源分配到位,才能得到CPU的服务

2.3、进程的另外两种状态

image.png

2.4、进程状态的转换

image.png

3、原语实现进程控制

3.1、知识总览

image.png

3.2、什么是进程控制

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

简化理解:反正进程控制就是要实现进程状态转换

3.3、如何实现进程控制?

image.png

为了防止类似状态转换后PCB内容来不及修改等事件的发生,操作系统用原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。这种不可被中断的操作即原子操作

用于进程控制的原语有:创建原语、撤销原语、阻塞原语、唤醒原语等。原语采用“关中断指令”和“开中断指令”实现

image.png

显然,关/开中断指令的权限非常大,必然是只允许在核心态下执行的特权指令【原语运行在核心态】

3.4、进程控制相关的原语

学习技巧:进程控制会导致进程状态的转换。无论哪个原语,要做的无非三类事情:

  1. 更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
    1. 所有的进程控制原语一定都会修改进程状态标志
    2. 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
    3. 某进程开始运行前必然要恢复期运行环境
  2. 将PCB插入合适的队列
  3. 分配/回收资源

进程的创建相关的原语

image.png

进程的终止相关的原语

image.png

进程的阻塞和唤醒相关的原语

一个处于阻塞的进程,不可能自我唤醒

image.png

进程的切换相关的原语

image.png

4、进程通信IPC

4.1、知识总览

image.png

4.2、进程通信

顾名思义,进程通信就是指进程之间的信息交换。进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立

image.png

为了保证安全,一个进程不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。如上面所示3个方法

4.3、通信方式1--共享存储

image.png

4.4、通信方式2--管道通信[消息缓冲通信]

image.png

  1. 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
  2. 各进程要互斥地访问管道。
  3. 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据 取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
  4. 如果没写满,就不允许读。如果没读空,就不允许写。
  5. 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

在消息通信中,接收方和发送方之间有明确的协议,双方都认可其中的消息格式。在大多数消息传递机制中都使用消息头,用于标识与消息有关的信息,包括发送进程的标识符、接收进程的标识符以及消息中传送信息的字节数等。消息头能够被系统中所有的进程所理解。

消息缓冲通信方式包括消息缓冲、发送原语和接收原语。每当发送进程欲发送消息时,便形成一个消息缓冲区(包括消息头和消息内容),然后用发送原语把消息发送出去。接收进程在接收消息之前在本进程的主存空间中设置一个接收区, 然后用接收原语接收消息。

4.5、通信方式2--消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的**“发送消息/接收消息”**两个原语进行数据交换。

image.png

5、线程threads概念和多线程模型

5.1、知识总览

image.png

5.2、线程的概念,为什么要引入线程?

形象的解释:

  • 我可以用QQ一边打字一边视频聊天
  • 电脑管家有很多功能,我可以一边杀毒,一边清理垃圾

有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了“线程”,来增加并发度。

引入线程后,线程成为了程序执行流的最小单位

image.png

可以把线程理解为“轻量级进程”,线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间 可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)。引入线程后,进程只作为除CPU之外的,系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。

5.3、引入线程机制后,有什么变化?

image.png

5.4、线程的属性

image.png

5.5、线程的状态变迁

如果一个系统支持线程的创建与线程的活动,那么,处理机调度的最小单位是线程而不是进程。一个进程可以创建一个线程, 那么它具有单一的控制路径,一个进程也可创建多个线程,那么它就具有多个控制路径。这时,线程是争夺CPU的单位。线程也有一个从创建到消亡的生命过程,在这一过程中它具有运行、等待、就绪或终止几个状态。

  1. 创建。建立-个新线程,新生的线程将处于新建状态。此时它已经有了相应的主存空间和其他资源,并已被初始化。
  2. 就绪。线程处于线程就绪队列中,等待被调度。此时它已经具备了运行的条件,一旦分到CPU时间,就可以立即去运行。百报5
  3. 运行。一个线程正占用CPU,执行它的程序。
  4. 等待。一个正在执行的线程 如果发生某些事件,如被挂起或需要执行费时的输人输出操作时,将让出CPU,暂时中止自己的执行,进入等待状态,等待另一个线程唤醒它。
  5. 终止。一个线程已经退出,但该信息还没被其他线程所收集(在UNIX术语中,父线程还没有做wait)。

线程与进程一样, 是一个动态的概念,也有一个从产生到消亡的生命周期,如下图所示。

image.png

解释:

image.png

线程在活动期间,其状态是不断变化的,这些变化是由系统运行的状况、同时存在的其他线程和线程本身的算法等因素共同决定的。在创建和使用线程时应注意利用线程的方法宏观地控制这个过程。

5.6、线程的实现方式和分类

image.png

1、用户级线程(User-Level Thread, ULT)

用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)

用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。用户级线程通常能快速地创建和管理。用户线程存在的缺点是:如果内核是甲线程的,那么仕何一个用户级线程执行了一个线程等待的系统调用,就会引起整个进程的阻塞,即使还有其他线程可 以在应用程序内运行。

在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。(用户级线程对用户不透明,对操作系统透明)可以这样理解,“用户级线程”就是“从用户视角看能看到的线程

2、内核级线程(Kernel-Level Thread, KLT, 又称“内核支持的线程”)

内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能 完成。可以这样理解,“内核级线程” 就是“从操作系统内核视角看能看到的线程”

3、组合

image.png

在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程.上( n>=m)

重点重点重点: 操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。

例如:左边这个模型中,该进程由两个内核级线程,三个用户级线程,在用户看来,这个进程中有三个线程。但即使该进程在一 个4核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行

5.7、多线程模型

在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了“多线程模型”问题。

多对一模型

image.png

多对一模型:多个用户及线程映射到-一个内核级线程。每个用户进程只对应一个内核级线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机_上并行运行

一对一模型

image.png

多对多模型

image.png

6、处理器调度的概念、层次

6.1、知识总览

image.png

6.2、调度基本概念

  • 场景1:优先级更高的进行先服务,先到先服务

  • 场景2:时间相同的排队,时间短的优先服务

当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。

在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行地处理各个进程。处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。

6.3、调度的三个层次

高级调度

image.png

由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。

高级调度(作业调度)。按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利。

高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。

中级调度

image.png

引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。

这么做的目的是为了提高内存利用率和系统吞吐量。暂时调到外存等待的进程状态为挂起状态。值得注意的是,PCB并不会- - 起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。

中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。

低级调度

image.png

低级调度(进程调度),其主要任务是按照某种方法和策略从就绪队列中选取-一个进程,将处理机分配给它。 进程调度是操作系统中最基本的一-种调度,在-般的操作系统中都必须配置进程调度。 进程调度的频率很高,一般几十毫秒一次。

三层调度的联系、对比

image.png

6.4、进程的挂起状态与七状态模型

暂时调到外存等待的进程状态为挂起状态( 挂起态,suspend )

挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态

五状态模型-->七状态模型

image.png

7、进程调度的时机、切换与过程、方式

7.1、知识总览

image.png

7.2、进程调度的时机

进程调度(低级调度),就是按照某种算法从就绪队列中动态的选择一个进程为其分配处理机。

image.png

7.2、临界区和内核程序临界区

image.png

7.3、进程的调度方式

有的系统中,只允许进程主动放弃处理机。有的系统中,进程可以主动放弃处理机,当有更紧急的任务需要处理【或者说有优先级更高的进程转变为就绪状态】时, 也会强行剥夺处理机(被动放弃),根据这个引入进程的调度方式

image.png

7.4、进程的切换与过程

“狭义的进程调度”与“进程切换”的区别:

狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后-种情况就需要进程切换)

进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。

广义的进程调度包含了选择一个进程和进程切换两个步骤。

进程切换的过程主要完成了:

  1. 对原来运行进程各种数据的保存
  2. 对新的进程各种数据的恢复(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息--般保存在进程控制块)

[注意:进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低, 使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。]

8、调度算法的评价指标

8.1、知识总览

image.png

8.2、CPU利用率

由于早期的CPU造价极其昂贵,因此人们会希望让CPU尽可能多地工作,CPU利用率:指CPU“忙碌”的时间占总时间的比例。

image.png

8.3、系统吞吐量

对于计算机来说,希望能用尽可能少的时间处理完尽可能多的作业

系统吞吐量:单位时间内完成作业的数量

系统吞吐量=总共完成了多少道作业/总共花了多少时间

Eg:某计算机系统处理完10道作业,共花费100秒,则系统吞吐量为10/100= 0.1道/秒

8.4、周转时间

对于计算机的用户来说,他很关心自己的作业从提交到完成花了多少时间。 周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。 它包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等 待进程调度( 低级调度)的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间。后三项在一个作业的整个处理过程中,可能发生多次。

image.png

  • 对于周转时间相同的两个作业,实际运行时间长的作业在相同时间内被服务的时间更多,带权周转时间更小,用户满意度更高。
  • 对于实际运行时间相同的两个作业,周转时间短的带权周转时间更小,用户满意度更高。

8.5、等待时间

image.png

8.6、响应时间

对于计算机用户来说,会希望自己的提交的请求(比如通过键盘输入了一个调试命令)尽早地开始被系统服务、回应。 响应时间,指从用户提交请求到首次产生响应所用的时间。