1. 使用while read line和/etc/passwd,計算用戶id總和。

2. 總結(jié)索引數(shù)組和關(guān)聯(lián)數(shù)組,字符串處理,高級變量使用及示例。
索引數(shù)組:
引用特定的數(shù)組元素
${ARRAY_NAME[INDEX]}
注:如果省略[INDEX]表示引用下標(biāo)為0的元素
引用數(shù)組所有元素
${ARRAY_NAME[*]}
${ARRAY_NAME[@]}
數(shù)組個數(shù)
${#ARRAY_NAME[*]}
數(shù)組下標(biāo)
${!ARRAY_NAME[*]}

關(guān)聯(lián)數(shù)組:
注意:關(guān)聯(lián)數(shù)組必須先聲明再調(diào)用
declare -A ARRAY_NAME
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...)

基于偏移量取字符串

基于模式取字符串
${var#*word}:刪除從開頭到第一個word之間所有的字符(懶惰模式)
${var##*word}:刪除從開頭到最后一個word之間所有的字符(貪婪模式)
${var%word*}:刪除從結(jié)尾到第一個word之間所有的字符
${var%%word*}:刪除從結(jié)尾到最后一個word之間所有的字符

查找替換
${var/pattern/substr}:查找變量var中第一次被pattern匹配的字符串,并替換為substr
${var//pattern/substr}:查找變量var中所有被pattern匹配的字符串,并替換為substr
${var/#pattern/substr}:查找變量var中行首被pattern匹配的字符串,并替換為substr
${var/%pattern/substr}:查找變量var中行尾被pattern匹配的字符串,并替換substr

小寫轉(zhuǎn)換成大寫:

大寫轉(zhuǎn)換成小寫:

高級變量用法:


eval會執(zhí)行兩次,第一個替換變量,第二次執(zhí)行命令


3. 求10個隨機數(shù)的最大值與最小值。

4. 使用遞歸調(diào)用,完成階乘算法實現(xiàn)。

3. 解析進程和線程的區(qū)別?
進程是操作系統(tǒng)分配資源的最小單位
線程是程序執(zhí)行的CPU調(diào)度的最小單位
一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執(zhí)行路線;
進程之間相互獨立,但同一進程下的各個線程之間共享程序的內(nèi)存空間(包括代碼段、數(shù)據(jù)集、堆等)及一些進程級的資源(如打開文件和信號),某進程內(nèi)的線程在其它進程不可見;
調(diào)度和切換:線程上下文切換比進程上下文切換要快得多。
4. 解析進程的結(jié)構(gòu)。
內(nèi)核把進程存放在叫做任務(wù)隊列(task list)的雙向循環(huán)鏈表中
鏈表中的每一項都是類型為task_struct,稱為進程控制塊(Processing Control Block),PCB中包含一
個具體進程的所有信息
進程控制塊PCB包含信息:
進程id、用戶id和組id
程序計數(shù)器
進程的狀態(tài)(有就緒、運行、阻塞)
進程切換時需要保存和恢復(fù)的CPU寄存器的值
描述虛擬地址空間的信息
描述控制終端的信息
當(dāng)前工作目錄
文件描述符表,包含很多指向file結(jié)構(gòu)體的指針
進程可以使用的資源上限(ulimit –a命令可以查看)
輸入輸出狀態(tài):配置進程使用I/O設(shè)備
5. 解析磁盤中的代碼如何在計算機上運行的?
每個進程都包括5種不同的數(shù)據(jù)段
代碼段:用來存放可執(zhí)行文件的操作指令,也就是說是它是可執(zhí)行程序在內(nèi)存中的鏡像。代碼段需
要防止在運行時被非法修改,所以只準(zhǔn)許讀取操作,而不允許寫入(修改)操作——它是不可寫的
數(shù)據(jù)段:用來存放可執(zhí)行文件中已初始化全局變量,換句話說就是存放程序靜態(tài)分配的變量和全局
變量BSS段:Block Started by Symbol”的縮寫,意為“以符號開始的塊,BSS段包含了程序中未初始化的
全局變量,在內(nèi)存中 bss段全部置零
堆(heap):存放數(shù)組和對象,堆是用于存放進程運行中被動態(tài)分配的內(nèi)存段,它的大小并不固
定,可動態(tài)擴張或縮減。當(dāng)進程調(diào)用malloc等函數(shù)分配內(nèi)存時,新分配的內(nèi)存就被動態(tài)添加到堆上
(堆被擴張);當(dāng)利用free等函數(shù)釋放內(nèi)存時,被釋放的內(nèi)存從堆中被剔除(堆被縮減)
棧(stack):棧是用戶存放程序臨時創(chuàng)建的局部變量,也就是說我們函數(shù)括弧“{}”中定義的變量
(但不包括static聲明的變量,static意味著在數(shù)據(jù)段中存放變量)。除此以外,在函數(shù)被調(diào)用時,
其參數(shù)也會被壓入發(fā)起調(diào)用的進程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值也會被存放回棧中。
由于棧的后進先出特點,所以棧特別方便用來保存/恢復(fù)調(diào)用現(xiàn)場。可以把堆??闯梢粋€寄存、交
換臨時數(shù)據(jù)的內(nèi)存區(qū)
喝多了吐就是棧
吃多了拉就是隊列
6. 總結(jié)OOM原理,及處理方法。
OOM 即 Out Of Memory,“內(nèi)存用完了”,在情況在java程序中比較常見。系統(tǒng)會選一個進程將之殺死,
在日志messages中看到類似下面的提示
Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child
當(dāng)JVM因為沒有足夠的內(nèi)存來為對象分配空間并且垃圾回收器也已經(jīng)沒有空間可回收時,就會拋出這個
error,因為這個問題已經(jīng)嚴(yán)重到不足以被應(yīng)用處理)。
原因:
給應(yīng)用分配內(nèi)存太少:比如虛擬機本身可使用的內(nèi)存(一般通過啟動時的VM參數(shù)指定)太少。
應(yīng)用用的太多,并且用完沒釋放,浪費了。此時就會造成內(nèi)存泄露或者內(nèi)存溢出。
使用的解決辦法:
1,限制java進程的max heap,并且降低java程序的worker數(shù)量,從而降低內(nèi)存使用
2,給系統(tǒng)增加swap空間
7. 結(jié)合進程管理命令,說明進程各種狀態(tài)。
進程的基本狀態(tài)
創(chuàng)建狀態(tài):進程在創(chuàng)建時需要申請一個空白PCB(process control block進程控制塊),向其中填寫
控制和管理進程的信息,完成資源分配。如果創(chuàng)建工作無法完成,比如資源無法滿足,就無法被調(diào)
度運行,把此時進程所處狀態(tài)稱為創(chuàng)建狀態(tài)
就緒狀態(tài):進程已準(zhǔn)備好,已分配到所需資源,只要分配到CPU就能夠立即運行
執(zhí)行狀態(tài):進程處于就緒狀態(tài)被調(diào)度后,進程進入執(zhí)行狀態(tài)
阻塞狀態(tài):正在執(zhí)行的進程由于某些事件(I/O請求,申請緩存區(qū)失?。┒鴷簳r無法運行,進程受
到阻塞。在滿足請求時進入就緒狀態(tài)等待系統(tǒng)調(diào)用
終止?fàn)顟B(tài):進程結(jié)束,或出現(xiàn)錯誤,或被系統(tǒng)終止,進入終止?fàn)顟B(tài)。無法再執(zhí)行
狀態(tài)之間轉(zhuǎn)換六種情況
運行——>就緒:1,主要是進程占用CPU的時間過長,而系統(tǒng)分配給該進程占用CPU的時間是有限的;
2,在采用搶先式優(yōu)先級調(diào)度算法的系統(tǒng)中,當(dāng)有更高優(yōu)先級的進程要運行時,該進程就被迫讓出CPU,
該進程便由執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)
就緒——>運行:運行的進程的時間片用完,調(diào)度就轉(zhuǎn)到就緒隊列中選擇合適的進程分配CPU
運行——>阻塞:正在執(zhí)行的進程因發(fā)生某等待事件而無法執(zhí)行,則進程由執(zhí)行狀態(tài)變?yōu)樽枞麪顟B(tài),如發(fā)
生了I/O請求
阻塞——>就緒:進程所等待的事件已經(jīng)發(fā)生,就進入就緒隊列
以下兩種狀態(tài)是不可能發(fā)生的:
阻塞——>運行:即使給阻塞進程分配CPU,也無法執(zhí)行,操作系統(tǒng)在進行調(diào)度時不會從阻塞隊列進行挑
選,而是從就緒隊列中選取
0 – Heuristic overcommit handling. 這是缺省值,它允許overcommit,但過于明目張膽的
overcommit會被拒絕,比如malloc一次性申請的內(nèi)存大小就超過了系統(tǒng)總內(nèi)存。Heuristic的意思是“試探
式的”,內(nèi)核利用某種算法猜測你的內(nèi)存申請是否合理,它認(rèn)為不合理就會拒絕overcommit。
1 – Always overcommit. 允許overcommit,對內(nèi)存申請來者不拒。內(nèi)核執(zhí)行無內(nèi)存過量使用處理。使
用這個設(shè)置會增大內(nèi)存超載的可能性,但也可以增強大量使用內(nèi)存任務(wù)的性能。
2 – Don’t overcommit. 禁止overcommit。 內(nèi)存拒絕等于或者大于總可用 swap 大小以及
overcommit_ratio 指定的物理 RAM 比例的內(nèi)存請求。如果希望減小內(nèi)存過度使用的風(fēng)險,這個設(shè)置就是
最好的。就緒——>阻塞:就緒態(tài)根本就沒有執(zhí)行,談不上進入阻塞態(tài)
進程更多的狀態(tài):
運行態(tài):running
就緒態(tài):ready
睡眠態(tài):分為兩種,可中斷:interruptable,不可中斷:uninterruptable
停止態(tài):stopped,暫停于內(nèi)存,但不會被調(diào)度,除非手動啟動
僵死態(tài):zombie,僵尸態(tài),結(jié)束進程,父進程結(jié)束前,子進程不關(guān)閉,殺死父進程可以關(guān)閉僵死
態(tài)的子進程
8. 說明IPC通信和RPC通信實現(xiàn)的方式。
同一主機

不同主機

9. 通過mkfifo, cat, 來解釋秒殺的并發(fā)問題,如何通過隊列解決的?最好結(jié)合圖形。說明消息隊列的作用?
利用管道文件實現(xiàn) IPC


10. 總結(jié)Linux,前臺和后臺作業(yè)的區(qū)別,并說明如何在前臺和后臺中進行狀態(tài)轉(zhuǎn)換。
Linux的作業(yè)控制
前臺作業(yè):通過終端啟動,且啟動后一直占據(jù)終端
后臺作業(yè):可通過終端啟動,但啟動后即轉(zhuǎn)入后臺運行(釋放終端)
讓作業(yè)運行于后臺
運行中的作業(yè): Ctrl+z
尚未啟動的作業(yè): COMMAND &
后臺作業(yè)雖然被送往后臺運行,但其依然與終端相關(guān);退出終端,將關(guān)閉后臺作業(yè)。如果希望送往后臺
后,剝離與終端的關(guān)系
nohup COMMAND &>/dev/null &
screen;COMMAND
tmux;COMMAND
查看當(dāng)前終端所有作業(yè):[root@rocky8 2024-07-01]# jobs
作業(yè)控制:
fg [[%]JOB_NUM]:把指定的后臺作業(yè)調(diào)回前臺
bg [[%]JOB_NUM]:讓送往后臺的作業(yè)在后臺繼續(xù)運行
kill [%JOB_NUM]: 終止指定的作業(yè)
11. 總結(jié)內(nèi)核設(shè)計流派及特點。
單內(nèi)核設(shè)計:把所有功能模塊集成于同一個程序(Linux),支持模塊化如進程調(diào)度,內(nèi)存管理,文件系統(tǒng),硬件驅(qū)動等,支持模塊的動態(tài)裝載和卸載
微內(nèi)核設(shè)計:每種功能模塊使用一個單獨子系統(tǒng)實現(xiàn)(Windows),把一些應(yīng)用放到了用戶空間,服務(wù)與服務(wù)之間隔離,單個服務(wù)故障或者被攻擊,也不會導(dǎo)致操作系統(tǒng)掛掉
12. 總結(jié)rocky 啟動流程,grub工作流程
1. 加載BIOS的硬件信息,獲取第一個啟動設(shè)備2. 讀取第一個啟動設(shè)備MBR的引導(dǎo)加載程序(grub)的啟動信息
3. 加載核心操作系統(tǒng)的核心信息,核心開始解壓縮,并嘗試驅(qū)動所有的硬件設(shè)備
4. 核心執(zhí)行init程序,并獲取默認(rèn)的運行信息
5. init程序執(zhí)行/etc/rc.d/rc.sysinit文件,重新掛載根文件系統(tǒng)
6. 啟動核心的外掛模塊
7. init執(zhí)行運行的各個批處理文件(scripts)
8. init執(zhí)行/etc/rc.d/rc.local
9. 執(zhí)行/bin/login程序,等待用戶登錄
10. 登錄之后開始以Shell控制主機
GRUB 啟動階段
primary boot loader :
1st stage:MBR的前446個字節(jié)
1.5 stage:MBR 之后的扇區(qū),讓stage1中的bootloader能識別stage2所在的分區(qū)上的文件系統(tǒng)
secondary boot loader :2nd stage,分區(qū)文件/boot/grub/
13. 手寫chkconfig服務(wù)腳本,可以實現(xiàn)服務(wù)的開始,停止,重啟。




14. 總結(jié)systemd服務(wù)配置文件
systemd服務(wù)配置文件由三部分組成
[Unit]:定義與Unit類型相關(guān)的通用選項,用于提供unit描述消息,unit行為,依賴關(guān)系
[Service]:與特定類型相關(guān)的專用選項
[Install]:定義由systemclt enable/disable命令在實現(xiàn)服務(wù)開機啟動或不啟動時用到的一些選項
Unit段常用選項
Description:描述信息
After:定義unit的啟動次序,表示當(dāng)前unit應(yīng)該晚于哪些unit啟動
Requires:依賴到的其他units,被依賴的units無法激活時,當(dāng)前unit也無法激活
Wants:依賴到的其他units
Conflicts:定義units間的沖突關(guān)系
Service段常用選項
Type:定義影響ExecStart及相關(guān)參數(shù)的功能的unit進程啟動類型
ExecStart:指明啟動unit要運行命令或腳本的絕對路徑
ExecStop:指明停止unit要運行的命令或腳本
Install段常用選項
Alias:別名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依賴
WantedBy:被哪些units所依賴
Also:安裝被服務(wù)的時候還要安裝別的相關(guān)服務(wù)
15. 總結(jié)system啟動流程
POST加電自檢
Bootloader,grub2啟動引導(dǎo)程序:/etc/grub.d,/etc/default/grub,/boot/grub2/grub.cfg
解壓initramfs文件,加載驅(qū)動模塊,掛載根文件系統(tǒng)
加載虛擬根中的內(nèi)核
虛擬根的內(nèi)核初始化,運行第一個進程systemd
執(zhí)行initrd.target所有單元
從initramfs根文件系統(tǒng)切換到磁盤根目錄
systemd執(zhí)行默認(rèn)target配置,配置文件/etc/systemd/system/defaul.target
systemd執(zhí)行sysinit.target初始化系統(tǒng)及basic.target準(zhǔn)備操作系統(tǒng)
systemd啟動multi-user.target下的本機與服務(wù)器服務(wù)
systemd執(zhí)行multi-user.target下的/etc/rc.d/rc.local
systemd執(zhí)行multi-user.target下的getty.target及登錄服務(wù)
systemd執(zhí)行g(shù)raphical需要的服務(wù)
16. 總結(jié)awk工作原理,awk命令,選項,示例。
awk工作原理
第一步:執(zhí)行BEGIN{action}語句
第二步:從文件或標(biāo)準(zhǔn)輸入中讀取一行,然后執(zhí)行pattern{action}語句,與sed一樣逐行掃描處理,從第一行到最后一行重復(fù)這個過程,知道全部被讀取完畢
第三步:文件讀取完畢后,執(zhí)行END{action}語句
格式:awk [選項] ‘program’ [var=X] filename
選項:
-F:指定輸入的字段分隔符,默認(rèn)為若干個連續(xù)空白符

17. 總結(jié)awk的數(shù)組,函數(shù)。
awk數(shù)組為關(guān)聯(lián)數(shù)組
關(guān)聯(lián)下標(biāo)可以為任意字符串,字符串要使用雙引號
如果某數(shù)組元素不存在,在引用時,awk會自動創(chuàng)建此元素,并將其值初始化為空串
awk函數(shù)分為內(nèi)置函數(shù)和自定義函數(shù)
數(shù)值處理
rand():返回1和0之間隨機數(shù)
srand():配置rand函數(shù),生成隨機數(shù)種子
int():返回整數(shù)
字符串處理
length(X):返回指定字符串長度
sub(r,s,x):對x字符串搜索r表示模式匹配的內(nèi)容,并將第一個匹配內(nèi)容替換為s
gsub(r,s,x):對x字符串搜索r,并將匹配的所有內(nèi)容替換為s
split(s,array,r):對r為分隔符,切割字符串s,并將切割后的結(jié)果保存至array數(shù)組
自定義函數(shù)
格式
function? name(形參){
命令
return var
????????????????????????}
18. 總結(jié)ca管理相關(guān)的工具,根據(jù)使用場景總結(jié)示例。
創(chuàng)建CA相關(guān)文件
mkdir -p /etc/pki/CA/{certs,netwcerts,crl,private}
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
生成CA私鑰
(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem
生成CA自簽名證書
openssl req -new -x509 -key /etc/pki/CA/cakey.pem -out /etc/pki/CA/cacert.pem -days Num
生成用戶私鑰
(umask 066;openssl genrsa -out filename)
生成用戶證書請求文件
openssl req -new -in filename -out filename
頒發(fā)用戶證書
openssl ca -in filename -out filename -days Num
查看證書信息
openssl x509 -in filename -noout -text
吊銷證書
echo 01 > /etc/pki/CA/crlnumber
openssl ca -revoke /etc/pki/CA/newcerts/Num.pem
openssl ca gencrl -out /etc/pki/CA/crl.pem
19. 總結(jié)對稱加密和非對稱加密算法和用openssl簽發(fā)證書步驟
對稱加密算法
加密和解密使用同一個密鑰
特性:
加密、解密使用同一個密鑰,效率高
將原始數(shù)據(jù)分割成固定大小的塊,逐個進行加密
缺陷:
密鑰多
密鑰分發(fā)
數(shù)據(jù)來源無法確認(rèn)
常用對稱加密算法:
DES,3DES,AES
非對稱加密算法
密鑰成對出現(xiàn)
公鑰:公開給所有人
私鑰:自己留存,保證私密性
特點:用公鑰加密,只能使用與之匹配的私鑰解密,反之亦然
缺陷:
密鑰長,算法復(fù)雜
加密解密效率低
常見算法:
RSA,DSA