概述
基本特征
- 并发/并行
- 并发是指宏观上在一段时间内能同时运行多个程序,操作系统通过引入进程和线程,使得程序能够并发运行。
- 并行则指同一时刻能运行多个指令,需要硬件支持,如多流水线、多核处理器或者分布式计算系统。
- 共享
共享是指系统中的资源可以被多个并发进程共同使用。
有两种共享方式:互斥共享和同时共享。
互斥共享的资源称为临界资源,例如打印机等,在同一时刻只允许一个进程访问,需要用同步机制来实现互斥访问。
- 虚拟
虚拟技术把一个物理实体转换为多个逻辑实体。
主要有两种虚拟技术:时(时间)分复用技术(比如多进程)和空(空间)分复用技术(比如虚拟内存)。
- 异步
基本功能
进程管理:进程控制、进程同步、进程通信、死锁处理、处理机调度等。
内存管理:内存分配、地址映射、内存保护与共享、虚拟内存等。
文件管理:文件存储空间的管理、目录管理、文件读写管理和保护等。
设备管理:主要包括缓冲管理、设备分配、设备处理、虛拟设备等。
进程管理
进程与线程
- 进程:进程是资源分配的基本单位。进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。
- 线程:线程是独立调度的基本单位。一个进程中可以有多个线程,它们共享进程资源。
- 区别
- 拥有资源:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
- 调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
- 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,开销很大。而线程切换时只需保存和设置少量寄存器内容,开销很小。
- 通信方面:线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。
进程状态的切换
- 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。(缺资源到阻塞,缺CPU到就绪)
进程调度算法
不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。
- 批处理系统
批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。
- ==先来先服务== first-come first-serverd(FCFS):非抢占式的调度算法,按照请求的顺序进行调度。有利于长作业,但不利于短作业。
- ==短作业优先== shortest job first(SJF):非抢占式的调度算法,按估计运行时间最短的顺序进行调度。长作业有可能会饿死(一直有短作业进来会得不到执行)。
- ==最短剩余时间优先== shortest remaining time next(SRTN):短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。
- 交互式系统
交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。
- ==时间片轮转==:将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。(时间片大小影响很大,太小切换频繁效率低,太大实时性不强)
- ==优先级调度==:为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
- ==多级反馈队列==:一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,..。进程在第一个队列执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。
- ==实时系统==:实时系统要求一个请求在一个确定时间内得到响应。分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。
进程通信
进程同步与进程通信很容易混淆,它们的区别在于:
- 进程同步:控制多个进程按一定顺序执行;
- 进程通信:进程间传输信息。
进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。
- 管道
- 只支持半双工通信(单向交替传输);
- 只能在父子进程或者兄弟进程中使用。
- FIFO
也称为命名管道,去除了管道只能在父子进程中使用的限制。
- 消息队列
相比于 FIFO,消息队列具有以下优点:
- 消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
- 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
- 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
- 信号量
它是一个计数器,用于为多个进程提供对共享数据对象的访问。
- 共享存储
允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。
需要使用信号量用来同步对共享存储的访问。
- 套接字
与其它通信机制不同的是,它可用于不同机器间的进程通信。