形式化方法-实例研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
形式化方法
Formal Methods (实例研究)
裘宗燕北京大学数学学院2006年2-6月
2006年4月
2
实例1:实时内核
问题简介 实时内核
进程状态和内核数据结构(原文档) 内核状态
后台处理 中断处理 总结
2006年4月
3
简介
•嵌入式系统得到越来越广泛的应用
•需要一个小操作系统提供进程调度和中断处理功能•嵌入式系统应用有时是安全攸关和生命攸关的•下面的研究是用Z 描述了一个X 光治疗仪的内核•原系统包含大约50 页汇编代码,生成的目标代码将近1K
•本研究发现原内核实现有可能出现死锁,当时中断都被禁止,处理器空等待进程的运行
–由于实时和并行,这种错误很难通过测试查出并排除
–原来的系统错误并没有威胁到病人安全,一个原因是安装了一个限时硬件,以防控制计算机的软件或硬件错误–但这种错误有可能由于系统的修改或者升级而产生严重的后果•这里介绍简化后的这个实时内核规范
2006年4月4
内核基本情况
这是一个典型的用于嵌入式系统的实时内核:•支持后台处理进程和中断处理器
•若无中断发生,将有一个后台进程被作为当前进程,处于运行中
•当前进程一直运行到自己显式释放处理器,这时调度器将选择另一进程作为当前进程
•每个后台进程有一个就绪标志,调度器只在就绪进程中选择
•如果一个或几个中断激活,就根据它们的优先级(用一个数表示)选出其中最紧急的中断,令相应的中断处理器运行
•中断激活的条件是它们的优先级高于当时已激活的中断,当相应的处理器发出自己已结束的信号时,该中断离开激活状态
•后台进程可以注册到某个优先级,使自己变成一个中断处理器
图1:内核实现的数据结构(取自原文档)
进程,链接成一个环
中断控制下的进程
调度器控制下的进程
ready = true
ready = false
当前活动进程
图2:进程状态
被迫转换(其他进程导致)自主转换(自己执行命令)
中断控制下的进程
调度器控制下的进程
箭头反了
2006年4月7评价
•虽然这种图很常见,但它们的信息可以为应用程序员使用的并不多,其中的许多信息与应用程序员无关,如:
–中断处理器和进程连接为一个环,有就绪标志。这些应用程序员无法检查也不可能利用–调度环只是保证后台进程按固定的顺序运行,应用程序员不能依赖这种情况(否则无法保证应用程序的稳定运行)–图中中断处理器也在环上,也有就绪标志(永远为假),实际上完全可能采用其他实现方式(例如中断处理器从环上取下等)•图2可以看作半形式化描述,把内核描述为一组有穷自动机。但:
–没有给出进程间交互的明确信息(内核需要管理的重要事项)–有些可能状态没有描述(作者举了个例子)
2006年4月8
内核状态
下面开始用Z 做形式化描述。首先考虑系统的状态空间
进程用进程标识符指称,在内核实现中进程标识符是进程控制块的地址。实际表示形式应用程序员不关心,可以定义为一个抽象集合:
考虑定义一个唯一标识符none ,它不是真进程的名字。当处理器闲置时可以说它正在运行进程none ,其他名字可用于真进程
2006年4月
9
内核状态:后台进程
与后台进程相关的状态与调度器有关,定义下面模式:
•background :后台进程的集合
•ready :就绪进程的集合,是调度器选择当前进程时的备选集合•current :当前进程,可以是none 这里没有说ready 和current 之间的关系
2006年4月
10
内核状态:中断处理器
中断用与之相关的优先级表示,优先级是小整数,定义为集合(0 不是中断优先级,作为后台进程的优先级):
中断部分的状态描述为:
handler 是部分单射,每个优先级关联至多一个中断处理器,互不相同enable 是允许中断级的集合,active 是当前需要处理的中断级的集合
内部状态:内核
对于理解内核的工作,有些信息非常关键,如:•没有允许(enable )的中断就不能激活•不同优先级不能共享同一个处理器
这些都是静态的信息,但在程序正文中并没有表现整个内核的状态就是后台和中断两部分的组合:
内核状态包括6个变量:
内部状态:CPU
内核的工作就是确定CPU 运行哪个进程,它属于哪个优先级
这两个观察应该看成系统状态的组成部分。整个系统由CPU 和内核组成下面模式描述CPU 的状态:
•当没有进程运行(CPU 运行none )时running 的值是none •在没有激活的中断,其优先级是0
•CPU 的其他状态信息与这里的规范无关(例如寄存器内容,状态寄存器的状态等等
2006年4月
13
内部状态:系统
在考虑整个系统的状态时,需要刻画CPU 状态与内核状态之间的关系•如果正在运行后台进程,当时CPU 的priority 必定为0
•如果存在激活中断,CPU 一定处于其中最高的优先级,而且正在运行这个优先级的中断处理器
下面是描述整个系统状态的模式:
易见有:
2006年4月
14
后台进程:启动
下面考虑系统状态的变化
有些操作只影响状态空间里的后台进程部分,先考虑这部分操作。操作Start 将一个进程变为后台进程。用下面模式描述:
现有后台进程可以重新Start ,将其置于就绪状态
2006年4月15后台进程:释放处理器
当前后台进程可以通过调用Detach 操作释放CPU ,下面是相应模式:
执行这一操作的前提是当前CPU 运行的是后台进程
操作将CPU 置为闲逛状态(执行none 进程),下面的操作将是选择一个新后台进程,或者出现中断
2006年4月16
后台进程:选择
在CPU 闲置时(运行none ),可能自发地执行选择操作。该操作的模式:
•这一操作不属于内核应用程序接口,而是内核的一个内部操作,可以在其前条件满足的情况下随时发生•其前条件是:
•规范没说如何选择(抽象性),选择策略(调度策略)是实现的责任•一旦某进程被选中,它一定会立即投入运行,因为当时的优先级为0
后台进程:结束
后台进程可以自己执行Stop 操作终止,这个进程就结束了:
•当时正在运行的必须是一个真正的后台进程•结束的进程从background 和ready 集合里删除•当前进程变为none ,又可能执行Select
后台进程:设置就绪/非就绪
后台进程可以在就绪和“挂起”状态之间转换,为描述设置进程状态操作,需要先定义一个枚举类型操作的规范: