首页 > 其他分享 >线程的地址空间问题(转)

线程的地址空间问题(转)

时间:2023-04-23 12:34:12浏览次数:32  
标签:进程 地址 线程 空间 共享 stack

原文:https://blog.csdn.net/qq_41148436/article/details/121684129

Linux系统把所有线程都当做进程来实现,线程作为轻量级进程(LWP)。线程仅仅被视为一个与其他进程共享某些资源的进程,

是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。线程创建的时候,加上了 CLONE_VM 标记,这样线程的内存描述符 将直接指向 父进程的内存描述符

也就是说,线程的mm_struct *mm指针变量和所属进程的mm指针变量相同所有线程都共享一份地址空间,这不但包括text、heap和进程stack等,甚至还包括了线程stack。

注意此处表达的字面意思:
所有线程共享包括线程栈在内的地址空间,并不意味着所有线程都共享一个栈地址,而是一个线程可以访问另一个线程的栈数据
(虽然并没什么用,但确实可行,通过实验可以验证)。显然,
不同线程有不同的函数调用关系所以不能使用同一个栈
。之所以能做到线程A能访问线程B的栈数据,正是因为内核为每个线程在不同地址处分配了栈空间,从进程的全局地址空间看(cat /proc/PID/maps),每个线程的stack都位于不同的地址段

(比如说进程地址为0-99,A线程使用地址0-9,B线程使用地址10-19,C进程使用20-29,...,有些地址比如80-99用来保存代码段,全局变量等,这部分地址空间每个线程共享)

虽然线程共享地址空间,但线程的私有数据,又是需要单独保存的,这包括了:
pthread属性相关,pthread_attr
线程栈,thread stack
线程本地存储,TLS(thread local storage)

这三种数据位于同一块内存中,是在创建线程的时候,用mmap系统调用从heap分配出来的

标签:进程,地址,线程,空间,共享,stack
From: https://www.cnblogs.com/tan-wm/p/17346199.html

相关文章

  • 线程池使用小结
    在Java中,Executors是一个线程池的工厂类,它可以创建不同类型的线程池。下面是几种常见的Executors线程池,以及它们的使用区别:FixedThreadPool:这种类型的线程池有一个固定的线程数量,一旦线程池中的全部线程都在处理任务,那么后续提交的任务将会等待。如果应用程序需要限制线程数量,......
  • python--多线程:锁 、全局锁、Queue队列以及线程池
    关于如何加锁,获取钥匙,释放锁:lock=threading.Lock():生成锁对象,全局唯一;lock.acquire():获取锁。未获取到会阻塞程序,直到获取到锁才会往下执行;lock.release():释放锁,归回后,其他人也可以调用;【注意事项】:lock.acquire()和lock.release()必须成对出现,否则就有可能造成......
  • jmeter-跨线程组传参的两种方法
    jmeter的变量值不能跨线程组传递。如果变量在开始测试之前已经确定了,我们可以用参数化关联就可以实现。但是如果值时动态生成,每循环一次,值就变化一次,那么怎么办呢?以下两种方法可解决方法一:自定义属性法思路:jmeter中,属性是全局的,是可以动态设置的;而变量是独属于每个线程的第一步......
  • C++ - 多线程之初识多线程
    1.认识多线程传统的C++(C++11之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下的<windows.h>。C++11提供了语言层面上的多线程,包含在头文件<thread>中。它解决了跨平台的问题,提供......
  • Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能
    索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1.限制索引的大小:可以考虑为索引指定大小限制,在存储时仅存储指定大小内的数据。例如,在......
  • InnoDB表空间
    表空间是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为表名.ibd的实际文件。大家可以把表空间想象成被切分为许许多多个页的池子,当我们想为某个表插入一条记录的时候,就从池子中捞出一个对应的页来把数据写进......
  • jvm之线程上下文加载器与SPI
    线程上下文加载器线程上下文类加载器(ThreadContextClassLoader,简称TCCL)是从JDK1.2开始引入的。类java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoadercl)用来获取和设置线程的上下文类加载器。如果没有通过setContextClassLoader(ClassLoader......
  • JTS空间坐标Geometry使用
    Geomtery子类图创建GeometryGeometryFactorygeometryFactory=JTSFactoryFinder.getGeometryFactory();//点Coordinatecoord=newCoordinate(1,1);Pointpoint=geometryFactory.createPoint(coord);//线Coordinate[]coordinates=newCoordinate[]{newC......
  • Vue设置默认加载页面,去掉地址栏#号
     {path:'/',component:Login,//想默认启动的页面},mode:"history"//去掉地址栏的#号 ......
  • 空间点、直线、平面之间的位置关系
    平面平面内有无数个点,平面可以看成点的集合,点\(A\)在平面\(\alpha\)内,记作\(\alpha\inA\);点\(B\)在平面\(\alpha\)外,记作\(B\notin\alpha\)。公理\(1\):如果一条直线上的两点在一个平面内,那么这条直线在此平面内。符号表示:\(A\inl,B\inl\),且\(A\in\alpha,......