(线程和进程【并发和并行、线程上下文切换、线程的状态】)

转自 极客时间

  • 进程:是指内存中运行的一个应用程序,每个进程都有自己独立的内存空间;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
  • 线程:是进程中的一个执行单元,负责当前进程中任务的执行。一个进程在其执行过程中,会产生很多个线程。

什么是并发与并行?

在这里插入图片描述

什么是线程上下文切换?

==一个CPU内核,同一时刻只能被一个线程使用==。为了提升CPU利用率,CPU采用了时间片算法将CPU时间片轮流分配给多个线程,每个线程分配了一个时间片(几十毫秒/线程),线程在时间片内,使用CPU执行任务。当时间片用完后,线程会被挂起,然后把 CPU 让给其它线程。

那么问题来了,线程再次运行时,系统是怎么知道线程之前运行到哪里了呢?

  • CPU切换前会把当前任务状态保存下来,用于下次切换回任务时再次加载。
  • 任务状态的保存及再加载的过程就叫做上下文切换。

任务状态信息保存在哪里呢?

  • 程序计数器:用来存储CPU正在执行的指令的位置,和即将执行的下一条指令的位置。
  • 他们都是CPU在运行任何任务前,必须依赖的环境,被叫做CPU上下文。

上下文切换过程:

  1. 挂起当前任务任务,将这个任务在 CPU 中的状态(上下文)存储于内存中的某处。
  2. 恢复一个任务,在内存中检索下一个任务的上下文并将在 CPU 的寄存器中恢复。
  3. 跳转到程序计数器所指定的位置(即跳转到任务被中断时的代码行)

在这里插入图片描述 线程上下文切换会有什么问题呢?

过多的线程并行执行会导致CPU资源的争抢,产生频繁的上下文切换,常常表现为高并发执行时,RT延长。因此,合理控制上下文切换次数,可以提高多线程应用的运行效率。(也就是说线程并不是越多越好,要合理的控制线程的数量。)

  • 直接消耗:指的是CPU寄存器需要保存和加载,系统调度器的代码需要执行
  • 间接消耗:指的是多核的cache之间得共享数据,间接消耗对于程序的影响要看线程工作区操作数 据的大小

线程状态:一个线程的一生

在这里插入图片描述