嵌入式筆試面試題目系列(一)
本系列將按類別對題目進行分類整理,重要的地方標上星星,這樣有利于大家打下堅實的基礎。
本文均為嵌入式筆試面試高頻題目
一、進程與線程
1、什么是進程、線程,有什么區別?
進程是資源(CPU、內存等)分配的基本單位,線程是CPU調度和分配的基本單位(程序執行的最小單位)。同一時間,如果CPU是單核,只有一個進程在執行,所謂的并發執行,也是順序執行,只不過由于切換速度太快,你以為這些進程在同步執行而已。多核CPU可以同一時間點有多個進程在執行。
2、多進程、多線程的優缺點
說明:一個進程由進程控制塊、數據段、代碼段組成,進程本身不可以運行程序,而是像一個容器一樣,先創建出一個主線程,分配給主線程一定的系統資源,這時候就可以在主線程開始實現各種功能。當我們需要實現更復雜的功能時,可以在主線程里創建多個子線程,多個線程在同一個進程里,利用這個進程所擁有的系統資源合作完成某些功能。
優缺點:1)一個進程死了不影響其他進程,一個線程崩潰很可能影響到它本身所處的整個進程。2) 創建多進程的系統花銷大于創建多線程。3)多進程通訊因為需要跨越進程邊界,不適合大量數據的傳送,適合小數據或者密集數據的傳送。多線程無需跨越進程邊界,適合各線程間大量數據的傳送。并且多線程可以共享同一進程里的共享內存和變量。
3、什么時候用進程,什么時候用線程
1)創建和銷毀較頻繁使用線程,因為創建進程花銷大。2)需要大量數據傳送使用線程,因為多線程切換速度快,不需要跨越進程邊界。3)安全穩定選進程;快速頻繁選線程;
4、多進程、多線程同步(通訊)的方法
進程間通訊:
(1)有名管道/無名管道(2)信號(3)共享內存(4)消息隊列(5)信號量(6)socket
線程通訊(鎖):
(1)信號量(2)讀寫鎖(3)條件變量(4)互斥鎖(5)自旋鎖
5、進程線程的狀態轉換圖
(1)就緒狀態:進程已獲得除CPU外的所有必要資源,只等待CPU時的狀態。一個系統會將多個處于就緒狀態的進程排成一個就緒隊列。
(2)執行狀態:進程已獲CPU,正在執行。單處理機系統中,處于執行狀態的進程只一個;多處理機系統中,有多個處于執行狀態的進程。
(3)阻塞狀態:正在執行的進程由于某種原因而暫時無法繼續執行,便放棄處理機而處于暫停狀態,即進程執行受阻。(這種狀態又稱等待狀態或封鎖狀態)
通常導致進程阻塞的典型事件有:請求I/O,申請緩沖空間等。
一般,將處于阻塞狀態的進程排成一個隊列,有的系統還根據阻塞原因不同把這些阻塞集成排成多個隊列。

(1) 就緒→執行
處于就緒狀態的進程,當進程調度程序為之分配了處理機后,該進程便由就緒狀態轉變成執行狀態。
(2) 執行→就緒
處于執行狀態的進程在其執行過程中,因分配給它的一個時間片已用完而不得不讓出處理機,于是進程從執行狀態轉變成就緒狀態。
(3) 執行→阻塞
正在執行的進程因等待某種事件發生而無法繼續執行時,便從執行狀態變成阻塞狀態。
(4) 阻塞→就緒
處于阻塞狀態的進程,若其等待的事件已經發生,于是進程由阻塞狀態轉變為就緒狀態。
6、父進程、子進程
父進程調用fork()以后,克隆出一個子進程,子進程和父進程擁有相同內容的代碼段、數據段和用戶堆棧。父進程和子進程誰先執行不一定,看CPU。所以我們一般我們會設置父進程等待子進程執行完畢。
7、說明什么是上下文切換?
你可以有很多角度,有進程上下文,有中斷上下文。
進程上下文:一個進程在執行的時候,CPU的所有寄存器中的值、進程的狀態以及堆棧中的內容,當內核需要切換到另一個進程時,它需要保存當前進程的所有狀態,即保存當前進程的進程上下文,以便再次執行該進程時,能夠恢復切換時的狀態,繼續執行。
中斷上下文:由于觸發信號,導致CPU中斷當前進程,轉而去執行另外的程序。那么當前進程的所有資源要保存,比如堆棧和指針。保存過后轉而去執行中斷處理程序,快讀執行完畢返回,返回后恢復上一個進程的資源,繼續執行。這就是中斷的上下文。