进程和线程都是操作系统提供的一种并发手段,只不过并发层次不同: 进程属于在处理器层次的并发;线程则属于在进程这个层次的并发。如果我们进入计算机体系结构里,就会发现,流水线提供的也是一种并发,不过是指令级的并发
如果将一个进程分解为若干个线程,则可以让不同的线程运行在不同的核上,从而提高进程的执行速度。一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程
区别
- 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
- 线程是进程的一个实体, 是CPU调度和分派的基本单位
- 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源
进程调度
- 用户进程数一般都多于处理机数, 这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行
- 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了
- 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
调度的算法
- FIFO
- 短进程优先, SCBF--Shortest CPU Burst First
- 轮转法
- 多级反馈队列
- 静态优先数调度法
调度方式
- 非剥夺
- 剥夺
进程控制块(PCB)
- 为了描述控制进程的运行,系统为每个进程定义
进程上下文
- 进程上下文实际上是进程执行活动全过程的静态描述
- 把已执行过的进程指令和数据在相关寄存器与堆栈中的内容称为上文,把正在执行的指令和数据在寄存器和堆栈中的内容称为正文,把待执行的指令和数据在寄存器与堆栈中的内容称为下文。具体的说,进程上下文包括计算机系统中与执行该进程有关的各种寄存器(例如通用寄存器,程序计数器PC,程序状态字寄存器PS等)的值,程序段在经过编译过后形成的机器指令代码集,数据集及各种堆栈值PCB结构
线程共享那些资源
- 线程ID
- 寄存器组的值
- 线程的堆栈
- 错误返回码
- 线程的信号屏蔽码
- 线程的优先级
多线程的互斥与同步
- 线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性
- 用户模式和内核模式
- 内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。
- 用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。
- 信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。
- 互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限
协程
- 协程也被叫做轻量级线程。通俗点讲就是定义一大堆任务,然后通过一个线程轮着对每个任务都执行一下,协作运行。
- 每运行到一个任务的时候,它可以从这个任务上一次中断的地方开始运行。