13.3.2 机制与策略

另一个有助于体系结构一致性的原理是机制与策略的分离,该原理同时还有助于使系统保持小型和良好的结构。通过将机制放入操作系统而将策略留给用户进程,即使存在改变策略的需要,系统本身也可以保持不变。即使策略模块必须保留在内核中,如果可能,它也应该与机制相隔离,这样策略模块中的变化就不会影响机制模块。

为了使策略与机制之间的划分更加清晰,让我们考虑两个现实世界的例子。第一个例子,考虑一家大型公司,该公司拥有负责向员工发放薪水的工资部门。该部门拥有计算机、软件、空白支票、与银行的契约以及更多的机制,以便准确地发出薪水。然而,策略——确定谁将获得多少薪水——是完全与机制分开的,并且是由管理部门决定的。工资部门只是做他们被吩咐做的事情。

第二个例子,考虑一家饭店。它拥有提供餐饮的机制,包括餐桌、餐具、服务员、充满设备的厨房、与信用卡公司的契约,如此等等。策略是由厨师长设定的,也就是说,厨师长决定菜单上有什么。如果厨师长决定撤掉豆腐换上牛排,那么这一新的策略可以由现有的机制来处理。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

现在让我们考虑某些操作系统的例子。首先考虑线程调度。内核可能拥有一个优先级调度器,具有k个优先级。机制是一个数组,以优先级为索引,如图10-11或图11-19所示。每个数组项是处于该优先级的就绪线程列表的表头。调度器只是从最高优先级到最低优先级搜索数组,选中它找到的第一个线程。策略是设定优先级。系统可能具有不同的用户类别,每个类别拥有不同的优先级。它还可能允许用户进程设置其线程的相对优先级。优先级可能在完成I/O之后增加,或者在用完时间配额之后降低。还有众多的其他策略可以遵循,但是此处的中心思想是设置策略与执行之间的分离。

第二个例子是分页。机制涉及到MMU管理,维护占用页面与空闲页面的列表,以及用来将页面移入磁盘或者移出磁盘的代码。策略是当页面故障发生时决定做什么,它可能是局部的或全局的,基于LRU的或基于FIFO的,或者是别的东西,但是这一算法可以(并且应该)完全独立于实际管理页面的机制。

第三个例子是允许将模块装载到内核之中。机制关心的是它们如何被插入、如何被链接、它们可以发出什么调用,以及可以对它们发出什么调用。策略是确定允许谁将模块装载到内核之中以及装载哪些模块。也许只有超级用户可以装载模块,也许任何用户都可以装载被适当权威机构数字签名的模块。