线程间有哪些资源是不可以共享的?


目录

一、不能共享的

1、栈区

2、调度优先级

3、上下文数据

二、可以共享的


进程之间是相互独立的,无法看到各自的地址空间。但是对于线程而言,就不一样了,进程是承担系统资源的基本单位,线程是承担进程资源以及被调度的基本单位。

一个PCB代表一个线程,而线程的空间来自于进程分出的一小部分资源,对应了上面说的“线程是承担进程资源的基本单位”,这样的话,因为是承担了同一个进程的资源,所以有一部分资源是线程间可以相互看到的!!那么到底哪些内容是可以“共享”的呢??

一、不能共享的

原则上来说,大部分内容应该是可以共享的,了解了不能共享的,剩下的就是可以共享的内容了。这里主要了解一些听说过的内容。

1、栈区

即便是承担进程资源,唯独栈区不能分你一点,下面就列举出几种情况。

(1) 函数调用

函数被调用的时候,要在栈上建立栈帧,此时函数的地址、函数的返回值、维护函数栈帧的寄存器(esp、ebp)都是私有的。栈上可能写了一些你自己定义的函数,如果其他线程能看到,岂不是相当于可以让一个陌生人随意拿你的东西。

(2) CPU指令执行

CPU执行指令的信息保存在一个叫做程序计数器的寄存器中,每一条语句都有对应的地址,当线程的运行时间到了,线程就要排到运行队列的末尾等待,CPU在执行指令的时候,通过这个程序计数器的值可以知道上一次执行到哪个地方了。

2、调度优先级

线程既是承担进程资源的基本单位,也是被调度的基本单位。最开始我们也说了,一个线程可以看作是一个PCB,而在运行队列中轮流运行的就是PCB,一个PCB的运行时间到了,就要排到末尾。然而,一般谁先被调用,谁后被调用,是要根据优先级而定的,这个优先级决定了哪个线程先被调用。

3、上下文数据

当PCB的运行时间到了以后,此时就要排到运行队列的末尾。那么运行过程中产生的 大量临时数据以及 CPU暂停运行的位置信息,我们统称为上下文数据。

二、可以共享的

这个相比之下就很好判断了,虚拟内存地址空间可以被分成多个部分。除了栈区不能被共享外,堆区、全局区、代码区都是可以被共享的!除此之外,加载到内存的动态链接库也是可以被共享的!比如线程库pthread,就是放在了栈区和堆区中间的位置

 关于动态链接库的话题,不清楚的可以看看下面这篇博文。

Linux“线程”的存储方式_abs(ln(1+NaN))的博客-CSDN博客_linux线程内存https://blog.csdn.net/challenglistic/article/details/124697644

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值