在进行系统编程时,经常遇到对象的生命周期这一概念。我理解的对象生命周期周期,就是一个对象从创建到销毁的所有状态,对象在不同的状态下会有不同的行为。
生命周期的概念,通常给出现在需要长时间运行的软件中,脚本工具中一般不会单独考虑对象生命周期。例如:后台服务、操作系统、应用框架、游戏。其主要目的是为了防止资源管理出错。例如:资源泄露、或者被多线程破坏。我们为对象增加各种各样的生命周期是有原因的。我总结了以下几种:
-
在对象的关键节点执行回调函数。例如,为了监控性能和程序执行情况,需要在应用创建时打一个时间点,在应用显示时再打一个时间点,应用销毁时打一个时间点。
-
为了使资源正确销毁。有些对象从创建后,在任何时间点都可以销毁,销毁时必须释放所有资源。而此时,某些资源可能还在创建过程中,不可立即打断。所以在出现销毁信号时,不能真正的销毁,而是只能设置一个生命周期标志位,等资源创建完成后再销毁。
-
为了多线程之间同步。对象在某些情况下,由于数据同步等原因,是不可以被修改的,这时候就需要禁用掉对象修改的功能。某些情景下可以用锁来实现,实现非阻塞的修改的话,也可以用 try_lock 来实现。如果由于性能原因不能用锁的话,这就需要通过状态位来实现了。
那么,在工作中,如何看懂一个程序中的声明周期设计?
我认为只能通过设计文档 和 代码来看懂了。
- 有设计文档,先看设计文档
- 从代码中找 标志位 相关的代码。
- 可以请教组内的专家
工作中,如何设计一个对象的生命周期?
设计生命周期就是定义程序在不同的时机下,对自己所拥有的资源,可以做什么,不可以做什么。
我认为可以先学习一个标准的生命周期设计,从优秀的设计中学习。例如:Linux 中 进程和线程的生命周期管理。
Linux 的任务有 5 种状态
- 执行态
- 就绪态
- 挂起态
- 停止态
- 僵死态
Linux 任务所拥有的资源有:
- 调度信息:调度优先级
- 标识符:标识任务,用于限制资源访问
- 进程间通信
- 进程间关系:父进程、子进程、兄弟进程
- 时间和计时器:消耗的cpu时间、用户定义的计时器。
- 文件系统:进程打开的文件
- 地址空间:系统分配给进程的虚拟地址空间
- cpu 专用上下文:寄存器、栈信息。
这5中状态包含了一个对象从创建到销毁甚至异常的各种状态之间的转换。把这几个状态搞清楚后,可以套用在生命周期的设计中。
对五种状态的描述如下
- 运行态:对应程序可正常执行的两个状态,执行态和就绪态
- 可中断:这是一个挂起态,此时进程正在等待一个事件结束、资源或另一个进程的信号。
- 不可中断:这也是一个挂起态,此时进程在等待一个硬件条件,不会接收任何其他信号。
- 停止:进程被终止,只能由另一个进程的主动动作恢复。例如,正在调试的应用,就是被调试器控制程序的执行与停止。
- 僵死:进程已被终止,但其进程表中的任务结构由于某些原因还未被清除。
有了以上的知识,然后在工作中灵活的套用模型即可。