多线程程序在内存中的分布

本文探讨了在Linux环境下,线程与进程作为执行环境的相同与不同,特别是线程如何通过clone函数创建并共享特定状态。多线程程序中,每个线程拥有独立的栈,局部变量互不影响,而.text, .data, .bss等部分是共享的,线程间通信直接在共享内存中进行,但需注意同步问题。" 105075501,9340253,CSS详解:从入门到精通,"['CSS', '前端开发', 'HTML', '页面布局']
摘要由CSDN通过智能技术生成

上一篇博客谈到了普通程序在内存中的分布,这篇博客谈谈文艺程序在内存中的分布。

执行环境

首先缕一下概念吧。在linux下,进程(process)和线程(thread)并没有什么区别,都是一种执行环境(context of execution, COE),在linux下统称为task。

每个执行环境都有自己的状态,包括CPU状态,内存映射状态,权限状态(uid,pid)和各种各样的通信状态(打开的文件描述符,管道,信号处理程序等)。

而线程和进程的不同在于线程这种执行环境之间共享了很多状态,至于共享哪些状态不取决于书上说了什么(书上只说了一点点),而是取决于创建这个执行环境的函数提供了哪些选择。

在linux下,线程通过clone这个函数创建,而这个函数和fork一样,其实是用来创建进程的,但是clone在创建进程的时候,会指定调用这个函数的进程和新创建的进程之间共享的内容,比如说pid,代码段,文件描述符等等,所以看上去好像一个进程里面有很多股进程在并行运行,这些并行运行的进程后来有了个新名字:线程。所以大家不必太在意他们叫什么名字,就好比给皇上吃的胡萝卜叫“宫廷胡萝卜”一样,换个名字都是唬人的,只要搞清楚实质就好了。

而我们创建新线程(进程)也可以不和老进程共享那些内容,比如不共享文件描述符,这样线程(子进程)可以打开的文件数就不会受到父进程的限制了(通常一个进程可以打开的文件数是有限制的,可以使用ulimit -n查看,一般是1024);再比如不共享pid,这样新线程也有自己的pid(进程id),从这也可以看出线程其实就是进程。

内存中

概念缕清楚了,后面的内容还是回到默认写法,大家看到线程、进程,心里清楚其实就是COE就好了。

多线程程序和普通程序在内存中的的不同主要表现在栈的不同,每个线程一个栈,所以线程的局部变量不会受其他线程影响。而.text, .data, .bss, 等部分各个线程是共享的

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值