死锁与囚徒困境的辩证关系

最近在复习<操做系统>的重修考试o(╥﹏╥)o, 原来准备戴上耳机来一场硬核复习, 可是发现死记硬背没用还浪费生命, 只好伪装喜好这一门学科, 顺带研究了下一些OS的底层原理, 期间经过研究银行家算法原理时发现了一些有趣的现象, 顺便联想到一些哲学思想, 想和你们分享一下: )web

首先谈谈OS在预防死锁的时候和进程之间进行了哪些博弈.算法

操做系统进程死锁是一个古典问题, 因为进程之间的不信任关系, 2个进程有可能造成一种胶着状态, 即循环等待, 无尽的浪费时间. 为啥会出现这种状况呢? 根据做业的逻辑, 一个进程完成一个任务若是须要2个以上的资源, 必定要前后得到全部资源的控制权后才会开始执行, 好比一个RPG游戏进程保存游戏进度的时候须要更新2个文件: 剧情进度文件A和主角当前属性文件B. 游戏得到了文件A的write权限后并不会当即写入A, 而是再去申请文件B的write权限, 可是若是期间B已经被其它恶意软件得到了write权限(由于对OS而言, 只要有进程索要一个不可共享资源的权限时, 只要合法就没有任何理由拒绝), 这时候游戏会一直等待B的占用被释放, 等待的期间本身对A的控制权不会释放(由于释放了就表明了示弱, 进程之间不信任意味着进程之间不能协商!).浏览器

以上这个状况就造成了一个单向无尽等待, 真实环境下不会出现这种状况, 由于游戏配置文件是属于游戏的私有物, 其余恶意软件没有权限访问这个文件, 游戏内部更不会出现死锁, 由于内部线程之间能够协商和变通.安全

真实状况下的死锁是循环等待形成的, 最简单的循环等待是双向无尽等待, 这是因为2个进程对多个公共资源的恶性竞争引发的服务器

 

若是你对这一套解释云里雾里的话, 这儿有一个很是通俗的类比: 在一个参观中只剩下一双筷子, 2只筷子散落2处, 如今也只有2个顾客, 只要谁抢到了2只筷子就能够先吃饭, 对方就不能干扰, 由于法律规定不能干扰他人吃饭, 法律的规定看似很公平, 可是有一种特殊状况不容忽视: 当2我的分别抢到一只筷子后都期望对方放弃筷子, 让本身先吃, 对方后吃. 从时间效益的角度看, 不管谁先吃后吃, 总时间必定, 没有效率差异, 可是对于食客我的而言, 吃饭前后顺序和本身的利益息息相关, 因而谁都不肯意先放弃手中的筷子, 2我的僵在一块儿, 无尽的等待, 可是这样作又没有违法, 因而这个局面无解, 造成了死锁.性能

这个例子映射了经典的囚徒困境问题, 即我的利益最大化不等于集体最优.操作系统

囚徒困境(prisoner's dilemma)是指两个被捕的囚徒之间的一种特殊博弈,说明为何甚至在合做对双方都有利时,保持合做也是困难的。囚徒困境是博弈论的非零和博弈中具表明性的例子,反映我的最佳选择并不是团体最佳选择。虽然困境自己只属模型性质,但现实中的价格竞争、环境保护、人际关系等方面,也会频繁出现相似状况。线程

如图, 对于一个囚徒来讲, 若是本身和对方都隐瞒对方, 则皆大欢喜, 双双释放, 若是都揭发对方, 双双坐牢1年, 若是本身隐瞒但被对方揭发则本身坐牢5年对方释放, 若是本身揭发对方对方隐瞒则本身释放对方坐牢5年. 若是他们是亲人那颇有可能都坦承从而达到全局最优, 可是若双方都不信任, 对于我的来讲最好的选择是揭发对方, 正中警察圈套!因此说, 在个体之间不信任的前提下, 囚徒困境是很难有解的.blog

仔细想一想看, 真的无解吗? 其实有解, 若是我遇到这种状况, 按之前的性格, 直接上去抽对方也不会和他僵持(夸张了, 表达这个意思). 可是如今我不想和他浪费时间, 若是对方执意要先行, 我就把筷子给他, 等他吃完我再吃, 这样既节省了个人时间也节省了对方的时间, 更节省了饭店的时间. 可是现实中不多有人会这么作, 在没有控制全局的leader的前提下, 大多数人都会僵持.游戏

进程之间难道不也是这样吗? 若是一个进程发现本身的颇有可能处于死锁状态的时候自愿放弃手中的资源, 隔段时间再重新请求, 颇有可能想要的资源顺利获得了, 这是真实可行的, 大家能够本身分析分析是否是这个道理, 一个进程只要暂时牺牲本身的时间, 从数学指望的角度必定能得到以后的全部资源, 从而为本身节省更多的时间. 可是进程和人是同样的, 确实有少部分进程心胸宽广, 愿意放弃资源, 或者它以为资源不充足的状况下能够照样办事, 办完后把手头的资源也释放, 让对方进程从而也得以继续, 可是大多数进程都是谁都不肯先妥协, 谁都不肯先吃亏, 相互抵制, 从而形成了囚徒困境, 产生了死锁.

既然囚徒困境在充满冷漠和质疑的世界上是无解的, 那就须要一个leader来控制局面, 这个leader就是OS. 但正如以前抢筷子问题, 即便两人的争吵引来了城管, 城管由于公平的原则也不能剥夺任何人的筷子给与对方, OS也不能强行把一方的资源给另外一方先使用, 只能寻找其余的办法, 因而就产生了'银行家算法'.

回到以前的饭馆, 饭馆经理通过深思熟虑以后, 制定了一条行为准则, 专门针对饭店里存在的死锁问题, 这个规则不是为了死锁发生后怎样解决, 而是为了从根源上预防死锁, 法案规定, 筷子和其余餐具再也不直接让顾客自由拿取, 而让顾客排队领取, 而且每一个顾客进门以前要登记, 同时汇报本身对每一种餐具的数量需求, 若是是团体顾客就提供每人的需求总和.

为了简化例子, 仍是拿刚刚2我的挣一只筷子的状况吧, 2我的A和B对筷子的需求量都是2, A申请领取第一支筷子的时候, 服务员会模拟一个假设: 假如把筷子给了A, 剩下1只筷子, 和一个须要2只筷子的B, 这样是否安全? 若是我把另一只先给A, 等A知足后再把2只筷子给B, 正好, 没有危险. 因而服务员愉快的将第一支筷子给到A. 而后当B索要一只筷子的时候, 虽然库存中正好还有1只筷子, 但服务员仍是拒绝了B的请求, 缘由是, 若是筷子给了你, 大家有可能发生死锁.

这项规定的逻辑是, 你若是须要2只筷子, 却只获得了1只, 那你有权利不满, 有权利争吵; 可是若是2只筷子都给你了, 你给我闭嘴乖乖吃饭, 快点吃饭, 吃完把筷子还给我! 若是你进门时说只须要1只筷子, 如今要2只, 对不起, 给我滚! 这个方法是有代价的, 由于也许A并非同时须要2只筷子, 有可能A用一只也能吃(也正打算用1只吃饭, 另一只忽然不想要了), 这种状况下也许把第二只筷子给到B是全局更好的方案, 可是服务员也不想冒险, 由于万一一会A又来索要第2只筷子了怎么办.

这就是银行家算法, 银行家算法是一种妥协的算法, 虽然避免了死锁可是有机会成本的开销. OS不可能假定每一个进程都是高素质的, 只能考虑最坏的状况, 也就是每一个进程不获得全部的资源不死心. 在每一个进程请求资源的时候进行假设, 判断是否会形成不安全状态. 但如图所示, 不安全状态是包含死锁状态的, 也就是说系统不安全并不必定形成死锁, 银行家算法经过封杀全部不安全状态从而全面避免了死锁, 但资源浪费的状况也没法杜绝. 悠悠青史告诉咱们, 在没有第三方权威约束下独立思惟永远没法相互协做, 只能实现个体最优, 一个社会没有上帝引导, 经过自由发展永远没法共产.

 

总结

银行家算法的本质是OS的猜想算法, 是OS与进程以及进程与进程间的不信任引发的. 计算机软件自己就是由多个不信任的软件层结合起来的, 好比OS不信任浏览器, 浏览器不信任服务器, 服务器不信任用户, 在咱们web领域, 这种4层不信任体系成为了了网页性能的瓶颈, 每一层不信任都带来了额外的时空开销. web的将来应该是高内聚低耦合的, 浏览器也应该从应用软件变成系统软件, 从而减小臃肿的层次结构, 提升互联网服务的性能, 目前为止这仍是一场梦. 

相关文章
相关标签/搜索