- 论坛徽章:
- 0
|
我们的程序是这样的:频繁地生成从2M-4M大小的数据包,超过的或者小于的都是非法的,丢掉。如果符合条件将此数据包交由中间件传输。我觉得我们的情况和 yeajchao 兄的情况很相似。这中间的平台包括Windows,Linux,Aix.在程序的编译过程中总是出现因为栈空间不够用而出错的。在Windows平台上我们是知道是如何处理这种情况的。在linx和Aix上我们不知道如何处理,所以才有了上面的疑问。
现在终于知道了在Unix平台下如何处理了。我结合从网上找到的资料和namtso 兄的帮助,把我的总结发上来,感谢大家的帮助!!!!
如果数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。
如果数组定义成全局变量或者局部静态变量,并且不初始化,数组在.bss段中分配,当程序加载时,由操作系统来完成。
如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。
如果数组定义成全局变量或者局部静态变量,并且初始化,数组在.data段中,由链接程序分配空间,当程序加载时,操作系统直接加载映像到内存或者使用内存映射技术。
如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。
不同平台的默认栈的大小如下:
platform default size
===============================================================
SunOS/Solaris 8172K bytes (Shared Version)
Linux 8172K bytes
Windows 1024K bytes (Release Version)
cygwin 2048K bytes
数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。那么如何修改系统默认的栈的大小
呢。
一般说来,在Unix-like平台,栈的大小不是由程序自己来控制的而是由环境变量来控制的,所以就不能通过设置编译器(像gcc)的任何编译标志来设置栈的大小;
在windows平台下,栈的大小的信息是包含在可执行文件中的。它可以在Visual C++的编译过程中设置,但是在gcc中是不可行的。
也可以用Microsoft提供的一个叫作:”editbin.exe“程序来直接修改可执行文件的栈的大小。
下面给出一些更详细的资料:
SunOS/Solaris:
==============
> limit # shows the current stack size
> unlimit # changes the stack size to unlimited
> setenv STACKSIZE 32768 # limits the stack size to 32M bytes
Linux:
======
> ulimit -a # shows the current stack size
> ulimit -s 32768 # sets the stack size to 32M bytes
Windows (在编译过程中的设置):
=============================
1. Select "Project->Setting".
2. Select "Link" page.
3. Select "Category" to "Output".
4. Type your preferred stack size in "Reserve:" field under "Stack
allocations". eg, 32768 in decimal or 0x20000 in hexadecimal.
Windows (修改可执行文件):
=======================================
There are two programs included in Microsoft Visual Studio, "dumpbin.exe"
and "editbin.exe". Run "dumpbin /headers executable_file", and you can see
the "size of stack reserve" information in "optional header values". Run
"editbin /STACK:size" to change the default stack size. |
|