发布网友 发布时间:2024-10-04 01:37
共1个回答
热心网友 时间:2024-12-13 09:27
救命,堆栈空间不足是什么错误?
1)程序中有两个这样的char数组,算下来,一个char是一个字节,两个2048*2048的数组便是8MB的空间。
2)而使用ulimit-a查看Linux系统中设置的栈空间大小stacksize,8192(单位KB),即8MB,,也可用ulimit-s可以只看栈空间大小。可见栈空间已经不够用了,在调用该函数的时候,在栈空间中为该函数开辟空间,因为已经开辟不出这么大的空间了,于是段错误了,程序目前尚未进入该函数,因为在装载该函数的时候挂掉了。所以即使给该函数第一行加输出信息,也输出不了。
3)使用ulimit-s10240修改栈大小为10M,重新运行程序,程序正常运行无段错误
4)由此可证,的确是系统栈空间大小太小导致程序段错误,当然如果改成newmalloc等方式在堆区申请空间则不会段错误。
linux怎么管理空闲内存?
内存组织层次:页式管理—>(numa)—>node的zonelist—>32位DMA/NORMAL/HIGHMEM三个区,64位没有高端内存—>伙伴分配系统—>slab/slub/slob2.创建进程时内存分配:实际上只分配task_struct和thread_info的内存,而且很可能是从slab缓存中分配的,当进程运行时由于缺页中断,才由内核层具体分配物理内存并与vm挂接3.malloc是cruntime中的实现,是上层库的内存分配层,至于内核层的,可以看看__alloc_pages/alloc_pages/kmalloc(小内存直接slab,大内存还是alloc_pages)/vmalloc(alloc_page分配不连续的物理页,映射到连续的vm_struct中的pages指针数组)/vmap/map_vm_area等几个函数