进程管理
并发与并行
共享
共享:指的是系统中资源可供内存中多个并发执行的进程共同使用。
有两种资源共享的方式:
- 互斥共享方式:规定一段时间内只能一个进程访问资源,其它进程需要等待。这个资源被称作临界资源。大多数物理设备、软件中使用的栈、变量等都属于临界资源。
- 同时访问方式:允许资源在一段时间内被多个进程“同时”访问,这里的“同时”通常是宏观上的。
虚拟
虚拟:指的是把一个物理上的实体变为若干个逻辑上的对应物。
用于实现虚拟的技术,称作虚拟技术。操作系统利用多种虚拟技术实现了虚拟处理器、虚拟内存、虚拟外部设备等。
虚拟处理器技术:利用多道程序设计技术,让多个程序可以分时使用一个处理器。即把一个物理上的CPU虚拟化成了多个逻辑上的CPU(虚拟处理器)。
虚拟存储器技术:把一个物理存储器变为虚拟存储器,在逻辑上扩充存储器的容量。我们把用户感觉到的存储器称作虚拟存储器。
虚拟I/O:把一台物理I/O虚拟化为多个逻辑上的I/O设备。
操作系统的虚拟技术可归纳为:时分复用技术:如处理器的分时共享;空分复用技术:如虚拟存储器。进程
进程实体:由程序段、相关数据段、PCB三部分组成。
进程的定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
进程的五种状态:创建态、就绪态、运行态、阻塞态、结束态。
- 运行态:单处理机下,每个时刻最多一个进程处于运行态;
- 就绪态:进程获得了除处理器资源外的一切资源,一旦获得处理器资源就能进入运行态;
- 阻塞态:进程因为等待某一事件而暂停运行。如等待某资源可用/等待输入输出。即使处理器空间也不会运行。
- 创建态:进程正在被创建,还未到就绪态;
- 结束态:进程可能正常结束或者其他原因中断退出。
进程间通信
高级通信方法主要有三种:
- 共享存储
在通信的进程之间存在一块可直接访问的共享空间。通过对这个共享空间的读/写操作来实现进程间的通信。 - 消息传递
进程间的数据交换是以格式化的信息(Message)为单位的。若进程之间不存在共享空间,必须利用操作系统提供的消息传递方法来实现进程通信。即进程间通过发送消息、接收消息的原语来进行数据交换。
有两种消息传递的方式:- 直接通信方式:发送进程把消息发送给接收进程,并将其挂载到接收进程的消息缓冲队列中,接受进程通过消息缓冲队列取得消息。
- 间接通信方式:发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称作信箱。
- 直接通信方式:发送进程把消息发送给接收进程,并将其挂载到接收进程的消息缓冲队列中,接受进程通过消息缓冲队列取得消息。
- 管道通信
所谓的管道,指的是连接一个读进程和写进程的一个共享文件(又称pipe文件),以实现两者之间的通信。半双工通信。
管道通信可以看作是共享存储的优化和发展。在共享存储中,同一时刻只允许一种操作,管道是半双工通信,要求只能一边写入,一边读出,只要管道中有数据就能进行读取,不会因为其它进程进行写操作而堵塞读操作,因为管道要求写进程需要把缓冲区写满,才能让读进程读取。单工通信、半双工通信和全双工通信之间有什么区别
简单的说:
单工通信就是只能从A到B,如[广播]
半双工通信是A到B,B到A都行,但不能同时进行。如[对讲机]
全双工通信是A到B,B到A都行,可以同同时进行。如[电话]线程的概念
是基本的CPU执行单元,也是程序执行流的最小单元。线程是进程中的一个实体,是系统独立调度和分派的基本单位。线程本身不拥有系统资源,而是与进程中其它线程共享进程所拥有的资源。
线程也有就绪、阻塞、运行三种基本状态。
而进程是拥有资源的基本单位。
引入线程的目的:为了减小程序在并发执行所付出的时空开销。
可以认为线程是“轻量级的进程”调度的概念
为什么需要有调度:因为进程数量通常远大于处理器的个数,这时候就会发生进程间争用处理器资源的现象。我们需要一种算法来实现对处理器资源的合理分配。进程调度方式
- 非剥夺调度方式
-
典型的调度算法
先来先服务调度算法:每次从就绪队列中选择最先进入该队列的进程,将处理器分配给它。属于不可剥夺算法。特点:算法简单,但效率低;对长作业有利,对短作业不利;有利于CPU繁忙型作业,不利于I/O繁忙型作业。
- 短作业优先调度算法:从后备队列中选择一个运行时间最短的作业。对长时间作业不利,可能会造成“饥饿”现象(区别于死锁)
- 优先级调度算法:每次从后背队列中选取优先级最高的作业。
- 非剥夺式优先级调度算法
- 剥夺式优先级调度算法
- 静态优先级调度算法
- 动态优先级调度算法
- 高响应比优先调度算法:选取响应比最高的作业。先来先服务+短作业:克服了饥饿状态兼顾了长作业。
- 时间片轮转调度算法:主要适用于分时系统。对于时间片的大小应该适当设置。
- 多级反馈队列调度算法:以上的综合
死锁
死锁的定义:多个进程因为竞争资源而陷入了相互等待的情况。若没有外力作用,这些进程无法向前推进。
为什么会产生死锁:
- 系统资源的竞争:系统中有不可剥夺的资源,通常不够满足所有进程的需要,使得进程在争夺资源的过程中陷入了相互等待。
- 进程推进顺序非法:如信号量使用不当造成两个进程相互等待对方发送消息。
产生死锁的必要条件:
四个条件只要任一不成立,死锁就不会发生。
- 互斥条件:某段时间进程独占资源
- 不剥夺条件:资源在被使用时无法被强行剥夺
- 请求并保持条件:进程保持着资源同时请求另一资源,对保持的资源不释放
- 循环等待条件:进程间循环等待资源
死锁的处理策略:
- 死锁预防:破环四个必要条件之一。
- 死锁避免:在资源动态分配的过程中,使用某种方法防止系统进入不安全的状态来避免死锁。
- 银行家算法
- 死锁检测与解除:
- 内存的分配、回收;
- 地址转换;
- 内存扩充:
- 存储保护:
首先考虑问题,如何将程序以进程的形式在内存中运行呢?有以下几个步骤:
- 编译
- 链接
- 装入