CPU工作原理
CPU工作原理
CPU只知道两件事:
-
从内存中取出指令
-
执行指令,然后回到1
❓CPU从哪里取出指令呢?
➡PC寄存器(Program Counter Register)即程序计数器
⭐存放的是指令在内存中的地址
🐖寄存器是CPU内部用来存放数据的一些小型存储区域
PC寄存器中的地址默认是自动加1的
❓PC中的初始值?
内存中的指令是从磁盘中保存的可执行程序加载过来的,磁盘中可执行程序是编译器生成的,编译器又是从哪里生成的机器指令呢?答案就是我们定义的函数。
🚩也就是,函数被编译后才会形成CPU执行的指令
那么,只需要找到函数被编译后形成的第一条指令就可以了,第一条指令就是函数入口。
简言之,我们需要把函数对应的第一条机器指令的内存地址装入PC寄存器就可以了
函数➡机器指令➡PC寄存器
进程&线程
进程的入口函数就是main函数,线程诞生前进程中只有一个执行流
线程诞生后进程中可以有多个执行流,每个执行流称为线程
把CPU的PC寄存器指向线程的入口函数,这样线程就可以运行起来了,这就是为什么我们创建线程时必须指定一个入口函数的原因
注:
图中用了多个CPU,但不是说一定要有多核才能使用多线程,在单核的情况下一样可以创建出多个线程,原因在于线程是操作系统层面的实现,和有多少个核心是没有关系的,CPU在执行机器指令时也意识不到执行的机器指令属于哪个线程。
即使在只有一个CPU的情况下,操作系统也可以通过线程调度让各个线程“同时”向前推进,方法就是将CPU的时间片在各个线程之间来回分配,这样多个线程看起来就是“同时”运行了,但实际上任意时刻还是只有一个线程在运行。
————————————————
版权声明:本文为CSDN博主「Dragonxxl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_34608734/article/details/121831890
线程&内存
函数在被执行的时产生的数据包括函数参数、局部变量、返回地址等信息,这些信息是保存在栈中的
操作系统要为每个线程在进程的地址空间中分配一个栈,即每个线程都有独属于自己的栈
线程共享了进程哪些资源
线程运行的本质其实就是函数的执行,
函数的执行总会有一个源头,这个源头就是所谓的入口函数,
CPU从入口函数开始执行从而形成一个执行流,执行流就叫线程。
在这里插入图片描述
🐏函数运行时的信息保存在栈帧中,
栈帧中保存了函数的返回值、调用其它函数的参数、该函数使用的局部变量以及该函数使用的寄存器信息
同时函数运行时需要额外的寄存器来保存一些信息,像部分局部变量之类,这些寄存器也是线程私有的,一个线程不可能访问到另一个线程的这类寄存器信息。
简言之,所属线程的栈区、程序计数器、栈指针以及函数运行使用的寄存器(在CPU)是线程私有的。
以上这些信息有一个统一的名字,就是线程上下文(thread context)。
总结下,线程私有资源:栈,PC计数器(在CPU)等。
具体来说,有以下:
(1)线程ID:每个线程都有自己唯一的ID,用于区分不同的线程。
(2)寄存器组的值:当线程切换时,必须将原有的线程的寄存器集合的状态保存,以便重新切换时得以恢复。
(3)线程的堆栈:堆栈是保证线程独立运行所必须的。
(4)错误返回码:由于同一个进程中有很多个线程同时运行,可能某个线程进行系统调用后设置了error值,而在该线程还没有处理这个错误,另外一个线程就在此时被调度器投入运行,这样错误值就有可能被修改。所以,不同的线程应该拥有自己的错误返回码变量。
(5)线程优先级:线程调度的次序(并不是优先级大的一定会先执行,优先级大只是最先执行的机会大)。
函数运行时栈(run time stack)
⭐函数执行的活动轨迹:栈
当函数A调用函数B时,我们只要知道:
函数A对于的机器指令执行到了哪里 (我从哪里来,返回)
函数B第一条机器指令所在的地址 (要到哪里去,跳转)
图片
call指令除了给出跳转地址之外还把call指令的下一条指令的地址,也就是0x40056a push到函数A的栈帧中
图片
现在CPU开始执行函数B对应的机器指令,注意观察,函数B也有一个属于自己的小盒子(栈帧),可以往里面扔一些必要的信息
图片
🐎栈中放函数的参数、局部变量、寄存器的初始值
假设函数A调用了函数B,函数A将一些参数写入相应的寄存器,当CPU执行函数B时就可以从这些寄存器中获取参数了。但寄存器的空间有限,所以放在函数的栈区。
图片
图片
参考:
https://cloud.tencent.com/developer/article/1768025
https://mp.weixin.qq.com/s?__biz=Mzg4OTYzODM4Mw==&mid=2247485714&idx=1&sn=1a315fe4da87fde2758fc9dd5366ba01&source=41#wechat_redirect
https://mp.weixin.qq.com/s?__biz=Mzg4OTYzODM4Mw==&mid=2247485705&idx=1&sn=1845875575601b23ed5cea0579c1f77e&source=41#wechat_redirect
https://mp.weixin.qq.com/s?__biz=Mzg4OTYzODM4Mw==&mid=2247485653&idx=1&sn=24a27455af32fdf97f6787e4a29e856a&source=41#wechat_redirect
Dragonxxl
关注
2
————————————————
版权声明:本文为CSDN博主「Dragonxxl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_34608734/article/details/121831890
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本