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



    目录

    一、不能共享的

    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

  • 相关阅读:
    在回调之间共享数据
    DirectX12学习笔记-创建窗口
    【Oracle】Navicat Premium 连接 Oracle的两种方式
    基于Basic auth 的一个C# 示例
    Nginx + PHP 异常排查,open_basedir 异常处理
    uniapp 去掉默认导航栏
    十进制分钟转时间类型
    VS 配置 OpenCV (亲测可用)
    【考研数学】全程跟张宇,《1000题》应该怎么搭配《660》《880》?
    汽车EDI:德国大众 EDI 项目案例
  • 原文地址:https://blog.csdn.net/challenglistic/article/details/125896252