进程管理
Posted li-code
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程管理相关的知识,希望对你有一定的参考价值。
进程管理
进程的概念
- 程序:是静态的,就是存放在磁盘里的可执行文件,就是一系列的指令集合
- 进程(Process):是动态的,是程序的一次执行过程
进程的组成
- PCB:进程控制块,是进程存在的唯一标志
- 程序段:程序的代码(指令序列)
- 数据段:运行过程中产生的各种数据(如:程序中定义的变量)
- PCB是给操作系统用的
- 数据段、程序段是给进程自己用的
- 一个进程实体(进程映像)由PCB、程序段、数据段组成
- 进程是动态的,进程实体(进程映像)是静态的
- 进程实体反映了进程的在某一时刻的状态
进程是实体的运行过程,是系统进行资源分配和调度的一个独立单位
进程的特征
- 动态性:进程是程序的一次执行过程,是动态的产生、变化和消亡的过程
- 并发行:内存中有多个进程实体,各进程可并发执行
- 独立性:进程是能够独立运行,独立获得资源,独立接收调度的基本单位
- 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题
- 结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成
- 动态性是进程最基本的特性
进程的状态
创建态
- 进程正在被创建时,它的状态是“创建态”,在这个阶段操作系统会为进程分配资源、初始化PCB
就绪态
- 当进程创建完成后,便进入“就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲的CPU,就暂时不能运行
运行态
- 如果一个进程此时正在CPU上运行,那么这个进程处于“运行态”。CPU会执行该进程对应的程序(执行指令序列)
阻塞态
- 在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)
- 在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”
终止态
- 一个进程可以执行exit系统调用,请求操作系统终止该进程
- 此时该进程会进入“终止态”,操作系统会让该进程下CPU,并回收内存空间等资源,最终还要回收该进程的PCB
进程状态的转化
- 三种基本状态
- 就绪态
- 运行态
- 阻塞态
- 单CPU情况下,同一时刻只会有一个进程处于运行态,多核CPU情况下,可能有多个进程处于运行态
- 进程PCB中, 会有一个变量state来表示进程的当前状态。
为了对同一个状态下各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来
进程的组织
链式方式
索引方式
进程控制
- 进程控制的主要功能是对系统中所有进程实施有效的管理,它具备创建进程,撤销已有进程,实现进程状态转换等功能
- 原语:是一种特殊的程序,它的执行具有原子性。程序运行必须一气呵成,不可中断。
- 原子性:是由“关中断指令” 和 “开中断指令” 两个特权指令实现的
进程控制相关的原语
- CPU中的一些寄存器
- PSW:程序状态字寄存器
- PC:程序计数器,存放下一条指令的地址
- IR:指令寄存器,存放当前正在执行的指令
- 通用寄存器:其他一些信息
进程通信
- 进程间的信息交换
- 进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立
共享存储
- 通过一个共享空间实现
- 两个进程对共享空间的访问必须是互斥的
- 基于数据结构的共享:比如共享空间里面只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。
- 基于存储区的共享:在内存中画出一块共享存储区,数据的形式,存放位置都是由进程控制的。速度更快,是一种高级通信方式。
管道通信
- 管道:是指用于连接读写进程的一个共享文件,又名pipe。其实就是在内存中开辟一个大小固定的缓存区。
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
- 各进程要互斥地访问管道
- 数据以字符流的的形式写入管道 ,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走,管道没有写满时,不能进行读进程。当读进程将数据全部取走后,管道变空,此时读进程read()系统调用将被阻塞,管道没有读完时,不能进行写进程
- 数据一旦被读出,就从管道中被抛弃,意味着读进程最多只能有一个
消息传递
- 进程间的数据交换以格式化的消息为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换
- 消息头+消息体
- 直接通信方式:消息直接挂到接收进程的消息缓冲队列上
- 间接通信方式:消息要发送到中间实体(信箱)
线程
- 对比:
- 当切换进程时,需要保存/恢复进程运行环境,还需要切换内存地址空间(更换快表、更新缓存)
- 同一个进程内的各个线程并发,不需要切换进程运行环境和内存地址空间
- 从属同一进程的各个线程共享进程拥有的资源
- 进程是资源分配的基本单位
- 线程是系统调度的基本单位
- 同一进程的各线程共享进程拥有的资源
线程的实现方式
- 用户级线程:应用程序
- 用户级线程由应用程序 通过线程库实现,所有的线程管理工作都有应用程序负责
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
- 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高
- 内核级线程:操作系统
- 内核级线程的管理工作由操作系统内核完成
- 线程调度、切换等工作都由内核负责,内核级线程的切换必然需要在核心态下才曾完成
- 优点:并发能力强,多线程可在多核处理机上并行执行
- 缺点:一个用户进程往往会占用多个内核级线程,成本高,开销大
多线程模型
- 一对一模型:一个用户级线程映射到一个内核级线程。
- 优点:并发能力强
- 缺点:成本高,开销大
- 多对一模型:多个用户级线程映射到一个内核级线程。
- 优点:开销小,效率高
- 缺点:并发度不高,不可在多核处理机上并发运行
- 多对多模型:n用户级线程映射到m个内核级线程(n>=m)
处理机状态
- 调度:当有一堆任务需要处理,但资源优先,因此需要一种顺序,依次执行任务
- 调度的三个层次
- 高级调度(作业调度):由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。
- 按一定的原则从外存上将处于后备队列的作业中挑选一个作业,给他们分配内存等必要资源,并建立相应的进程,以使它们获得竞争处理机的权利
- 中级调度(内存调度):引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍微有空闲时,再重新调入内存。
- 作用:提高内存的利用率和系统吞吐量
- 暂时调到外存等待的进程称为挂起状态,PCB并不会一起调到外存,而会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息。
- 中级调度(内存调度):就是要决定将那个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率比高级调度更高
- 低级调度(进程调度):主要任务是按照某种方法和策略从就绪队列中选择一个进程,将处理机分配给它
- 对比
挂起状态可以细分为:就绪挂起,阻塞挂起
进程调度的时机
- 主动放弃
- 进程正常终止
- 运行过程中发生异常而终止
- 进程主动请求阻塞(等待I/O)
- 被动放弃
- 分配进程的时间片用完
- 有更紧急的事需要处理(I/O中断)
- 有更高优先级的进程进入就绪队列
- 不能进行进程调度的三个时机
- 在处理中断的过程中
- 进程在操作系统内核程序临界区中
- 在原子操作过程中
- 内核程序临界区:一般是用来访问某种内核数据结构的
进程调度的方式
- 非剥夺调度方式
- 剥夺式调度方式
进程的切换与过程
- 进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程
- 进程切换的过程完成的功能:
- 对原来运行进程各种数据的保存
- 对新的进程各种数据的恢复
调度算法的评价
- CPU利用率:指CPU“忙碌”的时间占总时间的比例
- 系统吞吐量:单位时间内完成作业的数量,(总共完成了多少道作业/总共花了多少时间)
- 周转时间:是指从作业被提交给系统开始,到作业完成为止的这段时间间隔
- 平均周转时间
- 带权周转时间:作业的周转时间 / 作业实际运行的时间
- 平均带权周转时间
- 等待时间:指进程/作业处于等待处理机状态时间之和
- 响应时间:指用户提交请求到首次响应的时间
调度算法
- 先来先服务
- 算法思想:按照公平原则
- 算法规则:按照进程或作业到达的先后顺序进行调度
- 用于作业调度和进程调度
- 非抢占式
- 优点:公平、算法实现简单
- 缺点:对长作业有利,对短作业不利
- 不会导致饥饿
- 短作业优先
- 算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周转时间
- 算法规则:最短的作业/进程优先被服务
- 用于作业调度/进程调度
- 有抢占式和非抢占式
- 优点:“最短”的平均等待时间、平均周转时间
- 缺点:对短作业有利,对长作业不利
- 会导致饥饿
- 高响应比优先
- 算法思想:综合考虑作业/进程的等待时间和要求服务的时间
- 算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务
- 响应比=(等待时间+要求服务时间)/ 要求服务时间
- 即可用于作业调度也可以用于进程调度
- 非抢占式
- 优点:
- 缺点:
- 不会导致饥饿
- 时间片轮转调度算法
- 算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
- 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片
- 用于进程调度
- 抢占式
- 优点:公平,响应快,适合分时操作系统
- 缺点:高频率的进程切换,会有一定的开销,不区分任务的紧急程度
- 不会导致饥饿
- 优先级调度算法
- 算法思想:根据任务的紧急程度来决定处理顺序
- 算法规则:每个进程/作业都有自己的优先级,调度时选择优先级最高的进行调度
- 用于作业调度/进程调度
- 抢占式和非抢占式
- 优点:用优先级区分紧急程度和重要程度
- 会导致饥饿
- 根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种
- 静态优先级:创建进程时,之后一直不变
- 静态优先级:创建时有一个初始值,之后会根据情况动态地调整优先级
- 多级反馈队列调度算法
- 算法思想
- 算法规则
- 用于进程调度
- 抢占式
- 优点:进程相对公平,每个进程都可以很快的得到响应
- 会导致饥饿
进程同步
- 进程同步:直接制约关系,并发行带来了异步性,有时需要通过进程同步解决这种异步问题,有的进程之间需要相互配合地完成工作,各进程工作的推进需要遵循一定先后顺序。
- 进程互斥:间接制约关系,对临界资源的访问,需要互斥的进行
- 临界资源:一个时间段内只允许一个进程使用的资源
- 临界资源互斥访问的四个步骤
- 进入区:负责检查是否可进入临界区,设置正在访问临界资源的标志
- 临界区:访问临界资源的那段代码
- 退出区:负责解除正在访问临界资源的标志
- 剩余区:剩余代码
- 遵循的原则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
进程互斥的软件实现方法
单标志法
- 两个进程在访问完临界区后会把使用临界区的权限交给另一进程,每个进程进入临界区的权限只能被一个进程赋予
- 该算法可以实现:同一时刻最多只允许一个进程访问临界区
- 违反了空闲让进原则
双标志先检查
- 算法思想:设置一个布尔型数组,数组中各个元素用来标记各进程想进入临界区的意愿
- 违反了“忙则等待”原则
后标志后检查
- 先上锁,后检查
- 违背了“空闲让进”和“有限等待”
Peterson 算法
- 结合双标志、单标志法
- 遵循了空闲让进,忙则等待,有限等待
但没有实现让权等待
进程互斥的硬件实现方法
中断屏蔽方法
- 利用“开/关中断指令”实现
- 步骤
- 关中断
- 临界区
- 开中断
- 优点:简单高效
- 缺点:不适合多处理机,只适用于操作系统内核进程
TestAndSet指令
- TSL指令
- 利用硬件实现,执行过程中不允许被中断
- 优点:实现简单,适用于多处理机
- 缺点:不满足让权等待
Swap指令
- 用硬件实现
- 优缺点同TSL指令
信号量机制
- 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步
整型信号量
- 用一个整数型的变量作为信号量,用来表示系统中某种资源的数量
- 对信号量的操作只有三种:初始化、P操作、V操作
- 检查和上锁一气呵成
- 不满足让权等待
记录型信号量
信号量机制实现
- 实现进程互斥
- 设置 互斥信号量mutex,初始值为1
- 对不同的临界资源需要设置不同的互斥信号量
- P,V操作必须成对出现
- 实现进程同步
- 进程同步:要让各并发进程按要求有序地推进。
- 分析什么地方需要实现“同步关系”,即必须保证一前一后执行两个操作
- 设置同步信号量S,初始值为0
- 前V后P
- 实现进程的前驱关系
- 为每一对前驱关系各设置一个同步信号量
- 在前操作之后对相应的同步信号量执行V操作
- 在后操作之前对相应的同步信号量执行P操作
生产者消费者问题
多生产者和多消费者问题
银行家问题
错题分析
- 公用队列属于临界资源
- 在操作系统中P,V操作是一种低级进程通信原语,不能被中断
- 可以被多个进程在任意时刻共享的代码必须是不允许任何修改的代码,又称可 可重入代码
- 一个进程映像的共享程序段必须是用可重入编码编写
- 管程是进程同步工具,解决信号量机制大量同步操作分散的问题
- 管程每次只允许一个进程进入管程
- 管程是被进程调用的,管程是语法范围,无法创建和撤销
- 信号量中的V操作一定会改变信号量的值,而管程中的signal操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则signal不会产生任何影响
- 管程不仅能实现进程间的互斥,而且能实现进程间的同步
- 局部于管程内的数据只能被局部于管程内的过程所访问
- 一个进程只能通过调用管程内的过程才能进入管程访
以上是关于进程管理的主要内容,如果未能解决你的问题,请参考以下文章