我在FC3,gcc3.4.2环境下进行该实验,证明线程的栈确实有固定大小,也就是ulimit -a显示的那个值,在我的实验室环境下为10M字节 
实验1: 
#include <stdio.h> 
#include <pthread.h>

int i = 0;

void *test(void * s) { 
int buffer[1024]; 
printf("i=%d\n", i); 
i++; 
test(s); 
}

int main() { 
pthread_t p;

pthread_create(&p, NULL, &test, NULL); 
sleep(100); 
}

并且可以使用如下代码修改这个线程栈的大小为16M: 
实验2: 
#include <stdio.h> 
#include <pthread.h>

int i = 0;

void *test(void * s) { 
int buffer[1024]; 
printf("i=%d\n", i); 
i++; 
test(s); 
}

int main() { 
pthread_t p; 
pthread_attr_t tattr; 
void *stack;

pthread_attr_init(&tattr);

stack=malloc(16*1024*1024); 
pthread_attr_setstack(&tattr,stack,16*1024*1024); //注意这个空间应该从堆中分配,如果从栈中分配,就会出现另一个问题,我们后面会提到 
pthread_create(&p, &tattr, &test, NULL); 
sleep(100); 
}

但是如果用两个线程使用默认大小,来进行上面的实验,两个栈的总和并不是一个线程的二倍,并且这个总和也不是固定值 
实验3: 
#include <stdio.h> 
#include <pthread.h>

int i = 0; 
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

void *test(void * s) { 
int buffer[1024]; 
pthread_mutex_lock(&mutex); 
printf("i=%d\n", i); 
i++; 
pthread_mutex_unlock(&mutex); 
test(s); 
}

int main() { 
pthread_t p1,p2; 
pthread_create(&p1, NULL, &test, NULL); 
pthread_create(&p2, NULL, test, NULL); 
sleep(100); 
}

如果不使用任何线程的话,那么一个进程的栈也不是理论上的2G,而是比一个线程的栈稍(ulimit -a 的值10M)大一些,并且这个栈的大小也不总是固定的 
实验4: 
#include <stdio.h>

int i=0;

void fun() 

int buffer[1024]; 
printf("i=%d\n",i); 
i++; 
fun(); 
}

int main() 

fun(); 
sleep(100); 
}

如果pthread_attr_setstack设置的线程栈是从栈空间分配的话,如果线程栈的大小为10M的话,那么线程栈的大小也不是固定不变了而是和实验4的结果相同(类似?) 
如果线程栈大小为11M的话,那么线程栈的大小也不是固定不变,但这个时候有可能在进程一开始的时候就发生段错误,即使是同一个可执行文件多次不同执行也会出现这种现象,说明这个栈的大小是和gcc的编译与链接无关的

实验5: 
#include <stdio.h> 
#include <pthread.h>

int i = 0;

void *test(void * s) { 
int buffer[1024]; 
printf("i=%d\n", i); 
i++; 
test(s); 
}

int main() { 
pthread_t p; 
pthread_attr_t tattr; 
char stack[11*1024*1024];

pthread_attr_init(&tattr);

pthread_attr_setstack(&tattr,&stack[0],11*1024*1024); 
pthread_create(&p, &tattr, &test, NULL); 
sleep(100); 
}

结论: 
1. 进程的栈大小是在进程执行的时刻才能指定的,即不是在编译的时刻决定,也不是链接的时刻决定,否则就不会有实验5的结果 
2. 进程的栈大小是随机确定的至少比线程的栈要大,但是不到线程栈大小的2倍 
3. 线程栈的大小是固定的,也就是ulimit -a显示的值

进程栈大小 与 线程栈大小-转相关推荐

  1. java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?

    在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...

  2. linux存储--进程栈 线程栈 内核栈 中断栈(十六)

    一.栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈 ...

  3. 栈空间_Linux中的进程栈和线程栈

    1. 进程栈 进程栈是属于用户态栈,和进程虚拟地址空间 (Virtual Address Space) 密切相关.那我们先了解下什么是虚拟地址空间:在 32 位机器下,虚拟地址空间大小为 4G.这些虚 ...

  4. Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 ...

  5. linux的进程栈和线程栈

    进程栈:也叫主线程栈.是fork出一个进程的时候自带的线程的栈. 进程栈特点:进程栈在进程的栈区.可动态扩充,但扩充有上限,默认是8M(ulimit可设),如果扩充超出该上限则栈溢出会报段错误(发送段 ...

  6. 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 栈是什么?栈有什么作用? 首先,栈 (stack) ...

  7. Linux中的各种栈:进程栈 线程栈 内核栈 中断栈

    Linux中的各种栈:进程栈 线程栈 内核栈 中断栈 栈的作用 1. 函数调用 2. 多任务支持 Linux 中有几种栈?各种栈的内存位置? 1. 进程栈 2. 线程栈 3. 进程内核栈 4. 中断栈 ...

  8. linux限制堆栈大小,进程超过RedHat Enterprise Linux 6的线程堆栈大小限制?

    我在RHEL 6.3上运行了几个进程,但由于某种原因,它们超出了线程堆栈大小. 例如,Java进程在启动时在运行时被赋予-Xss256k的堆栈大小,并且在实际代码中使用pthread_attr_set ...

  9. 【操作系统】线程栈如何分配

    测试环境: Linux centos-7.shared 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86 ...

最新文章

  1. 企业级监控软件Zabbix搭建部署之使用mutt+msmtp配置Zabbix邮件报警
  2. 如何关注掘金的所有小伙伴
  3. 卷积神经网络的一些规则
  4. linux版本更新,滚动更新与固定版本Linux之争
  5. 理论上每天有8.5到11.5小时的学习时间,可是为什么只有最多4小时是有效的?如何改善?...
  6. Java线程简单总结
  7. Android 开发, Android 安全 精品资料收集
  8. iOS之性能优化·优化App的启动速度
  9. Using .NET C# LDAP Library(Novell.Directory.Ldap)
  10. 《开源容器云OpenShift:构建基于Kubernetes的企业应用云平台》一2.3 完善OpenShift集群...
  11. 人群与网络:关系的平衡
  12. [转载] python---python中时间的应用(time模块)
  13. ZDNS宣布完成B轮融资,根服务器之外,顶级域名系统迎重要机遇
  14. Spring的三大核心思想
  15. Linux如何删除用户
  16. 想要买房的人究竟有多可悲?! --水木周平
  17. Chromium 文件下载
  18. SQL Server 数据库无法重命名的解决
  19. 《星际探索》首席数码绘景师为你解析Blender场景制作
  20. c语言猜12生肖一种,12生肖2017年运程完整版十二生肖中最老的是哪个生肖_脑筋急转弯_算......

热门文章

  1. 使用SQL语句添加和删除约束
  2. 利用iTextSharp把DataTable导出为PDF和RTF(Rich Text Format)文件
  3. c语言宏定义数组_利用数组处理批量数据 C语言程序编写定义与利用数组技巧全归纳...
  4. 在cmd里面运行adb命令的时候提示:adb server is out of date. killing...
  5. Android 中的Intent的某些用法
  6. AngularJS 的异步服务测试与Mocking
  7. 如何在windows中使用cmd命令去编译,运行C++程序
  8. 《机器学习与数据科学(基于R的统计学习方法)》——2.8 读取JSON文件
  9. Unity GUI屏幕自适应
  10. lnmp之PDO_mysql.so