linux下进程和线程的空间分配

关于进程栈和线程栈总结:

(1)进程栈大小时执行时确定的,与编译链接无关
(2)进程栈大小是随机确认的,至少比线程栈要大,但不会超过2倍
(3)线程栈是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改
(4)一般默认情况下,线程栈是在进程的堆中分配栈空间,每个线程拥有独立的栈空间,为了避免线程之间的栈空间踩踏,线程栈之间还会有以小块guardsize用来隔离保护各自的栈空间,一旦另一个线程踏入到这个隔离区,就会引发段错误。

查看线程栈大小:


1.png

可以看到默认情况下线程栈大小为8192(8MB),可以使用ulimit -s xxx修改线程默认栈大小

(1)检查线程栈默认大小(8MB)

2.png

线程执行2030次之后,出现段错误(20304K=8120K)
3.png

(2)修改栈大小,使用pthread_attr_setstack()
4.png

如上修改栈大小为16MB,其中线程栈的空间从堆中进行分配
5.png

程序执行4063次后出现段错误(4063
4KB)

(3)创建两个线程,使用默认栈大小执行

6.png

创建两个线程,默认单个线程栈大小为8M
7.png

执行结果1:程序执行4009次之后段错误(40094KB)
8.png

执行结果2:程序执行3380次之后段错误(3380
4KB)

总结:

两个线程时,两个线程栈的总和不是固定值,也不是线程栈的2倍

(3)不使用任何线程

9.png


执行结果1:程序执行2538次后段错误(25384KB)
3.png

执行结果2:程序执行2537次后段错误(2537
4KB)

总结:

进程的栈大小不是固定的,而是比线程栈大一些

(4)线程栈从进程栈中分配

4.png

5.png

执行结果1: 程序执行2536次后段错误(25364KB>8M)
6.png

执行结果2:程序执行2537次后段错误(2537
4KB>8M)

总结:

线程从进程栈分配空间,大小并不是固定的,如果分配空间大于进程栈空间,那么直接运行时出现段错误。

你可能感兴趣的:(linux下进程和线程的空间分配)