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

最新文章

  1. mysql 用drop和delete方法删除用户的区别
  2. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法
  3. Elasticsearch 安装中文分词
  4. 页面加载时执行JQ代码
  5. linux笔记:shell基础-bash变量
  6. model的封装+MJExtension 方便后续处理
  7. Relative 定位与Absolute 定位实例
  8. Sublime发布Markdown博客
  9. Introducing Microsoft Sync Framework: Sync Services for File Systems
  10. T-SQL 之 多表联合更新
  11. 【风马一族_xml】xml语法
  12. 收集统计信息让SQL走正确的执行计划
  13. POI做题记录:第二届POI
  14. Libgdx开发ios游戏
  15. POJ 3080 Blue Jeans(后缀数组+二分答案)
  16. Java IO编程全解(三)——伪异步IO编程
  17. 利用exosip DNS CACHE自定义SIP服务器地址和端口
  18. shell IFS
  19. FFT(快速傅里叶变换)摘要
  20. 堆排序(最大堆)的理解和实现(Java)

热门文章

  1. Python3 迭代器与生成器 - 学习笔记
  2. 向Redis里存入数据
  3. Fortify Audit Workbench 笔记 File Disclosure: Spring 文件泄露(Spring框架)
  4. 【Linux基础总结】Shell 基础编程
  5. Power BI:社保、公积金增减
  6. 这些Kubernetes常见安全问题,你遇到过几个?
  7. python 数据类型: 字符串String / 列表List / 元组Tuple / 集合Set / 字典Dictionary
  8. git --添加多个文件
  9. 当Tomcat遇上Netty
  10. Vue+Vuex实现自动登录 升级版