【第二彈】嵌入式工程師面試題

cdfarsight發表於2021-11-07
為大家整理了一些面試經常會遇到的題目,希望這些乾貨對大家面試有所幫助。
第二彈
話不多數直接看題:


一.區域性變數能否和全域性變數重名?
答:能,區域性會遮蔽全域性。
區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。
對於有些編譯器而言,在同一個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義一個同名的區域性變數,而那個區域性變數的作用域就在那個迴圈體內。


二.嵌入式系統中經常要用到無限迴圈,如何用C編寫死迴圈
答:while(1){}或者for(;;)


三.關鍵字static的作用是什麼?
答:在C語言中,關鍵字static有三個明顯的作用:
1) 在函式體,一個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。
2) 在模組內(但在函式體外),一個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是一個本地的全域性變數。
3) 在模組內,一個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。


四.static全域性變數與普通的全域性變數有什麼區別?static函式與普通函式有什麼區別?
答:全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。
全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。
這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式, 當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。
由於靜態全域性變數的作用域侷限於一個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。
從以上分析可以看出,把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。
static函式與普通函式作用域不同。僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static),內部函式應該在當前原始檔中說明和定義。
對於可在當前原始檔以外使用的函式,應該在一個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案。


五.程式之間通訊的途徑有哪些?
答:程式間通訊主要透過管道、訊息、訊號等途徑進行。
1、無名管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程式間使用。程式的親緣關係通常是指父子程式關係。
2、高階管道(popen):將另一個程式當做一個新的程式在當前程式程式中啟動,則它算是當前程式的子程式,這種方式我們成為高階管道方式。
3、有名管道 (named pipe) :有名管道也是半雙工的通訊方式,但是它允許無親緣關係程式間的通訊。
4、訊息佇列( message queue ) :訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
5、訊號量( semophore ) :訊號量是一個計數器,可以用來控制多個程式對共享資源的訪問。它常作為一種鎖機制,防止某程式正在訪問共享資源時,其他程式也訪問該資源。因此,主要作為程式間以及同一程式內不同執行緒之間的同步手段。
6、訊號 ( sinal ) :訊號是一種比較複雜的通訊方式,用於通知接收程式某個事件已經發生。
7、共享記憶體( shared memory ) :共享記憶體就是對映一段能被其他程式所訪問的記憶體,這段共享記憶體由一個程式建立,但多個程式都可以訪問。共享記憶體是最快的 IPC 方式,它是針對其他程式間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程式間的同步和通訊。
8、套接字( socket ) :套解口也是一種程式間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程式通訊。


六.死鎖的4個必要條件
答:
1、互斥:某種資源一次只允許一個程式訪問,即該資源一旦分配給某個程式,其他程式就不能再訪問,直到該程式訪問結束。
2、佔有且等待:一個程式本身佔有資源(一種或多種),同時還有資源未得到滿足,正在等待其他程式釋放該資源。
3、不可搶佔:別人已經佔有了某項資源,你不能因為自己也需要該資源,就去把別人的資源搶過來。
4、迴圈等待:存在一個程式鏈,使得每個程式都佔有下一個程式所需的至少一種資源。
當以上四個條件均滿足,必然會造成死鎖,發生死鎖的程式無法進行下去,它們所持有的資源也無法釋放。這樣會導致CPU的吞吐量下降。所以死鎖情況是會浪費系統資源和影響計算機的使用效能的。那麼,解決死鎖問題就是相當有必要的了。


七.死鎖的處理方式有哪些?
答:死鎖的處理方式主要從預防死鎖、避免死鎖、檢測與解除死鎖這四個方面來進行處理。
預防死鎖:
1、資源一次性分配:(破壞請求和保持條件)
2、可剝奪資源:即當某程式新的資源未滿足時,釋放已佔有的資源(破壞不可剝奪條件)
3、資源有序分配法:系統給每類資源賦予一個編號,每一個程式按編號遞增的順序請求資源,釋放則相反(破壞環路等待條件)
避免死鎖:
預防死鎖的幾種策略,會嚴重地損害系統效能。因此在避免死鎖時,要施加較弱的限制,從而獲得 較滿意的系統效能。由於在避免死鎖的策略中,允許程式動態地申請資源。因而,系統在進行資源分配之前預先計算資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給程式;否則,程式等待。其中最具有代表性的避免死鎖演算法是銀行家演算法。
檢測死鎖:
首先為每個程式和每個資源指定一個唯一的號碼;
然後建立資源分配表和程式等待表
解除死鎖:
當發現有程式死鎖後,便應立即把它從死鎖狀態中解脫出來,常採用的方法有:
1、剝奪資源:從其它程式剝奪足夠數量的資源給死鎖程式,以解除死鎖狀態;
2、撤消程式:可以直接撤消死鎖程式或撤消代價最小的程式,直至有足夠的資源可用,死鎖狀態.消除為止;所謂代價是指優先順序、執行代價、程式的重要性和價值等。


八.程式和執行緒有什麼區別?
答:程式是併發執行的程式在執行過程中分配和管理資源的基本單位。執行緒是程式的一個執行單元,是比程式還要小的獨立執行的基本單位。一個程式至少有一個程式,一個程式至少有一個執行緒。兩者的區別主要有以下幾個方面:
1. 程式是資源分配的最小單位。
2. 執行緒是程式執行的最小單位,也是處理器排程的基本單位,但程式不是,兩者均可併發執行。
3. 程式有自己的獨立地址空間,每啟動一個程式,系統就會為它分配地址空間,建立資料表來維護程式碼段、堆疊段和資料段,這種操作非常昂貴。而執行緒是共享程式中的資料,使用相同的地址空間,因此,CPU切換一個執行緒的花費遠比程式小很多,同時建立一個執行緒的開銷也比程式小很多。
4. 執行緒之間的通訊更方便,同一程式下的執行緒共享全域性變數、靜態變數等資料,而程式之間的通訊需要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多執行緒程式的難點。但是多程式程式更健壯,多執行緒程式只要有一個執行緒死掉,整個程式也跟著死掉了,而一個程式死掉並不會對另外一個程式造成影響,因為程式有自己獨立的地址空間。
5. 程式切換時,消耗的資源大,效率低。所以涉及到頻繁的切換時,使用執行緒要好於程式。同樣如果要求同時進行並且又要共享某些變數的併發操作,只能用執行緒不能用程式。
6. 執行過程:每個獨立的程式有一個程式執行的入口、順序執行序列和程式入口。但是執行緒不能獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
優缺點:
執行緒執行開銷小,但是不利於資源的管理和保護。執行緒適合在SMP機器(雙CPU系統)上執行。
程式執行開銷大,但是能夠很好的進行資源管理和保護,可以跨機器遷移。
何時使用多程式,何時使用多執行緒?
對資源的管理和保護要求高,不限制開銷和效率時,使用多程式。
要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多執行緒。


九. 執行緒是否具有相同的堆疊?
答:真正的程式執行都是執行緒來完成的,程式啟動的時候作業系統就幫你建立了一個主執行緒。
每個執行緒有自己的堆疊。


整理不易,希望評論或推薦一個,謝謝~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996125/viewspace-2840961/,如需轉載,請註明出處,否則將追究法律責任。

相關文章