进程管理

并发与并行

并发:一段时间间隔多道程序运行
并行:某一时刻多个程序运行

共享

共享:指的是系统中资源可供内存中多个并发执行的进程共同使用。
有两种资源共享的方式:

  1. 互斥共享方式:规定一段时间内只能一个进程访问资源,其它进程需要等待。这个资源被称作临界资源。大多数物理设备、软件中使用的栈、变量等都属于临界资源。
  2. 同时访问方式:允许资源在一段时间内被多个进程“同时”访问,这里的“同时”通常是宏观上的。

    虚拟

    虚拟:指的是把一个物理上的实体变为若干个逻辑上的对应物。
    用于实现虚拟的技术,称作虚拟技术。操作系统利用多种虚拟技术实现了虚拟处理器、虚拟内存、虚拟外部设备等。
    虚拟处理器技术:利用多道程序设计技术,让多个程序可以分时使用一个处理器。即把一个物理上的CPU虚拟化成了多个逻辑上的CPU(虚拟处理器)。
    虚拟存储器技术:把一个物理存储器变为虚拟存储器,在逻辑上扩充存储器的容量。我们把用户感觉到的存储器称作虚拟存储器。
    虚拟I/O:把一台物理I/O虚拟化为多个逻辑上的I/O设备。
    操作系统的虚拟技术可归纳为:时分复用技术:如处理器的分时共享;空分复用技术:如虚拟存储器。

    进程

    进程实体:由程序段、相关数据段、PCB三部分组成。
    进程的定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
    进程的五种状态:创建态、就绪态、运行态、阻塞态、结束态。
  • 运行态:单处理机下,每个时刻最多一个进程处于运行态;
  • 就绪态:进程获得了除处理器资源外的一切资源,一旦获得处理器资源就能进入运行态;
  • 阻塞态:进程因为等待某一事件而暂停运行。如等待某资源可用/等待输入输出。即使处理器空间也不会运行。
  • 创建态:进程正在被创建,还未到就绪态;
  • 结束态:进程可能正常结束或者其他原因中断退出。

操作系统 - 图1

进程间通信

高级通信方法主要有三种:

  • 共享存储
    在通信的进程之间存在一块可直接访问的共享空间。通过对这个共享空间的读/写操作来实现进程间的通信。
    操作系统 - 图2
  • 消息传递
    进程间的数据交换是以格式化的信息(Message)为单位的。若进程之间不存在共享空间,必须利用操作系统提供的消息传递方法来实现进程通信。即进程间通过发送消息、接收消息的原语来进行数据交换。
    有两种消息传递的方式:
    • 直接通信方式:发送进程把消息发送给接收进程,并将其挂载到接收进程的消息缓冲队列中,接受进程通过消息缓冲队列取得消息。
      操作系统 - 图3
    • 间接通信方式:发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称作信箱
  • 管道通信
    所谓的管道,指的是连接一个读进程和写进程的一个共享文件(又称pipe文件),以实现两者之间的通信。半双工通信
    操作系统 - 图4
    管道通信可以看作是共享存储的优化和发展。在共享存储中,同一时刻只允许一种操作,管道是半双工通信,要求只能一边写入,一边读出,只要管道中有数据就能进行读取,不会因为其它进程进行写操作而堵塞读操作,因为管道要求写进程需要把缓冲区写满,才能让读进程读取。

    单工通信、半双工通信和全双工通信之间有什么区别

    简单的说:
    单工通信就是只能从A到B,如[广播]
    半双工通信是A到B,B到A都行,但不能同时进行。如[对讲机]
    全双工通信是A到B,B到A都行,可以同同时进行。如[电话]

    线程的概念

    是基本的CPU执行单元,也是程序执行流的最小单元。线程是进程中的一个实体,是系统独立调度和分派的基本单位。线程本身不拥有系统资源,而是与进程中其它线程共享进程所拥有的资源。
    线程也有就绪、阻塞、运行三种基本状态。
    进程是拥有资源的基本单位
    引入线程的目的:为了减小程序在并发执行所付出的时空开销。
    可以认为线程是“轻量级的进程”

    调度的概念

    为什么需要有调度:因为进程数量通常远大于处理器的个数,这时候就会发生进程间争用处理器资源的现象。我们需要一种算法来实现对处理器资源的合理分配。

    进程调度方式

  1. 非剥夺调度方式
  2. 剥夺调度方式

    典型的调度算法

  3. 先来先服务调度算法:每次从就绪队列中选择最先进入该队列的进程,将处理器分配给它。属于不可剥夺算法。特点:算法简单,但效率低;对长作业有利,对短作业不利;有利于CPU繁忙型作业,不利于I/O繁忙型作业。

  4. 短作业优先调度算法:从后备队列中选择一个运行时间最短的作业。对长时间作业不利,可能会造成“饥饿”现象(区别于死锁)
  5. 优先级调度算法:每次从后背队列中选取优先级最高的作业。
    • 非剥夺式优先级调度算法
    • 剥夺式优先级调度算法
    • 静态优先级调度算法
    • 动态优先级调度算法
  6. 高响应比优先调度算法:选取响应比最高的作业。先来先服务+短作业:克服了饥饿状态兼顾了长作业。
  7. 时间片轮转调度算法:主要适用于分时系统。对于时间片的大小应该适当设置。
  8. 多级反馈队列调度算法:以上的综合

    死锁

    死锁的定义:多个进程因为竞争资源而陷入了相互等待的情况。若没有外力作用,这些进程无法向前推进。
    为什么会产生死锁
  • 系统资源的竞争:系统中有不可剥夺的资源,通常不够满足所有进程的需要,使得进程在争夺资源的过程中陷入了相互等待。
  • 进程推进顺序非法:如信号量使用不当造成两个进程相互等待对方发送消息。

产生死锁的必要条件
四个条件只要任一不成立,死锁就不会发生。

  1. 互斥条件:某段时间进程独占资源
  2. 不剥夺条件:资源在被使用时无法被强行剥夺
  3. 请求并保持条件:进程保持着资源同时请求另一资源,对保持的资源不释放
  4. 循环等待条件:进程间循环等待资源

死锁的处理策略

  • 死锁预防:破环四个必要条件之一。
  • 死锁避免:在资源动态分配的过程中,使用某种方法防止系统进入不安全的状态来避免死锁。
    • 银行家算法
  • 死锁检测与解除
    • 死锁检测:系统死锁可以利用资源分配图来进行查看。通过简化资源分配图可以检测是否为死锁状态。死锁的状态图是完全不能简化的,这称作死锁定理。
    • 死锁解除:1)资源剥夺法;2)撤销进程法;3)进程回退法

      内存管理

      程序代码需要放入内存才能运行。程序放入内存中,内存如何合理分配空间就是内存管理的概念。
      内存管理需要考虑的功能:
  1. 内存的分配、回收;
  2. 地址转换;
  3. 内存扩充:
  4. 存储保护:

首先考虑问题,如何将程序以进程的形式在内存中运行呢?有以下几个步骤:

  1. 编译
  2. 链接
  3. 装入

image.png