死鎖是由於併發程序只能按互斥方式訪問臨界資源等多種因素引起的,並且是一種與執行時間和速度密切相關的錯誤現象。
死鎖的一般定義:若在乙個程序集合中,每乙個程序都在等待乙個永遠不會發生的事件而形成乙個永久的阻塞狀態,這種阻塞狀態就是死鎖。
死鎖的產生條件:
1.互斥(mutual exclusion):系統存在著臨界資源;
2.占有並等待(hold and wait):已經得到某些資源的程序還可以申請其他新資源;
3.不可剝奪(no preemption):已經分配的資源在其宿主沒有釋放之前不允許被剝奪;
4.迴圈等待(circular waiting):系統中存在多個(大於2個)程序形成的封閉的程序鏈,鏈中的每個程序都在等待它的下乙個程序所占有的資源;
死鎖的預防:
因為獨佔資源必須以互斥方式進行訪問,所以要預防死鎖只能從破壞後三個條件下手了。
1.破壞占有並等待條件:
要破壞這個條件,就要求每個程序必須一次性的請求它們所需要的所有資源,若無法全部獲取就等待,直到滿足為止,也可以採用事務機制,確保可以回滾,即把獲取、釋放資源做成原子性的。這個方法實現起來可能會比較困難,因為某些情況下,程序並不能事先直到自己需要哪些資源,也有時候並不需要分配到所有資源就可以執行。
2.破壞不可剝奪條件:
乙個已占有資源的程序若要再申請新的資源,它必須先釋放已占有的資源。若隨後再需要這些資源,需要重新申請。
3.破壞迴圈等待條件:
將系統中所有的資源設定標誌位、排序,規定所有的程序申請資源必須以一定的順序(公升序或降序)做操作。
實際設計中每個執行緒中鎖的呼叫順序都相同可以有效的預防死鎖的發生。
死鎖的避免:
死鎖的預防是通過破壞產生條件來阻止死鎖的產生,但這種方法破壞了系統的並行性和併發性。
死鎖產生的前三個條件是死鎖產生的必要條件,也就是說要產生死鎖必須具備的條件,而不是存在這3個條件就一定產生死鎖,那麼只要在邏輯上迴避了第四個條件就可以避免死鎖。
避免死鎖採用的是允許前三個條件存在,但通過合理的資源分配演算法來確保永遠不會形成環形等待的封閉程序鏈,從而避免死鎖。該方法支援多個程序的並行執行,為了避免死鎖,系統動態的確定是否分配乙個資源給請求的程序。方法如下:
1.如果乙個程序的當前請求的資源會導致死鎖,系統拒絕啟動該程序;
2.如果乙個資源的分配會導致下一步的死鎖,系統就拒絕本次的分配;
顯然要避免死鎖,必須事先知道系統擁有的資源數量及其屬性。
關於死鎖的一些SQL
查詢表空間 select tablespace name,file id,file name,round bytes 1024 1024 0 total space from dba data files order by tablespace name 設定表空間大小 alter database...
關於爬蟲的一些記錄
普通的文字型爬蟲就不說了,這裡主要說一下在爬取有js指令碼和驗證碼的一些內容時,遇到的坑。作業系統的選擇 由於爬蟲 資訊分析ai web介面都部屬在centos上,且系統部署的最優選擇還是centos。爬蟲方面,文字型爬蟲是基礎,模擬瀏覽器也是必須的。目前模擬瀏覽器就三樣,firefox chrom...
關於torch的一些記錄
int型tensor from torch.autograd import variable from torch import inttensor var variable inttensor 1,0 0,1 檢視size var.size torch.size 2,2 將var.size 轉換為...