Linux學習-什么是進程 (process)


觸發 任何一個事件時,系統都會將他定義成為一個進程,並且給予這個進程一個 ID ,稱為 PID,同時依據啟發這個進程的用戶與相關屬性關系,給予這個 PID 一組有效的權限設定。從此以后,這 個 PID 能夠在系統上面進行的動作,就與這個 PID 的權限有關了!

進程與程序 (process & program)

我們如何產生一個進程呢?其實很簡單啦,就是『執行一個程序或指令』就可以觸發一個事件而取得 一個 PID 啰!我們說過,系統應該是僅認識 binary file 的,那么當我們要讓系統工作的時候,當然 就是需要啟動一個 binary file 啰,那個 binary file 就是程序 (program) 。

我們知道,每個程序都有三組人馬的權限,每組人馬都具有 r/w/x 的權限,所以:『不同的使用 者身份執行這個 program 時,系統給予的權限也都不相同!』舉例來說,我們可以利用 touch 來建 立一個空的文件,當 root 執行這個 touch 指令時,他取得的是 UID/GID = 0/0 的權限,而當 dmtsai (UID/GID=501/501) 執行這個 touch 時,他的權限就跟 root 不同啦!

程序被加載成為進程以及相關數據的示意圖

程序一般是放置在實體磁盤中,然后透過用戶的執行來觸發。觸發后會加載到內存中成 為一個個體,那就是進程。 為了操作系統可管理這個進程,因此進程有給予執行者的權限/屬性等參 數,並包括程序所需要的腳本與數據或文件數據等, 最后再給予一個 PID 。系統就是透過這個 PID 來判斷該 process 是否具有權限進行工作的!

舉個更常見的例子,操作系統的時候,通常是利用聯機程序或者直接在主機前面登入,然后取 得我們的 shell 對吧!那么,我們的 shell 是 bash 對吧,這個 bash 在 /bin/bash 對吧,那么同時 間的每個人登入都是執行 /bin/bash 對吧!不過,每個人取得的權限就是不同!也就是說,我們可以 這樣看:

程序與進程之間的差異

也就是說,當我們登入並執行 bash 時,系統已經給我們一個 PID 了,這個 PID 就是依據登入者的 UID/GID (/etc/passwd) 來的啦~以上面的圖來做說明的話,我們知道 /bin/bash 是一個程序 (program),當 dmtsai 登入后,他取得一個 PID 號碼為 2234 的進程,這個進程的User/Group 都是 dmtsai ,而當這個程序進行其他作業時,例如上面提到的 touch 這個指令時, 那 么由這個進程衍生出來的其他進程在一般狀態下,也會沿用這個進程的相關權限的!

讓我們將程序與進程作個總結:

  • 程序 (program):通常為 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等), 為實體文件的型態存在;

  • 進程 (process):程序被觸發后,執行者的權限與屬性、程序的程序代碼與所需數據等都會被加載內存中,操 作系統並給予這個內存內的單元一個標識符 (PID),可以說,進程就是一個正在運作中的程序。


  • 子進程與父進程:

『衍生出來的進程』,那是個啥咚咚?這樣說好了,當我們登 入系統后,會取得一個 bash 的 shell ,然后,我們用這個 bash 提供的接口去執行另一個指令,例 如 /usr/bin/passwd 或者是 touch 等等,那些另外執行的指令也會被觸發成為 PID ,那個后 來執行指令才產生的 PID 就是『子進程』了,而在我們原本的 bash 環境下,就稱為『父進程』了!

進程相關系之示意圖

所以你必須要知道,程序彼此之間是有相關性的!以上面的圖示來看,連續執行兩個 bash 后,第二 個 bash 的父進程就是前一個 bash。因為每個進程都有一個 PID ,那某個進程的父進程該如何判斷? 就透過 Parent PID (PPID) 來判斷即可。


  • fork and exec: 進程呼叫的流程

在 Linux 的 進程呼叫通常稱為 fork-and-exec 的流程 (注 1)!進程都會藉由父進程以復制 (fork) 的方式產生一個 一模一樣的子進程, 然后被復制出來的子進程再以 exec 的方式來執行實際要進行的程序,最終就 成為一個子進程的存在。

進程使用fork and exec 呼叫的示意圖

(1)系統先以 fork 的方式復制一個與父進程相同的暫存進程,這個進程與父進程唯一的差別就是 PID 不同! 但是這個暫存進程還會多一個 PPID 的參數,PPID 如前所述,就是父進程的進程標識符啦!

2)暫存進程開始以 exec 的方式加載實際要執行的程序,以上述圖標來講,新的程序名稱為 qqq , 最終子進程的程序代碼就會變成 qqq 了!


  • 系統或網絡服務:常駐在內存的進程

我們下達的指令都很簡單,包括用 ls 顯示文件啊、 用 touch 建立文件啊、rm/mkdir/cp/mv 等指令管理文件啊、chmod/chown/passwd 等等的指令來管理 權限等等的,不過, 這些指令都是執行完就結束了。也就是說,該項指令被觸發后所產生的 PID 很 快就會終止!那有沒有一直在執行的進程啊?

舉個簡單的例子來說好了,我們知道系統每分鍾都會去掃瞄 /etc/crontab 以及相關的配置文件, 來 進行工作排程吧?那么那個工作排程是誰負責的?當然不是鳥哥啊! 呵呵!是 crond 這個程序所管 理的,我們將他啟動在背景當中一直持續不斷的運作, 套句鳥哥以前 DOS 年代常常說的一句話, 那就是『常駐在內存當中的進程』啦!

常駐在內存當中的進程通常都是負責一些系統所提供的功能以服務用戶各項任務,因此這些常駐程序 就會被我們稱為:服務 (daemon)。大致分成系統本身所需要的服務,例如剛剛提到的 crond 及 atd ,還有 rsyslogd 等等的。還有一些則是負責網絡聯機的服務,例如 Apache, named, postfix, vsftpd。

Linux 的多人多任務環境

Linux 底下執行一個指令時,系統會將相關的權限、屬性、程序代碼與數 據等均加載內存,並給予這個單元一個進程標識符 (PID),最終該指令可以進行的任務則與這個 PID 的權限有關。


  • 多人環境:

在 Linux 系統上面 具有多種不同的賬號, 每種賬號都有都有其特殊的權限,只有一個人具有至高無上的權力,那就是 root (系統管理員)。除了 root 之外,其他人都必須要受一些限制的!而每個人進入 Linux 的環境設 定都可以隨着每個人的喜好來設定。


  • 多任務行為:

我們的 Linux 可以讓 CPU 在各個工作間進行切換, 也就是說,其實每個工作都僅占去 CPU 的幾個指令次數,所以 CPU 每秒就能夠在各個進程之間進行切換啦!

CPU 切換進程的工作,與這些工作進入到 CPU 運作的排程會影響到系統的整體效能! 目前 Linux 使用的多任務切換行為是非常棒的一個機制,幾乎可以將 PC 的 性能整個壓榨出來! 由於效能非常好,因此當多人同時登入系統時,其實會感受到整部主機好像就 為了你存在一般! 這就是多人多任務的環境


多重登入環境的七個基本終端窗口:

在 Linux 當中,默認提供了六個文字界面登入窗口,以及一個圖形界面,你可以使用 [Alt]+[F1].....[F7] 來切換不同的終端機界面,


  • 特殊的進程管理行為:

如果我在 Linux 下以文字界面登入,在屏幕當中顯示錯誤訊息后就掛了~動都不能動,該如何是好!? 這個時候那 默認的七個窗口就幫上忙啦!你可以隨意的再按 [Alt]+[F1].....[F7] 來切換到其他的終端機界面,然后以 ps -aux 找出剛剛的錯誤進程,然后給他 kill 一下,哈哈,回到剛剛的終端機界面!恩~棒!又回復正常啰!

為什么可以這樣做呢?我們剛剛不是提過嗎?每個進程之間可能是獨立的,也可能有相依性, 只要 到獨立的進程當中,刪除有問題的那個進程,當然他就可以被系統移除掉啦!


  • bash 環境下的工作管理 (job control)

我們登入 bash 之后, 就是取得一 個名為 bash 的 PID 了,而在這個環境底下所執行的其他指令,就幾乎都是所謂的子進程了。那么, 在這個單一的 bash 接口下,我可不可以進行多個工作啊? 當然可以啦!可以『同時』進行喔!舉 例來說,我可以這樣做:

[root@study ~]# cp file1 file2 &

在這一串指令中,重點在那個 & 的功能,他表示將 file1 這個文件復制為 file2 ,且放置於背景中 執行, 也就是說執行這一個命令之后,在這一個終端接口仍然可以做其他的工作!而當這一個指令 (cp file1 file2) 執行完畢之后,系統將會在你的終端接口顯示完成的消息!


  • 多人多任務的系統資源分配問題考慮:

多人多任務確實有很多的好處,但其實也有管理上的困擾,因為使用者越來越多, 將導致你管理上 的困擾哩!另外,由於使用者日盛,當使用者達到一定的人數后, 通常你的機器便需要升級了,因 為 CPU 的運算與 RAM 的大小可能就會不敷使用!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM