科幻小說死鎖
㈠ 什麼是死鎖
在並發程序設計中,死鎖 (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) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。
㈩ 什麼是死鎖,死鎖的原因是什麼
自鎖,不是死鎖。自鎖是由於摩擦力的存在讓本來可以實現轉動的機械出現無論加再大力也無法轉動的現象。它的原因是由於角度的原因,摩擦分力始終大於動力分力。
