典型的linux結(jié)構(gòu)
shell命令執(zhí)行過(guò)程
三進(jìn)程概念
程序的一個(gè)執(zhí)行實(shí)例
正在執(zhí)行的程序
能分配處理器并由處理器執(zhí)行的實(shí)體
進(jìn)程描述
每一個(gè)進(jìn)程都有一個(gè)進(jìn)程控制塊(PCB)linux下為task_struct結(jié)構(gòu)體
該結(jié)構(gòu)體在include/linux/sched.h文件中
進(jìn)程標(biāo)識(shí)符
PID
PPID
進(jìn)程映像(從高地址到低地址)
內(nèi)核部分
命令行參數(shù)以及環(huán)境變量
棧
共享區(qū)
堆
(以下部分由exec替換并初始化)
未初始化數(shù)據(jù)
已初始化數(shù)據(jù)代碼區(qū)
環(huán)境變量的獲取
extern char **environ;
相關(guān)函數(shù)
getenv
setenv
unsetenv
進(jìn)程狀態(tài)
running運(yùn)行狀態(tài):正在運(yùn)行或者在運(yùn)行隊(duì)列中
sleeping睡眠狀態(tài):在等待事件完成
disk sleep磁盤休眠狀態(tài):會(huì)等待io完成,不可中斷
Zombies僵死狀態(tài):父進(jìn)程未調(diào)用wait等待,而子進(jìn)程退出.
stopped,暫停狀態(tài),通過(guò)single T信號(hào)產(chǎn)生
X(dead),死亡狀態(tài),系統(tǒng)清除該進(jìn)程信息
t (tracing stop):用于debug調(diào)試跟蹤
一份專業(yè)描述
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
[...]
僵尸進(jìn)程:如果一個(gè)進(jìn)程的父進(jìn)程一直不掉用wait或者waitpid,子進(jìn)程退出,沒(méi)有人接收其狀態(tài),那么他就會(huì)作為僵尸進(jìn)程存在,直到父進(jìn)程退出,然后交給init進(jìn)程管理
孤兒進(jìn)程:如果父進(jìn)程退出,而其還有一個(gè)或者多個(gè)子進(jìn)程在運(yùn)行,那么這些子進(jìn)程就會(huì)變成孤兒進(jìn)程.由init接管
進(jìn)程優(yōu)先級(jí)
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就是進(jìn)程優(yōu)先級(jí)
而NI則對(duì)應(yīng)nice值,用于調(diào)節(jié)優(yōu)先級(jí)
相關(guān)命令
nice ? 調(diào)節(jié)程序執(zhí)行時(shí)優(yōu)先級(jí)
nice -n -5 /usr/local/mysql/bin/mysqld_safe &renice? ? 修改正在運(yùn)行程序的優(yōu)先級(jí)
renice -5 -p 5200
進(jìn)程創(chuàng)建
fork()
fork成功,子進(jìn)程得到父進(jìn)程地址空間的堆,棧,數(shù)據(jù)區(qū)域的拷貝,而文本段則是父子進(jìn)程共享的
進(jìn)程終止
exit
從主函數(shù)返回
_exit
return
最后一個(gè)線程調(diào)用pthread_exit
調(diào)用abort函數(shù)
接收到信號(hào)終止
最后一個(gè)線程對(duì)取消請(qǐng)求做出相應(yīng)