进程与线程

OS中进程是作为资源分配独立运行的基本单位出现的。OS的1四大特征(并发、共享、虚拟、异步)也都是基于线程而形成的。所以,在OS中,进程是一个极其重要的概念

到80年代中期,又出现了比进程更小的基本单位——线程。用它来提高程序并发执行程度,以进一步改善系统的服务质量。现代OS无一例外的引入了线程,所以,线程也是一个非常重要的概念。

2.1 进程描述

解决什么是进程,如何表示进程的问题

进程控制块PCB
  • 为了方便控制和管理参与并发执行每个程序的独立运行,在操作系统中为之配置了一种专门的数据结构,称为进程控制模块PCB(Process Control Block)。系统充分利用PCB(动态的)来描述进程的基本信息与活动过程,进而控制和管理进程。

    此时就产生了一个行动概念——进程实体,又称进程映像。程序段、相关数据段PCB三部分组成了进程实体。

PCB在进程切换中的作用
  • 系统就是根据PCB来感知进程存在的,PCB在进程切换中起着非常重要的作用,操作系统可以通过对PCB的修改来达到对进程的控制。

进程的定义
  • 对于进程的定义,从不同的角度可以有不同的定义,其中较典型的定义有三个:

    • 进程是程序的一次执行

    • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动

    • 进程是具有独立功能的程序在一个数据集合上运动的过程,它是系统进行资源分配和调度的一个独立单位

    在引入了进程实体概念后,可以将进程定义为:进程是进程实体的运动过程,是系统进行资源分配和调度的一个独立单位

引发的问题(总体来说还是利大于弊)
  • 引入进程后使得作业的并发执行得以实现,但同时也带来了一些问题(与单道批处理系统对比):

    • 增加了空间开销

      需要为进程创建PCB

    • 增加了时间开销

      管理、协调、跟踪进程的执行需要时间

      创建、更新、回收PCB需要时间

      进程切换、保护、恢复CPU现场需要时间

      ……

    • 增加了控制难度

      协调多个进程对资源的竞争与共享增加了控制难度

      对可能由进程引发的异常经行经行处理增加了控制难度

2.2 进程的状态(线程的状态与进程基本一致)
五种状态
  • 根据进程所拥有资源的不同,可以将进程所处的状态划分为五种

    • 就绪:进程已经获取到了处理器之外进行所需的所有资源的状态

    • 执行:进程已经获取到了包括处理器在内的执行所需的所有资源的状态

    • 阻塞:进程在执行过程中因等待某事件的发生而无法继续执行的状态

    就绪状态、执行状态、阻塞状态,被称为进程的基本状态

    • 创建:进程缺少完整PCB与运行所需资源的状态

    申请一个空白PCB

    • 终止:进程释放所拥有资源的过程的状态

PCB的组织方式

粗略理解的话,无论是就绪队列,还是各种阻塞队列,其队列元素都是PCB

  • 不同应用可以产生很多异类进程,一个应用可以产生很多同类进程。无论是何类进程,其会按照它们的状态将它们组织到一起,常见的方式有两种:

    • 链表

    • 索引

状态转换(需画图体会)

创建——>就绪

就绪—获得CPU—>执行—释放CPU—>就绪

执行—释放PCB—>终止

执行—等待某事件—>阻塞

阻塞—事件已发生—>就绪

  • 状态转换的特点:

    • 创建好的进程直接到达就绪态

    • 就绪态进程无法直接转换为阻塞态

    • 阻塞态只能是进程执行过程中由于等待某事件的发生而引发的

    • 进程只能是在执行态到终止态

挂起与激活
  • 挂起操作通过挂起原语suspend可以使进程挂起,由活动状态变为禁止状态。

    有了挂起后,状态转换发生一点变化:

    • 新创建的进程可以直接到静态就绪态

    • 执行态进程被挂起后进入静止就绪态

    • 静止就绪态不能直接进入执行态,需要激活变成活动就绪态才能执行

    • 静止阻塞态进程在等待事件发生后会到静止就绪态,而不会直接到活动就绪态,需要激活

    • 为什么要引入挂起操作:

      • 终端用户的需要

      • 父进程的需要

      • 符合调节的需要

    • 挂起操作典型应用:

      • 交换技术

      • 虚拟存储技术

2.3 进程控制

进程按揭是进程管理中最基本的功能。如:进程的创建与终止、进程状态转换等。进程控制一般是由OS内核中的原语实现的。

进程的创建
  • 父子进程

    在OS中,进程一般由OS内核创建,但是也允许使用一个用户进程区创建出更多的子孙进程。这种创建与被创建关系,很自然可以形成树型层次结构(Unix、Linux)。并不是所有的OS中,这种创建与被创建关系都一定形成树型层次结构。如:Windows,其中所有的进程具有同等地位,但依然可以控制子进程。

    对于具有层次结构的父子进程,在PCB中设置了专门的家族关系表项,以表明自己的父进程及所有的子进程。

    • 子进程可以继承父进程的所有资源,且父进程不能拒绝子进程的继承权。当子进程终止时,会将从父进程获取到的资源全部归还给父进程

    • 父进程可以管理子进程的生命周期。例如:父进程可以终止子进程,父进程可以挂起和激活子进程,父进程在终止时会将其所有的子进程全部终止

  • 进程创建事件

    一个进程可以由系统内核创建,也可以由另一个进程创建。发生进程创建的典型事件有三类:

    • 用户登录:在分时系统中,用户登录后,系统内核会为该用户创建一个进程。

    • 作业调度:在多道批处理系统中,当作业调度程序调度到某作业后,会将其装入内存,并由系统内核为该作业创建一个进程

    • 请求处理:当某进程在运行过程中提出某种请求后,系统内核或主进程将会创建一个相应的子进程来处理该请求,使主进程与子进程可以并发执行

  • 进程创建过程

    无论是OS内核创建进程,还是用户创建子进程,都是调用了进程创建原语完成的。进程创建原语的创建过程如下:

    1. 生成进程标识符PID,这是一个数字标识符,哦那个与区分系统中的所有进程,在系统中具有唯一性。

    2. 申请空白PCB

    3. 为进程分配其运行所需的一切资源(CPU除外),这些资源要么从OS直接获得,要么从父进程获得

    4. 初始化PCB。这些初始化信息包括直接的PID及父进程的PID,当前处理器的状态数据,进程的状态数据。

    5. 将进程写入就绪队列或静止就绪队列

进程的终止
  • 进程终止事件

    引起进程终止的事件典型的有三类:

    • 正常结束

    • 异常结束

      常见的异常事件有:

      • 访问越界

      • 非法指令

      • 权限异常

      • 运行超时

      • 等待超时

      • 运算异常

      • IO异常

    • 外界干预

  • 进程终止过程

    系统中发生进程终止事件,OS就会调用进程终止原语去终止进程,进程终止原语过程如下:

    1. 根据被终止进程的PID,找出其PCB

  1. 从PCB中读取其状态,若该进程处于执行态,则立即终止其执行,并置调度标志为真,用于标志该进程可被重新调度

  2. 从PCB中读取其子进程PID,若该进程还有子进程,则要将所有子进程全部终止

  3. 从PCB中读取其所拥有的全部资源,并全部释放,归还给其父进程或系统

    主要包含两步:

    • 将其PCB赋值为null

    • 在其父进程或系统的资源数量上增加相应释放的数据

  4. 将该进程的PCB从PCB队列或链表中移除

  5. 释放该PCB空间

进程的阻塞与唤醒
  • 引发进程阻塞的事件

    由于在执行的进程突然发生执行条件的缺失,进而暂停执行,等待1条件满足;而阻塞进程被唤醒则是发生了某些事件,从而具备了执行条件,达到了执行时机。典型引发阻塞的事件有以下四类:

    • 等待资源

      无论是临界资源还是共享资源,只要其需要的数量不够就会阻塞。例如:打印机(临界资源)、缓存(共享资源)

    • 等待IO完成

      Redis的DB持久化的save方式持久化过程

      C语言代码中的scanf,只有输入了,才能继续执行

    • 等待数据到达

      分布式Barrier队列

    • 等待任务到达

      例如:MQ中的消息发送进程与消息接收进程

  • 进程阻塞过程

    阻塞是进程自身的一种主动行为。当系统中发生阻塞事件后,进程自己会调用阻塞原语将自己阻塞。进程阻塞原语的阻塞过程如下

    1. 立即暂停CPU的执行,保留当前CPU的现场

    2. 将PCB中的状态由执行态修改为阻塞态

    3. 将PCB写入到相应阻塞原因的阻塞队列

    4. 启动调度程序进行重新调度,即将CPU分配给另一就绪进程

    5. 按照新进程的PCB设置CPU新的环境

  • 进程唤醒过程

    当被阻塞进程所期待的事件发生时,由 ”相关进程(促使执行条件满足的进程)“ 调用唤醒原语,将阻塞进程唤醒(唤醒是进程的被动行为)。进程唤醒原语过程如下:

    1. 将该进程的PCB从阻塞队列移出

    2. 修改PCB中的状态,由阻塞态变为就绪态

    3. 将PCB插入到就绪队列

2.4 进程同步
同步与异步

进程同步机制的主要任务,是对多个具有相互制约关系的进程再执行次序上进行协调,使并发执行的进程间能按照一定的规律或时序共享系统资源,实现相互合作,从而使程序的执行具有可再现性。

异步:不确定的、不可预知的

同步:确定的、可预知的、可在现的

进程间的相互制约关系有两种:互斥制约合作制约。但无论哪种制约关系,在多道程序环境下,进程何时可以获得处理器,运行的速度如何,并不是进程自身可以控制的。此为进程的异步性。

  • 互斥制约:当多个进程都对同一个临界资源进行访问时,它们之间就具有互斥制约关系

    互斥制约关系中一定会出现临界资源

    临界资源:诸进程间需要采取互斥方式实现对某种资源的共享,那么这种资源就称为临界资源。例如:打印机、磁带机等

  • 合作制约:当某项任务需要多个进程同时协作完成时,它们之间就具有合作制约关系

异步带来的问题

多道程序环境下异步是不可避免的,但没有完善的同步机制,会产生很多无法预料的结果

同步机制准则

同步机制的制定需要遵循四条准则:

  • 空闲让进:若临界资源处于空闲状态,则应允许一个进程进入临界区访问临界资源

  • 忙则等待:若已有进程进入临界区访问临界资源,则其他需要访问临界资源的进程必须等待,以实现对临界资源的互斥访问

  • 有限等待:对临界找资源进行等待的进程,应在有限时间内能进入临界区以免陷入死等状态

  • 让全等待:若进程由于无法进入临界区而发生等待,则应立即释放处理器,以免陷入忙等状态

信号量机制
  • 整型信号量

  • Hystrix的信号量隔离

  • 记录型信号量

  • AND型信号量

  • 信号量集

管程机制

虽然信号量机制是一种方便、有效的进程同步机制,但每个访问临界资源的进程都必须自备同步PV操作。这不仅使得PV操作大量分散在进程中,而且如果使用不当(没有成对出现)就会导致系统死锁。管程机制解决了这些问题。

  • 管程定义

    管程是一种面向对象思想的体现。其由一组共享数据结构及随这些数据的一组操作构成。以下是不同的学者给出的两种不同的管理定义:

    • 代表共享资源的数据结构以及 ”由对该共享数据结构实施操作的一组过程所组成“ 的资源管理程序共同构成的一个操作系统的资源管理模块,我们称之为管程

    • 一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据

  • 管程结构

    管程由四部分组成:

    • 管程名称:不同共享资源和不同的操作可以构成不同管程,不同管程对象具有不同名称

    • 共享数据结构:这些共享数据结构是局部与管程之中的,用于描述共享资源。

    • 一组操作:用于操作共享数据结构,基础访问共享资源(共享数据结构)只能通过这组管程内的操作完成

    • 初始化代码:对局部于管程的共享数据进行初始化的代码,在创建管程对象时执行一次

  • 管程同步

    • 管程由请求和释放共享资源的进程调用。通过管程机制可以实现进程间对共享资源(共享数据结构)的同步访问。

      • 当某进程通过管程访问临界资源时,管程变调用条件X的wait原语cwait(X),条件X不满足,该进程阻塞,并将其排在条件X的阻塞队列上

      • 当进程通过管程访问完毕临界资源时,其同时会改变条件X,即调用条件X的signal原语csignal(X),从条件X阻塞队列中唤醒一个进程。

      也就是说,在管程中还需要用于实现进程同步访问的条件变量

2.5 分布式同步
  • 什么是分布式同步

    分布式同步,也称为分布式协调,时分布式系统中不可缺少的环节,是将不同的分布式组件有机结合起来的关键。对于一个在多台机器上运行的应用而言,通常需要一个协调者来控制整个系统的运行流程,例如执行的先后顺序,或执行与不执行等,这种控制机制就称为分布式同步。

2.6 进程通信

进程通信是指进程间的信息交互,根据通信双方通信的方式可以分为四大类:

  • 共享存储器通信

  • 管道通信

  • 消息传递通信

  • C/S通信

共享存储器通信

仙湖通信的进程共享数据结构或存储区,进程间通过这些空间进行通信。据此,由科分为两种:

  • 共享数据结构的通信

    该方式通常是同一主机中不同进程间的通信方式。例如生产者-消费者问题中的缓冲池就属于这种方式。操作系统仅提供用于存储共享数据结构的存储空间,对共享数据结构的创建与同步处理,则是由程序员自己负责的。这种方式斤适合少量同构数据的传递。

  • 共享存储器的通信

    为了传输量的,异构数据,可以划分出一块所有进程都可以访问的共享存储区域,通过该区域进行进程间的数据交换。

管道通信

所谓管道,就是用于连接一个读进程和一个写进程,实现两个进程间通信的共享文件,又称pipe文件。

管道通信机制提供了三方面协调能力:

  • 互斥:当一个进程正在对pipe执行 读/写 操作时,另一个进程必须等待

  • 同步:进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,再其它进程从管道中移走数据之前,写进程将一直阻塞

  • 双方:只有确定了通信的对方存在时才能进行通信

管道通信属于半双工通信

  • 单工通信:只能一方输出(类似广播,只能听其输出)

  • 全双工通信:双方可以同时收和发(微信打字聊天)

  • 半双工通信:双方可以收和发,一方收或发,另一方需要暂停

消息传递机制

消息传递机制中,进程无需借助任何共享数据结构或共享存储区域,而是以格式化的信息为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程进行消息传递

这种通信机制在生产中使用很广:

  • 异构系统中一般使用JSON格式的消息通信

  • 同构系统中一般会使用更加符合自身业务需求的消息格式通信。

C/S通信

C/S通信机制更适合网络环境下进程间的通信,其实现方式由两种:

  • Sockst通信

    Socket通信,即套接字通信。一个套接字通信就是一个通信标识类型的数据结构,包含了通信目的的地址、端口号、通信协议等,还包括真正要进行网络传输的数据。网络通信技术BIO、NIO、AIO的底层就是Socket。

  • RPC通信

    RPC(Remote Procedure Call),远程过程调用,是一种通信协议,或者着说时一种通信模型。RPC通信会使一台主机上的进程调用另一台主机上的进程,使用起来就像调用本地进程一样,无需额外的操作。

2.7 线程基础
线程出现的历史需求

任何技术的出现都不是凭空创造出来的,都是有其历史需求的,线程就是因为SMP(对称多处理机)与计算机体系结构的发展,使得进程生命周期过程中系统开销显得越来越大,形成了大量的资源浪费。

  • SMP

    随着VLSI(超大规模集成电路)技术和计算机体系结构的发展,出现了SMP(对称多处理机)计算机系统。在SMP系统中,对于传统进程(单线进程)来说,一个进程只能运行在一个处理器上,形成大量处理器浪费。

  • 系统开销

    进程生命周期中包含三个很重要的过程:创建、销毁、切换,而这三个过程的系统开销非常大,它们大量的执行会大大降低系统性能与吞吐量。

    • 进程创建:系统在创建一个进程时,必须为其分配器所需的除处理器外的所有资源(内存、IO设备等),并为之建立相应的PCB。

    • 进程销毁:系统在销毁一个进程时,会先对其所占有的资源进行回收,然后再销毁其对应的PCB。

    • 进程切换:进程再进行上下文切换时,需保留当前进程的CPU环境,设置新进程的CUP环境,而这个过程需要消耗大量的处理器时间

引入线程的目的

如果说,在OS中引入进程的目的是为了多个程序并发执行,以提高资源利用率和系统吞吐量,那么,在OS中再引入线程,则是为了减少程序再并发执行时所付出的时空开销,使OS具有更好的并发性。

简而言之就是:

进程解决并发问题

线程优化的并发问题

线程是什么

线程也称为进程元。对于传统的进程,其相当于只有一个线程任务。

对于线程,并没有一个十分明确的概念定义,可以通过与传统进程在以下几点的对比来理解:

  • 拥有资源

    进程仍为资源分配的基本单位,线程除了拥有一些为保证独立运行所必须的资源外,会与其它线程共享(所属进程的)所有资源,同一进程的线程就会共享内存空间,线程间通信的实现就简单了很多

  • 独立性

    • 传统OS中:进程的独立性强,拥有的独立的地址空间和资源。

    • 引入线程后:进程的的独立性较之前进程要弱很多,同一个进程中的线程共享该进程的所有资源,这些共享的资源使它们失去了独立性

  • 调度单位

    • 传统OS中:进程是一个独立的执行单位,其是一个独立调度和分派的基本单位。进程的切换,系统的开销很大。

    • 引入线程后:线程作为调度和分派的基本单位,线程的切换,仅需要保存和设置少量寄存器数据,切换代价远低于进程切换

    进程:重量级

    线程:轻量级

  • 并发性

    • 传统OS中:可以并发执行的只能是进程,可以是同一应用的多个进程,也可以是不同应用的进程

    • 引入线程后:并发执行的进程是通过并发执行的线程实现的。这个并发运行,不仅可以是不同进程中的线程,也可以是相同进程中的线程。对于同一个进程中的线程,可以是不同任务的线程,也可是相同任务的线程

    简单理解:引入线程并发度提高,并发单位更小

  • 系统开销

    • 传统OS中:进程的创建、销毁、切换,系统开销非常大,因为涉及到大量的资源分配、回收

    • 引入线程后:线程的创建、销毁、切换,较之比进程要小很多,涉及到的资源分配、回收很少,大部分资源是所有线程共享的,无需进行任何操作

  • SMP支持

    • 传统OS中:无论有多少处理器,一个进程只能运行在一个处理器上

    • 引入线程后:一个进程可以同时运行在多个处理器上并行执行,提高了运行速度

  • 状态

    传统OS中进程的状态概述,对于线程也是成立的。线程的状态也是:执行态、就绪态、阻塞态,也可以挂起。

  • 系统感知标识

    系统对于进程的感知标识就是进程控制块PCB

    系统对于线程的感知标识是线程控制块TCB。在TCB中通常包含:

    • 线程的唯一标识符

    • 一组寄存器,用于存放程序计数器和堆栈指针

    • 线程状态,是就绪态、阻塞态等

    • 优先级

    • 线程专有存储区,用于保存线程切换时的现场数据和与当前线程相关的统计数据等

    • 堆栈,用于保存线程的局部变量等

2.8 线程实现

线程在现代绝大多数OS实现了,但各系统实现方式有所不同,主要有三种:

  • 内核支持线程实现

  • 用户级线程实现

  • 两种线程相结合实现(大多数系统属于这一类)

  • 31
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值