前言
面试中有被问到进程和线程的问题,这个平时看得比较少,这里做一个简单的总结。
定义
进程:资源分配的基本单位,由进程控制块(Process Control Block, PCB)描述他的基本信息和运行状态
线程:独立调度的基本单位,一个进程可以有多个线程,且这些线程共享进程的资源和数据
两者区别:
- 进程拥有资源,而线程只能访问所属进程的资源
- 通信方式不同,线程间通信可以通过对进程数据的读写完成,进程的通信需要通过IPC(进程间通信技术)完成
进程的状态:
- 就绪态,等待调度
- 运行态
- 阻塞态,等待资源分配
就绪态和运行态能相互转换,运行态->阻塞态->就绪态属于单向转换。
线程状态(Java中):
- 初始:NEW 尚未启动的线程处于这种状态
- 运行:RUNNABLE 在Java虚拟机上执行的线程处于这种状态
- 阻塞:BLOCKED 被阻止等待监视器锁的线程处于这种状态
- 等待:WAITING 即无限期地等待另一个线程来执行某一特定操作的线程处于这种状态
- 超时等待:TIMED_WAITING 正在等待另一个线程来达到一个指定的等待时间执行动作的线程处于这种状态
- 终止:TERMINATED 已退出的线程处于这种状态
一个线程可以在给定时间点只能处于一种状态。 这些状态是虚拟机的状态并没有反映任何操作系统线程状态。
进程调度算法
批处理系统
- 先来先服务:非抢占式的调度算法,按照请求的顺序进行调度
- 短作业优先:非抢占式的调度算法,按估计运行时间最短的顺序进行调度
- 最短剩余时间:短作业优先的抢占式版本,按剩余运行时间的顺序进行调度
交互式系统
- 时间片轮转:每个进程分配一个时间片,用完了就会轮转到下一个进程
- 优先级调度:为每一个进程定义一个优先级,按照优先级顺序调度,也可调整进程优先级
- 多级反馈队列:类似于时间片轮转,但是设置多个不同时间长度的队列,按时间长短顺序优先,
进程没在高优先级(即时间短的)队列中执行完成会依次进入下一队列获取更长的时间片。这样做的目的是减少切换的次数。
进程通信
- 管道
- FIFO
- 消息队列
- 信号量
- 共享存储
- 套接字