ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CPU基础知识-线程切换

2021-12-19 15:31:32  阅读:148  来源: 互联网

标签:执行 基础知识 线程 切换 寄存器 上下文 CPU


参考资料:
基本功:线程上下文切换 https://blog.csdn.net/alex_xfboy/article/details/90722654
进程/线程上下文切换会用掉你多少CPU? https://zhuanlan.zhihu.com/p/79772089

1. 名词解释:

时间片
多任务系统往往需要同时执行多道作业。作业数往往大于机器的CPU数,然而一颗CPU同时只能执行一项任务。利用了时间片轮转的方式,让用户感觉任务正在同时进行
时间片是CPU分配给各个任务(线程)的时间。

线程上下文
指某一时间点 CPU 寄存器程序计数器的内容,CPU通过时间片分配算法来循环执行任务(线程),因为时间片非常短,所以CPU通过不停地切换线程执行。

2. 线程上下文切换

2.1 线程上下文切换

CPU切换前把当前任务的状态保存下来,以便下次切换回这个任务时可以再次加载这个任务的状态,然后加载下一任务的状态并执行。任务的状态保存及再加载, 这段过程就叫做上下文切换。

每个线程都有一个程序计数器(记录要执行的下一条指令),一组寄存器(保存当前线程的工作变量),堆栈(记录执行历史,其中每一帧保存了一个已经调用但未返回的过程)。
寄存器 是 CPU 内部的数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度。
程序计数器是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置。

2.2 线程上下文切换步骤

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

2.3 线程上下文切换的开销

开销分成两种,一种是直接开销、一种是间接开销。
直接消耗:指的是CPU寄存器需要保存和加载, 系统调度器的代码需要执行, TLB实例需要重新加载, CPU 的pipeline需要刷掉
间接消耗:指的是多核的cache之间得共享数据, 间接消耗对于程序的影响要看线程工作区操作数据的大小

直接开销就是在切换时,cpu必须做的事情,包括:

  1. 切换页表全局目录
  2. 切换内核态堆栈
  3. 切换硬件上下文(进程恢复前,必须装入寄存器的数据统称为硬件上下文)
    ip(instruction pointer):指向当前执行指令的下一条指令
    bp(base pointer): 用于存放执行中的函数对应的栈帧的栈底地址
    sp(stack poinger): 用于存放执行中的函数对应的栈帧的栈顶地址
    cr3:页目录基址寄存器,保存页目录表的物理地址
    ......
  4. 刷新TLB (Translation Lookaside Buffer 转译后备缓冲器,也被翻译为页表缓存、转址旁路缓存,为CPU的一种缓存,由存储器管理单元用于改进虚拟地址到物理地址的转译速度。)
  5. 系统调度器的代码执行

间接开销主要指的是虽然切换到一个新进程后,由于各种缓存并不热,速度运行会慢一些。如果进程始终都在一个CPU上调度还好一些,如果跨CPU的话,之前热起来的TLB、L1、L2、L3因为运行的进程已经变了,所以以局部性原理cache起来的代码、数据也都没有用了,导致新进程穿透到内存的IO会变多。 其实我们上面的实验并没有很好地测量到这种情况,所以实际的上下文切换开销可能比3.5us要大。

2.4 查看上下文切换次数

Linux系统下可以使用vmstat命令来查看上下文切换的次数, 其中cs列就是指上下文切换的数目(一般情况下, 空闲系统的上下文切换每秒大概在1500以下)

标签:执行,基础知识,线程,切换,寄存器,上下文,CPU
来源: https://www.cnblogs.com/gnivor/p/15707530.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有