嵌入式面試題(一)
阿新 • • 發佈:2019-01-06
嵌入式面試題(一)
1.靜態變數與區域性靜態變數的區別
- 儲存類別:非零的全域性變數,非零的區域性靜態變數儲存在資料段;零初始化的全域性變數或者區域性靜態變數儲存在bss段
- 作用域:靜態變數屬於內連結,只在當前模組內可以被訪問。
- 生命週期:bss段和資料段的生命週期是永久的,從程式開始到程式結束。
擴充套件
變數型別 | 儲存型別 | 連結屬性 | 作用域 | 生命週期 |
---|---|---|---|---|
區域性變數 | 棧 | 無連結 | 程式碼塊作用域{} | 臨時的,在變數空間程式碼執行時開闢,執行結束釋放 |
區域性靜態變數 | bss或者資料段 | 無連結 | 程式碼塊作用域{} | 永久的 |
全域性變數 | bss或者資料段 | 外連線 | 檔案作用域 | 永久的 |
靜態全域性變數 | bss或者資料段 | 內連結 | 檔案內部 | 永久 |
malloc申請變數 | 堆 | 連結屬性根據變數型別 | 程式碼塊作用域 | malloc到free之間 |
const變數 | 只讀段 | -- | 根據變數型別 | 永久的 |
函式 | 程式碼段 | 外連線 | 檔案作用域 | 永久 |
2.C語言呼叫函式過程中,棧是如何變化的?
- 呼叫前的準備:實參入棧,引數從右向左先後入棧;返回地址入棧
- 函式執行:程式控制流程跳轉;儲存caller的棧幀指標;為區域性變數分配空間;執行計算;銷燬區域性變數;恢復caller的棧幀指標
- 控制返回
3.為什麼指標都是佔四個位元組?
C語言的指標變數所佔的空間,是一個字的空間。這其實跟機器有關。
如果你使用的是32位的編譯器,編譯後的指標變數是4個位元組。
如果使用的是64位的編譯器,編譯後的指標變數應該是8位元組
4.程序與執行緒的區別?
- 程序是系統資源分配的最小單位;執行緒是程式執行的最小單位,也是處理器排程的基本單位。兩者均可併發執行。
- 程序有自己獨立的地址空間,每啟動一個程序,系統會為它分配地址空間建立資料表來維護程式碼段、堆疊段、資料段這種操作非常昂貴;執行緒是共享程序中資料,使用相同的地址空間,因此CPU切換一個執行緒的花費比切換一個執行緒要小。
- 執行緒之間通訊更加方便,同一執行緒共享程序下全域性變數和靜態變數;程序間通訊方式要通過IPC方式。
- 程序切換資源大、效率高。所以涉及到頻繁的切換時,使用執行緒要好於程序。同樣如果要求同時進行並且又要共享某些變數的併發操作,只能用執行緒不能用程序。
- 每個獨立程序都有一個程式執行的入口、順序執行序列和程式入口。但是執行緒不能獨立執行,必須依賴於應用程式,由應用程式提供多個執行緒執行程式。
5.程序間通訊?
- 管道。有名管道和無名管道。
- 訊號量。
- 訊息佇列
- 共享記憶體
- 套接字