程序中的一些限制(基于Linux系统C语言)

今天突然想起来几个问题,在程序运行起来时,存在一些限制:

1,数组的长度(成员的个数)存在限制!(数组定义的空间大小)
2,一个进程里打开的文件数。
3,一个文件的名字的长度。
4,一个进程里创建线程的个数。

数组的长度(成员的个数)存在限制!

  宏观上的限制因素:

    首先,如果要确定一个数组的最大长度,我们需要知道它的数据类型,因此,数组的数据类型是其中一个限制因素。因为不同数据类型的元素大小不同。很显然(我们假设int为4字节,char为1字节),数据类型为char的数组的最大长度是类型为int的数组的4倍。

    另外,我们不难想到,大小(size)的数据类型,也就是数组下标的数据类型,其实也是一个限制因素。在C/C++中,数组下标的类型是std::size_t,因此数组的大小首先不能超过size_t所能表示的大小。这个数据类型是在库文件stdio.h中通过typedef声明的,对于32位程序它被定义为unsighed int,对于64位程序定义为unsigned long。前者能表示的最大大小为2^32-1,后者为2^64-1。

  微观上的限制因素:

    函数内申请的变量,数组,是在栈(stack)中申请的一段连续的空间。栈的默认大小为2M或1M,开的比较小。
    全局变量,全局数组,静态数组(static)则是开在全局区(静态区)(static)。大小为2G,所以能够开的很大。
    而malloc、new出的空间,则是开在堆(heap)的一段不连续的空间。理论上则是硬盘大小。

一个进程里打开的文件数

  这个一般都是1024。Linux上使用命令     ulimit -n   可以查看。

一个文件的名字的长度

       在x86_64 Linux下,文件名的最大长度是255个字符(characters),文件路径的最大长度是4096字符(characters)。

一个进程里创建线程的个数

    可以用ulimit -s命令来查看大小(一般常见的有10M或者是8M)。我们还知道,一个进程的虚拟内存是4G,在Linux32位平台下,内核分走了1G,留给用户用的只有3G,于是我们可以想到,创建一个线程占有了10M内存,总共有3G内存可以使用。于是可想而知,最多可以创建差不多300个左右的线程。

注:ulimit -a 查看程序中的所有限制

猜你喜欢

转载自www.cnblogs.com/wzqstudy/p/10273626.html