C 对于静态空间分配来说,多大太大

C 对于静态空间分配来说,多大太大,c,linux,arrays,C,Linux,Arrays,由于我无法找到一种解决方法,如本问题所述,使用套接字描述符的线程特定数据,因此我计划声明一个进程范围的全局数组,其中每行有两个元素pthread_t和int(对于socketfd)。因此,每当线程需要与服务器通信时,它都会使用其标识(pthread_self())在数组中查找其套接字fd,并使用它进行通信 但我想知道,如果我有一个大小为1000的数组,它是否太大/效率太低(我也必须搜索),而不是在连接设置或断开连接时动态分配和释放此结构的空间?1000个线程不会同时存在。因此,阵列并不总是满的

由于我无法找到一种解决方法,如本问题所述,使用套接字描述符的线程特定数据,因此我计划声明一个进程范围的全局数组,其中每行有两个元素pthread_t和int(对于socketfd)。因此,每当线程需要与服务器通信时,它都会使用其标识(pthread_self())在数组中查找其套接字fd,并使用它进行通信

但我想知道,如果我有一个大小为1000的数组,它是否太大/效率太低(我也必须搜索),而不是在连接设置或断开连接时动态分配和释放此结构的空间?1000个线程不会同时存在。因此,阵列并不总是满的


谢谢,除非您在资源非常有限的硬件上运行,否则存储这样一个只有1000个元素的阵列所需的空间可能不会有问题。至于性能,这实际上取决于搜索数组的频率。。。如果搜索在每个线程的生命周期内不会频繁发生,那么速度可能就足够了,除非您有非常高的性能标准

但是,如果您计划为每个连接创建一个线程,并在完成后终止该线程,那么更好的方法是设计一个包含线程从主程序(如套接字文件描述符)需要的所有信息的结构,并在创建线程时将指向该结构的指针作为线程的参数传递


如果每个连接使用一个线程,您可能还需要考虑为线程设置一个小于默认值的堆栈大小,以便创建大量线程不会占用太多的堆栈空间内存。

首先,1000个元素所需的内存乘以pthread_t和int的空间是微不足道的,除非您在嵌入式计算机或其他类似受限系统上

关于搜索时间,通过1000个元素进行简单的搜索可能不会花费很长时间。但是,您可以通过将其作为一个组件来实现,从而使其变得非常快速

您还可以考虑,虽然内存分配慢,但在大多数操作系统上创建新线程也很慢。(但您可以使用a来避免这种情况。)与后者相比,内存分配的成本可能比您想象的要低。与查找线程的上下文相比,您创建新线程的频率是多少


另一条评论:如果您真的关心性能,那么创建一个单独的线程来处理每个连接几乎肯定不是一个好办法,因为线程之间的上下文切换会带来成本。理想情况下,您希望避免上下文切换,但使所有CPU保持忙碌。这意味着您需要与CPU数量相同的线程,并且每个线程执行异步(非阻塞)I/O。

阵列将消耗空间,但速度最快。由于1000个元素可以完全购买到内存中,并且不会作为操作系统交换的一部分驻留在磁盘上,因此您将承担最大缓存未命中的成本。当多个线程查找其信息时,不会因随机访问而产生成本,因为1000行的地址是按顺序排列的;彼此相隔不远

此外,当您为每行添加malloc()时,您分配的每一行不必与先前分配的块相邻,并且当多个线程查找各自的信息时,由于这种动态分配,会涉及某种内存随机访问

除非有内存限制,否则不需要使用malloc()。数组方法简洁且性能友好


HTH

一般来说,如果需要从不同的线程更新数据结构,那么从性能角度来看,多个线程之间共享的单个数据结构是不好的。从一个线程更新结构将迫使其他CPU使其缓存和同步原语(如互斥)失效,从而导致额外的开销和内存障碍。如果将元素与缓存线对齐,可以使效果稍好一些,但这是特定于硬件的

话虽如此,我相信与连接设置成本相比,这种开销可以忽略不计。但别相信我,相信你的档案员