深入理解 Linux C 线程栈大小及其影响
在计算机编程的世界里,线程是一个既常见又重要的概念,而 Linux 操作系统则被广泛应用于各种开发环境中。在 Linux C 编程中,线程栈是一个重要的部分,它对程序的运行效率和可靠性都有着重要的影响。本文将深入理解 Linux C 线程栈大小及其影响。
一、线程栈的概念
线程栈(或称函数调用栈)是计算机程序中的一种特殊数据结构,它用于存储当前函数的局部变量、参数以及其他信息。当一个新的函数被调用时,系统会为其分配一个新的栈帧,并将其入栈,所以栈帧是堆栈中一个函数执行过程中的一块内存空间,其中包含了该函数的参数、返回地址、局部变量等信息,函数执行结束后栈帧将被出栈。
二、线程栈的大小
在 Linux C 编程中,线程栈大小通常由系统配置文件指定(/etc/security/limits.conf),默认情况下线程栈大小为 8MB。不过,程序员可以使用 pthread_attr_setstacksize() 函数来设置线程栈大小,从而达到调整程序性能和资源利用的目的。
三、线程栈大小对性能的影响
线程栈大小的设定与程序的性能和资源使用效率密切相关。如果线程栈太小,可能会导致程序崩溃或出现非法访问错误,例如栈溢出等。如果线程栈太大,会浪费大量内存,并可能导致程序性能下降。
可根据程序的实际情况进行线程栈大小的调整。一般来说,栈大小的更佳值应该能够更大限度地充分利用可用资源,同时避免浪费,同时还要让程序的性能达到更佳状态。因此,在程序开发过程中,需要对更多的因素进行权衡和对比,以便达到更好的效果。
四、线程栈大小对资源的消耗
线程栈大小的设定也会影响系统资源的消耗。线程栈过大会增加系统内存的占用,甚至可能导致系统耗尽内存而影响其它运行的应用程序。因此,使用合适的线程栈大小应该综合考虑应用程序所需的线程数量等因素,尽量减少系统资源的占用。
五、线程栈大小的实现
在 Linux 中,线程栈的实现通常是基于动态分配内存的方式,通过 malloc() 或 mmap() 等函数来分配堆内存并将其设为线程栈。
下面是 malloc() 和 mmap() 两个函数的用法示例:
“`C
#include
#include
#include
#define STACKSIZE 1024*1024 // 线程栈大小为 1MB
void* thread(void* arg) {
int i;
int* p = (int*)arg;
printf(“Thread Start! arg = %d\n”, *p);
for (i = 0; i
printf(“Thread Doing %dth step!\n”, i + 1);
sleep(1);
}
printf(“Thread End!\n”);
free(arg); // 释放线程的参数内存
pthread_exit(NULL);
}
int mn() {
pthread_t tid;
int* arg = (int*)malloc(sizeof(int)); // 动态分配内存
*arg = 666;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, STACKSIZE); // 设置线程栈大小
pthread_create(&tid, &attr, thread, arg);
pthread_attr_destroy(&attr);
pthread_join(tid, NULL);
return 0;
}
“`
mmap() 函数比 malloc() 更加灵活,它可以为线程栈预留一段内存空间,进行更加有效的内存管理。下面是 mmap() 函数的示例代码:
“`C
#define STACKSIZE (1024 * 1024) // 线程栈大小为 1MB
…
void* thread(void* arg) {
…
}
int mn() {
pthread_t tid;
int* arg = (int*)malloc(sizeof(int)); // 动态分配内存
*arg = 666;
void* stack = mmap(NULL, STACKSIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstack(&attr, stack, STACKSIZE); // 设置线程栈
pthread_create(&tid, &attr, thread, arg);
pthread_attr_destroy(&attr);
pthread_join(tid, NULL);
munmap(stack, STACKSIZE); // 释放线程栈内存
free(arg); // 释放线程的参数内存
return 0;
}
“`
相关问题拓展阅读:
- Linux 怎么增大可以创建的更大线程数
- linux 一个进程 最多开多少线程
Linux 怎么增大可以创建的更大线程数
检查ulimit -a 的结果,敬正扰查看stack size:
stack size(kbytes, -s) 8192
8192KB 就是栈的大小。不能超过这个栈的数目,因此上面2)分配的buf大小超过了栈限制,得到了setmentation fault。
LInux上,更大线程数目是:
number of threads = total virtual memory / (stack size*1024*1024)
在32位系统上,进程空间是4G,其中0-3G是用户空间(0x0-0xBFFFFFFF), 3G-4G是内核空间。
因此理论上讲,用户空间大小/栈大小=更大线程数。3072M/8M=384,亮旦考虑到系统的占用,主线程等,我的系统上是380. 也许在你的系统上是382.
我们可以减小栈限制或者增大虚拟内存使得线程的数目增加。
检查虚拟内存: ulimit -v
检查栈大小: ulimit -s
设置虚拟内存:ulimit -v 新值
设置栈大小:清雹 ulimit -s 新值
linux 一个进程 最多开多少线程
32为linux系统更大内存地址4G,0-3GB的给用户进程(User Space)使用,3-4GB给内核使用
stack size (kbytes, -s) 10240表示线程堆栈大小
3G/10M=更大线程数,但实际会比这个数小一点,因为程序本身占内存,还有些管理败枣猜线程
可以使用ulimit -s来设置stack size,设置的小一点开辟的线程就多。
同时/usr/include/bits/local_lim.h中的PTHREAD_THREADS_MAX限制了进程的更大线程数
/proc/sys/kernel/threads-max中限制了系统的更大线程数
你自己写个简单的察型代码就能测试出自己系统更大可以岩猛开多少线程
#include
#include
#include
#include
void *foo(void *param)
{
}
int main()
{
int i = 0;
pthread_t thread;
while(1)
{
if(pthread_create(&thread,NULL,foo,NULL) != 0)
break;
i++;
}
printf(“i=%d\n”,i);
return 0;
}
linux c 线程栈大小的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux c 线程栈大小,「深入理解」Linux C 线程栈大小及其影响,Linux 怎么增大可以创建的更大线程数,linux 一个进程 最多开多少线程的信息别忘了在本站进行查找喔。
香港服务器首选树叶云,2H2G首月10元开通。
树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/158924.html<