~~~~~~貓毛要開啟瘋狂寫文章模式~~~~~~
前段時間簡書不能發(fā)表文章可是把毛給憋壞了,希望同伴們多多留言點贊,這樣貓毛才會更加有動力?。?!
1 理解“什么是進(jìn)程”(process)
當(dāng)一個程序被加載到內(nèi)存當(dāng)中運作,那么在內(nèi)存內(nèi)的那個數(shù)據(jù)就被稱為進(jìn)程(process)。進(jìn)程是操作系統(tǒng)上面非常重要的概念,所有系統(tǒng)上面跑的數(shù)據(jù)都會以進(jìn)程的型態(tài)存在。
1.1 理解PID的定義
觸發(fā)任何一個事件時,系統(tǒng)都會將他定義成為一個進(jìn)程,并且給予這個進(jìn)程一個ID,稱為PID,同時依據(jù)啟發(fā)這個進(jìn)程的用戶與相關(guān)屬性關(guān)系,給予這個PID一組有效的權(quán)限設(shè)定。從此以后,這個PID能夠在系統(tǒng)上面進(jìn)行的動作,就與這個PID的權(quán)限有關(guān)了!

如圖所示例,程序一般是放置在實體磁盤中(用windows的話來說就是D盤、E盤...),然后透過用戶的執(zhí)行來觸發(fā)。觸發(fā)后會加載到內(nèi)存中成為一個個體,那就是進(jìn)程。為了操作系統(tǒng)可管理這個進(jìn)程,因此進(jìn)程有給予執(zhí)行者的權(quán)限/屬性等參數(shù),并包括程序所需要的腳本與數(shù)據(jù)或文件數(shù)據(jù)等,最后再給予一個PID。系統(tǒng)就是通過這個PID來判斷該process是否具有權(quán)限進(jìn)行工作的。
小總結(jié):進(jìn)程其實就是在計算機內(nèi)存中運作的程序。
不過,linux是怎么為每一個bash設(shè)置不同權(quán)限的?如果人來做豈不是太燒腦了???
當(dāng)我們登入并執(zhí)行bash時,系統(tǒng)已經(jīng)給我們一個PID了,這個PID就是依據(jù)登陸者的UID/GID(/etc/passward)來的。我們知道/bin/bash是一個程序,當(dāng)dmtsai登入后,他取得一個PID號碼為2234的進(jìn)程,這個進(jìn)程的User/Group都是dmtsai,而當(dāng)這個程序進(jìn)行其他作業(yè)時,例如執(zhí)行touch命令時,那么由這個進(jìn)程衍生出來的其他進(jìn)程在一般狀態(tài)下,也會沿用這個進(jìn)程的相關(guān)權(quán)限的。
程序與進(jìn)程之間的差
這里將程序與進(jìn)程做個總結(jié):
程序(program):通常為binary program,放置在儲存媒體中(如硬盤,光盤),為實體文件的型態(tài)存在
進(jìn)程(process):程序被觸發(fā)后,執(zhí)行者的權(quán)限與屬性、程序的代碼與所需數(shù)據(jù)等都會被加載內(nèi)存中,操作系統(tǒng)并給予這個內(nèi)存內(nèi)的單元一個標(biāo)識符(PID),可以說,進(jìn)程就是一個正在運作中的程序。
1.2 子進(jìn)程與父進(jìn)程
當(dāng)我們登入系統(tǒng)后,會取得一個bash的shell,然后,我們用這個bash提供的接口去執(zhí)行另一個指令,例如/user/bin/passwd或者是touch等等,那些另外執(zhí)行的指令也會被觸發(fā)成為PID。那個后來執(zhí)行指令才產(chǎn)生的PID就是子進(jìn)程,而在我們原本的bash環(huán)境下,就稱為父進(jìn)程

因為每個進(jìn)程都有一個PID,那某個進(jìn)程的父進(jìn)程是怎么判斷的?實際上,通過Parent PID(PPID)就可以判斷。我們在之前環(huán)境變量部分提到過環(huán)境變量的繼承問題,子進(jìn)程可以取得父進(jìn)程的環(huán)境變量。
例如,在你的命令行中輸入
ps -l查詢你當(dāng)前的進(jìn)程信息,這里用鳥哥的例子
在圖中我們可以看到第一個bash的PID與第二個bash的PPID都是13928,因此就可以判斷第一個bash是第二個的父程序。
有朋友會常常發(fā)現(xiàn),明明將有問題的進(jìn)程關(guān)閉了,怎么過一陣子又自動產(chǎn)生?而且新產(chǎn)生的那個進(jìn)程的PID和原先的還不一樣。這是怎么回事?不要懷疑,如果不是crontab工作排程的影響,肯定有一支父進(jìn)程存在,所以你殺掉子進(jìn)程后,父進(jìn)程就會主動再生一支,因此要找出父進(jìn)程,然后將它刪除掉。
1.3 fork and exec 進(jìn)程呼叫的流程
其實,子進(jìn)程與父進(jìn)程之間的關(guān)系還挺復(fù)雜的,最大的復(fù)雜點在于進(jìn)程互相之間的呼叫。在Linux的進(jìn)程呼叫通常稱為 fork-and-exec的流程!
進(jìn)程都會藉由父進(jìn)程以復(fù)制(fork)的方式產(chǎn)生一個一模一樣的子進(jìn)程,然后被復(fù)制出來的子進(jìn)程再以exec的方式來執(zhí)行實際要進(jìn)行的程序,最終就成為一個子進(jìn)程的存在。

1.4 了解常駐在內(nèi)存的進(jìn)程(daemon)
我們之前學(xué)的一些指令例如:ls/mv/cp等等都是執(zhí)行完就結(jié)束了,也就是說,該項指令被觸發(fā)后所產(chǎn)生的PID很快就會終止。那有沒有一直在執(zhí)行的進(jìn)程呢?
我們知道系統(tǒng)每分鐘都會去掃描/etc/crontab以及相關(guān)的配置文件,來進(jìn)行工作排程。而這個工作排程就是crond這個程序所管理的,我們將他啟動在背景當(dāng)中一直持續(xù)不斷的運作,也就是說“常駐在內(nèi)存中的進(jìn)程”。
常駐在內(nèi)存中的進(jìn)程通常都是負(fù)責(zé)一些系統(tǒng)所提供的功能以服務(wù)用戶各項任務(wù),因此這些常駐程序就會被我們稱為服務(wù)(daemon)。系統(tǒng)的服務(wù)非常多,不過主要大致分成系統(tǒng)本身所需要的服務(wù),例如剛提到的crond及atd,還有rsyslogd等等的。還有一些則是負(fù)責(zé)網(wǎng)絡(luò)聯(lián)機的服務(wù),例如Apache,named,postfix,vsftpd...等等的。這些網(wǎng)絡(luò)服務(wù)比較有趣的地方,在于這些程序被執(zhí)行后,他會啟動一個可以負(fù)責(zé)網(wǎng)絡(luò)監(jiān)聽的端口(prot),以提供外部客戶端(client)的聯(lián)機要求。
以crontab來說,他的主要執(zhí)行程序名稱應(yīng)該是cron或at才對,為什么要在最后加d?是因為Linux希望我們可以簡單的判斷該程序是否為daemon,所以,一般daemon類型的程序都會加上d在文件名后頭,包括服務(wù)器篇我們會看到的httpd,vsftpd等等都是。
2. Linux 的多人多任務(wù)環(huán)境
通過前面的學(xué)習(xí),我們現(xiàn)在知道了,其實在Linux系統(tǒng)底下執(zhí)行一個指令時,系統(tǒng)會將相關(guān)的權(quán)限、屬性、程序代碼與數(shù)據(jù)等均加載內(nèi)存,并給予這個單元一個進(jìn)程標(biāo)識符(PID),最終該指令可以進(jìn)行的任務(wù)則與這個PID的權(quán)限有關(guān)。這也就是為什么Linux這么多用戶,但是卻每個人都可以擁有自己的環(huán)境。
- 多人環(huán)境:除了root之外,其他人都必須要受一些限制,而每個人進(jìn)入Linux的環(huán)境設(shè)定都可以隨著每個人的喜好設(shè)定(~/.bashrc)
- 多任務(wù)行為:
目前的CPU速度可高達(dá)幾個GHz,這代表CPU每秒鐘可以運作10的9次方這么多次指令。我們的Linux可以讓CPU在各個工作間進(jìn)行切換,其實每個工作都僅占去CPU的幾個指令次數(shù),所以CPU每秒就能夠在各個進(jìn)程之間進(jìn)行切換啦。
CPU切換進(jìn)程的工作,與這些工作進(jìn)入到CPU運作的排程(CPU排程,非rontab排程)會影響到系統(tǒng)的整體效能!目前Linux使用的多任務(wù)切換行為是一個非常棒的機制,幾乎可以將PC的性能整個壓榨出來。由于效能非常好,因此當(dāng)多人同時登入系統(tǒng)時,其實會感受到整部主機好像就是為了你存在一般。這就是多人多任務(wù)的環(huán)境。
2.1 多重登入環(huán)境的七個基本終端窗口
在Linux當(dāng)中,默認(rèn)提供了六個文字界面登入窗口以及一個圖形界面,你可以使用[Alt]+[F1].....[F7]來切換不同的終端機界面,而且每個終端機界面的登陸者還可以不同人。其實,這也是多任務(wù)環(huán)境下所產(chǎn)生的一個情況,我們的Linux默認(rèn)會啟動六個終端機登入環(huán)境的程序,所以我們就會有六個終端機接口。
舉例:六個終端機接口的好處
進(jìn)行特殊的進(jìn)程管理
Linux幾乎可以說絕對不會當(dāng)機的。因為他可以在任何時候,將某個被困住的進(jìn)程殺掉,然后再重新執(zhí)行進(jìn)程而不用重新啟動。如果我在Linux以下文字界面登入,在屏幕當(dāng)中顯示錯誤訊息后就掛了:動都不能動,如何是好?這個時候默認(rèn)的七個窗口就榜上忙了,可以隨意切換到其他的終端機界面,然后以ps-aux找出剛剛的錯誤進(jìn)程,然后給他kill一下,回到剛剛的終端機界面,又恢復(fù)正常了。
2.2 單一bash接口下進(jìn)行多個工作 &
其實,我們登入bash之后,就是取得一個名為bash的PID了,而在這個環(huán)境底下所執(zhí)行的其他命令,就幾乎都是所謂的子進(jìn)程了。那么,在這個單一的bash接口下,我可不可以進(jìn)行多個工作?當(dāng)然可以,(使用&)
eg: cp file1 file2 &在這串指令中,重點放在&的功能,他表示將file1這個文件復(fù)制為file2,且放置于背景中執(zhí)行,也就是說執(zhí)行這個命令之后,在這個終端接口仍然可以做其他工作。而當(dāng)cp file1 file2指令執(zhí)行完畢之后,系統(tǒng)會在你的終端接口顯示完成的消息。
多人多任務(wù)的系統(tǒng)資源分配問題考慮
多人多任務(wù)確實又很多的好處,但其實也有管理上的困擾,因為使用者越來越多,將導(dǎo)致管理的困擾。另外,由于使用者日盛,CPU的運算與RAM的大小可能就會不敷使用。
