1.什麼是程序?
程序:資源的封裝機關;
linux用一個PCB來描述程序,即task_struct, 其包含mm,fs,files,signal…
-
root目錄,是一個程序概念,不是系統概念;
apropos chroot
man chroot 2
如下圖,将分區/dev/sda5挂載到/mnt/a,調用chroot,改變root目錄,目前程序下的檔案b.txt即位于目前程序的根目錄。
(2)fd也是程序級概念;
(base) leon@leon-Laptop:/proc/29171$ ls fd -l
總用量 0
lrwx------ 1 leon leon 64 5月 16 10:26 0 -> /dev/pts/19
lrwx------ 1 leon leon 64 5月 16 10:26 1 -> /dev/pts/19
lrwx------ 1 leon leon 64 5月 16 10:26 2 -> /dev/pts/19
(3)pid,系統全局概念
Linux總的PID是有限的,用完PID
每個使用者的PID也是有限的
ulimit -u 最大程序數
ulimit –a
(base) leon@leon-Laptop:/proc/29171$ cat /proc/sys/kernel/pid_max
32768
案例:android2.2漏洞
Android提權漏洞分析——rageagainstthecage:
Setuid(shell):rootshell使用者 PID用完時,降級失敗,依然具有root權限
解決辦法,檢查傳回值
軟體工程符合墨菲定律,解決辦法,代碼寫出閉環。
2 linux程序的組織方式
linux裡的多個程序,其實就是管理多個task_struct,那他們是怎麼組織聯系的呢?
組織task_struct的資料結構:
a.連結清單,周遊程序
b.樹:友善查找父子相關程序
c.哈希表:用于快速查找
用三種資料結構來管理task_struct,以空間換時間。
父程序監控子程序,linux總是白發人送黑發人。父程序通過wait,讀取task_struct的退出碼,得知程序死亡原因。并且清理子程序屍體。
Android/或者伺服器,都會用由父程序監控子程序狀态,适時重新開機等;
3.程序的生命周期
有六個狀态:就緒,運作,睡眠(深度/淺度睡眠),暫停,僵屍
3.1.什麼是僵屍程序:
子程序死掉,父程序還沒清理屍體,沒火化。
子程序死亡後,首先變成僵屍,
mm,fs等所有資源已經釋放,隻剩task_struct軀殼還沒被父程序清理,父程序通過wait_pid獲得,wait結束,僵屍所有資源(task_struct)被釋放。
父程序用waitpid()檢視task_struct退出碼,檢測子程序退出狀态;
Waitpid()調用完成,則子程序徹底消失。
僵屍程序狀态:子程序死亡,還沒被父程序清理,資源已經被釋放,隻剩下task_struct。
清理辦法:kill父程序。
僵屍程序被殺死的假象:
當一個程序裡有多個子線程,主線程退出其他線程仍然運作;
top是以程序視角看線程,是以造成僵屍程序亦然可以被殺的假象;
3.2 stop狀态:
其他程序控制其停止
Ctrl+z:讓程序暫停;發信号19
Fg:程序在前台繼續跑;
Bg:讓程序在背景繼續跑
Fg/bg實際上是發continue信号18
用于作業控制。
Kill –l
cpulimit -l 20 -p 3637
限制CPU占用率為20,實際用ctrl+z fg/bg實作的。
cpulimit是暴力的方法,更好的用CGROUP
3.3 睡眠
程序本身主動睡眠,等待資源,深度睡眠/淺度睡眠。
3.4排程:
隻管在就緒态和運作态程序的切換,一個運作态,多個就緒态。
排程程序隻等CPU,其他資源全部就緒。Linux就緒和占用都是用task_running辨別符
4.fork
建立程序,子程序拷貝父程序的task_struct資源。
5.什麼是記憶體洩漏?
程序沒死,運作越久,耗費記憶體越多,叫記憶體洩漏(程式死亡時,所占記憶體會全部釋放);
判斷記憶體洩漏方法:連續多點采樣(6,7,8,9每小時采樣,統計剩餘記憶體是否收斂),正常的程式,記憶體震蕩收斂。随時間增加,記憶體消耗不斷增多,且不收斂,則一定是記憶體洩漏;
發散