2011-08-04 207 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