對於很多問題的答案,部分從網絡上拿過來,或者是在書上看到的,也包括自學的一部分內容。有錯誤可以提出。
有些是面試中經常遇到的,但就是記不住,沒有深刻理解。不斷更新中。。。。。
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.打開一個網站的時候,發生了什麼(小米)
- 在瀏覽器裏輸入要網址:
- 瀏覽器查找域名的 IP 地址
- 瀏覽器給 web 服務器發送一個 HTTP 請求
- facebook 服務的永久重定向響應
- 瀏覽器跟蹤重定向地址
- 服務器“處理”請求
- 服務器發回一個 HTML 響應
- 瀏覽器開始顯示 HTML
- 瀏覽器發送獲取嵌入在 HTML 中的對象
- 瀏覽器發送異步(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 獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中。這種進程稱
之爲僵死進程。