1. 程式人生 > >嵌入式面試題(一)

嵌入式面試題(一)

嵌入式面試題(一)

1.靜態變數與區域性靜態變數的區別

  • 儲存類別:非零的全域性變數,非零的區域性靜態變數儲存在資料段;零初始化的全域性變數或者區域性靜態變數儲存在bss段
  • 作用域:靜態變數屬於內連結,只在當前模組內可以被訪問。
  • 生命週期:bss段和資料段的生命週期是永久的,從程式開始到程式結束。
    擴充套件
變數型別 儲存型別 連結屬性 作用域 生命週期
區域性變數 無連結 程式碼塊作用域{} 臨時的,在變數空間程式碼執行時開闢,執行結束釋放
區域性靜態變數 bss或者資料段 無連結 程式碼塊作用域{} 永久的
全域性變數 bss或者資料段 外連線 檔案作用域 永久的
靜態全域性變數 bss或者資料段 內連結 檔案內部 永久
malloc申請變數 連結屬性根據變數型別 程式碼塊作用域 malloc到free之間
const變數 只讀段 -- 根據變數型別 永久的
函式 程式碼段 外連線 檔案作用域 永久

2.C語言呼叫函式過程中,棧是如何變化的?

  • 呼叫前的準備:實參入棧,引數從右向左先後入棧;返回地址入棧
  • 函式執行:程式控制流程跳轉;儲存caller的棧幀指標;為區域性變數分配空間;執行計算;銷燬區域性變數;恢復caller的棧幀指標
  • 控制返回

3.為什麼指標都是佔四個位元組?

C語言的指標變數所佔的空間,是一個字的空間。這其實跟機器有關。
如果你使用的是32位的編譯器,編譯後的指標變數是4個位元組。
如果使用的是64位的編譯器,編譯後的指標變數應該是8位元組

4.程序與執行緒的區別?

  • 程序是系統資源分配的最小單位;執行緒是程式執行的最小單位,也是處理器排程的基本單位。兩者均可併發執行。
  • 程序有自己獨立的地址空間,每啟動一個程序,系統會為它分配地址空間建立資料表來維護程式碼段、堆疊段、資料段這種操作非常昂貴;執行緒是共享程序中資料,使用相同的地址空間,因此CPU切換一個執行緒的花費比切換一個執行緒要小。
  • 執行緒之間通訊更加方便,同一執行緒共享程序下全域性變數和靜態變數;程序間通訊方式要通過IPC方式。
  • 程序切換資源大、效率高。所以涉及到頻繁的切換時,使用執行緒要好於程序。同樣如果要求同時進行並且又要共享某些變數的併發操作,只能用執行緒不能用程序。
  • 每個獨立程序都有一個程式執行的入口、順序執行序列和程式入口。但是執行緒不能獨立執行,必須依賴於應用程式,由應用程式提供多個執行緒執行程式。

5.程序間通訊?

  • 管道。有名管道和無名管道。
  • 訊號量。
  • 訊息佇列
  • 共享記憶體
  • 套接字