~~~~~~貓毛要開啟瘋狂寫文章模式~~~~~~
前段時間簡書不能發表文章可是把毛給憋壞了,希望同伴們多多留言點贊,這樣貓毛才會更加有動力!!!
1 理解“什么是進程”(process)
當一個程序被加載到內存當中運作,那么在內存內的那個數據就被稱為進程(process)。進程是操作系統上面非常重要的概念,所有系統上面跑的數據都會以進程的型態存在。
1.1 理解PID的定義
觸發任何一個事件時,系統都會將他定義成為一個進程,并且給予這個進程一個ID,稱為PID,同時依據啟發這個進程的用戶與相關屬性關系,給予這個PID一組有效的權限設定。從此以后,這個PID能夠在系統上面進行的動作,就與這個PID的權限有關了!
如圖所示例,程序一般是放置在實體磁盤中(用windows的話來說就是D盤、E盤...),然后透過用戶的執行來觸發。觸發后會加載到內存中成為一個個體,那就是進程。為了操作系統可管理這個進程,因此進程有給予執行者的權限/屬性等參數,并包括程序所需要的腳本與數據或文件數據等,最后再給予一個PID。系統就是通過這個PID來判斷該process是否具有權限進行工作的。
小總結:進程其實就是在計算機內存中運作的程序。
不過,linux是怎么為每一個bash設置不同權限的?如果人來做豈不是太燒腦了???
當我們登入并執行bash時,系統已經給我們一個PID了,這個PID就是依據登陸者的UID/GID(/etc/passward)來的。我們知道/bin/bash是一個程序,當dmtsai登入后,他取得一個PID號碼為2234的進程,這個進程的User/Group都是dmtsai,而當這個程序進行其他作業時,例如執行touch命令時,那么由這個進程衍生出來的其他進程在一般狀態下,也會沿用這個進程的相關權限的。
程序與進程之間的差
這里將程序與進程做個總結:
程序(program):通常為binary program,放置在儲存媒體中(如硬盤,光盤),為實體文件的型態存在
進程(process):程序被觸發后,執行者的權限與屬性、程序的代碼與所需數據等都會被加載內存中,操作系統并給予這個內存內的單元一個標識符(PID),可以說,進程就是一個正在運作中的程序。
1.2 子進程與父進程
當我們登入系統后,會取得一個bash的shell,然后,我們用這個bash提供的接口去執行另一個指令,例如/user/bin/passwd或者是touch等等,那些另外執行的指令也會被觸發成為PID。那個后來執行指令才產生的PID就是子進程,而在我們原本的bash環境下,就稱為父進程
因為每個進程都有一個PID,那某個進程的父進程是怎么判斷的?實際上,通過Parent PID(PPID)就可以判斷。我們在之前環境變量部分提到過環境變量的繼承問題,子進程可以取得父進程的環境變量。
例如,在你的命令行中輸入
ps -l
查詢你當前的進程信息,這里用鳥哥的例子在圖中我們可以看到第一個bash的PID與第二個bash的PPID都是13928,因此就可以判斷第一個bash是第二個的父程序。
有朋友會常常發現,明明將有問題的進程關閉了,怎么過一陣子又自動產生?而且新產生的那個進程的PID和原先的還不一樣。這是怎么回事?不要懷疑,如果不是crontab工作排程的影響,肯定有一支父進程存在,所以你殺掉子進程后,父進程就會主動再生一支,因此要找出父進程,然后將它刪除掉。
1.3 fork and exec 進程呼叫的流程
其實,子進程與父進程之間的關系還挺復雜的,最大的復雜點在于進程互相之間的呼叫。在Linux的進程呼叫通常稱為 fork-and-exec的流程!
進程都會藉由父進程以復制(fork)的方式產生一個一模一樣的子進程,然后被復制出來的子進程再以exec的方式來執行實際要進行的程序,最終就成為一個子進程的存在。
1.4 了解常駐在內存的進程(daemon)
我們之前學的一些指令例如:ls/mv/cp等等都是執行完就結束了,也就是說,該項指令被觸發后所產生的PID很快就會終止。那有沒有一直在執行的進程呢?
我們知道系統每分鐘都會去掃描/etc/crontab以及相關的配置文件,來進行工作排程。而這個工作排程就是crond這個程序所管理的,我們將他啟動在背景當中一直持續不斷的運作,也就是說“常駐在內存中的進程”。
常駐在內存中的進程通常都是負責一些系統所提供的功能以服務用戶各項任務,因此這些常駐程序就會被我們稱為服務(daemon)。系統的服務非常多,不過主要大致分成系統本身所需要的服務,例如剛提到的crond及atd,還有rsyslogd等等的。還有一些則是負責網絡聯機的服務,例如Apache,named,postfix,vsftpd...等等的。這些網絡服務比較有趣的地方,在于這些程序被執行后,他會啟動一個可以負責網絡監聽的端口(prot),以提供外部客戶端(client)的聯機要求。
以crontab來說,他的主要執行程序名稱應該是cron或at才對,為什么要在最后加d?是因為Linux希望我們可以簡單的判斷該程序是否為daemon,所以,一般daemon類型的程序都會加上d在文件名后頭,包括服務器篇我們會看到的httpd,vsftpd等等都是。
2. Linux 的多人多任務環境
通過前面的學習,我們現在知道了,其實在Linux系統底下執行一個指令時,系統會將相關的權限、屬性、程序代碼與數據等均加載內存,并給予這個單元一個進程標識符(PID),最終該指令可以進行的任務則與這個PID的權限有關。這也就是為什么Linux這么多用戶,但是卻每個人都可以擁有自己的環境。
- 多人環境:除了root之外,其他人都必須要受一些限制,而每個人進入Linux的環境設定都可以隨著每個人的喜好設定(~/.bashrc)
- 多任務行為:
目前的CPU速度可高達幾個GHz,這代表CPU每秒鐘可以運作10的9次方這么多次指令。我們的Linux可以讓CPU在各個工作間進行切換,其實每個工作都僅占去CPU的幾個指令次數,所以CPU每秒就能夠在各個進程之間進行切換啦。
CPU切換進程的工作,與這些工作進入到CPU運作的排程(CPU排程,非rontab排程)會影響到系統的整體效能!目前Linux使用的多任務切換行為是一個非常棒的機制,幾乎可以將PC的性能整個壓榨出來。由于效能非常好,因此當多人同時登入系統時,其實會感受到整部主機好像就是為了你存在一般。這就是多人多任務的環境。
2.1 多重登入環境的七個基本終端窗口
在Linux當中,默認提供了六個文字界面登入窗口以及一個圖形界面,你可以使用[Alt]+[F1].....[F7]來切換不同的終端機界面,而且每個終端機界面的登陸者還可以不同人。其實,這也是多任務環境下所產生的一個情況,我們的Linux默認會啟動六個終端機登入環境的程序,所以我們就會有六個終端機接口。
舉例:六個終端機接口的好處
進行特殊的進程管理
Linux幾乎可以說絕對不會當機的。因為他可以在任何時候,將某個被困住的進程殺掉,然后再重新執行進程而不用重新啟動。如果我在Linux以下文字界面登入,在屏幕當中顯示錯誤訊息后就掛了:動都不能動,如何是好?這個時候默認的七個窗口就榜上忙了,可以隨意切換到其他的終端機界面,然后以ps-aux
找出剛剛的錯誤進程,然后給他kill
一下,回到剛剛的終端機界面,又恢復正常了。
2.2 單一bash接口下進行多個工作 &
其實,我們登入bash之后,就是取得一個名為bash的PID了,而在這個環境底下所執行的其他命令,就幾乎都是所謂的子進程了。那么,在這個單一的bash接口下,我可不可以進行多個工作?當然可以,(使用&)
eg: cp file1 file2 &
在這串指令中,重點放在&
的功能,他表示將file1這個文件復制為file2,且放置于背景中執行,也就是說執行這個命令之后,在這個終端接口仍然可以做其他工作。而當cp file1 file2
指令執行完畢之后,系統會在你的終端接口顯示完成的消息。
多人多任務的系統資源分配問題考慮
多人多任務確實又很多的好處,但其實也有管理上的困擾,因為使用者越來越多,將導致管理的困擾。另外,由于使用者日盛,CPU的運算與RAM的大小可能就會不敷使用。