<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 16.1 什么是程序 (process) 由前面一連幾個章節的數據看來,我們一直強調在 Linux 下面所有的指令與你能夠進行的動作都與權限有關, 而系統如何判定你的權限呢?當然就是[第十三章帳號管理](../Text/index.html)當中提到的 UID/GID 的相關概念,以及文件的屬性相關性啰!再進一步來解釋,你現在大概知道,在 Linux 系統當中:“觸發任何一個事件時,系統都會將他定義成為一個程序,并且給予這個程序一個 ID ,稱為 PID,同時依據啟發這個程序的使用者與相關屬性關系,給予這個 PID 一組有效的權限設置。” 從此以后,這個 PID 能夠在系統上面進行的動作,就與這個 PID 的權限有關了! 看這個定義似乎沒有什么很奇怪的地方,不過,您得要了解什么叫做“觸發事件”才行啊! 我們在什么情況下會觸發一個事件?而同一個事件可否被觸發多次?呵呵!來了解了解先! ### 16.1.1 程序與程序 (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 不同啦!我們將這個概念繪制成圖示來瞧瞧如下: ![程序被載入成為程序以及相關數據的示意圖](https://box.kancloud.cn/2016-05-13_5735737a2bb87.gif)圖16.1.1、程序被載入成為程序以及相關數據的示意圖 如上圖所示,程序一般是放置在實體磁盤中,然后通過使用者的執行來觸發。觸發后會載入到內存中成為一個個體,那就是程序。 為了操作系統可管理這個程序,因此程序有給予執行者的權限/屬性等參數,并包括程序所需要的指令碼與數據或文件數據等, 最后再給予一個 PID 。系統就是通過這個 PID 來判斷該 process 是否具有權限進行工作的!他是很重要的哩! 舉個更常見的例子,我們要操作系統的時候,通常是利用連線程序或者直接在主機前面登陸,然后取得我們的 shell 對吧!那么,我們的 shell 是 bash 對吧,這個 bash 在 /bin/bash 對吧,那么同時間的每個人登陸都是執行 /bin/bash 對吧!不過,每個人取得的權限就是不同!也就是說,我們可以這樣看: ![程序與程序之間的差異](https://box.kancloud.cn/2016-05-13_5735737a3df45.gif)圖16.1.2、程序與程序之間的差異 也就是說,當我們登陸并執行 bash 時,系統已經給我們一個 PID 了,這個 PID 就是依據登陸者的 UID/GID (/etc/passwd) 來的啦~以上面的圖 16.1.2 配合圖 16.1.1 來做說明的話,我們知道 /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 談到的 export](../Text/index.html#export) 所用的圖示好了: ![程序相關系之示意圖](https://box.kancloud.cn/2016-05-13_5735737715656.gif)圖16.1.3、程序相關系之示意圖 所以你必須要知道,程序彼此之間是有相關性的!以上面的圖示來看,連續執行兩個 bash 后,第二個 bash 的父程序就是前一個 bash。因為每個程序都有一個 PID ,那某個程序的父程序該如何判斷?就通過 Parent PID (PPID) 來判斷即可。此外,由第十章的 export 內容我們也探討過環境變量的繼承問題,子程序可以取得父程序的環境變量啦! 讓我們來進行下面的練習,以了解什么是子程序/父程序。 例題:請在目前的 bash 環境下,再觸發一次 bash ,并以“ ps -l ”這個指令觀察程序相關的輸出信息。答:直接執行 bash ,會進入到子程序的環境中,然后輸入 ps -l 后,出現: ``` F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 13928 13927 0 80 0 - 29038 wait pts/0 00:00:00 bash 0 S 1000 13970 13928 1 80 0 - 29033 wait pts/0 00:00:00 bash 0 R 1000 14000 13970 0 80 0 - 30319 - pts/0 00:00:00 ps ``` 有看到那個 PID 與 PPID 嗎?第一個 bash 的 PID 與第二個 bash 的 PPID 都是 13928 啊, 因為第二個 bash 是來自于第一個所產生的嘛!另外,每部主機的程序啟動狀態都不一樣, 所以在你的系統上面看到的 PID 與我這里的顯示一定不同!那是正常的!詳細的 [ps](../Text/index.html#ps) 指令我們會在本章稍后介紹, 這里你只要知道 ps -l 可以查閱到相關的程序信息即可。 很多朋友常常會發現:“咦!明明我將有問題的程序關閉了,怎么過一陣子他又自動的產生? 而且新產生的那個程序的 PID 與原先的還不一樣,這是怎么回事呢?”不要懷疑,如果不是 [crontab 工作調度](../Text/index.html)的影響,肯定有一支父程序存在,所以你殺掉子程序后, 父程序就會主動再生一支!那怎么辦?正所謂這:“擒賊先擒王”,找出那支父程序,然后將他刪除就對啦! * fork and exec:程序調用的流程 其實子程序與父程序之間的關系還挺復雜的,最大的復雜點在于程序互相之間的調用。在 Linux 的程序調用通常稱為 fork-and-exec 的流程 [[1]](#ps1)!程序都會借由父程序以復制 (fork) 的方式產生一個一模一樣的子程序, 然后被復制出來的子程序再以 exec 的方式來執行實際要進行的程序,最終就成為一個子程序的存在。 整個流程有點像下面這張圖: ![程序使用 fork and exec 調用的情況示意圖](https://box.kancloud.cn/2016-05-13_5735737a56b5b.gif)圖16.1.4、程序使用 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... 等等的。這些網絡服務比較有趣的地方,在于這些程序被執行后,他會啟動一個可以負責網絡監聽的端口 (port) ,以提供外部用戶端 (client) 的連線要求。 ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 以 crontab 來說,他的主要執行程序名稱應該是 cron 或 at 才對,為啥要加個 d 在后面?而成為 crond, atd 呢?就是因為 Linux 希望我們可以簡單的判斷該程序是否為 daemon, 所以,一般 daemon 類型的程序都會加上 d 在文件名后頭~包括服務器篇我們會看到的 httpd, vsftpd 等等都是 ^_^。 ### 16.1.2 Linux 的多用戶多任務環境 我們現在知道了,其實在 Linux 下面執行一個指令時,系統會將相關的權限、屬性、程序碼與數據等均載入內存, 并給予這個單元一個程序識別碼 (PID),最終該指令可以進行的任務則與這個 PID 的權限有關。根據這個說明,我們就可以簡單的了解,為什么 Linux 這么多用戶,但是卻每個人都可以擁有自己的環境了吧!^_^ !下面我們來談談 Linux 多用戶多任務環境的特色: * 多人環境: Linux 最棒的地方就在于他的多用戶多任務環境了!那么什么是“多用戶多任務”?在 Linux 系統上面具有多種不同的帳號, 每種帳號都有都有其特殊的權限,只有一個人具有至高無上的權力,那就是 root (系統管理員)。除了 root 之外,其他人都必須要受一些限制的!而每個人進入 Linux 的環境設置都可以隨著每個人的喜好來設置 (還記得我們在[第十章 BASH](../Text/index.html) 提過的 ~/.bashrc 吧?對了!就是那個光!)!現在知道為什么了吧?因為每個人登陸后取得的 shell 的 PID 不同嘛! * 多任務行為: 我們在[第零章](../Text/index.html)談到 CPU 的速度,目前的 CPU 速度可高達幾個 GHz。 這代表 CPU 每秒鐘可以運行 109 這么多次指令。我們的 Linux 可以讓 CPU 在各個工作間進行切換, 也就是說,其實每個工作都僅占去 CPU 的幾個指令次數,所以 CPU 每秒就能夠在各個程序之間進行切換啦! 誰叫 CPU 可以在一秒鐘進行這么多次的指令運行。 CPU 切換程序的工作,與這些工作進入到 CPU 運行的調度 (CPU 調度,非 crontab 調度) 會影響到系統的整體性能! 目前 Linux 使用的多任務切換行為是非常棒的一個機制,幾乎可以將 PC 的性能整個壓榨出來! 由于性能非常好,因此當多人同時登陸系統時,其實會感受到整部主機好像就為了你存在一般! 這就是多用戶多任務的環境啦![[2]](#ps2) * 多重登陸環境的七個基本終端窗口: 在 Linux 當中,默認提供了六個文字界面登陸窗口,以及一個圖形界面,你可以使用 [Alt]+[F1].....[F7] 來切換不同的終端機界面,而且每個終端機界面的登陸者還可以不同人! 很炫吧!這個東西可就很有用啦!尤其是在某個程序死掉的時候! 其實,這也是多任務環境下所產生的一個情況啦!我們的 Linux 默認會啟動六個終端機登陸環境的程序,所以我們就會有六個終端機接口。 您也可以減少啊!就是減少啟動的終端機程序就好了。 未來我們在[開機管理流程 (第十九章)](../Text/index.html) 會再仔細的介紹的! * 特殊的程序管理行為: 以前的鳥哥笨笨的,總是以為使用 Windows 98 就可以啦!后來,因為工作的關系,需要使用 Unix 系統,想說我只要在工作機前面就好,才不要跑來跑去的到 Unix 工作站前面去呢!所以就使用 Windows 連到我的 Unix 工作站工作!好死不死,我一個程序跑下來要 2~3 天,唉~偏偏常常到了第 2.5 天的時候, Windows 98 就給他掛點去!當初真的是給他怕死了~ 后來因為換了新計算機,用了隨機版的 Windows 2000 ,呵呵,這東西真不錯 (指對單人而言) ,在死機的時候, 他可以僅將錯誤的程序踢掉,而不干擾其他的程序進行,呵呵! 從此以后,就不用擔心會死機連連啰!不過,2000 畢竟還不夠好,因為有的時候還是會死當! 那么 Linux 會有這樣的問題嗎?老實說, Linux 幾乎可以說絕對不會死機的!因為他可以在任何時候, 將某個被困住的程序殺掉,然后再重新執行該程序而不用重新開機!夠炫吧!那么如果我在 Linux 下以文字界面登陸,在屏幕當中顯示錯誤訊息后就掛了~動都不能動,該如何是好!? 這個時候那默認的七個窗口就幫上忙啦!你可以隨意的再按 [Alt]+[F1].....[F7] 來切換到其他的終端機界面,然后以 [ps -aux](../Text/index.html#ps) 找出剛剛的錯誤程序,然后給他 [kill](../Text/index.html#kill) 一下,哈哈,回到剛剛的終端機界面!恩~棒!又回復正常啰! 為什么可以這樣做呢?我們剛剛不是提過嗎?每個程序之間可能是獨立的,也可能有相依性, 只要到獨立的程序當中,刪除有問題的那個程序,當然他就可以被系統移除掉啦!^_^ * bash 環境下的工作管理 (job control) 我們在上一個小節有提到所謂的“父程序、子程序”的關系,那我們登陸 bash 之后, 就是取得一個名為 bash 的 PID 了,而在這個環境下面所執行的其他指令, 就幾乎都是所謂的子程序了。那么,在這個單一的 bash 接口下,我可不可以進行多個工作啊? 當然可以啦!可以“同時”進行喔!舉例來說,我可以這樣做: ``` [root@study ~]# cp file1 file2 & ``` 在這一串指令中,重點在那個 & 的功能,他表示將 file1 這個文件復制為 file2 ,且放置于背景中執行, 也就是說執行這一個命令之后,在這一個終端接口仍然可以做其他的工作!而當這一個指令 (cp file1 file2) 執行完畢之后,系統將會在你的終端接口顯示完成的消息!很便利喔! * 多用戶多任務的系統資源分配問題考慮: 多用戶多任務確實有很多的好處,但其實也有管理上的困擾,因為使用者越來越多, 將導致你管理上的困擾哩!另外,由于使用者日盛,當使用者達到一定的人數后, 通常你的機器便需要升級了,因為 CPU 的運算與 RAM 的大小可能就會不敷使用! 舉個例子來說,鳥哥之前的網站管理的有點不太好,因為使用了一個很復雜的人數統計程序, 這個程序會一直去取用 MySQL 數據庫的數據,偏偏因為流量大,造成 MySQL 很忙碌。 在這樣的情況下,當鳥哥要登陸去寫網頁數據,或者要去使用討論區的資源時, 哇!慢的很!簡直就是“龜速”啊!后來終于將這個程序停止不用了, 以自己寫的一個小程序來取代,呵呵!這樣才讓 CPU 的負載 (loading) 整個降下來~ 用起來順暢多了! ^_^
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看