1. 程式人生 > >網絡瓶頸、線程死鎖、內存泄露溢出、棧堆、ajax

網絡瓶頸、線程死鎖、內存泄露溢出、棧堆、ajax

https 兩個 獲取鎖 生活 如果 排他性 產生 malloc 競爭

網絡瓶頸:網絡傳輸性能及穩定性的一些相關元素

線程死鎖:多個線程因競爭資源造成的一種僵局

下面我們通過一些實例來說明死鎖現象。

先看生活中的一個實例,2個人一起吃飯但是只有一雙筷子,2人輪流吃(同時擁有2只筷子才能吃)。某一個時候,一個拿了左筷子,一人拿了右筷子,2個人都同時占用一個資源,等待另一個資源,這個時候甲在等待乙吃完並釋放它占有的筷子,同理,乙也在等待甲吃完並釋放它占有的筷子,這樣就陷入了一個死循環,誰也無法繼續吃飯。。。
在計算機系統中也存在類似的情況。例如,某計算機系統中只有一臺打印機和一臺輸入 設備,進程P1正占用輸入設備,同時又提出使用打印機的請求,但此時打印機正被進程P2 所占用,而P2在未釋放打印機之前,又提出請求使用正被P1占用著的輸入設備。這樣兩個進程相互無休止地等待下去,均無法繼續執行,此時兩個進程陷入死鎖狀態。

二、死鎖產生的原因

1) 系統資源的競爭

2) 進程推進順序非法

3) 死鎖產生的必要條件

產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生。
互斥條件:進程要求對所分配的資源(如打印機)進行排他性控制,即在一段時間內某 資源僅為一個進程所占有。此時若有其他進程請求該資源,則請求進程只能等待。
不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能 由獲得該資源的進程自己來釋放(只能是主動釋放)。
請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
循環等待條件:存在一種進程資源的循環等待鏈,鏈中每一個進程已獲得的資源同時被 鏈中下一個進程所請求。即存在一個處於等待狀態的進程集合{Pl, P2, ..., pn},其中Pi等 待的資源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的資源被P0占有,如圖2-15所示。

三、如何避免死鎖

在有些情況下死鎖是可以避免的。三種用於避免死鎖的技術:

  1. 加鎖順序(線程按照一定的順序加鎖)
  2. 加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己占有的鎖)
  3. 死鎖檢測

    那麽當檢測出死鎖時,這些線程該做些什麽呢?

    一個可行的做法是釋放所有鎖,回退,並且等待一段隨機的時間後重試。這個和簡單的加鎖超時類似,不一樣的是只有死鎖已經發生了才回退,而不會是因為加鎖的請求超時了。雖然有回退和等待,但是如果有大量的線程競爭同一批鎖,它們還是會重復地死鎖(編者註:原因同超時類似,不能從根本上減輕競爭)。

    一個更好的方案是給這些線程設置優先級,讓一個(或幾個)線程回退,剩下的線程就像沒發生死鎖一樣繼續保持著它們需要的鎖。如果賦予這些線程的優先級是固定不變的,同一批線程總是會擁有更高的優先級。為避免這個問題,可以在死鎖發生的時候設置隨機的優先級。


    ---------------------
    作者:jayxu無捷之徑
    來源:CSDN
    原文:https://blog.csdn.net/ls5718/article/details/51896159
    版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

    內存泄露:內存申請後,用完沒有釋放,造成可用內存越來越少。C語言

    內存溢出:用戶實際的數據長度超過了申請的內存空間大小,導致覆蓋了其他正常數據,容易造成程序異常,嚴重的,攻擊者可用以此獲取程序的控制權
    棧(stack):系統自動分配空間,char a,運行後自己釋放,像桶或盒子,後進先出
    堆(heap):程序員根據需要自己申請空間,malloc(10),10個字節空間,程序員忘記釋放後會造成內存泄露
    AJAX:不重新加載整個頁面的情況下,可以與服務器交換數據並更新部分網友內容

網絡瓶頸、線程死鎖、內存泄露溢出、棧堆、ajax