线程共享了进程的哪些资源

编程入门 行业动态 更新时间:2024-10-27 02:22:15

CPU工作原理

CPU只知道两件事:

  1. 从内存中取出指令

  2. 执行指令,然后回到1



❓CPU从哪里取出指令呢?

➡PC寄存器(Program Counter Register)即程序计数器

⭐存放的是指令在内存中的地址

🐖寄存器是CPU内部用来存放数据的一些小型存储区域

PC寄存器中的地址默认是自动加1的


❓PC中的初始值?

内存中的指令是从磁盘中保存的可执行程序加载过来的,磁盘中可执行程序是编译器生成的,编译器又是从哪里生成的机器指令呢?答案就是我们定义的函数

🚩也就是,函数被编译后才会形成CPU执行的指令

那么,只需要找到函数被编译后形成的第一条指令就可以了,第一条指令就是函数入口


简言之,我们需要把函数对应的第一条机器指令的内存地址装入PC寄存器就可以了

函数➡机器指令➡PC寄存器


进程&线程

进程的入口函数就是main函数,线程诞生前进程中只有一个执行流

线程诞生后进程中可以有多个执行流,每个执行流称为线程

把CPU的PC寄存器指向线程的入口函数,这样线程就可以运行起来了,这就是为什么我们创建线程时必须指定一个入口函数的原因

注:

  • 图中用了多个CPU,但不是说一定要有多核才能使用多线程,在单核的情况下一样可以创建出多个线程,原因在于线程是操作系统层面的实现,和有多少个核心是没有关系的,CPU在执行机器指令时也意识不到执行的机器指令属于哪个线程。
  • 即使在只有一个CPU的情况下,操作系统也可以通过线程调度让各个线程“同时”向前推进,方法就是将CPU的时间片在各个线程之间来回分配,这样多个线程看起来就是“同时”运行了,但实际上任意时刻还是只有一个线程在运行。

线程&内存

函数在被执行的时产生的数据包括函数参数局部变量返回地址等信息,这些信息是保存在中的

操作系统要为每个线程在进程的地址空间中分配一个栈,即每个线程都有独属于自己的栈

线程共享了进程哪些资源

  • 线程运行的本质其实就是函数的执行,
  • 函数的执行总会有一个源头,这个源头就是所谓的入口函数,
  • 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/developer/article/1768025

https://mp.weixin.qq/s?__biz=Mzg4OTYzODM4Mw==&mid=2247485714&idx=1&sn=1a315fe4da87fde2758fc9dd5366ba01&source=41#wechat_redirect

https://mp.weixin.qq/s?__biz=Mzg4OTYzODM4Mw==&mid=2247485705&idx=1&sn=1845875575601b23ed5cea0579c1f77e&source=41#wechat_redirect

https://mp.weixin.qq/s?__biz=Mzg4OTYzODM4Mw==&mid=2247485653&idx=1&sn=24a27455af32fdf97f6787e4a29e856a&source=41#wechat_redirect

更多推荐

线程共享了进程的哪些资源

本文发布于:2023-06-14 00:54:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1419919.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:线程   进程   资源

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!