雷子聊併發編程(002):進程介紹

什麼是進程

進程的定義是:指在系統中能獨立運行並做爲資源分配的基本單位,它是由一組機器指令、數據和堆棧等組成的,是一個能獨立運行的活動實體。
通俗直白的講:進程是系統中正在運行的一個程序,程序一旦運行就是進程。php

查看進程

在Windows系統中,打開QQ程序這個軟件,系統就會建立一個進程,經過任務欄管理器能夠方便直觀的查看。以下圖所示: java

ps -aux指令

在Linux操做系統中,執行ps -aux指令,下圖所示。編程

ps -aux指令

進程特徵

動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的。在PHP的WEB程序中,用戶每次請求都動態產生一個php-fpm的進程,結束後又動態消亡。進程的動態性能夠經過top命令查看。segmentfault

併發性:任何進程均可以同其餘進程一塊兒併發執行。進程與線程樣都具備併發性,單核CPU,進度在處理多任務時,與線程同樣也是輪流使用資源。
獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位。在Windows系統中,同時開啓多個應用程序,每一個應用程序佔用的資源各有不一樣。
異步性:因爲進程間的相互制約,使進程具備執行的間斷性,即進程按各自獨立的、不可預知的速度向前推動。這比如咱們在Windows操做系統中既運行瀏覽器,又能同時運行QQ接收到消息,他們之間各自獨立互不依賴且互不影響,各個程序又保持着運行狀態。
結構特徵:進程由程序、數據和進程控制塊三部分組成。關於結構特徵會比較複雜,放在進度的PCB章節中詳細介紹。瀏覽器

ps -aux指令

進程的生命週期

(1) 就緒→執行
處於就緒狀態的進程,當進程調度程序爲之分配了處理機後,該進程便由就緒狀態轉變成執行狀態。微信

(2) 執行→就緒
處於執行狀態的進程在其執行過程當中,因分配給它的一個時間片已用完或更高優先級的進程搶佔而不得不讓出處理機,因而進程從執行狀態轉變成就緒狀態。併發

(3) 執行→阻塞
正在執行的進程因爲發生某事件而暫時沒法繼續執行時,便放棄處理機而處於暫停狀態,亦即進程的執行受到阻塞,把這種暫停狀態稱爲阻塞狀態。
處於阻塞狀態的進程排成一個隊列,稱爲阻塞隊列,有的系統則根據阻塞緣由的不一樣而把處於阻塞狀態的進程排成多個隊列。異步

(4) 阻塞→就緒
處於阻塞狀態的進程,若其等待的事件已經發生,因而進程由阻塞狀態轉變爲就緒狀態。php-fpm

(5) 運行→終止
程序執行完畢,撤銷而終止。學習

舉例說明:
經過java jar指令運行Java程序,即建立了一個進程,同時進入就緒狀態。用戶經過Http請求訪問應用,CPU調度到這個進程。進程實時返回結果給用戶,又進入就緒。若程序處理耗時較長,那進程處於堵塞狀態(但CPU不堵塞,等時間片到又會調度到另外一個進程)。等程序處理完成,又進入就緒狀態繼續等待用戶請求。假設程序在處理的過程當中致使程序崩潰,嚴重狀況則有可能終止進程。

以上是最經典也是最基本的三種進程狀態(就緒,執行,堵塞),但如今的操做系統都根據須要從新設計了一些新的狀態。

ps -aux指令

運行狀態:是運行態和就緒態的合併,表示進程正在運行或準備運行。
可中斷睡眠狀態(淺度睡眠):進程正在睡眠(被阻塞),等待資源到來是喚醒,也能夠經過其餘進程信號或時鐘中斷喚醒,進入運行隊列。
不可中斷睡眠狀態(深度睡眠狀態):其和淺度睡眠基本相似,但有一點就是不可被其餘進程信號或時鐘中斷喚醒。
暫停狀態:進程暫停執行接受某種處理。如正在接受調試的進程處於這種狀態。
僵死狀態:進程已經結束但未釋放PCB。

top指令

在Linux系統中,得知進程的狀態與其它信息可使用top指令查看輸入信息:
PID:進程ID
USER:進程的全部者
PR:進程的優先級
NI:nice值,負值表示高優先級,正值表示低優先級
VIRT:進程佔用虛擬內存的大小
RES:進程佔用物理內存的大小
SHR:進程佔用共享內存的大小
S:進程的狀態,D=睡眠狀態,R=運行狀態,S=睡眠狀態,T=中止狀態,Z=殭屍進程
%CPU:進程佔用CPU的百分比
%MEM:進程佔用物理內存的百分比
TIME+:進程佔用CPU的總時長
COMMAND:進程使用的命令行,使用 top -c 能夠查看詳細的命令行

最後

爲何要學習進程,由於對處理機即CPU的管理可歸結爲對進程的管理。進一步而言,能控制好進程,那麼就能最大化利用CPU資源,提升程序運行效率。

搜索並關注微信公衆號:iamleiyongjun;每週都有【由淺入深的併發編程】教程分享,開發中間件再也不是夢想!
相關文章
相關標籤/搜索