科幻小说死锁
㈠ 什么是死锁
在并发程序设计中,死锁 (deadlock) 是一种十分常见的逻辑错误。通过采用正确的编程方式,死锁的发生不难避免。
死锁的四个必要条件
在计算机专业的本科教材中,通常都会介绍死锁的四个必要条件。这四个条件缺一不可,或者说只要破坏了其中任何一个条件,死锁就不可能发生。我们来复习一下,这四个条件是:
•互斥(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
•持有(Hold and wait):当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
•不可剥夺(No preemption):执行绪获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
•环形等待(Circular wait):若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有的资源。
解除死锁的必要条件
不难看出,在死锁的四个必要条件中,第二、三和四项条件比较容易消除。通过引入事务机制,往往可以消除第二、三两项条件,方法是将所有上锁操作均作为事务对待,一旦开始上锁,即确保全部操作均可回退,同时通过锁管理器检测死锁,并剥夺资源(回退事务)。这种做法有时会造成较大开销,而且也需要对上锁模式进行较多改动。
消除第四项条件是比较容易且代价较低的办法。具体来说这种方法约定:上锁的顺序必须一致。具体来说,我们人为地给锁指定一种类似“水位”的方向性属性。无论已持有任何锁,该执行绪所有的上锁操作,必须按照一致的先后顺序从低到高(或从高到低)进行,且在一个系统中,只允许使用一种先后次序。
请注意,放锁的顺序并不会导致死锁。也就是说,尽管按照 锁A, 锁B, 放A, 放B 这样的顺序来进行锁操作看上去有些怪异,但是只要大家都按先A后B的顺序上锁,便不会导致死锁。
举例
假如有三个对象A、B、C,我们人为约定它们的锁序是: A 先于 B 先于 C。举例说来,下列锁序均为合法:
• 锁C,放C
• 锁B,放B
• 锁B,锁C,放B,放C
• 锁B,锁C,放C,放B
• 锁A,放A
• 锁A,锁C,放A,放C
• 锁A,锁C,放C,放A
• 锁A,锁B,放A,放B
• 锁A,锁B,放B,放A
• 锁A,锁B,锁C,放A,放B,放C
• 锁A,锁B,锁C,放C,放B,放A
而在上面定义的系统中,可能导致发生死锁典型上锁序列包括:
• 锁B,锁A,锁C,放C,放A,放B
(因为先B后A的上锁顺序违反了锁序约定,如果另一执行绪同时按照先A后B的顺序上锁,则可能由于执行绪甲获得了B,执行绪乙获得了A,而导致双方同时等待对方释放所持有的锁,从而形成死锁局面;解法是将操作序列中增加适当的锁操作,即改为锁B,放B,锁A,锁B,锁C,放C,放A,放B)
或者说,只要拿锁的时候不出现逆序(例如拿着C的时候试图抓B或A,或者拿着B的时候试图抓A),并出现潜在逆序的时候先放掉“小”锁再抓大的,就一定不造成死锁了。
㈡ 何谓死锁产生死锁的原因和必要条件是什么
死锁的原因主要是:(1)
因为系统资源不足。(2)
进程运行推进的顺序不合适。(3)
资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件:(1)
互斥条件:一个资源每次只能被一个进程使用。(2)
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3)
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。(4)
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立
㈢ 什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
的情况下占用资源。因此,对资源的分配要给予合理的规划。
㈣ 卫斯理总共写了多少部科幻小说
倪匡科幻作品集
●卫斯理系列
钻石花 地底奇人 卫斯理与白素 妖火
真菌之毁灭 蓝血人 回归悲剧 蜂云
奇门 透明光 真空密室之谜 沉船
地心洪炉 地图 丛林之神 不死药
规律 支离人 贝壳 仙境
访客 蛊惑 狐变 老猫
天外金球 尸变 笔友 大厦
古声 换头记 原子空间 红月亮
鬼子 新年 魔磁 影子
头发 眼睛 木炭 连锁
愿望猴神 迷藏 天书 玩具
寻梦 后备 第二种人 盗墓
搜灵 茫点 神仙 追龙
洞天 活俑 犀照 命运
异宝 极刑 废墟 密码
血统 谜踪 瘟神 招魂
背叛 鬼混 报应 错手
真相 毒誓 拼命 怪物
探险 继续探险 圈套 烈火女
大秘密 转世暗号 暗号之二 在数难逃
还阳 运舍 开心 将来
改变 闯祸 解脱 爆炸
遗传 水晶宫 前世 新武器
病毒 算帐 原形 活路
双程 洪荒 买命 卖命
考验 传说 黄金故事 聚宝盆
再来一次 雨花台石 真实幻景 风水
湖水 多了一个 游戏 消失
虚像 奇玉 成仙(伪) 阴差阳错
尽头 错变(伪) 决斗(伪) 从阴间来
许愿 到阴间去 合成 环
豪赌 天打雷劈 本性难移 阴魂不散
祸根 成精变人 人面组合 未来身份
移魂怪物 运气 背叛 另类复制
求死(伪) 大阴谋 狂人之梦 鬼车
神山
●原振侠传奇系列 “原振侠传奇”总序
天人 心变 迷路 血咒
海异 宝狐 灵椅 奇缘
精怪 鬼界 魔女 失魂
降头 巫艳 爱神 寻找爱神
大犯罪者 幽灵星座 黑暗天使 迷失乐园
劫数 快活秘方 变幻双星 血的诱惑
催命情圣 黑白无常 自杀阴谋 假太阳
无间地狱 人鬼疑云 魂飞魄散 宇宙杀手
天皇巨星 复活
●亚洲之鹰罗开系列
鬼钟 妖偶 魔像 怪头
巨龙 蛇神 蜂后 火凤
飞碍 夜光 异人 死结
解开死结 困兽 游魂 飞焰
●非人协会 非人协会系列自序
非人协会 鱼人 树妖 两生
大鹰 泥沼火人 三千年死人 主宰
●年轻人与公主系列
神机 暗算 天敌 夜归
四条金龙 消失女神 离魂奇遇 神话世界
足球 宝刀 手套 大宝藏
●木兰花系列
魔画 人形飞弹 死神殿 失踪新娘
巧夺死光表 隐形奇人 超人集团 高空喋血
冰川亡魂 夺命红烛 智擒电子盗 怒歼恶魔团
连环毒计 秘密党 无价奇石 怪新郎
死亡爆炸网
●少年卫斯理系列
少年 天外桃源
●浪子高达系列
微晶之秘 超脑终极战 盗尸艳遇 红粉猫
●倪匡鬼话系列
宝宝不要哭 麻将遇鬼记 摇摇摇,摇到外婆桥 更多>>>>
●其它
倪匡谈金庸 通神 电王 异军
蛇王石 创造 血美人 生死锁
倪匡论金庸 骗徒
㈤ 死锁的概述
死锁的规范定义:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。
一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。
计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。
在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁。例如:事务A 获取了行 1 的共享锁。事务 B 获取了行 2 的共享锁。
排他锁,等待事务 B 完成并释放其对行 2 持有的共享锁之前被阻塞。
排他锁,等待事务 A 完成并释放其对行 1 持有的共享锁之前被阻塞。
事务 B 完成之后事务 A 才能完成,但是事务 B 由事务 A 阻塞。该条件也称为循环依赖关系:事务 A 依赖于事务 B,事务 B 通过对事务 A 的依赖关系关闭循环。
除非某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去。Microsoft SQL Server 数据库引擎死锁监视器定期检查陷入死锁的任务。如果监视器检测到循环依赖关系,将选择其中一个任务作为牺牲品,然后终止其事务并提示错误。这样,其他任务就可以完成其事务。对于事务以错误终止的应用程序,它还可以重试该事务,但通常要等到与它一起陷入死锁的其他事务完成后执行。
在应用程序中使用特定编码约定可以减少应用程序导致死锁的机会。有关详细信息,请参阅将死锁减至最少。
死锁经常与正常阻塞混淆。事务请求被其他事务锁定的资源的锁时,发出请求的事务一直等到该锁被释放。默认情况下,除非设置了 LOCK_TIMEOUT,否则 SQL Server 事务不会超时。因为发出请求的事务未执行任何操作来阻塞拥有锁的事务,所以该事务是被阻塞,而不是陷入了死锁。最后,拥有锁的事务将完成并释放锁,然后发出请求底事务将获取锁并继续执行。
死锁有时称为抱死。
不只是关系数据库管理系统,任何多线程系统上都会发生死锁,并且对于数据库对象的锁之外的资源也会发生死锁。例如,多线程操作系统中的一个线程要获取一个或多个资源(例如,内存块)。如果要获取的资源当前为另一线程所拥有,则第一个线程可能必须等待拥有线程释放目标资源。这就是说,对于该特定资源,等待线程依赖于拥有线程。在数据库引擎实例中,当获取非数据库资源(例如,内存或线程)时,会话会死锁。
在示例中,对于 Part表锁资源,事务 T1 依赖于事务 T2。同样,对于 Supplier表锁资源,事务 T2 依赖于事务 T1。因为这些依赖关系形成了一个循环,所以在事务 T1 和事务 T2 之间存在死锁。
当表进行了分区并且 ALTER TABLE 的 LOCK_ESCALATION 设置设为 AUTO 时也会发生死锁。当 LOCK_ESCALATION 设为 AUTO 时,通过允许数据库引擎在 HoBT 级别而不是 TABLE 级别锁定表分区会增加并发情况。但是,当单独的事务在某个表中持有分区锁并希望在其他事务分区上的某处持有锁时,会导致发生死锁。通过将 LOCK_ESCALATION 设为 TABLE 可以避免这种类型的死锁,但此设置会因强制某个分区的大量更新以等待某个表锁而减少并发情况。

㈥ 死锁是网络的什么极端结果最常见的死锁有哪些
死锁是网络 阻塞/拥塞 的极端结果。最常见的死锁有 直接存储转发死锁、重装死锁和间接转发死锁。
㈦ 死锁例子
三个鸡蛋和三份面粉做成一块蛋糕。现在总共有三个鸡蛋和三份面粉,甲现在有其中的三个鸡蛋,乙现在有其中的三份面粉,两个都需要对方的东西,但都不肯放手,这就产生了死锁。
㈧ 死锁怎么解锁
重启,修改程序!死锁,你以为真的是死了一把锁啊?
由于上面这位,连死锁都不知道,我只好又来,加一句,死锁,是计算机操作系统里的一个概念
㈨ 什么是死锁及死锁的必要条件和解决方法
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
㈩ 什么是死锁,死锁的原因是什么
自锁,不是死锁。自锁是由于摩擦力的存在让本来可以实现转动的机械出现无论加再大力也无法转动的现象。它的原因是由于角度的原因,摩擦分力始终大于动力分力。
