线程共享地址空间的问题

Linux系统把所有线程都当做进程来实现,线程作为轻量级进程(LWP)。

线程仅仅被视为一个与其他进程共享某些资源的进程,而
是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别
。线程创建的时候,加上了 CLONE_VM 标记,这样
线程的内存描述符 将直接指向 父进程的内存描述符
,也就是说,
线程的mm_struct *mm指针变量和所属进程的mm指针变量相同。
所有线程都共享一份地址空间
,这不但包括text、heap和进程stack等,
甚至还包括了线程stack。

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

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

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程和父进程之间的地址空间是不同的。子进程在继承父进程之后,获得了父进程资源的副本,但是它们拥有独立的地址空间。这意味着子进程和父进程之间的地址空间是分开的,互不共享。通过使用写时复制技术和MMU实现了这个特性。所以,子进程在继承了父进程的资源之后,可以独立地运行,而与父进程没有直接关联。因此,每个进程都具有私有的地址空间属性。相比之下,线程和父进程共享相同的地址空间,它们可以直接访问和修改相同的数据和变量。这使得线程之间的通信和数据共享更加简单和高效。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [父进程与子进程、线程与进程之间的关系](https://blog.csdn.net/qq_37535749/article/details/113363045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [进程和线程](https://blog.csdn.net/weixin_45590051/article/details/116530748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值