牛客网嵌入式软件工程师面试题(一)
?作者簡介:大家好我是:嵌入式基地,是一名嵌入式工程師,希望一起努力,一起進步!
📃個人主頁:嵌入式基地
🔥系列專欄:牛客網嵌入式習題專欄
💬網上關于嵌入式的面試練習網站很少,這里給大家推薦一款嵌入式模擬面試、刷題神器,從基礎到大廠面試題👉點擊跳轉刷題網站進行注冊學習
牛客網嵌入式軟件工程師面試題(一)
- 1、select和epoll的區別
- 2、異步IO和同步IO區別?
- 3、linux的進程狀態有哪些?
- 4、什么是死鎖?產生死鎖的原因是什么?
- 5、死鎖的必要條件是什么?
- 6、什么是優先級翻轉,如何避免優先級翻轉?
- 7、Linux驅動程序的功能是什么?
- 8、Linux驅動程序的分類有哪些?
- 9、內核程序中申請內存使用什么函數?
- 10、內核程序中申請內存和應用程序時申請內存有什么區別?
- 結束語
1、select和epoll的區別
select的時間復雜度O(n)。它僅僅知道了,有I/O事件發生了,卻并不知道是哪那幾個流(可能有一個,多個,甚至全部),我們只能無差別輪詢所有流,找出能讀出數據,或者寫入數據的流,對他們進行操作。所以select具有O(n)的無差別輪詢復雜度,同時處理的流越多,無差別輪詢時間就越長。
epoll的時間復雜度O(1)。epoll可以理解為event
poll,不同于忙輪詢和無差別輪詢,epoll會把哪個流發生了怎樣的I/O事件通知我們。所以我們說epoll實際上是事件驅動(每個事件關聯上fd)的,此時我們對這些流的操作都是有意義的。(復雜度降低到了O(1))
2、異步IO和同步IO區別?
所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。 而異步就是過程調用發出后,調用者不能立刻得到結果。
實際處理這個調用的部件在完成后,通過狀態、通知和回調來通知調用者。所以異步IO和同步IO區別就是數據拷貝的時候進程是否阻塞。
3、linux的進程狀態有哪些?
Linux系統下進程通常存在6種不同的狀態,分為:
- 就緒態
- 運行態
- 僵尸態
- 可中斷睡眠狀態(淺度睡眠)
- 不可中斷睡眠狀態(深度睡眠)
- 暫停態。
4、什么是死鎖?產生死鎖的原因是什么?
所謂死鎖,是指多個進程在運行過程中因爭奪資源而造成的一種僵局,當進程處于這種僵持狀態時,若無外力作用,它們都將無法再向前推進。
死鎖產生的原因可歸結為兩點:
- 競爭資源
- 進程間推進順序非法
5、死鎖的必要條件是什么?
產生死鎖的必要條件:
- 互斥條件:進程要求對所分配的資源進行排它性控制,即在一段時間內某資源僅為一進程所占用。
- 請求和保持條件:當進程因請求資源而阻塞時,對已獲得的資源保持不放。
- 不剝奪條件:進程已獲得的資源在未使用完之前,不能剝奪,只能在使用完時由自己釋放。
- 環路等待條件:在發生死鎖時,必然存在一個進程–資源的環形鏈。
6、什么是優先級翻轉,如何避免優先級翻轉?
優先級翻轉指的是一個具有中等優先級的任務比一個更高優先級的任務先執行。
優先級翻轉的主要原因是對共享資源的訪問產生了互斥,因此我們可以采用帶有優先級繼承機制的互斥量來避免優先級翻轉。
7、Linux驅動程序的功能是什么?
設備驅動連接操作系統和硬件。
設備驅動程序是一種可以使計算機與設備進行通信的特殊程序,可以說相當于硬件的接口。
操作系統只有通過這個接口,才能控制硬件設備的工作。
安裝在操作系統中的驅動程序可以完成設備的初始化和釋放,進行外部數據和操作系統的通信和數據交互,控制硬件的行為,并檢查設備可能出現的故障并報錯。
8、Linux驅動程序的分類有哪些?
Linux將硬件設備分為3大類,分別是字符設備、塊設備和網絡設備。
- 字符設備是指那些能一個字節一個字節讀取數據的設備,如鍵盤鼠標等,常見的SPI/I2C/UART默認也是字符設備。
- 塊設備與字符設備類似,一般是像磁盤一樣的設備。
- 網絡設備主要負責主機之間的數據交換。與字符設備和塊設備完全不同,網絡設備主要是面向數據包的接收和發送而設計的。
9、內核程序中申請內存使用什么函數?
內核中使用kmalloc(),kzalloc(), vmalloc(), alloc_page()等函數。
- kamlloc申請的內存區域位于物理內存的映射區域,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,存在比較簡單的轉換關系,所以對申請的內存大小有限制,不能超過128KB。
- kzalloc() 函數與 kmalloc() 額外附加了 __GFP_ZERO 標志,所以它除了申請內核內存外,還會對申請到的內存內容清零。
- vmalloc() 函數則會在虛擬內存空間給出一塊連續的內存區,但這片連續的虛擬內存在物理內存中并不一定連續。由于 vmalloc() 沒有保證申請到的是連續的物理內存,因此對申請的內存大小沒有限制,如果需要申請較大的內存空間就需要用此函數了。
- 需要注意的是vmalloc() 和 vfree() 可以睡眠,因此不能從中斷上下文調用。
- alloc_page()用于申請連續的物理頁,可以通過page_address()把指定的頁轉化成邏輯地址。
如何區分這幾個概念: kmalloc是最常用的內存分配函數,可以原子操作,速度快,缺點就是大小有上限,kzalloc是強制清零版本的kmalloc,而vmalloc只有在需要申請大內存的時候使用,會陷入阻塞
10、內核程序中申請內存和應用程序時申請內存有什么區別?
應用程序的內存申請,例如C/C++可以使用malloc函數,與內核的kmalloc(),kzalloc(), vmalloc(), alloc_page()等函數相比,比較像vmalloc機制,即虛擬地址申請,物理地址不一定連續,區別在于,應用程序malloc不會做分配物理頁的動作,交由內核去申請,而vmalloc本身在內核中會執行這個動作。
結束語
你想要的牛客都有,各種大廠面試真題在等你哦!快快通過下方鏈接注冊加入刷題大軍吧!
💬刷題神器,從基礎到大廠面試題👉點擊跳轉刷題網站
總結
以上是生活随笔為你收集整理的牛客网嵌入式软件工程师面试题(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html单元格上下拆分代码,在HTML
- 下一篇: html单元格上下拆分代码,在HTML/