进程栈大小 与 线程栈大小-转
我在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显示的值
进程栈大小 与 线程栈大小-转相关推荐
- java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?
在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...
- linux存储--进程栈 线程栈 内核栈 中断栈(十六)
一.栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈 ...
- 栈空间_Linux中的进程栈和线程栈
1. 进程栈 进程栈是属于用户态栈,和进程虚拟地址空间 (Virtual Address Space) 密切相关.那我们先了解下什么是虚拟地址空间:在 32 位机器下,虚拟地址空间大小为 4G.这些虚 ...
- Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 ...
- linux的进程栈和线程栈
进程栈:也叫主线程栈.是fork出一个进程的时候自带的线程的栈. 进程栈特点:进程栈在进程的栈区.可动态扩充,但扩充有上限,默认是8M(ulimit可设),如果扩充超出该上限则栈溢出会报段错误(发送段 ...
- 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 栈是什么?栈有什么作用? 首先,栈 (stack) ...
- Linux中的各种栈:进程栈 线程栈 内核栈 中断栈
Linux中的各种栈:进程栈 线程栈 内核栈 中断栈 栈的作用 1. 函数调用 2. 多任务支持 Linux 中有几种栈?各种栈的内存位置? 1. 进程栈 2. 线程栈 3. 进程内核栈 4. 中断栈 ...
- linux限制堆栈大小,进程超过RedHat Enterprise Linux 6的线程堆栈大小限制?
我在RHEL 6.3上运行了几个进程,但由于某种原因,它们超出了线程堆栈大小. 例如,Java进程在启动时在运行时被赋予-Xss256k的堆栈大小,并且在实际代码中使用pthread_attr_set ...
- 【操作系统】线程栈如何分配
测试环境: 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 ...
最新文章
- 企业级监控软件Zabbix搭建部署之使用mutt+msmtp配置Zabbix邮件报警
- 如何关注掘金的所有小伙伴
- 卷积神经网络的一些规则
- linux版本更新,滚动更新与固定版本Linux之争
- 理论上每天有8.5到11.5小时的学习时间,可是为什么只有最多4小时是有效的?如何改善?...
- Java线程简单总结
- Android 开发, Android 安全 精品资料收集
- iOS之性能优化·优化App的启动速度
- Using .NET C# LDAP Library(Novell.Directory.Ldap)
- 《开源容器云OpenShift:构建基于Kubernetes的企业应用云平台》一2.3 完善OpenShift集群...
- 人群与网络:关系的平衡
- [转载] python---python中时间的应用(time模块)
- ZDNS宣布完成B轮融资,根服务器之外,顶级域名系统迎重要机遇
- Spring的三大核心思想
- Linux如何删除用户
- 想要买房的人究竟有多可悲?! --水木周平
- Chromium 文件下载
- SQL Server 数据库无法重命名的解决
- 《星际探索》首席数码绘景师为你解析Blender场景制作
- c语言猜12生肖一种,12生肖2017年运程完整版十二生肖中最老的是哪个生肖_脑筋急转弯_算......
热门文章
- 使用SQL语句添加和删除约束
- 利用iTextSharp把DataTable导出为PDF和RTF(Rich Text Format)文件
- c语言宏定义数组_利用数组处理批量数据 C语言程序编写定义与利用数组技巧全归纳...
- 在cmd里面运行adb命令的时候提示:adb server is out of date. killing...
- Android 中的Intent的某些用法
- AngularJS 的异步服务测试与Mocking
- 如何在windows中使用cmd命令去编译,运行C++程序
- 《机器学习与数据科学(基于R的统计学习方法)》——2.8 读取JSON文件
- Unity GUI屏幕自适应
- lnmp之PDO_mysql.so