1. 程式人生 > >嵌入式常見面試簡答題

嵌入式常見面試簡答題

1、阻塞與非阻塞的區別
阻塞就是在執行相關函式命令時,如果條件不滿足那麼該執行緒就會阻塞再那裡不動,直到等待條件滿足才繼續執行 ,但是線上程在等待的期間會交出CPU排程,因此並不影響cpu效率;
非阻塞就是在執行非阻塞屬性的函式命令時,並不會等待條件滿不滿足,呼叫後直接返回,因此在用非阻塞的時候要注意非阻塞執行的時候可能是執行失敗的,因為他沒有等待條件就執行了。而阻塞式則返回肯定是成功的,

阻塞式執行一定是成功的相對於非阻塞而言,但是阻塞式在多路IO的時候就會出現併發式IO問題。因為阻塞式卡執行緒,讓該執行緒阻塞在那裡而不進行執行。

2、Http是長連線還是短連線
短連線 連線->傳輸資料->關閉連線
HTTP是無狀態的,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連線,但任務結束就中斷連線。也可以這樣說:短連線是指SOCKET連線後傳送後接收完資料後馬上斷開連線。

長連線 連線->傳輸資料->保持連線 -> 傳輸資料-> 。。。 ->關閉連線。 長連線指建立SOCKET連線後不管是否使用都保持連線,但安全性較差。 
HTTP也可以建立長連線的,使用Connection:keep-alive,長連線多用於操作頻繁,點對點的通訊,而且連線數不能太多情況

2、Tcp連線的過程
三次握手過程;
伺服器;呼叫socket獲取一個網路插口,呼叫bind將本地IP與埠繫結,呼叫listen進入監聽模式
客服端;呼叫sokcet並繫結同一個網路插口,呼叫connect進行連線;就是向伺服器傳送syn訊號,然後等待伺服器呼叫accept接收則給客服端會syn+ack訊號,客服端再次想伺服器發生ack訊號保證確認,這樣就完成了TCP連線,他們之間就可以通過socket埠進行資料通訊。

四次揮手
客服端呼叫close請求關閉socket就是向伺服器發生FIN訊號請求伺服器關閉,並進入FIN-WAIT-1狀態
伺服器收到FIN訊號,將要傳輸的資料傳送完後,發生ACK訊號。
客服端收到ACK後進入FIN-WAIT-2狀態等待伺服器發生FIN訊號
伺服器傳送FIN訊號,
客服端回ACK訊號,進入TIME-WAIT。

3、程序通訊與執行緒通訊的方式
多程序通訊其實就是多個程式之間的通訊,又因為MMU虛擬地址對映的問題,因此導致多程序通訊困難,
方法有;無名管道,有名管道,訊息佇列,訊號量,共享記憶體,socket套接字
多執行緒通訊就是同一個程式之間的不同函式通訊,一個全域性變數就可以搞定,因此比較簡單,
執行緒同步的方法有;訊號量,互斥鎖,條件變數,

4、管道通訊是怎麼實現的
無名管道就是父子程序之前,通過在核心中建立管道完成通訊。
具體做法;在父程序fork之前建立pipe管道,則在子程序中也有對應的pipe的讀寫fd,從而達到通訊的效果,注意pipe被閹割成單向通訊了。

5、建立執行緒的方法
pthread_creat 自己建立一個執行緒
一個程序就是一個主執行緒
fork一個子程序同時也就產生了一個子執行緒

一個執行緒的最終去處要麼被父執行緒回收,要麼被分解
pthread_join回收
pthread_detach分離

6、程序與執行緒的區別
linux中執行緒式輕量級的程序,一個程序可以有多個執行緒,執行緒依賴與程序而存在。
程序相當與一個程式,而執行緒相當於一個函式,執行緒的核心就是建立的時候繫結的那個函式。

程序是資源分配的最小單位,執行緒是程式執行的最小單位。

程序有自己的獨立地址空間,每啟動一個程序,系統就會為它分配地址空間,建立資料表來維護程式碼段、堆疊段和資料段
一個程序可以由很多個執行緒組成,執行緒間共享程序的所有資源,每個執行緒有自己的堆疊和區域性變數
執行緒之間的通訊更方便,同一程序下的執行緒共享全域性變數、靜態變數等資料,而程序之間的通訊需要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多執行緒程式的難點。
執行緒之間的通訊更方便,同一程序下的執行緒共享全域性變數、靜態變數等資料,而程序之間的通訊需要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多執行緒程式的難點。

https://www.cnblogs.com/zhehan54/p/6130030.html

7;交換機和路由器的區別;
交換機;完成MAC地址與主機的通訊,在集線器的基礎上增加了地址表,在區域網內工作
路由器;主要完成路由功能,作用在網際網路上,對內管理子網,對外實現聯網,

工作層次不同  
	最初的的交換機是工作在OSI/RM開放體系結構的資料鏈路層,也就是第二層,而路由器一開始就設計工作在OSI模型的網路層。

資料轉發所依據的物件不同  
交換機是利用實體地址或者說MAC地址來確定轉發資料的目的地址。而路由器則是利用不同網路的ID號(即IP地址)來確定資料轉發的地址。

功能能不一樣。
	交換機本質功能 是 學習MAC地址,進行幀的轉發
	路由器的本質功能 是包轉發和路徑選擇。
  1. 問:建構函式的作用?並把建構函式的定義格式寫出來。
    在建立這個物件的時候,就是new的時候會自動呼叫其對應的建構函式來完成填充該物件的相關資料
    建構函式沒有返回值,函式名和類名一樣,可以傳入值,可以過載
    建構函式的作用:初始化物件的資料成員。

  2. 問:談談對多型的理解。
    多型;就是在繼承和重寫,虛擬函式的基礎上完成的;
    就是可以利用父類的指標指向子類的物件,從而呼叫子類物件的相關函式。

  3. 問:虛擬函式和純虛擬函式的區別。
    C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現。子類可以重寫父類的虛擬函式實現子類的特殊化。

    純虛擬函式就是該類的所有函式都是虛的,則不能進行new操作就是類似於java裡面的抽象類,只有實現了虛擬函式的子類才能new出物件來。

    普通函式是靜態編譯的,沒有執行時多型,只會根據指標或引用的“字面值”類物件,呼叫自己的普通函式。

  4. 問:靜態連結庫和動態連結庫的區別。
    靜態連結庫,在使用的時候就是直接將庫的對應函式體複製到程式中來。因此多呼叫幾次則多複製幾次,則有重複。 -static表示進行靜態連結,.a表示
    動態連結庫,在使用的時候就是隻將對應的鏈家放到程式中來。.so表示

    使用時要注意;
    包含對應標頭檔案,編譯時可能要加額外用-lxx來指向連結
    動態庫要注意-L指定動態庫的地址。
    -l表示指向連結庫的名字。-L表示指向連結庫的地址

  5. 問:const放在函式的前中後分別有什麼區別。
    函式後;int GetY() const;該函式為只讀函式,不允許修改其中的資料成員的值。
    函式中;int GetY(){const修飾具體變數是否可變}
    函式前;const int * GetPosition();修飾的是返回值,表示返回的是指標所指向值是常量。