1.进程,线程,协程
(1)进程是资源分配的最小单位,线程是 CPU 调度的最小单位
(2)一个进程在执行的过程种可能产生一个线程,也可能产生多个线程
(3)进程之间相互独立,一个进程出问题不会影响到另一个进程,虽然线程之间也是独立运行的,但是一个进程种的线程会共用一些资源,所以同一个进程的线程之间很有可能会相互影响
(4)多个线程共享进程的堆和方法区,每个线程有自己的程序计数器,虚拟机栈,本地方法栈
(5)协程属于线程,协程程序在线程里面跑,因此协程又称微线程。
协程是在用户态下运行的
协程的调度切换是用户(程序员)手动切换的
协程具有原子性, 所以不会出现执行一半的代码片段被强制中断了
Java 不支持协程
2.进程切换
挂起正在cpu上运行的进程,执行之前挂起的某个进程
进程切换的步骤如下:
(1)保持cpu的上下文,程序计数器和寄存器信息
(2)更新PCB信息
(3)把进程的 进程控制块(PCB Process Control Block)移入相应的队列,如就绪、在某事件阻塞等队列
(4)选择另一个进程执行,并更新其PCB。
(5)更新内存管理的数据结构。
(6)恢复处理机上下文
3.进程调度算法
- 先到先服务(FCFS)调度算法: 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
- 短作业优先(SJF)的调度算法: 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
- 时间片轮转调度算法: 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
- 优先级调度: 为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
- 多级反馈队列调度算法:前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。