面試遇到問題乾貨整理(一)

 對於很多問題的答案,部分從網絡上拿過來,或者是在書上看到的,也包括自學的一部分內容。有錯誤可以提出。
 有些是面試中經常遇到的,但就是記不住,沒有深刻理解。不斷更新中。。。。。

1.簡述ARM指令和Thumb指令(大疆)

解答:在ARM的體系結構中,可以工作在三種不同的狀態,一是ARM狀態,二是Thumb狀態及Thumb-2狀態,三是調試狀態。而ARM狀態和Thumb狀態可以直接通過某些指令直接切換,都是在運行程序,只不過指令長度不一樣而已。
ARM狀態:arm處理器工作於32位指令的狀態,所有指令均爲32位;
Thumb狀態:arm執行16位指令的狀態,即16位狀態;
thumb-2狀態:這個狀態是ARM7版本的ARM處理器所具有的新的狀態,新的thumb-2內核技術兼有16位及32位指令,實現了更高的性能,更有效的功耗及更少地佔用內存。總的來說,感覺這個狀態除了兼有arm和thumb的優點外,還在這兩種狀態上有所提升,優化;
調試狀態:處理器停機時進入調試狀態。
也就是說:ARM狀態,此時處理器執行32位的字對齊的ARM指令;Thumb狀態,此時處理器執行16位的,半字對齊的THUMB指令。
幾個注意點:
ARM處理器復位後開始執行代碼時總是隻處於ARM狀態;
Cortex-M3只有Thumb-2狀態和調試狀態;
由於Thumb-2具有16位/32位指令功能,因此有了thumb-2就無需Thumb了。
另外,具有Thumb-2技術的ARM處理器也無需再ARM狀態和Thumb-2狀態間進行切換了,因爲thumb-2具有32位指令功能。

2.下面代碼片段中有哪些隱患或者錯誤(雲從)

void *get1(){
char buf[12] = {“abc”};
return buf;
}
void get2(int *p){
p = new int[10];
}
int main(){
int *m;
get2(m);
m = get1();
memcpy(m, “aaa”, 3);
return 0;
}
1.首先調用get2(m)的時候,因爲是值傳遞,無法修改m的實際值,即無法將new申請的內存地址傳出。
2.再者調用get1(m)的時候,函數內定義的數組是局部變量,對應的內存在這個函數結束的時候就會被釋放,因此返回的地址是無效的,調用這樣的地址造成嚴重錯誤。
3.最後調用memcpy(m,“aaa”,3)往一個沒有權限的無效內存空間拷貝數據是非法的。
如果函數的參數是指針,避免用該指針去動態申請內存。如果想用記得使用二級指針。(雲從面試)

3.簡述SPI IIC UART接口的區別和各自收發數據的方法(大疆)

1、名字上的區別:
 SPI: (Serial Peripheral Interface),串行外設接口
 IIC: (INTER IC BUS),IC之間的總線
 UART: (Universal Asynchronous Receiver Transmitter),通用異步收發器
2、電氣信號上的區別
A.SPI總線主要由三條信號線組成:串行時鐘(SCLK)、串行數據輸出(SDO)、串行數據輸入(SDI)。SPI總線可以實現多個SPI設備互相連接。主從設備可以實現全雙工通信,當有多個從設備是,還可以增加一條從設備選擇線。
B.IIC總線是雙向、兩線(SCL、SDA)、串行、多控接口標準,具有總線仲裁機制,非常適合器件之間近距離、非經常性的數據通信。
C.UART總線是異步串口,一般由波特率產生器、UART接收器、UART發送器組成,硬件上有兩根線,發送與接收各佔一根線。
3、SPI和UART可以實現全雙工,但是IIC不行。
1.UART是全雙工通信方式,兩根數據線RX和TX,通信時雙方需要共地,數據的傳輸速度由波特率決定,所以每位數據的收發完全依靠精確的時間來控制。
2.IIC總線是半雙工通信方式,支持一個主機多個從機,在通信時主機必須固定,通過地址來區分從機,兩根數據線SCL,SDA,數據的收發依靠時鐘線進行控制。 3.SPI總線是全雙工通信方式,支持一個主機多個從機,通信是主機可以發生改變,是真正的多主機總線,4跟數據線,CS,MISO,MOSI,SCL,通過片選線來控制與哪個從機進行通信,通過時鐘線控制數據收發。

4.簡述static關鍵字對於工程模塊化的作用(阿里,華爲,支付寶)

解答:static主要定義全局靜態變量、局部靜態變量、靜態函數。
定義全局靜態變量,有以下特點:在全局數據區分配內存。如果沒有初始化,其默認值爲0.該變量在文件內從定義開始到文件結束可見。
局部靜態變量:該變量在全局數據區分配內存,如果不顯示初始化,那麼將被隱式初始化爲0,它始終駐留在全局數據區,直到程序運行結束,其作用域爲局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束。
定義靜態函數:靜態函數只能在本源文件中使用,在文件作用域中聲明的inline函數默認爲static類型 。
Extern:將變量和函數聲明爲外部鏈接,僅僅是一個變量的聲明,其並不是定義,因爲不會分配內存空間。定義多次的話會報錯。

5.復位電路的原理(諾瓦)

復位電路

6.TCP和UDP的區別?(諾瓦)

1)UDP是無連接的,即發送數據之前不需要建立連接。
2)UDP使用盡最大努力交付,即不保證可靠交付,同時也不能使用擁塞控制。
3)UDP是面向報文的,UDP沒有擁塞控制,很適合多媒體通信要求。
4)UDP支持1對1,1對多,多對1和多對多的交互通信。
5)UDP的首部開銷小,只有8個字節。
6)TCP是面向連接的運輸層協議
7)每一條TCP連接智能有兩個端點,每一條TCP連接只能是點對點
8)TCP提供可靠的交付的服務
9)TCP提供全雙工通道
10)TCP是面向字節流的
11)首部最低20字節

7.試描述TCP建立和斷開連接時的三次握手和四次揮手(阿里)

網上更詳細

8.打開一個網站的時候,發生了什麼(小米)

  1. 在瀏覽器裏輸入要網址:
  2. 瀏覽器查找域名的 IP 地址
  3. 瀏覽器給 web 服務器發送一個 HTTP 請求
  4. facebook 服務的永久重定向響應
  5. 瀏覽器跟蹤重定向地址
  6. 服務器“處理”請求
  7. 服務器發回一個 HTML 響應
  8. 瀏覽器開始顯示 HTML
  9. 瀏覽器發送獲取嵌入在 HTML 中的對象
  10. 瀏覽器發送異步(AJAX)請求

9.子進程 父進程(諾瓦,大疆)

子進程繼承父進程
○ 用戶號 UIDs 和用戶組號 GIDs
○ 環境 Environment
○ 堆棧
○ 共享內存
○ 打開文件的描述符
○ 執行時關閉(Close-on-exec)標誌
○ 信號(Signal)控制設定
○ 進程組號
○ 當前工作目錄
○ 根目錄
○ 文件方式創建屏蔽字
○ 資源限制
○ 控制終端
子進程獨有
○ 進程號 PID
○ 不同的父進程號
○ 自己的文件描述符和目錄流的拷貝
○ 子進程不繼承父進程的進程正文(text),數據和其他鎖定內存(memory locks)
○ 不繼承異步輸入和輸出
● 父進程和子進程擁有獨立的地址空間和 PID 參數。
● 子進程從父進程繼承了用戶號和用戶組號,用戶信息,目錄信息,環境(表),打開的
文件描述符,堆棧,(共享)內存等。
● 經過 fork()以後,父進程和子進程擁有相同內容的代碼段、數據段和用戶堆棧,就像父
進程把自己克隆了一遍。事實上,父進程只複製了自己的 PCB 塊。而代碼段,數據段和用
戶堆棧內存空間並沒有複製一份,而是與子進程共享。只有當子進程在運行中出現寫操作
時,纔會產生中斷,併爲子進程分配內存空間。由於父進程的 PCB 和子進程的一樣,所以
在 PCB 中斷中所記錄的父進程佔有的資源,也是與子進程共享使用的。這裏的“共享”一詞
意味着“競爭”
● 父進程和子進程擁有獨立的地址空間和 PID 參數,所以子進程不會繼承父進程的地址空

● 子進程與父進程的區別在於:
1、父進程設置的鎖,子進程不繼承(因爲如果是排它鎖,被繼承的話,矛盾了)
2、各自的進程 ID 和父進程 ID 不同
父進程和子進程擁有獨立的地址空間和 PID 參數
3、子進程的未決告警被清除;
4、子進程的未決信號集設置爲空集。

10.孤兒進程和殭屍進程(CVTE)

孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲
孤兒進程。孤兒進程將被 init 進程(進程號爲 1)所收養,並由 init 進程對它們完成狀態收集
工作。
殭屍進程:一個進程使用 fork 創建子進程,如果子進程退出,而父進程並沒有調用 wait 或
waitpid 獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中。這種進程稱
之爲僵死進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章