天天看點

Linux核心之程序1:程序的概念

1.什麼是程序?

程序:資源的封裝機關;

linux用一個PCB來描述程序,即task_struct, 其包含mm,fs,files,signal…

Linux核心之程式1:程式的概念
  1. root目錄,是一個程序概念,不是系統概念;

    apropos chroot

    man chroot 2

如下圖,将分區/dev/sda5挂載到/mnt/a,調用chroot,改變root目錄,目前程序下的檔案b.txt即位于目前程序的根目錄。

Linux核心之程式1:程式的概念

(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

Linux核心之程式1:程式的概念

(base) leon@leon-Laptop:/proc/29171$ cat /proc/sys/kernel/pid_max

32768

案例:android2.2漏洞

Android提權漏洞分析——rageagainstthecage:

Linux核心之程式1:程式的概念

Setuid(shell):rootshell使用者 PID用完時,降級失敗,依然具有root權限

解決辦法,檢查傳回值

軟體工程符合墨菲定律,解決辦法,代碼寫出閉環。

2 linux程序的組織方式

linux裡的多個程序,其實就是管理多個task_struct,那他們是怎麼組織聯系的呢?

組織task_struct的資料結構:

Linux核心之程式1:程式的概念

a.連結清單,周遊程序

b.樹:友善查找父子相關程序

c.哈希表:用于快速查找

用三種資料結構來管理task_struct,以空間換時間。

父程序監控子程序,linux總是白發人送黑發人。父程序通過wait,讀取task_struct的退出碼,得知程序死亡原因。并且清理子程序屍體。

Android/或者伺服器,都會用由父程序監控子程序狀态,适時重新開機等;

Linux核心之程式1:程式的概念

3.程序的生命周期

有六個狀态:就緒,運作,睡眠(深度/淺度睡眠),暫停,僵屍

Linux核心之程式1:程式的概念

3.1.什麼是僵屍程序:

子程序死掉,父程序還沒清理屍體,沒火化。

Linux核心之程式1:程式的概念

子程序死亡後,首先變成僵屍,

mm,fs等所有資源已經釋放,隻剩task_struct軀殼還沒被父程序清理,父程序通過wait_pid獲得,wait結束,僵屍所有資源(task_struct)被釋放。

Linux核心之程式1:程式的概念

父程序用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辨別符

Linux核心之程式1:程式的概念

4.fork

建立程序,子程序拷貝父程序的task_struct資源。

Linux核心之程式1:程式的概念

5.什麼是記憶體洩漏?

程序沒死,運作越久,耗費記憶體越多,叫記憶體洩漏(程式死亡時,所占記憶體會全部釋放);

Linux核心之程式1:程式的概念

判斷記憶體洩漏方法:連續多點采樣(6,7,8,9每小時采樣,統計剩餘記憶體是否收斂),正常的程式,記憶體震蕩收斂。随時間增加,記憶體消耗不斷增多,且不收斂,則一定是記憶體洩漏;

發散

繼續閱讀