目录
1.进程与线程
(1)进程
进程是资源分配的基本单位。
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。
(2)线程
线程是独立调度的基本单位。
一个进程中可以有多个线程,它们共享进程资源。
(3)区别
- 拥有资源
进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。 - 调度
线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。 - 系统开销
创建或撤销进程时、进程切换时开销较大
线程切换时只需保存和设置少量寄存器内存,开销很小。 - 通信方面
线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。
2.进程状态的切换
阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。
3.进程调度算法
不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。
(1)批处理系统
没有太多的用户操作,其目标是保证吞吐量和周转时间(从提交到终止的时间)。
- 先来先服务
非抢占式的调度算法,按照请求的顺序进行调度。 - 短作业优先
非抢占式的调度算法,按估计运行时间最短的顺序进行调度。 - 最短剩余时间优先
最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。
(2)交互式系统
有大量的用户交互操作,其目标是快速地进行相映。
- 时间片轮转
时间片轮转算法的效率和时间片的大小有很大关系:
1、因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程 切换上就会花过多时间。
2、而如果时间片过长,那么实时性就不能得到保证。 - 优先级调度
为每个进程分配一个优先级,按优先级进行调度。 - 多级反馈队列
多级队列是为需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,..。进程在第一个队列没执行完,就会被移到下一个队列。
每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。
(3)实时系统
实时系统要求一个请求在一个确定时间内得到响应。
分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。
4.进程同步
(1)临界区
对临界资源进行访问的那段代码称为临界区。
(2)同步和互斥
- 同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。
- 互斥:多个进程在同一时刻只有一个进程能进入临界区。
(3)信号量
信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。(原语,会屏蔽中断)
- down : 如果信号量大于 0 ,执行 -1 操作;如果信号量等于 0,进程睡眠,等待信号量大于 0;
- up :对信号量执行 +1 操作,唤醒睡眠的进程让其完成 down 操作。
如果信号量的取值只能为 0 或者 1,那么就成为了 互斥量(Mutex) ,0 表示临界区已经加锁,1 表示临界区解锁。
(4)管程
使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制,而管程把控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。
管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否则其它进程永远不能使用管程。
管程引入了 条件变量 以及相关的操作:wait() 和 signal() 来实现同步操作。对条件变量执行 wait() 操作会导致调用进程阻塞,把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程。
5.进程通信
- 进程同步:控制多个进程按一定顺序执行。(一种目的)
- 进程通信:进程间传输信息。(一种手段)
为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。
(1)管道
它具有以下限制:
- 只支持半双工通信(单向交替传输);
- 只能在父子进程或者兄弟进程中使用
(2)FIFO(命名管道)
去除了管道只能在父子进程中使用的限制。
FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。
(3)消息队列
相比于 FIFO,消息队列具有以下优点:
- 消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
- 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
- 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
(4)信号量
它是一个计数器,用于为多个进程提供对共享数据对象的访问。
(5)共享存储
允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。
需要使用信号量用来同步对共享存储的访问。
多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外 XSI 共享内存不是使用文件,而是使用内存的匿名段。
(6)套接字
与其它通信机制不同的是,它可用于不同机器间的进程通信。