进程(线程)上下文
概念
每个正在运行的进程,cpu都会他的信息保存在下面三个东西中:
- 一个程序计数器(记录正在执行或者要执行的下一条指令)
- 一组寄存器(保存当前线程的工作变量)
- 堆栈(保存进程一些数据,线程则没有堆的切换)。
这些信息就叫上下文
寄存器: 是 CPU 内部的数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。 程序计数器:是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置。
进程上下文是进程执行活动全过程的静态描述。 已执行过的进程指令和数据,在相关寄存器与堆栈中的内容称为进程上文 正在执行的指令和数据在寄存器与堆栈中的内容称为进程正文, 待执行的指令和数据在寄存器与堆栈中的内容称为进程下文。
进程控制单元PCB
每个进程都有一个PCB来控制进程,他是一种数据结构。
- 进程状态:运行或等待
- 进程ID和父进程ID
- 程序计数器:程序执行到哪里的一个指针
- CPU调度信息:比如优先级
- 内存管理信息,比如页表或者块表
- IO状态信息:设备分配,等
什么是上下文切换
上下文切换就是从当前执行任务切换到另一个任务执行的过程。但是,为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态。
进程上下文切换
1.切换页目录以使用新的地址空间。 2.切换内核栈和硬件上下文。
- 挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中的某处, 上下文切换由PCB保存,发生上下文切换时,内核将旧进程的上下文保存到PCB中,从新的进程PCB中加载信息
- 在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复这些信息
- 跳转到程序计数器所指向的位置,以恢复该进程。
线程上下文切换
两种情况:
- 前后两个线程属于不同进程。此时,因为资源不共享,所以切换过程就跟进程上下文切换是一样。
- 前后两个线程属于同一个进程。此时,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据:栈、线程寄存器信息等不共享的线程私有的数据
进程上下文切换和线程上下文切换区别
进程上下文切换要涉及地址空间切换,将虚拟内存切换到物理内存,而线程不需要。线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相关的东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。
内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
上下文切换问题
上下文切换会导致额外的开销,常常表现为高并发执行时速度会慢串行,因此减少上下文切换次数便可以提高多线程程序的运行效率。
直接消耗:指的是CPU寄存器需要保存和加载, 系统调度器的代码需要执行, TLB实例需要重新加载, CPU 的pipeline需要刷掉 间接消耗:指的是多核的cache之间得共享数据, 间接消耗对于程序的影响要看线程工作区操作数据的大小
参考
https://zhuanlan.zhihu.com/p/52845869 https://blog.csdn.net/21cnbao/article/details/108860584 https://blog.csdn.net/alex_xfboy/article/details/90722654 https://blog.csdn.net/zt2650693774/article/details/105193125/ https://blog.csdn.net/woshidytgg/article/details/72926687?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.highlightwordscore&spm=1001.2101.3001.4242.2
|