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. 附录
略