线程和进程【并发和并行、线程上下文切换、线程的状态】
- 什么是并发与并行?
- 什么是线程上下文切换?
- 线程状态:一个线程的一生
转自 极客时间
- 进程:是指内存中运行的一个应用程序,每个进程都有自己独立的内存空间;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
- 线程:是进程中的一个执行单元,负责当前进程中任务的执行。一个进程在其执行过程中,会产生很多个线程。
什么是并发与并行?
什么是线程上下文切换?
一个CPU内核,同一时刻只能被一个线程使用。为了提升CPU利用率,CPU采用了时间片算法将CPU时间片轮流分配给多个线程,每个线程分配了一个时间片(几十毫秒/线程),线程在时间片内,使用CPU执行任务。当时间片用完后,线程会被挂起,然后把 CPU 让给其它线程。
那么问题来了,线程再次运行时,系统是怎么知道线程之前运行到哪里了呢?
- CPU切换前会把当前任务状态保存下来,用于下次切换回任务时再次加载。
- 任务状态的保存及再加载的过程就叫做上下文切换。
任务状态信息保存在哪里呢?
- 程序计数器:用来存储CPU正在执行的指令的位置,和即将执行的下一条指令的位置。
- 他们都是CPU在运行任何任务前,必须依赖的环境,被叫做CPU上下文。
上下文切换过程:
- 挂起当前任务任务,将这个任务在 CPU 中的状态(上下文)存储于内存中的某处。
- 恢复一个任务,在内存中检索下一个任务的上下文并将在 CPU 的寄存器中恢复。
- 跳转到程序计数器所指定的位置(即跳转到任务被中断时的代码行)
线程上下文切换会有什么问题呢?
过多的线程并行执行会导致CPU资源的争抢,产生频繁的上下文切换,常常表现为高并发执行时,RT延长。因此,合理控制上下文切换次数,可以提高多线程应用的运行效率。(也就是说线程并不是越多越好,要合理的控制线程的数量。)
- 直接消耗:指的是CPU寄存器需要保存和加载,系统调度器的代码需要执行
- 间接消耗:指的是多核的cache之间得共享数据,间接消耗对于程序的影响要看线程工作区操作数
据的大小