计数在软件设计中的应用
计数是一个非常普通的过程,虽其普通,却在软件设计中有很多的应用。在这篇文章中我便列举二三,仅供参考!
动态数据结构的引用计数
在一些动态数据结构中,常常能看到引用计数的影子。这里的引用计数初始化为 0,被使用时加 1,使用完成后减 1。这里引用计数器大于 0 表示数据结构仍然有人使用,此时不能释放它,当引用计数减到 0 之后,表明没有人使用此数据结构,这时就可以调用相应的析构函数安全的释放其占用的内存。
inode 的链接计数器
unix 文件系统中文件的 inode 属性有一个链接计数器,这个链接计数器表示指向当前 inode 的文件数目。当创建一个指向当前文件的硬链接时,这个计数器会加 1。当删除一个硬链接文件时,只有当链接计数器的值减到 0 的时候文件才会真正删除,这是硬链接实现的部分原理。
ls -l 命令打印的文件属性中,第二项就是文件的 inode 中链接计数器的当前值!一个简单的示例如下:
[longyu@debian-10:14:33:36] ~ $ ls -ld *
drwxr-xr-x 3 longyu longyu 4096 8月 20 17:39 backup
drwxr-xr-x 8 longyu longyu 4096 8月 22 22:14 company_file
drwxr-xr-x 2 longyu longyu 4096 7月 24 13:08 Desktop
drwxr-xr-x 2 longyu longyu 4096 8月 16 14:09 Documents
drwxr-xr-x 5 longyu longyu 4096 8月 29 06:39 Downloads
信号量计数器
信号量是操作系统中的一种任务间通信方式。按照功能划分可分为二值信号量与计数信号量。
二值信号量只有 0 与 1 两种值,主要用来解决互斥问题。计数信号量可以有多个值,其值的上限为计数器所能取到的最大值。
对于二值信号量而言,多次的 give 与单次的 give 效果相同,这就意味着中间 give 操作的【丢失】,这一点是由二值信号量的实现决定的。
对于计数信号量,计数器可以【保存】多次 give 的状态,在计数器溢出之前所有的 give 都不会丢失,这意味着我们可以 TAKE 相同的次数。使用计数信号量我们就可以很方便的编写出多个生产者与多个消费者协作的代码。
中断嵌套层数计数器
现代的处理器大多数都支持嵌套中断,这也是实时操作系统统一中断处理流程时需要考虑的问题。这样的问题不仅体现在中断处理过程中,也体现在在中断里面进行上下文切换的过程之中。
通过使用一个计数器我们就可以确定当前的中断嵌套层数,这个层数主要标志了两个不同的状态——有中断嵌套与无中断嵌套。我们在设计中常常要根据不同的状态来编写不同的处理逻辑。
定时器计数器
嵌入式开发中常常用到定时器,定时器实质上就是一个可变频率的计数器。通过确定单次的定时时间与计数次数我们便可以完成定时工作,这与沙漏的原理有相同之处,可以进行类比思考。