(2)Linux系統規定:所有孤兒進程都成為一個特殊進程(進程1,也就是init進程)的子進程。
(1).bss
段:儲存未初始化的、初始化為0的全域變數和靜態變數。
(2).data
段:儲存初始化不為0的全域變數與靜態變數、const型常數。
程式設計師在程式中用malloc向虛擬內存的堆空間動態申請內存,用free釋放內存。如果程式存在大量的malloc/free操作且長時間運行,則虛擬記憶體的堆空間很容易產生記憶體碎片
#記憶體碎片是指堆空間剩餘很多離散的空閒內存,但不能滿足malloc的分配請求。記憶體碎片分為外部碎片和內部碎片。下圖描述了部分堆空間的記憶體分配情況,將堆空間以4位元組為單位劃分為許多分配區塊,白色區塊表示空閒內存,淺藍色和深藍色區塊表示已分配的記憶體。假設記憶體分配的最小單位是一個分配塊(4位元組)。
#堆疊:由系統自動分配
#堆疊:由程式設計師手動申請
#堆疊:堆疊區的記憶體大小是固定的,只要申請的記憶體小於棧區剩餘的內存,就可以分配成功,否則棧會溢位。
堆:堆區的記憶體大小是由電腦的虛擬記憶體決定的,
(1)信號量用於執行緒同步,互斥鎖用於執行緒互斥。
(2)訊號量可以為非負整數,可以實現多個同類資源的多執行緒同步;互斥鎖只能為0/1,只能用於一個資源的互斥存取。
(3)信號量可以由一個執行緒釋放,另一個執行緒得到;互斥鎖的加鎖和解鎖必須由同一執行緒分別對應使用,並且多個執行緒使用多個互斥鎖必須注意統一順序,否則可能造成死鎖。
什麼是死鎖?產生死鎖的原因是什麼?
(1)死鎖是指多個進程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程將無法向前推進。
(2)原因:①系統資源不足。 ②資源分配不當。 ③進程推進的順序不合適。
死鎖的四個必要條件是什麼?
(1)互斥條件:一個資源每次只能被一個行程使用,其他行程只能等待。
(2)請求與保持條件:進程已經獲得至少一個資源,但又提出了新的資源請求,而該資源已被其他進程佔有,此時該進程被阻塞,但對已獲得資源仍保持不放。
(3)不可剝奪條件:進程所獲得的資源不能被其他行程剝奪,只能被自己釋放。
(4)循環等待條件:若干進程形成首尾相接循環等待資源的關係。
注意:以上四個條件缺一不可。
死鎖的處理方法?
(1)預防死鎖:透過設定一些限制條件,去破壞產生死鎖的必要條件。
(2)避免死鎖:在資源分配過程中,使用某種方法避免系統進入不安全的狀態,從而避免發生死鎖。
(3)偵測並解除死鎖:允許死鎖的發生,但透過系統的偵測之後,採取一些措施,將死鎖清除掉。
怎麼預防死鎖?
(1)破壞「請求與保持條件」:
①靜態分配,即每個進程在開始執行時就申請它所需要的全部資源:
②動態分配,即每個進程在申請所需的資源時它本身不佔用系統資源。
(2)破壞「不可剝奪條件」:一個進程在阻塞等待期間,其占有的資源被隱式釋放後被其他進程使用,而阻塞等待的資源只有獲得所有需要的資源才能重新啟動。
(3)破壞「循環等待條件」:採用資源的有序分配,將所有資源進行編號,緊缺的資源採用 比較大的編號,一個行程只有獲得較小編號的資源才可以申請較大編號的資源
以上是作業系統面試高頻考點的詳細內容。更多資訊請關注PHP中文網其他相關文章!