程序的執行順序

2021-07-23 03:04:52 字數 3960 閱讀 8621

我們知道 linux 是多人多任務的環境,由 top 的輸出結果我們也發現,系統同時間有非常多的程式在執行中,只是絕大部分的程式都在休眠 (sleeping) 狀態而已。想一想,如果所有的程式同時被喚醒,那麼 cpu 應該要先處理那個程式呢?也就是說,那個程式被執行的優先序比較高?這就得要考慮到程式的優先執行序 (priority) 與 cpu 排程羅!

cpu 排程與前一章的例行性工作排程並不一樣。cpu 排程指的是每支程式被 cpu 執行的演算守則,而例行性工作排程則是將某支程式安排在某個時間再交由系統執行。 cpu 排程與作業系統較具有相關性!

我們知道 cpu 一秒鐘可以執行多達數 g 的微命令次數,透過核心的 cpu 排程可以讓各程式被 cpu 所切換執行,因此每個程式在一秒鐘內或多或少都會被 cpu 執行部分的命令碼。如果程式都是集中在乙個佇列中等待 cpu 的執行,而不具有優先順序之分,也就是像我們去遊樂場玩熱門遊戲需要排隊一樣,每個人都是照順序來!你玩過一遍後還想再玩 (沒有執行完畢),請到後面繼續排隊等待。情況有點像底下這樣:

上圖中假設 pro1, pro2 是緊急的程式, pro3, pro4 是一般的程式,在這樣的環境中,由於不具有優先順序,唉啊!pro1, pro2 還是得要繼續等待而沒有優待呢!如果 pro3, pro4 的工作又臭又長!那麼緊急的 pro1, pro2 就得要等待個老半天才能夠完成!真麻煩啊!所以羅,我們想要將程式分優先順序啦!如果優先序較高則執行次數可以較多次,而不需要與較慢優先的程式搶位置!我們可以將程式的優先順序與 cpu 排程進行如下圖的解釋:

如上圖所示,具高優先權的 pro1, pro2 可以被取用兩次,而較不重要的 pro3, pro4 則執行次數較少。如此一來 pro1, pro2 就可以較快被完成啦!要注意,上圖僅是示意圖,並非較優先者一定會被執行兩次啦!為了要達到上述的功能,我們 linux 給予程式乙個所謂的『優先執行序 (priority, pri)』,這個 pri 值越低代表越優先的意思。不過這個 pri 值是由核心動態調整的,使用者無法直接調整 pri 值的。先來瞧瞧 pri 曾在**出現?

[root@www ~]# ps -l

f s  uid   pid  ppid  cpri  ni addr sz wchan  tty         time cmd

4 s    0 18625 18623  2  75   0-  1514 wait   pts/1    00:00:00 bash

4 r    0 18653 18625  0  77   0-  1102 -      pts/1   00:00:00 ps

由於 pri 是核心動態調整的,我們使用者也無權去干涉 pri !那如果你想要調整程式的優先執行序時,就得要透過 nice 值了!nice 值就是上表的 ni 啦!一般來說, pri 與 ni 的相關性如下:

pri(new) = pri(old) + nice

不過你要特別留意到,如果原本的 pri 是 50 ,並不是我們給予乙個 nice = 5 ,就會讓 pri 變成 55 喔!因為 pri 是系統『動態』決定的,所以,雖然 nice 值是可以影響 pri ,不過,最終的 pri 仍是要經過系統分析後才會決定的。另外, nice 值是有正負的喔,而既然 pri 越小越早被執行,所以,當 nice 值為負值時,那麼該程式就會降低 pri 值,亦即會變的較優先被處理。此外,你必須要留意到:

l  nice 值可調整的範圍為 -20 ~ 19 ;

l  root 可隨意調整自己或他人程式的 nice 值,且範圍為 -20 ~ 19 ;

l  一般使用者僅可調整自己程式的 nice 值,且範圍僅為 0 ~ 19 (避免一般使用者搶占系統資源);

l  一般使用者僅可將 nice值越調越高,例如本來 nice 為 5 ,則未來僅能調整到大於 5;

這也就是說,要調整某個程式的優先執行序,就是『調整該程式的 nice 值』啦!那麼如何給予某個程式 nice 值呢?有兩種方式,分別是:

l  一開始執行程式就立即給予乙個特定的 nice 值:用 nice 命令;

l  調整某個已經存在的 pid的 nice 值:用 renice 命令。

[root@www ~]# nice [-n 數字] command

選項與引數:

-n  :後面接乙個數值,數值的範圍 -20 ~ 19。

範例一:用 root 給乙個 nice 值為 -5 ,用於執行 vi ,並觀察該程式!

[root@www ~]# nice -n -5 vi &

[1] 18676

[root@www ~]# ps -l

f s  uid   pid  ppid  cpri  ni addr sz wchan  tty         time cmd

4 s    0 18625 18623  0  75   0-  1514 wait   pts/1   00:00:00 bash

4 t    0 18676 18625  0  72  -5-  1242 finish pts/1    00:00:00 vi

4 r    0 18678 18625  0  77   0-  1101 -      pts/1   00:00:00 ps

# 原本的 bash pri 為 75  ,所以 vi 預設應為 75。不過由於給予nice  為 -5 ,

# 因此 vi 的 pri 降低了!但並非降低到 70,因為核心還會動態調整!

[root@www ~]# kill -9 %1 <==測試完畢將 vi 關閉

就如同前面說的, nice 是用來調整程式的執行優先順序!這裡只是乙個執行的範例罷了!通常什麼時候要將 nice 值調大呢?舉例來說,系統的背景工作中,某些比較不重要的程式之進行:例如備份工作!由於備份工作相當的耗系統資源,這個時候就可以將備份的命令之 nice 值調大一些,可以使系統的資源分配的更為公平!

[root@www ~]# renice [number] pid

選項與引數:

pid :某個程式的 id 啊!

範例一:找出自己的 bash pid ,並將該 pid 的 nice 調整到 10

[root@www ~]# ps -l

f s  uid   pid  ppid  cpri  ni addr sz wchan  tty         time cmd

4 s    0 18625 18623  0  75   0-  1514 wait   pts/1   00:00:00 bash

4 r    0 18712 18625  0  77   0-  1102 -      pts/1   00:00:00 ps

[root@www ~]# renice 10 18625

18625: old priority 0, new priority 10

[root@www ~]# ps -l

f s  uid   pid  ppid  cpri  ni addr sz wchan  tty         time cmd

4 s    0 18625 18623  0  85  10-  1514 wait   pts/1   00:00:00 bash

4 r    0 18715 18625  0  87  10-  1102 -      pts/1   00:00:00 ps

如果要調整的是已經存在的某個程式的話,那麼就得要使用 renice 了。使用的方法很簡單, renice 後面接上數值及 pid 即可。因為後面接的是 pid ,所以你務必要以 ps 或者其他程式觀察的命令去找出 pid 才行啊!

由上面這個範例當中我們也看的出來,雖然修改的是 bash 那個程式,但是該程式所觸發的 ps 命令當中的 nice 也會繼承而為 10 喔!了解了吧!整個 nice 值是可以在父程式 --> 子程式之間傳遞的呢!另外,除了 renice 之外,其實那個 top 同樣的也是可以調整 nice 值的!

文章**

關於程序的執行順序

1年 ago mqzi 關於程序的執行順序 priority與nice值 pri new pri old nice 雖然nice值可以影響pri的值但是最終還是要經過系統分析後才決定的 root可以調整的範圍為 20 19 一般使用者範圍為0 19,僅可將nice值越調越高,例本來為5.則將來僅能調...

主程序與子程序的執行順序

from multiprocessing import process import time deftask name print s start name time.sleep 3 print s stop name if name main p process target task,args...

fork父子程序執行順序

使用一段 來檢查父子程序執行順序 str hello world php eol 派生乙個子程序,子程序會複製主程序中的上下文 pcntl fork 函式在主程序中返回子程序的程序id,在子程序返回0,失敗在主程序返回 1 pid pcntl fork 這裡開始的 會被主程序 子程序共同執行 如果不...