linux - 程序运行时需要分配的内存(堆或栈)大小是否会被操作系统所限制?
ringa_lee
ringa_lee 2017-04-17 11:48:40
[Linux讨论组]

初看《编程珠玑》,试着实现了一下第一章的外部排序问题,下面的程序首先用generate_num(int scope, int count)函数在0-9,999,999范围内随机生成1,000,000个正整数,存放在文件all_nums.txt中,格式如下所示:

2357779
3473210
4731848

然后,通过函数disk_sort()对该文件中的所有正整数进行排序并将其排序结果存放在另一个文件sorted_nums.txt中,其思想同书中类似,不同的是这里用的是占8位的char来表示位向量all_nums[n],'0'表示这个数n不在待排序集合中,'1'表示这个数n在待排序集合出现1次,以此类推. char all_nums[MAX_SCOPE]这个数组需要占用10M内存空间。用clang3.5gcc4.8编译成功后,分别在64位的Ubuntu14.04和Windows 8下运行它却发现segmentation fault (core dumped)错误。而同时以十倍缩小整数范围和整数个数至MAX_SCOPE=1,000,000count=100,000就能够顺利运行。完整代码在这里https://gist.github.com/xuefu/9aecc7f2b8ae3ab0ce55。

我的问题是(基于Ubuntu 14.04):

  1. 操作系统对其运行的某个进程是否有内存大小限制,这个值是多少,若有,对堆内存和栈内存的限制是否一样?
  2. 如何来饶过这个限制,使得这个程序成功运行?应该是在编译时设置还是运行时设置?
  3. C语言如何来存储单个的二进制位,像C++中的bitset类一样?
ringa_lee
ringa_lee

ringa_lee

全部回复(1)
阿神

Linux 里面程序能使用的堆内存和栈内存最大值是可以通过 ulimit -vulimit -s 命令设置的,详见 help ulimit

程序也能动态的通过 setrlimit() 来动态的设置最大值,不过允许设置的范围不能超过 ulimit 命令所设置的 hard limit。

C 的标准库并没有封装类似 bitset 的东西(说起来,C 标准库有封装任何的容器么?),你自己写一个吧,应该相当的简单,无非就是一些很直接的 bit 运算。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号