歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux進程的基本知識

Linux進程的基本知識

日期:2017/2/28 16:02:27   编辑:Linux教程

進程的內存布局

進程從邏輯上可以分為

1.Text:程序的指令

2.Data:程序使用的靜態變量

3.Heap:程序能夠動態分配額外儲存空間的區域

3.Stack:當調用函數和返回函數是這片內存空間增長和縮小,用來給局部變量和函數調用s時有關的信息分配空間的內存區域

進程的創建和執行

1.創建:一個進程通過調用fork()系統調用創建一個子進程(調用fork()的是父進程)

調用fork()時,創建的子進程復制父進程的data,heap,stack段,共享父進程的Text段(Text段只讀)

2.執行:子進程可以通過調用execve()函數來載入和運行另一個程序,這時子進程的Text,Data,Heap,Stack將被新程序對應的東西替換

C library裡面有一些exec開頭的函數作用是差不多的

進程的終止和終止狀態

1.自殺:調用_exit()(或者相關的library中的exit()函數)

2.他殺:給進程傳送某種signal

_exit()可以指定終結的狀態(終結的狀態通常就是一個很小的整數)

通過某種signal終結進程,終結的狀態根據signal的種類而不同

父進程通過wait()系統調用函數可以獲取子進程終結後的終結狀態

進程自己的兩種ID

1.每一個進程都有一個process identifier(PID)和parent process identifier(PPID)

進程與用戶和組相關的一些ID

1.Real user id 表明進程屬於哪個用戶

Real group id 表明進程屬於哪組群組

2.Effective user id 根據這個用戶id,進程對某些資源的權限

Effective group id 根據這個群組id,進程對某些資源的權限

這兩個通常與real xxx id是一樣的值,這兩個值可以改變的

3.Supplementary IDs 這些ids表示一些額外的群組,而進程屬於這些群組

(以上3種這些IDs值繼承自父進程)

privileged process(特權進程) 和 unprivileged process

1.privileged process:Effective user id 值為0的進程,id的值為0意味著是超級用戶,能夠繞開權限的限制

2.unprivileged process:Effective user id 的值非0的進程,要根據權限來執行

capabilities(能力)

從kernel2.2開始,Linux將privileges分成一系列截然不同的單元叫做capabilities.每一個privileged operation關聯到一個具體的capability,每一個進程能夠執行某個操作僅當這個進程有對應的capability。傳統的super process具有所有的capabilities。

init process

當啟動操作系統的事後內核創建一個叫init的進程,它是所有進程的父進程,init是程序的路徑為/sbin/init(在Fedora15中 /sbin/init是一個鏈接 真正文件為/bin/systemd) init進程具有super user權限並且進程號為1。init進程只有在shut down時才能被干掉,即使super user也殺不了它。

daemon process

和其它進程差不多,有兩個特征

1.通常長時間生存,一般情況下與系統同生共死。(當然可以kill掉)

2.在後台運行,沒有控制終端讓它輸入或輸出

如syslogd進程

environment list

每一個進程都有一個environment list,它是在進程的用戶空間中被維護的集合environment variables。每一個元素是 名字和值 組成的,通過fork()創建一個新進程時,environment list繼承自父進程。當通過exec()系列的函數替換進程的程序時,可以通過指定environment list來替換本來的,或者不指定則保留原來進程的。C語言程序可以通過使用外部變量char **environ來獲取environment list或者修改它。

resource limits

每一個進程都要消耗一些資源如打開文件,內存,cpu時間。通過調用系統調用setrlimit(),一個進程能夠限制消費各種資源的上限。每一種資源限制有兩個相關的值:一個是soft limit,這個限制進程消耗資源的數量;另一個是hard limit,這個是一個允許調整的soft limit的值的上限。一個unprivileged process僅僅能調整soft limit的值在0-hard limit之間,只能減少hard limit的值,不能增加。fork()一個新進程,這個新進程的resource limits繼承自父進程。shell可以通過ulimit改變limits的值。

Copyright © Linux教程網 All Rights Reserved