1. limit
1 . 1 基本知识 查看 UNIX 操作系统资源限制 [HP-BILLFEE]limit cputime unlimited filesize unlimited datasize 1048576 kbytes stacksize 8192 kbytes coredumpsize 2097151 kbytes descriptors 2048 files memoryuse unlimited cputime: filesize: datasize: stacksize: coredumpsize: descriptors: memoryuse:
1 . 2 跟 l i mit 相关的注意事项 a. 通过 limit 限定的是某个用户对资源占用的软限制;在内核中, 有关于上述参 数的硬限制, 是针对所有用户而言的。 软限制无法超过硬限制。 b. 针对文件处理程序, 打开文件句柄后, 如果在异常处理环节忘记将文件句柄 关闭, 那么程序占用的文件句柄数就会越来越多。 当超过 descriptors 数量之 后, 就会出现无法打开文件的错误。 c. descriptors 不光是指文件句柄,还包括: socket 句柄等。当 socket 连接建立后, 如果没有正常的将 socket 连接关闭。 那么程序占用的 descriptors 数量也会超 过系统的软限制, 从而出现 socket 连接失败、 文件打开失败等情况。 d. 存储器组织有三种形式: 静态分配、 栈分配、 堆分配。 静态存储分配: 如果在编译时能确定目标程序运行的全部数据空间的大 小, 编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存 储位置, 那么则称这种分配策略为静态存储分配。 栈式存储分配: 子程序数据区为过程的活动记录 (Activation recorder) 简记 AR , 当一过程或函数被调用,活动记录 AR 被压入运行栈。当过程或子程序 返回时, 其活动记录被弹出运行栈, 也就是释放空间。 堆式存储分配: 用户可以自由的申请和释放空间。 数据对象的空间的分配与释放, 可在任何时间按任何顺序进行。 例如: C 和 C++ 的 alloc() 、 malloc() 。 e. 对于占用内存量很大的程序, 需要注意程序 malloc 的累积内存量应当低于 datasize 。 否则 malloc 函数会调度失败, 程序一般会提示: 内存不足。 f. stacksize 太小可能导致部分在其他机器上能够正常运行的程序无法运行, 出 现 coredump 。 因为程序编译完成后, 占用的 stack 大小是固定的, 如果低于 stacksize , 则程序无法装入内存。 例如: 在 Session. h 中定义了 CSession 类的一个成员: filename[MAX_FILE_NUM] [512] ; 该成员大概占用了 50K 的 stack size 。 50K 的 stacksize 导致程序在运行的时候, 无法将数据压栈, 从而出现总线 错误。 如果将 filename 修正成为 static 类型的, 如下: { … static char filename[MAX_FILE_NUM] [512] ; … } ; char CSession: : filename[MAX_FILE_NUM] [512] ; 那么 filename 就不需要反复压栈, 从而程序就可以正常运行。
1 . 3相关技巧 1 . 3.1 检查没有关闭的句柄 查看程序没有释放的句柄的方法, 可以通过: for (i=0;i<FOPEN_MAX;i++) // FOPEN_MAX 是程序可以打开的最大句柄 { if (close(i) ==EBADF) // 或其他的不影响程序功能的函数 printf("bad file handle:%dn", i) ; } 如果是 FILE * 类型, 可以通过 fileno 转换得到 file handle 。 在适当的时候, 用上述的方法检查那些没有关闭。