典型的linux結構
shell命令執行過程
三進程概念
程序的一個執行實例
正在執行的程序
能分配處理器并由處理器執行的實體
進程描述
每一個進程都有一個進程控制塊(PCB)linux下為task_struct結構體
該結構體在include/linux/sched.h文件中
進程標識符
PID
PPID
進程映像(從高地址到低地址)
內核部分
命令行參數以及環境變量
棧
共享區
堆
(以下部分由exec替換并初始化)
未初始化數據
已初始化數據代碼區
環境變量的獲取
extern char **environ;
相關函數
getenv
setenv
unsetenv
進程狀態
running運行狀態:正在運行或者在運行隊列中
sleeping睡眠狀態:在等待事件完成
disk sleep磁盤休眠狀態:會等待io完成,不可中斷
Zombies僵死狀態:父進程未調用wait等待,而子進程退出.
stopped,暫停狀態,通過single T信號產生
X(dead),死亡狀態,系統清除該進程信息
t (tracing stop):用于debug調試跟蹤
一份專業描述
PROCESS STATE CODES
R? running or runnable (on run queue)
D? uninterruptible sleep (usually IO)
S? interruptible sleep (waiting for an event to complete)
Z? defunct/zombie, terminated but not reaped by its parent
T? stopped, either by a job control signal or because?it is being traced
[...]
僵尸進程:如果一個進程的父進程一直不掉用wait或者waitpid,子進程退出,沒有人接收其狀態,那么他就會作為僵尸進程存在,直到父進程退出,然后交給init進程管理
孤兒進程:如果父進程退出,而其還有一個或者多個子進程在運行,那么這些子進程就會變成孤兒進程.由init接管
進程優先級
lang@liang:~$ ps -l
F S? UID? PID? PPID? C PRI? NI ADDR SZ WCHAN? TTY? ? ? ? ? TIME CMD
0 S? 1000? 4450? 2121? 0? 80? 0 -? 2236 wait? pts/19? 00:00:00 bash
4 R? 1000? 5126? 4450? 0? 80? 0 -? 2304 -? ? ? pts/19? 00:00:00 ps
注:這里的PRI就是進程優先級
而NI則對應nice值,用于調節優先級
相關命令
nice ? 調節程序執行時優先級
nice -n -5 /usr/local/mysql/bin/mysqld_safe &renice? ? 修改正在運行程序的優先級
renice -5 -p 5200
進程創建
fork()
fork成功,子進程得到父進程地址空間的堆,棧,數據區域的拷貝,而文本段則是父子進程共享的
進程終止
exit
從主函數返回
_exit
return
最后一個線程調用pthread_exit
調用abort函數
接收到信號終止
最后一個線程對取消請求做出相應