作為一名以后想從事嵌入式Linux工程師的大學生,那么Linux肯定是得學習的,如果要從事C++后臺或者服務器運維相關的作業那么Linux肯定也是一個必備的工具啦!既然作為作業中需要接觸的工具那么在面試程序中就一定會問到,關于Linux的基本命令、Linux的基本組件、行程間通信、執行緒間同步…都有可能被問到,盡管面試考察的方面很多,但是經過大量的面試就會發現有很多問題面試官是會百問不厭的,
往期推薦:
經過筆試和多輪技術面試我居然敗給了HR面?
面試官說:我們不要連Android TP驅動流程都不知道的人
文章目錄
- Linux——系統篇
- Linux是什么?
- Unix和Linux有什么區別?
- Linux系統的組成部分?
- Linux內核的組成部分?
- 記憶體管理單元MMU有什么作用?
- 常見的作業系統行程調度策略有哪些?
- I/O子系統層次結構
- 邏輯地址、線性地址、物理地址、總線地址、虛擬地址的區別?
- 作業系統的記憶體一般有哪幾種方式,各有什么優缺點?
- 用戶空間和內核通信的方式有哪些?
- 呼叫API read()/write()時,內核具體做了那些事情?
- 系統呼叫的作用?
- Boot loader、Linux內核、根檔案系統三者之間的關系?
- Bootloader的啟動程序分為那兩個階段?
- Linux——人機互動篇
- Linux常用命令
- Shell腳本
- GCC、GDB、makefile
- makefile
- Linux ——行程執行緒篇
- 行程間通信
- 執行緒間同步機制
- 執行緒與行程的區別
- 什么是死鎖?產生死鎖的原因是什么?
- 死鎖的四個必要條件是什么?
- 死鎖的處理方法?
- 如何預防死鎖?
- Linux——網路篇
- 網路基礎知識
- TCP編程
- 網路高頻面試題匯總
Linux——系統篇
Linux是什么?
簡單的來說Linux就是一套開源的和自由傳播的基于Unix作業系統,是一個基于POSIX和Unix的多用戶、多任務、支持多執行緒和多CPU的作業系統,簡單的來說就是和windows、Mac OS比較像的一種多任務、多用戶的作業系統!
Unix和Linux有什么區別?
Linux和Unix都是功能強大的作業系統,都是應用廣泛的服務器作業系統,有很多相似之處,甚至有一部分人錯誤地認為Unix和Linux作業系統是一樣的,然而,事實并非如此,以下是兩者的區別,
-
開源性
Linux是一款開源作業系統,不需要付費,即可使用;Unix是一款對原始碼實行知識產權保護的傳統商業軟體,使用需要付費授權使用, -
跨平臺性
Linux作業系統具有良好的跨平臺性能,可運行在多種硬體平臺上;Unix作業系統跨平臺性能較弱,大多需與硬體配套使用, -
可視化界面
Linux除了進行命令列操作,還有表單管理系統;Unix只是命令列下的系統, -
硬體環境
Linux作業系統對硬體的要求較低,安裝方法更易掌握;Unix對硬體要求比較苛刻,安裝難度較大, -
用戶群體
Linux的用戶群體很廣泛,個人和企業均可使用;Unix的用戶群體比較窄,多是安全性要求高的大型企業使用,如銀行、電信部門等,或者Unix硬體廠商使用,如Sun等,
相比于Unix作業系統,Linux作業系統更受廣大計算機愛好者的喜愛,主要原因是Linux作業系統具有Unix作業系統的全部功能,并且能夠在普通PC計算機上實作全部的Unix特性,開源免費的特性,更容易普及使用!
Linux系統的組成部分?
Linux系統由 boot loader、Linux kernel 、Linux Shell、Linux應用程式組成,
Linux內核的組成部分?
(1)第一種分類方式:記憶體管理子系統、行程管理子系統、檔案管理子系統、I/O管理子系統
(2)第二種分類方式:行程調度(SCHED)、行程間通信(IPC)、記憶體管理(MMU)、虛擬檔案系統(VFS)、網路介面(NET)
記憶體管理單元MMU有什么作用?
記憶體管理單元的主要作用是記憶體映射、記憶體分配和回收、記憶體保護、記憶體擴充,
常見的作業系統行程調度策略有哪些?
先來先服務、短行程優先、高回應比優先、時間片輪轉、多級反饋佇列、最高優先權優先,
I/O子系統層次結構
從上至下依次是用戶層I/O軟體,設備獨立性軟體,設備驅動程式,中斷處理程式
邏輯地址、線性地址、物理地址、總線地址、虛擬地址的區別?
| 地址 | 簡介 |
|---|---|
| 邏輯地址 | 與記憶體段相關的偏移地址部分,例如,在C語言獲取指標變數的值,就是邏輯地址,不和絕對的物理地址相關 |
| 線性地址 | 線性地址=邏輯地址+基地址 |
| 物理地址 | 如果啟動了分頁機制,那么線性地址使用頁表項變換后就是物理地址,如果沒有啟用分頁機制,那么線性地址就是物理地址, |
| 總線地址 | x86下的I/O地址,ARM下的物理地址, |
| 虛擬地址 | MMU虛擬出來的地址 |
作業系統的記憶體一般有哪幾種方式,各有什么優缺點?
- 分頁存盤管理:優點是不需要連續的記憶體空間,且記憶體利用率高(只有很小的頁內碎片);缺點是 不易于實作記憶體共享與保護,
- 分段存盤管理:優點是易于實作段記憶體共享和保護;缺點是每段都需要連續的記憶體空間,且記憶體利 用率較低(會產生外部碎片),
- 段頁式存盤管理:優點是不需要連續的記憶體空間,記憶體利用率高(只有很小的頁內碎片),且易于 實作段記憶體共享和保護;缺點是管理軟體復雜性較高,需要的硬體以及占用的記憶體也有所增加,使得執 行速度下降,
用戶空間和內核通信的方式有哪些?
| 系統呼叫API | 用戶空間行程通過系統呼叫進入內核空間,訪問指定的內核空間資料 |
|---|---|
| 驅動程式 | 用戶空間行程可以使用封裝后的系統呼叫介面訪問驅動設備節點,和運行在內核空間的驅動程式通信 |
| copy_to_user()、copy_from_user() | 在驅動程式中呼叫的介面,實作用戶空間和內核空間的資料拷貝操作,應用于實時性要求不太高的專案中 |
| procfs | 是一種特殊的檔案系統,是Linux內核資訊的抽象檔案介面,大量內核中的資訊以及可呼叫的引數都被作為常規檔案映射到這個目錄樹中,用戶可以直接通過echo或cat這樣的命令對系統資訊進行修改和查詢, |
| 共享記憶體mmap | 在代碼呼叫介面,實作內核空間與用戶空間的地址映射,在實時性要求很高的專案中為首選 |
| netlink | 用戶行程使用標準的socket API就可以使用netlink提供的強大功能 |
呼叫API read()/write()時,內核具體做了那些事情?
用戶行程呼叫read()/write()后進入內核空間-> 呼叫內核的sys_read()/sys_write()函式 -> 內核函式進一步呼叫fop.read()/fop.write()指向的函式,也就是驅動程式里具體的讀寫函式,
系統呼叫的作用?
為應用程式提供訪問硬體的同一介面,以至于應用程式不必關心具體的硬體操作細節,
為系統內核提供保護,保證系統的穩定和安全,因為**系統呼叫還規定了用戶行程進入內核的具體方式以及所能訪問的資料范圍**,
Boot loader、Linux內核、根檔案系統三者之間的關系?
系統上電,就執行Bootloader來初始化處理器及其外設,將系統的軟硬體環境帶到一個合適的狀態
Boot loader傳遞給Linux 內核 bootcmd和boot targs這兩個比較重要的引數,讓Linux內核知道從記憶體中那個地方讀取相關的設備樹,系統鏡等檔案,然后執行Linux內核,
Linux內核完成初始化之后就掛載某個檔案系統作為根檔案系統,
Bootloader的啟動程序分為那兩個階段?
- 第一個階段是匯編階段,完成一些依賴于CPU體系結構的初始化,并執行第二階段的代碼,
- 第二階段是C語言的,進一步完成硬體的初始化,并建立記憶體映射,并將記憶體和根檔案系統讀取到記憶體中,然后啟動內核
Linux——人機互動篇
Linux常用命令
在博主之前的文章中有整理了相關的Linux常用命令可以查看史上最全的Linux常用命令匯總(超全面!超詳細!)收藏這一篇就夠了!這篇文章,這篇文章覆寫了絕大部分的Linux命令!目前已經有1000+點贊,6000+收藏,這里面需要重點關注的命令就是關于**Linux用戶、Linux行程管理、檔案查找**這些是面試官最喜歡問的問題也是最容易記混淆的知識!既然是最容易記混淆的那么就需要重點關注整理一下!
| 命令 | 作用 | 說明 |
|---|---|---|
useradd -m -g 組 新建用戶名 | 添加新用戶 | - m 自動創建用戶家目錄 - g 指定用戶所在的組,負責會建立一個和同名的組 |
passwd | 設定用戶密碼 | 如果是普通用戶,直接用passwd可以修改自己的賬戶密碼 |
userdel -r 用戶名 | 洗掉用戶 | -r 選項會自動洗掉家用戶目錄 |
cat /etc/passwd | grep 用戶名 | 確認用戶資訊 | 新建用戶后,用戶資訊會保存在/etc/passwd檔案中 |
| 命令 | 作用 | 說明 |
|---|---|---|
ps -aux | 查看行程的詳細資訊 | - a 顯示終端上的所有行程 - u 顯示行程的詳細狀態 - x 顯示沒有控制終端的行程 |
ps -ef | grep -列出需要的行程 | 配合管道查看相關的行程的詳細資訊 | |
pstree | 通過顯示行程的樹狀圖來展示行程間的關系 | 如果指定了pid,那么樹的根就是該pid |
top | 監控系統不同行程所使用的資源資訊 | |
nice <優先值> <行程名> - 通過給定的優先值啟動一個程式 | 設定改變行程的優先級 | 普通用戶只能設定0~20,越小優先級越高 |
renice -n -g - 改變指定行程的優先值 | 通過改變指定用戶和組來改變行程優先級 | |
| kill | 用于發送信號來結束行程 | 可以通過-9引數來執行 |
| netstat -nap | grep xxx | 查看行程號為xxx的埠占用號 |
| 命令 | 作用 | 說明 |
|---|---|---|
find <指定目錄> <指定條件> <指定動作> | 查找指定目錄下的指定檔案,并對檔案進行相關操作 | 條件引數可以是 - name按照名字進行查找 |
| grep | grep允許對文本進行模式查找 | - n顯示匹配行及行號 - v顯示不包含匹配文本的所有行(相當于取反) - i 忽略大小 |
Shell腳本
用戶界面和命令列這個另外開發的程式,Linux下這個命令列的程式就叫Shell,其是一個應用程式,它連接了用戶和 Linux 內核,讓用戶能夠更加高效、安全、低成本地使用 Linux 內核,這就是 Shell 的本質,
博主在之前學習Shell腳本的時候已經整理的比較詳細了,這里就把鏈接給貼出來啦!
- Shell基本概念
- Shell變數和程式陳述句
- Shell函式呼叫以及變數的作用域
GCC、GDB、makefile
- 預處理:引入頭檔案、進行宏替換、處理條件編譯指令、去除注釋、添加行號,
- 編譯:進行語法分析等,并生成匯編代碼.s,
- 匯編:將匯編代碼轉成二進制代碼.o(目標檔案),
- 鏈接:將有關的目標檔案彼此連接為可執行代碼,分為靜態鏈接(將庫檔案代碼搬遷到可執行檔案 中,后綴是.a)和動態鏈接(在執行的時候轉到庫檔案代碼執行,后綴是.so),
之前也有整理關于代碼的編譯還有除錯相關的文章,可以戳鏈接進入文章代碼從編譯到運行經歷了什么?
makefile
makefile從入門到放棄——博主吐血整理的筆記
makefile的基本條件就是目標和依賴!
Linux ——行程執行緒篇
行程間通信
每個行程各自有不同的用戶地址空間,任何一個行程的全域變數在另一個行程中都看不到,所以行程間交換資料必須通過內核,在內核中開辟一塊緩沖區,行程1把資料從用戶空間拷貝到內核緩沖區,行程2再從內核緩沖區把資料讀走,內核提供這種機制稱為行程間通信!
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2DMiFYSH-1617975383512)(C:\Users\lenovo-pc\AppData\Roaming\Typora\typora-user-images\image-20210409204514616.png)]
-
管道
專案 通信方式 特點 無名管道(記憶體檔案) 半雙工通信 資料只能單向流動,只能在有親緣關系的行程間使用(父子行程) 有名管道(FIFO檔案,借助檔案系統) 半雙工通信 允許在沒有親緣關系的行程間使用,是先進先出的通信方式 -
共享記憶體:共享記憶體就是映射一段能被其他行程所訪問的記憶體,這段記憶體由一個行程創建,但是多個行程可以訪問,共享記憶體是最快的IPC方式,他是針對其他行程間通信方式運行效率低而專門設計的,
-
訊息佇列:訊息佇列是有訊息的鏈表,存放在內核中并由訊息佇列識別符號標識,訊息佇列克服了信號傳遞資訊少、管道只能承載無格式位元組流以及緩沖區大小受限制等缺點,
-
套接字:適用于不同機器間行程通信,在本地可作為兩個行程間通信的方式,
-
信號:用于通知接收行程某個時間已經發生,比如按下ctrl+C就是信號
-
信號量:信號量就是一個計數器,可以用來控制多個行程對共享資源的訪問,常用一種鎖的機制,實作行程、執行緒的臨界區的同步及互斥訪問,
執行緒間同步機制
- POSIX無名信號量(基于記憶體的信號量):可以用于行程間同步
- POSIX有名信號量:執行緒行程都適用
- 初始化、P操作(申請資源)、V操作(釋放資源)
- 互斥鎖+條件變數:只能用于執行緒間同步
執行緒與行程的區別
調度:執行緒是調度的基本單位;行程是擁有所有資源的基本單位,
并發性:一個行程內多個執行緒可以并發;多個行程可以并發
擁有資源:行程擁有獨立的地址空間;執行緒不擁有系統資源,
系統開銷:執行緒創建銷毀只需要處理PC值,狀態碼,通用暫存器,執行緒堆疊和堆疊指標即可;行程創建和執行緒需要分配及銷毀task_struct結構,
關于執行緒與行程我也有整理相關的博客:
-
1、行程簡介
-
2、執行緒&執行緒間同步
-
3、Unix間執行緒通信
-
4、System V間通信
-
5、并發與競爭
什么是死鎖?產生死鎖的原因是什么?
死鎖是指多個行程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些行程將無法向前推進,
原因:①系統資源不足,②資源分配不當,③行程推進的順序不合適,
死鎖的四個必要條件是什么?
互斥條件:一個資源每次只能被一個行程使用,其他行程只能等待,
請求與保持條件:行程已經獲得至少一個資源,但又提出了新的資源請求,而該資源已被其他行程占有,此時該行程被阻塞,但對已獲得資源依然保持不放,
不可剝奪條件:行程所獲得的資源不能被其他行程剝奪,只能被自己釋放,
回圈等待條件:若干行程形成首尾相接回圈等待資源的關系,
注意:以上四個條件缺一不可,
死鎖的處理方法?
(1)預防死鎖:通過設定一些限制條件,去破壞產生死鎖的必要條件,
(2)避免死鎖:在資源分配程序中,使用某種方法避免系統進入不安全的狀態,從而避免發生死鎖,
(3)檢測和解除死鎖:允許死鎖的發生,但是通過系統的檢測之后,采取一些措施,將死鎖清除掉,
如何預防死鎖?
(1)破壞“請求與保持條件”:
-
①靜態分配,即每個行程在開始執行時就申請它所需要的全部資源
-
②動態分配,即每個行程在申請所需要的資源時它本身不占用系統資源,
(2)破壞“不可剝奪條件”:一個行程在阻塞等待期間,其占有的資源被隱式釋放后被其他行程使用,而阻塞等待的資源只有獲得所有需要的資源才能重新啟動,
(3)破壞“回圈等待條件”:采用資源的有序分配,將所有資源進行編號,緊缺的資源采用比較大的編號,一個行程只有獲得較小編號的資源才可以申請較大編號的資源,
Linux——網路篇
網路基礎知識
借鑒之前整理的博客:網路基礎知識
TCP編程
借鑒之前整理的博客:網路編程——TCP
網路高頻面試題匯總
借鑒之前博客整理的面試題掌握了這些面試題,離大廠的距離更近一步!
不積小流無以成江河,不積跬步無以至千里,而我想要成為萬里羊,就必須堅持學習來獲取更多知識,用知識來改變命運,用博客見證成長,用行動證明我在努力,
如果我的博客對你有幫助、如果你喜歡我的博客內容,記得“點贊” “評論” “收藏”一鍵三連哦!聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/274438.html
標籤:其他
上一篇:LeetCode-旋轉陣列


