久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

一步步理解Linux進程(1)

 迎風(fēng)翱翔 2013-04-20

一步步理解Linux進程(1)--進程基礎(chǔ)知識

89人閱讀 評論(0) 收藏 舉報
0. 說明

作者:Gao Peng<[email protected]>
本文章由Gao Peng編寫,,轉(zhuǎn)載請注明出處。

1. 基本概念

進程
進程是處于執(zhí)行期的程序以及相關(guān)資源的總稱,,注意包含了兩個方面:
  • 程序代碼,。
  • 資源。比如說打開的文件,,掛起的信號,,內(nèi)核內(nèi)部數(shù)據(jù),處理器狀態(tài),,一個或多個具有內(nèi)存映射的內(nèi)存地址空間,,一個或多個執(zhí)行線程,存放全局變量的數(shù)據(jù)段等,。
PID
任意一個進程通過PID作為標(biāo)識,,PID一般是一個正整數(shù)。

線程
對于Linux,,內(nèi)核并沒有線程這個概念,。Linux把所有的線程都當(dāng)做進程來實現(xiàn),線程僅僅被視為一個與其他進程共享某些資源的進程,。

進程的狀態(tài)
進程可以有5種狀態(tài):
  • TASK_RUNNING(運行) -- 進程正在執(zhí)行,,或者在運行隊列中等待執(zhí)行。這是進程在用戶空間中唯一可能的狀態(tài),。
  • TASK_INTERRUPTIBLE(可中斷) -- 進程正在睡眠(阻塞),,等待某些條件的達(dá)成。一個硬件中斷的產(chǎn)生,、釋放進程正在等待的系統(tǒng)資源,、傳遞一個信號等都可以作為條件喚醒進程。
  • TASK_UNINTERRUPTIBLE(不可中斷) -- 與可中斷狀態(tài)類似,,除了就算是收到信號也不會被喚醒或準(zhǔn)備投入運行,,對信號不做響應(yīng)。這個狀態(tài)通常在進程必須在等待時不受干擾或等待事件很快就會發(fā)生時出現(xiàn),。例如,,當(dāng)進程打開一個設(shè)備文件,相應(yīng)的設(shè)備驅(qū)動程序需要探測某個硬件設(shè)備,,此時進程就會處于這個狀態(tài),,確保在探測完成前,設(shè)備驅(qū)動程序不會被中斷。
  • __TASK_TRACED -- 被其它進程跟蹤的進程,,比如ptrace對程序進行跟蹤,。
  • __TASK_STOPPED -- 進程停止執(zhí)行。通常這種狀態(tài)發(fā)生在接收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU等信號的時候,。此外,,在調(diào)試期間接收到任何信號,都會使進程進入這種狀態(tài),。


2. ps的使用

ps的參數(shù)
Linux中查看進程的最重要的命令是ps,,學(xué)會ps的使用,就了解了進程的大部分內(nèi)容,。具體的參數(shù)都在man手冊,,常用的參數(shù)是:

 a    顯示所有進程(包括其它用戶的進程)
 -e   列出所有進程
 x    顯示無控制終端的進程
 u    輸出用戶名
 e    列出程序時,顯示每個程序所使用的環(huán)境變量
 f    顯示樹狀圖
 -L   顯示線程
 -o   按照自定義的格式輸出信息
 -ww  在終端下不截斷命令

命令ps aux的輸出的各列如下:

  1. $ps aux  
  2. USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND  

需要解釋的是:
 VSZ    表示如果一個程序完全駐留在內(nèi)存的話需要占用多少內(nèi)存空間;
 RSS    指明了當(dāng)前實際占用了多少內(nèi)存;
 STAT   顯示了進程當(dāng)前的狀態(tài): 

ps輸出的進程狀態(tài)
進程的狀態(tài)和其表示符號如下:

 D    uninterruptible sleep (usually IO)
 R    running or runnable (on run queue)
 S    interruptible sleep (waiting for an event to complete)
 T    stopped, either by a job control signal or because it is being traced
 W    paging (not valid since the 2.6.xx kernel)
 X    dead (should never be seen)
 Z    defunct ("zombie") process, terminated but not reaped by its parent

For BSD formats and when the stat keyword is used, additional characters may be displayed:

 <    high-priority (not nice to other users)
 N    low-priority (nice to other users)
 L    has pages locked into memory (for real-time and custom IO)
 s    is a session leader
 l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
 +    is in the foreground process group


3. 進程關(guān)系

進程的創(chuàng)建
Linux非常依賴進程創(chuàng)建來滿足用戶的需求,,比如在shell中輸入一條命令,,shell進程就生成一個新進程,新進程執(zhí)行shell的另一個拷貝,,這個拷貝的過程由fork()函數(shù)完成,。示例如下:
示例1:
  1. $  ps -u jh -eo user,pid,ppid,stat,cmd  
  2. jh       18586  2840 Ss   /bin/bash  
  3. jh       19110 18586 R+   ps -u jh -eo user,pid,ppid,stat,cmd  


可以看到用戶的終端shell的pid是18586,執(zhí)行ps程序時,,進程18586生產(chǎn)了新的子進程19110來運行ps,。

示例2:
  1. $ ps -u jh -eo user,pid,ppid,stat,cmd | cat  
  2. USER       PID  PPID STAT CMD  
  3. jh       18586  2840 Ss   /bin/bash  
  4. jh       19130 18586 R+   ps -u jh -eo user,pid,ppid,stat,cmd  
  5. jh       19131 18586 S+   cat  
示例中ps的輸出通過管道傳送給cat,可以看到,,運行ps的進程(19130)和運行cat的進程(19131)都是bash進程(18586)的子進程,。

由此可見,出了初始的內(nèi)核進程,,所有進程都由其父進程fork()產(chǎn)生,。
如果一個進程的父進程終止而自己繼續(xù)運行,則這種進程叫做孤兒進程(orphan process),,內(nèi)核會把init進程(即PID為1)的進程安排為孤兒進程的父進程,。

作業(yè)
顧名思義,作業(yè)就是完成某個任務(wù)的進程的集合,。作業(yè)可以在前臺或者后臺運行,。比如

示例1:
$ cat main.c
在前臺啟動了一個作業(yè),這個作業(yè)只包含了一個進程,,即cat。

示例2:
$ ps aux | grep -v root | cat
在前臺啟動了一個作業(yè),,這個作業(yè)包含了三個進程,,即ps, grep和cat

示例3:
$ ps aux | grep -v root | cat &
則是在后臺啟動了一個包含3個進程的作業(yè)

進程組
每個進程除了有一個唯一的PID外,還屬于一個進程組。
進程組是一個或多個進程的集合,。通常,,他們與統(tǒng)一作業(yè)相關(guān)聯(lián),可以接受來自同一終端的各種信號,。
每個進程組由一個進程組ID(PGID)標(biāo)識,。當(dāng)一個進程的PID等于其所在進程組的PGID時,我們稱這個進程是該進程組的組長,。
  1. $ ps -u jh -eo user,pid,ppid,pgid,stat,cmd | cat | cat  
  2. USER       PID  PPID  PGID STAT CMD  
  3. jh       18586  2840 18586 Ss   /bin/bash  
  4. jh       19299 18586 19299 R+   ps -u jh -eo user,pid,ppid,pgid,stat,cmd  
  5. jh       19300 18586 19299 S+   cat  
  6. jh       19301 18586 19299 S+   cat  
可以看到,,19299, 19300, 19301三個進程具有同樣的PGID(19299),說明它們屬于同一進程組,,組長進程為19299.

會話(session)
會話是一個或多個進程組的集合,。
同樣,會話由會話ID(SID)標(biāo)識,。如果一個進程的PID等于其所在會話的SID,,我們稱這個進程是該會話的會話首進程。
  1. $ ps aux | less &  
  2. [1] 19322  
  3. $ ps -u jh -eo user,pid,ppid,pgid,sid,stat,cmd | cat | cat  
  4. USER       PID  PPID  PGID   SID STAT CMD  
  5. jh       18586  2840 18586 18586 Ss   /bin/bash  
  6. jh       19321 18586 19321 18586 T    ps aux  
  7. jh       19322 18586 19321 18586 T    less  
  8. jh       19323 18586 19323 18586 R+   ps -u jh -eo user,pid,ppid,pgid,sid,stat,cmd  
  9. jh       19324 18586 19323 18586 S+   cat  
  10. jh       19325 18586 19323 18586 S+   cat  
可以看到,,上面兩條命令執(zhí)行下來,,產(chǎn)生了兩個進程組(PGID分別為19321和19323),它們都屬于同一個會話(18586),。事實上,,由當(dāng)前控制終端產(chǎn)生的所有進程組都會屬于同一個會話。

一個會話中的幾個進程組可以被分成一個前臺進程組(foreground process group)和一個或多個后臺進程組(background process group),。擁有控制終端的進程所在的進程組就是前臺進程組,,在終端中鍵入中斷鍵(Control + C),就會把中斷信號發(fā)給前臺進程組中的所有進程,。



1
0

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多