進程: 是指一個具有獨立功能的程序在一個數據集合上的一次運行活動,即每個程序模塊和它執行時所處理的數據,組成了進程。
進程與程序的區別
1. 進程是動態的,程序是靜態的
2. 進程有生命週期的,程序是永久的
3. 一個程序可以包含多個進程,一個進程也可以包含多個程序(調用其它程序)
一個程序是由指令加數據組成一個靜態的文件放在外部存儲上(如硬盤),在必要的時候,cpu運行這個程序,那麼由cpu的控制指令從外部存儲加載至內存,並且完成運算的這麼一個過程,叫做進程,進程是有生命週期的。
線性內存:線性地址,在linux的32位系統中,邏輯上假設每個進程都是獨佔4G內存,其中 1G分配給內核使用,其餘的3G內存由進程使用。而在真實的內存中就是把內存本身劃分成一個個的頁框,每個頁框都是固定大小的存儲單元(4K),當進程使用內存時,根據需要會分配給n個頁框對應給虛擬地址的頁面給進程使用,而且各個頁框之間可能是不相臨的,不連續的,但對進程本身來看,是連續的,保存存在數據結構中的內存。把線性地址中的頁面映身到真實的物理地址,是MMU(Merrory Management Unit內存管理單元)的功能,爲了改進虛擬地址到物理地址轉換的速率,把每個頁面轉換後保存到緩存中去,這個過程叫TLB(後備緩衝器,或叫頁面緩存)
進程切換,上下文切換(Context Switch): 在單核單個cpu當中,一次只能有一個任務在cpu中運行,當一個進程沒有運行完成就進行任務切換。在切換時,一個進程存儲在處理器各寄存器中的中間數據叫做進程的上下文,所以進程的 切換實質上就是被中止運行進程與待運行進程上下文的切換。在進程未佔用處理器時,進程 的上下文是存儲在進程的私有堆棧中的。
保存現場:在進程切換前,把進程A的當前運行信息,如程序執行到的當前位置,程序狀態字,所有的寄存器值保存到進程A的PCB(Process Control Block)中。
恢復現場:從進程B的PCB中獲取進程的執行信息,將這些信息寫入相應的寄存器中,程序計數器指向進程B將執行的下一條指令。進程B可能第一次開始執行,也可能是被中斷過的進程,恢復執行。不論是哪種情況,進程B的執行信息都能在其PCB中找到。
進程切換與模式切換: 進程切換是作用於進程之間的一種操作。當分派程序收回前進程的CPU並把它分派給某個就緒進程時,叫進程切換。 模式切換是進程內部所引用的一種操作。當用戶程序轉入系統調用如I/O操作,或系統調用轉入程序時,叫模式切換。進程切換一定會有模式切換,模式切換就不一定有進程切換。
進程所擁有的常見狀態:
Stopped : 停止狀態
Ready : 就緒狀態,準備運行
Running(Executing) : 正在運行(執行)狀態
Sleeping : 睡眠狀態,睡眠狀態有兩種;
Uninterruptible Sleeping: 不可中斷睡眠狀態 當一個進程需要調用額外的I/O資源(硬盤資源)時,由於I/O資源速度太慢,進程一定會轉入睡眠狀態,當I/O沒有執行完時,進程不可以再被調入CPU執行,叫不可中斷睡眠狀態
Interruptible Sleeping : 可中斷睡眠狀態 當一個進程不是由於額外I/O進入睡眠狀態,而時處於隨時可以喚醒狀態,叫可中斷睡眠狀態
Zombie : 僵死進程,正常執行完成的進程,但內存沒有被釋放的進程。除了INIT進程外,每個進程都有其父進程,當進程結束時由父進程負責回收其子進程的資源,如果當父進程意外終止時,子進程無法釋放其所佔的資源,叫做Zombie。
進程優先級:在linux中有0-139共140個優先級,數字越小,優先級越高。其中0-99的優先級是由內核調整的,100-139可以由用戶調整 nice(-20 -- 19)值來調整優先級,普通用戶只能調大nice值用來降低其優先級,root用戶可以調整 對應的nice值來提高或降低進程的優先級。一般默認進程的nice值是0。
進程管理命令:
pstree : 進程樹,顯示以樹結構的進程列表。用這個命令可以瞭解進程的層次結構。如圖所示,init進程是第一個進程
ps : Process Stat 顯示系統當前進程狀態的命令;
PID : 進程ID,進程開始後指派給此進程的唯一標識符。PPID:父進程ID,創建了當前進程的父進程的PID。
COW : copy on write 寫時複製,父進程創建子進程時,爲了推遲甚至避免拷貝數據的技術,內核此時並不複製整個進程的地址空間,而是讓父子進程共享同一個地址空間。只 用在需要寫入的時候纔會複製地址空間,從而使各個進程擁有各自的地址空間。也就是說,資源的複製是在需要寫入的時候纔會進行,在此之前,只有以只讀方式共 享。這種技術使地址空間上的頁的拷貝被推遲到實際發生寫入的時候。
ps命令的參數:
a : 顯示所有跟終端有關的進程
u:顯示用戶信息,以用戶爲中心顯示進程的想在關信息
x: 顯示所有跟終端無關的進程
命令顯示效果如圖
PID 進程號 VSZ 虛擬內存集 RSS 常駐內存集
TTY 顯示與終端相關的信息 ?表示與終端無關, TIME 運行時長
STAT 進程狀態 TIME 運行時長 COMMAND 進程命令
ps 的另外一組參數 -elf
PRI 顯示的是進程的優先級 NI nice值,可以調整nice值來更新進程的優先級
PSR 運行在哪個CPU上
top 命令: 顯示正在運行的系統的進程的實時視圖,默認每隔5秒鐘刷新一次
top 前五行是統計信息區,是系統整體的統計信息
1. 第一行是任務隊列信息,和uptime 命令的執行結果,顯示當前時間,up 運行時間,user 當前登陸用戶,load average 系統負載,即任務隊列的平均長度。三個值爲1min 5min 15min 鍾前到現在的平均值。
2. 第二、三行爲進程和CPU信息,當有多個CPU時,這些內容會超過兩行,按數字1 可以展開每個CPU的信息,不展開顯示的是CPU的平均值。
Tasks 進程總數 running 正在運行的進程數 sleeping 睡眠的進程數
stopped 停止的進程數 zombie 僵死的進程數 CPU(s):0.0% us 用戶空間佔用的cpu百分比(平均值) sy 內核空間佔用cpu百分比 ni 用戶進程空間內改變過優先級的進程佔用cpu百分比 id 空閒cpu 百分比 wa 等待I/O所未CPU時間百分比
hi 硬件中斷所佔cpu時間百分比 st 虛擬機所佔cpu 時間百分比
3. 第四、五行爲內存信息
Mem 物理內存總量 used 使用的物理內存總量 free 空閒內存總量 buffers 用做內核緩存的內存量
Swap 交換區總量 used 使用的交換區的總量 free 空閒交換區總量 cached 緩衝的交換區的問題。
進程信息:
PID USER PR(優先級) NI VIRT(虛擬內存級) RES(常駐內存級) SHR(共享內存) S(狀態) %CPU %MEM TIME+(進程所佔CPU的時間總計,單位是百分之1秒) COMMAND (命令名/命令行)
top命令參數
-d # : 指定信息刷新時間間隔,單位是秒,top默認的刷時爲5秒, top –d 3表示每隔3秒種刷新一次。
-s : 使top命令在安全模式中運行,這將去除交互命令所帶來的潛在危險
-b : 批模式, 翻屏顯示信息,不再實時刷新,因爲實時刷新時有可能一屏顯示不會所有的進程。但會一直翻屏顯示,除非ctrl +c 終止
-n # : 在批模式中,後面加-n # ,表示只顯示#屏,如top –b –n 3 只顯示top命令一共3屏的信息。
交互式命令
top :
M : 根據駐留內存大小 進行排序
P: 根據CPU使用百分比大小進行排序
T: 根據時間/累計時間進行排序
l : 切換顯示平均負載和啓動時間信息。即顯示隱藏第一行的信息
m: 切換顯示內存信息。即顯示隱藏內存行
t : 切換顯示進程和CPU狀態信息。即顯示影藏CPU行
c : 是否顯示完整的命令行信息
k : 終止某個進程。系統將提示用戶輸入需要終止的進程PID,以及需要發送給該進程什麼樣的信號。
q : 退出程序。