HOME ABOUT CONTACT

軟韌體工程師面試考題 - 專有名詞解釋

Rain February 4, 2024
Outline

程式碼相關(C/C++)

作業系統和計組相關

程式碼相關(C/C++)top

題目1:

#error

參考解答:

一種巨集指令,用於編譯時,輸出錯誤訊息。

題目2:

#warning

參考解答:

一種巨集指令,用於編譯時,輸出警告訊息。

題目3:

說明struct和union:

參考解答:

兩者主要差異在於記憶體空間的佔用。struct佔用的記憶體空間至少為成員的總和; union佔用的記憶體空間為所有成員裡佔用最大空間者的size。

題目4:

說明volatile,能否用volatile和const來修飾同一個變數?能否用volatile來修飾指標?

參考解答:

i. volatile和const可以修飾同一個變數
ii. volatile可以修飾指標
volatile修飾詞是告訴編譯器在後面被修飾的變數在程式執行時,是隨時都有可能改變的。
通常編譯器在編譯變數時,會優化變數讀取和儲存操作,當有讀取或儲存操作時,是使用暫時存放在暫存器裡(CPU的暫存器)的變數值。
然而當被volatile修飾的變數有讀取或儲存操作時,是直接以變數的位址進行操作。volatile常見於多執行緒程式。

題目5:

說明傳值呼叫、傳址呼叫、參考呼叫 (Call by value, Call by address, Call by reference)

參考解答:

三者差別在於,Call by Value是將實數複製一份給函式的參數做運算,函式內所有的運算不會直接影響到實數的值。
Call by Address是直接取得實數的位址,並以指標型態作為函式的參數,讓函式可對其指標進行處理與運算。
Call by Reference也是取得實數的位址,並以非複製方式的變數型態作為函式的參數,讓函式可直接對該位址的變數進行處理與運算。

Call by Value最多只能回傳一個值,而Call by Address和Call by Reference的好處就在於可以回傳多個值。

Call by Value:


int func(int a , int b)
{
    …
}
                    
int main()
{
    int a, b;
    func(a ,b);

    return 0;
}
                        

Call by Address:


int func(int *a , int *b)
{
    …
}
                    
int main()
{
    int a, b;
    func(&a ,&b);

    return 0;
}
                        

Call by Reference:


int func(int &a , int &b)
{
    …
}
                    
int main()
{
    int a, b;
    func(a ,b);

    return 0;
}
                        

題目6:

多載函式(Overloading Function)

參考解答:

意旨相同的函式名稱,但參數型態或個數不同,藉此達到不同操作的函式處理。

題目7:

struct和class的差別

參考解答:

兩者差異在於struct是一堆不同型態變數的集合;而class除了有struct的特性之外,它是相同性質物件的藍圖,
其成員可以有不同型態的變數之外,還能有方法、建構式、解構式以及繼承關係。class是C++延伸的概念,而struct常見於C。

題目8:

說明建構式、解構式

參考解答:

Ans: 建構式是類別被建立時執行的方法,可初始自身的成員或執行其他函式等等。
解構式是類別一旦被delete時執行的方法,常見的執行為關閉檔案、釋放成員占用的記憶體等等。

題目9:

說明public, private, protected(繼承權限)

參考解答:

public: 任何引用此類別的地方都可以存取。
private: 只能在自身類別中存取(自身的函式成員,或稱方法)。若子類別繼承,也不能在子類別中使用。
protected: 除了自身類別能存取之外,也允許子類別存取。

題目10:

this pointer

參考解答:

用於類別的非靜態函式成員存取類別本身的指標。

題目11:

虛擬函式(Virtual function)

參考解答:

若類別含有至少一個虛擬函式,則該類別稱之為「抽象類別」。
虛擬函式在抽象類別裡只有方法宣告,沒有實現層(程式碼實作的部分),實現層是由衍生類別來實現。

題目12:

動態連結和靜態連結

參考解答:

靜態連結是在編譯時期,物件和方法就連結在一起。動態連結是在程式執行時,隨著不同的條件情況,才連結到對應的方法。

題目13:

樣板函式 (Template)

參考解答:

可定義相同運算,但不同資料型態的函式,是用來簡化多載函式的語法。可用class宣告資料型態的代名,宣告寫法如下:

template< class T >

T Func_Name(T arg_name)

T 能代表所有變數的型態,稱之為樣板(Template)。class關鍵字在樣板宣告是用來指定共用型態的代名。
樣板可定義函式(Function)和類別(Class)。typedef雖然也可以替換變數名,但和template最大差異是不能代名所有型態的變數。

作業系統和計組相關

題目1:

描述競爭情形、死結(Deadlock)

參考解答:

競爭情形發生在兩個執行緒對同一個變數進行讀取並更新結果的時候。死結發生必須滿足以下四種條件:
i. 互斥: 一個資源一次只能被一個process使用。
ii. 把持並等待: process取得一個資源之後又等待其他的資源。
iii. 搶占: 資源只能由process自己釋放,不能由其他方式釋放。
iv. 循環等待: 每個process都握有另一個process請求的資源,導致每一個process都在等待另一個process。

題目2:

如何避免Race Condition(競爭危害)

參考解答:

在多執行緒都會存取的資源加上互斥鎖(Mutex)即可

題目3:

Process和Thread的差異

參考解答:

Process如同thread的集合。
Process是已經載入到記憶體裡準備交給CPU處理的程序(還未載入到記憶體的稱之為Program),而CPU每次只能執行一條thread,process可以含有至少一條以上的thread(process本身有一條唯一的main thread)。

題目4:

說明Hazard

參考解答:

指令在執行時,可能會發生亂序,是指讀取和寫入資料之間的時間或空間的相關性,導致Hazard發生。
發生可能性有三種:
i. 先寫後讀(RAW)
ii. 先讀後寫(WAR)
iii. 寫後寫(WAW)
[以上這些情況都是發生在前一個指令還未操作完就執行下一個指令]

題目5:

說明Kernel mode和User Mode

參考解答:

在Linux裡,虛擬位址空間存取權限被分成Kernel Mode和User Mode。當有使用者程式呼叫了系統呼叫或是任何的中斷發生時,就會進入Kernel Mode,並將執行權交給了作業系統,而執行內容隨著系統的不同而有所不同,當系統執行完成後,就會將執行權交還給使用者程式,即回到User Mode。

題目6:

Mutex和Semaphore的差異和用途

參考解答:

Mutex是指資源由某個執行緒佔用時,就該由某個執行緒釋放該資源,屬於一個鎖和一個鑰匙的概念。Semaphore則是該資源可以由限定數個執行緒佔用,且若某個執行緒釋放資源後,可交給下一個需要資源的執行緒,屬於多鎖多鑰匙的概念。

Last updated:

Related Artical List

  1. 軟韌體工程師面試考題 - 程式碼考題
  2. 2024年台灣谷歌(Google)面試心得
  3. CAD工作對應徵EDA職缺有哪些幫助
  4. 如何準備外商軟體公司的面試
  5. 我在竹科從台商到外商之路
  6. 聊聊我覺得有毒職場具備了哪些特徵

Article List