Q1. 什麼是臨界區?什麼是競爭狀態?什麼是同步?
A:
1) 臨界區(critical regions)就是訪問和操作共享數據的代碼段,多個內核任務並發訪問同一個資源通常是不安全的;
2) 如果兩個內核任務可能處於同一個臨界區,就是一種錯誤現象;如果確實發生了這種情況,就稱它為競爭狀態;
3) 避免並發和防止競爭狀態稱為同步(synchronization)。
Q2. 簡要介紹一下死鎖及避免死鎖的方法。
答:死鎖包括自死鎖和ABBA死鎖,
1) 產生死鎖有四個原因:互斥使用、不可搶占、請求和保持,以及循環等待;
2) 避免死鎖的方法有:破壞“不可剝奪”條件、破壞“請求和保持”條件、破壞“循環等待”條件。
Q3. 內核中造成並發執行的原因是什麼?
A:“並發”分為“偽並發”和“真並發”兩種,內核中造成並發執行的原因有以下幾種:
1) 中斷:它可能隨時打斷當前正在執行的代碼;
2) 內核搶占:內核中的任務可能會被另一個任務搶占;
3) 睡眠及其與用戶空間的同步:在內核執行的進程可能會睡眠,這就會喚醒調度程序,調度一個新的用戶進程執行;
4) 對稱多處理:兩個或多個處理器可以同時執行代碼。
Q4. 給出信號量的定義,並說明down()和up()的含義。
A:
1) Linux中的信號量是一種睡眠鎖,它是1968年由Dijkstra提出的,如果一個任務試圖獲得一個已被持有的信號量,信號量會將其推入等待隊列,然後讓其睡眠;當持有信號量的進程將信號量釋放後,在等待隊列中的一個任務將被喚醒,從而可以獲得這個信號量;
2) 信號量支持兩個原子操作P()和V(),前者叫做測試操作,後者叫做增加操作;後來的系統把這兩種操作分別叫做down()和up();
3) down()操作通過對信號量計數減1來請求獲得一個信號量;up()操作用來釋放信號量,該操作也被稱作“提升”(upping)信號量,因為它會增加信號量的計數值。