【笔记】进程与线程 1

349 阅读3分钟

进程(Process)就是正在执行的应用程序,是软件的执行副本。进程是分配资源的基础单位 线程很长一段时间被称作轻量级进程(Light Weighted Process),是程序执行的基本单位。

被操作系统直接调度的线程,我们也成为内核级线程。 主线程的程序用算法实现子线程,这种情况我们称为用户级线程。

每个进程在执行时都会获得操作系统分配的一个时间片段,如果超出这个时间,就会轮到下一个进程(线程)执行。再强调一下,现代操作系统都是直接调度线程,不会调度进程。

一个进程(线程)运行的过程,会经历以下 3 个状态:

  • 进程(线程)创建后,就开始排队,此时它会处在“就绪”(Ready)状态;

  • 当轮到该进程(线程)执行时,会变成“运行”(Running)状态;

  • 当一个进程(线程)将操作系统分配的时间片段用完后,会回到“就绪”(Ready)状态。

有时候一个进程(线程)会等待磁盘读取数据,或者等待打印机响应,此时进程自己会进入“阻塞”(Block)状态。

image.png

进程(线程)切换

  1. 当操作系统发现一个进程(线程)需要被切换的时候,直接控制 PC 指针跳转是非常危险的事情,所以操作系统需要发送一个“中断”信号给 CPU,停下正在执行的进程(线程)。

  2. 当 CPU 收到中断信号后,正在执行的进程(线程)会立即停止。注意,因为进程(线程)马上被停止,它还来不及保存自己的状态,所以后续操作系统必须完成这件事情。

  3. 操作系统接管中断后,趁寄存器数据还没有被破坏,必须马上执行一小段非常底层的程序(通常是汇编编写),帮助寄存器保存之前进程(线程)的状态。

  4. 操作系统保存好进程状态后,执行调度程序,决定下一个要被执行的进程(线程)。

  5. 最后,操作系统执行下一个进程(线程)。

image.png

一个进程(线程)被选择执行后,它会继续完成之前被中断时的任务,这需要操作系统来执行一小段底层的程序帮助进程(线程)恢复状态。

原子操作就是操作不可分。

竞争条件就是说多个线程对一个资源(内存地址)的读写存在竞争,在这种条件下,最后这个资源的值不可预测,而是取决于竞争时具体的执行顺序。

这种访问共享资源的程序片段我们称为临界区。在临界区,程序片段会访问共享资源,造成竞争条件,也就是共享资源的值最终取决于程序执行的时序,因此这个值不是确定的。

解决竞争条件

  1. 避免临界区ThreadLocal
  2. CAS指令
  3. tas指令 tas 指令的目标是设置一个内存地址的值为 1。首先比较内存地址的数据和 1 的值,如果内存地址是 0,那么把这个地址置 1。如果是 1,那么失败。