面試時候屢次被問到,本身回答感受很通常,回答瞭如下幾點:面試
進程是資源分配的基本單位,可是線程不擁有資源,線程能夠訪問同一進程的資源算法
線程是獨立調度的基本單位,同一進程中,線程的切換不會引發進程切換,從一個進程內的線程切換到另外一個進程內的線程會引發進程切換安全
建立和撤銷進程時,系統都要爲之分配或回收資源,所付出的開銷遠大於建立或撤銷線程時的開銷。一樣的在進程切換時,也會涉及當前執行進程 CPU 環境的保存以及新調度進程 CPU 環境的設置,而線程的切換隻需保存和設置少許寄存器的內容,開銷很小多線程
進程間通訊須要進程同步和互斥手段的輔助,以保證數據的一致性。而線程間能夠經過直接讀/寫贊成進程中的數據段(如全局變量)來進行通訊。併發
這是面試騰訊的面試題,同一進程中有多個線程共享資源,確定會出現資源的不夠用,簡單來講就是可能出現線程死鎖,這裏我當時有點不願定,覺得只能出現進程死鎖,實際上線程也會出現死鎖,面試官問個人時候我就直接按照進程死鎖的來講了ide
這個問題就是要考察死鎖發生的條件,如何避免死鎖。我先是簡單介紹了死鎖發生的四個條件,當時也是想既然是死鎖,無論線程仍是進程發生死鎖的條件應該是一致的,就直接說了,後面查資料證實事實就是這樣的,惟一不一樣之處就是死鎖的基本單元不一樣,一個是進程之間,一個是線程之間。測試
死鎖的四個必要條件:spa
死鎖案例:操作系統
package opersystem;
/** * @author YaboSun */
public class DeadLock {
// 經過一個簡單的例子測試線程死鎖
public static void main(String[] args) {
// 線程a
Thread a = new Thread(new Runnable() {
@Override
public void run() {
DeadLock.method1();
}
});
// 線程b
Thread b = new Thread(new Runnable() {
@Override
public void run() {
DeadLock.method2();
}
});
a.start();
b.start();
}
private static void method1() {
synchronized (String.class) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("線程 a 嘗試獲取integer.class");
synchronized (Integer.class){
}
}
}
private static void method2() {
synchronized (Integer.class) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("線程 b 嘗試獲取 string.class");
synchronized (String.class){
}
}
}
}
複製代碼
那麼避免死鎖的出現就是破壞其中的必要條件:.net
參考: 一句話+一張圖說清楚銀行家算法
當一個進程申請使用資源的時候,銀行家算法經過試探分配給該進程資源,而後經過安全性算法判斷分配後的系統是否處於安全狀態,若不安全則試探分配做廢,讓該進程繼續等待
如何判斷系統處於安全狀態?
若是沒有死鎖發生, 而且即便全部進程忽然請求對資源的最大需求,也仍然存在某種調度次序可以使得每個進程運行完畢,則稱該狀態是安全的。