上一篇博客谈到了普通程序在内存中的分布,这篇博客谈谈文艺程序在内存中的分布。
执行环境
首先缕一下概念吧。在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, 等部分各个线程是共享的