Rocket

https://mp.weixin.qq.com/s/Pe7FGKzfRufzzYDrl0fQ7g

 
介绍IDPool的实现。
 
 
1. 基本介绍
 
实现从ID池中分配和释放ID的功能。
 
2. 实现
 
1) numIds & idWidth
 
numIds为ID池中ID的个数;idWidth为表示这么多ID所需要的比特数;
 
2) io
 
alloc为从ID池中分配一个ID时所使用的接口,io.alloc.bits为返回的ID号;
free为从ID池中释放一个ID时所使用的接口,id.free.bits为要释放的ID号;
 
3) bitmap
 
位图:标识每个ID是否可用;
 
4) select
 
分配ID时选定的ID号;
 
5) valid
 
是否仍可以从池中分配ID,取决于当前池中是否还有ID可分配;
 
6) take
 
下一个要分配的ID位:
 
7) given
 
要释放的ID位。
 
8) bitmap1
 
分配或者释放之后的位图(bitmap for next clock cycle):
 
9) select1
 
下一个待分配的ID号(从小号开始分配):
 
其中leftOR生成一个掩码,以取出bitmap1中最低的可分配的位:
 
10) valid1
 
是否仍有ID可分配;
 
11) 更新bitmap
 
如果发生ID的分配和释放,则更新bitmap,以及valid(是否仍有ID可分配):
 
12) 更新select
 
更新下一个要分配的ID号:
a. 发生了分配动作;
b. 在没有ID可分配的情况下,发生了释放动作;也就是说,分配是循环(round robin)的,在高ID没有分配过的情况下,即便低ID已经释放,仍然优先分配高ID。
 
3. 附录
 
 
原文地址:https://www.cnblogs.com/wjcdx/p/10940736.html