用python示範一種死結的產生,python示範
搞多線程的經常會遇到死結的問題,學習作業系統的時候會講到死結相關的東西,我們用python直觀的示範一下。
死結的一個原因是互斥鎖。假設銀行系統中,使用者a試圖轉賬100塊給使用者b,與此同時使用者b試圖轉賬200塊給使用者a,則可能產生死結。
2個線程互相等待對方的鎖,互相佔用著資源不釋放。
#coding=utf-8import timeimport threadingclass Account: def __init__(self, _id, balance, lock): self.id = _id self.balance = balance self.lock = lock def withdraw(self, amount): self.balance -= amount def deposit(self, amount): self.balance += amountdef transfer(_from, to, amount): if _from.lock.acquire():#鎖住自己的賬戶 _from.withdraw(amount) time.sleep(1)#讓交易時間變長,2個交易線程時間上重疊,有足夠時間來產生死結 print 'wait for lock...' if to.lock.acquire():#鎖住對方的賬戶 to.deposit(amount) to.lock.release() _from.lock.release() print 'finish...'a = Account('a',1000, threading.Lock())b = Account('b',1000, threading.Lock())threading.Thread(target = transfer, args = (a, b, 100)).start()threading.Thread(target = transfer, args = (b, a, 200)).start()
什是進程?有幾種基本狀態?進程死結與產生死結的原因
進程是作業系統中的一個核心概念.其概念至今未有嚴格的公認的定義.一般的講,進程是一個具有一定獨立功能的程式關於某個資料集合的一次運行活動.
其基本狀態有3種,即ready(就緒),running(運行),wait(等待).
死結是指,在兩個或多個並發進程中,如果每個進程持有某種資源而又都等待別的進程釋放它們現在保持著的資源,否則就不能向前推進.此時,每個進程都佔用了一定的資源但是又不能向前推進,稱這一組進程產生了死結.
通俗的講,就是兩個或多個進程無止境的等候著永遠不會成立的條件的一種系統狀態.
產生死結的根本原因是系統能夠提供的資源個數比要求該資源的進程數少.其具體原因是1系統資源不足2進程推進順序非法.
問進程調度中產生死結的必要條件是什?解決死結有幾種辦法
產生死結的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 迴圈等待條件:若干進程之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死結的必要條件,只要系統發生死結,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死結。
死結排除的方法:
1、撤消陷於死結的全部進程;
2、逐個撤消陷於死結的進程,直到死結不存在;
3、從陷於死結的進程中逐個強迫放棄所佔用的資源,直至死結消失。
4、從另外一些進程那裡強行剝奪足夠數量的資源分派給死結進程,以解除死結狀態
參考資料:baike.baidu.com/view/121723.htm