为什么要引入进程概念?
多道程序环境下,为了使多个程序更好地并发执行,实现操作系统的并发性和共享性。
进程与程序的联系与区别
进程的组成
- PCB(进程控制块)
- 程序段
- 数据段
- 通用寄存器
- 状态寄存器
PCB的组成
- 进程描述信息
- 进程控制和管理信息
- 资源分配清单
- 处理机相关信息
程序段
- 多个进程可以共享一个程序代码段,即一个程序多次执行对应多个进程
数据段
- 装进程的原始数据,执行中产生的中间或最终结果
进程的状态
共有5个状态
- 创建态
- 就绪态
- 运行态
- 阻塞态
- 终止态
进程控制
操作系统有进程控制的程序段,会完成对进程的创建,撤销已有进程,实现进程状态转换等功能。我们称这个程序段为原语,它的特点是执行过程中不允许打断。
进程的创建
- 允许一个进程创建另一个进程
- 创建进程时会分配一个进程号,并申请一个PCB。由于PCB有限,所以可能会创建失败
- 给进程分配资源,包括:程序段所需内存空间,数据段所需内存空间,用户栈所需内存空间
- 初始化PCB,如设置进程优先级
- 如果就绪队列能接纳新进程,则放入就绪队列
进程的终止
- 正常结束
- 异常结束
- 外界干预
进程的阻塞和唤醒
- 需要阻塞时执行阻塞原语(block),保护现场,修改PCB状态为阻塞态,将PCB插入等待队列
- 需要唤醒时调用唤醒原语(wakeup),在等待队列中找到PCB,修改为就绪态,将PCB插入就绪队列
进程切换与调度
切换和调度不同,切换是指实际分配的行为,在进程间切换;调度指的是将资源分配给某进程的行为。
进程的通信
pv操作是低级通信方式,高级通信是指较高速率传输大量数据,包括下面三种方式:
- 共享存储:操作系统会提供一段共同的数据段内存空间,你们两一起用,但要符合P,V操作规定进行。此时读写操作隔离。
- 消息传递:两个进程数据段的物理地址是独立的,通过直接发消息的方式传递数据。
- 管道通信:使用连接读进程和写进程的pipe文件,像一条(半双工通信)输血管一样插在两个进程上。可以理解为共享存储的优化与发展,缓冲区(linux下4KB大小)(输血管)虽然只允许一边读一边写,但却可以同时进行。
为什么要引入线程
引入进程是为了多道程序更好地并发执行,增加并发程度;引入线程是为减少程序并发执行过程中产生的时间和空间上的开销,提高并发性能。
线程的概念
- “轻量级进程”,cpu执行流的基本单位
- 本身没有资源,但可以和其他线程共享进程资源
- 一个进程可以创建多个线程,一个线程可以创建和撤销另一个线程
- 同一个进程的线程可以并发执行
- 线程也有就绪、阻塞和运行态
- 进程是除cpu外的系统资源的单元,线程是cpu的分配单元
- 两个线程在同一个进程里切换需要很少的时空开销
线程与进程的比较
- 在现在的操作系统中,线程是cpu独立调度的最小单元,进程是拥有资源的最小单元
- 线程切换可能会引起进程切换,即:在同一个进程里的线程切换不会引起线程切换,不同进程里的线程切换必然会引起进程切换。进程只能被动切换。
- 不同进程间的线程不可见
- 进程之间通信使用:共享内存,消息传递,管道通讯,线程之间的通信使用全局变量即可
- 进程在执行,实际上是其下的某线程在执行
线程的组成
- 有唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场信息
- 多个线程可以执行一个程序,多个用户调用同一程序时会创建多个线程
- 同一进程的多个线程共享该进程资源
- 线程是cpu的调度单位,在单cpu计算机中,多个线程交替占用cpu;在多核多线程cpu中可以多个线程占用不同cpu,如我的电脑是6核12线程,即最多同时12个线程一起跑
- 与进程相似,线程的生命周期也是创建、等待、就绪、执行、终止状态
- 由于线程切换不一定会切换进程,所以可以提高系统的并发性
线程的实现
有两种线程实现方式
-
用户级线程
-
内核级线程
对应关系 -
目前主要用第一种