2011-08-04 85 views
1

我必须管理资源。它基本上是一个唯一的号码,用于识别交换机中的第2层连接。可以有16k这样的连接,所以每当用户希望配置连接时,他/她都需要分配唯一的索引。同样,当用户希望删除连接时,必须释放资源(数字),并且必须可用于配置(并识别)其他连接。截至目前我使用基于无符号字符阵列以保持其位被置位/复位分配/取消分配资源

监视16K号码我使用2048个字节的无符号的字符阵列,位图,其中每一个比特代表一个资源:

unsigned char bitmap_array[2048]; 

有没有更好的方法来做同样的事情,那不涉及如此庞大的静态分配?

+1

任何理由为什么不?你使用的平台内存非常有限吗?静态2k似乎并不好 – amit

+0

您是否存储任何其他与连接有关的信息?你为什么决定使用数字而不是指针? – perreal

回答

0

这是嵌入式的吗? 2k的桌面标准没有那么多内存。你总是可以使用散列表,但你可能不会得到你现在得到的性能。如果它让你感觉更好,也可以动态分配块。

我的C可能有点乱码,但如果我没有记错,应该是这样的:

unsigned char *ptr = (unsigned char *) malloc(2048 * sizeof (unsigned char)); 
//insert null pointer check here 

只记得打电话给free当您完成......

严重的是,2K的静分配可能很好。

+0

谢谢大家的回答:) –

1

另一种方式可能是使用Set [Hash/Tree],其大小将被动态选择。当且仅当分配此资源时,每个元素都在集合中。

这些解决方案的问题是:
1.它会更慢。
2.当元素数量很多时,它会花费更多的内存,然后静态数组。我想坚持使用静态位图数组。

多了一个可能性:

使用同样的伎俩虚拟内存使用(pages)
将你的'数组'划分为N个部分,并创建一个大小为N的额外表格。
表格中的每个元素都将映射到与其相关的数组的一部分。
现在,当您分配资源k时,您将不得不分配k所在的数组部分[[并将所有其他值设置为0]。

它仍然会比块更慢,并且当所有主题都被分配时,它将需要额外的N * 4个字节。

我只有在数据比2k大得多时才会使用这个解决方案。

更多信息:http://tldp.org/LDP/tlk/mm/memory.html