免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2325 | 回复: 6
打印 上一主题 下一主题

关于LINUX下进程栈的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-17 16:10 |只看该作者 |倒序浏览
我设置的堆栈大小是10M,机器是CENTOS 5.4 32BIT
[root@localhost test]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 8192
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 8192
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

但是在测试过程中,居然能够分配11M多的内存,求高手解释,具体代码如下
#include <stdio.h>
#include <memory.h>

int f(int i)
{
  char c[1024 * 1024 * 11];
  memset(c, 0, sizeof(c));
  return (0);
}

int main()
{
  f(1);
  return (0);
}

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
2 [报告]
发表于 2011-04-17 17:13 |只看该作者
你设置的ulimit 值只在当前tty 有效,哪怕20M也有可能

你可以把这个值在 .bash_profile 里设置就全局了。

论坛徽章:
0
3 [报告]
发表于 2011-04-17 17:32 |只看该作者
你设置的ulimit 值只在当前tty 有效,哪怕20M也有可能

你可以把这个值在 .bash_profile 里设置就全局了。 ...
crazyhadoop 发表于 2011-04-17 17:13


目前修改的结果
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATHHOME/bin
ulimit -s 20480
export PATH
unset USERNAME

程序运行的结果
21M
段错误

为何老是分配多1M呢?
代码如下
int f(int i)
{
  char c[1024 * 1024];
  printf("%dM\n", i + 1);
  f(i + 1);
  return (0);
}

int main()
{
  f(0);
  return (0);
}

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
4 [报告]
发表于 2011-04-17 18:10 |只看该作者
这个计数是按1000 还是1024? 是这样的影响吗?

论坛徽章:
0
5 [报告]
发表于 2011-04-17 18:15 |只看该作者
不是吧。
ulimit -s 20480 就是把堆栈大小设置为20M,就是2 * 1024 * 1024字节
我每次分配1024 * 1024字节,也就是1M。
正确的结果应该是20M或者是19M。
现在疑问就是,居然分配的栈空间大于了20M。

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
6 [报告]
发表于 2011-04-17 22:12 |只看该作者
你把变量申请这个放到一个线程中去测试,不要放在进程里。你现在测试的是进程栈,对吧?

线程栈是进程栈的一个子集才对。

论坛徽章:
0
7 [报告]
发表于 2011-04-18 10:29 |只看该作者
放到线程中的话,确实是10M不到,但是为何在进程中是会超过10M的呢?
  1. #include <stdio.h>
  2. #include <pthread.h>

  3. int f(int i)
  4. {
  5.   char c[1024 * 1024];
  6.   printf("%dM\n", i + 1);
  7.   f(i + 1);
  8.   return (0);
  9. }

  10. void *thread(void *argv)
  11. {
  12.   f(0);
  13.   return ((void *)0);
  14. }

  15. int main()
  16. {
  17.   pthread_t pt;
  18.   int pid = pthread_create(&pt, NULL, thread, NULL);
  19.   sleep(5);
  20.   return (0);
  21. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP