程序是正在執行中的程式。當程式被執行時,執行人的許可權和屬性,以及程式的**都會被加載入記憶體,作業系統給這個程序分配乙個 id,稱為 pid(程序 id)。
也就是說,在作業系統中,所有可以執行的程式與命令都會產生程序。只是有些程式和命令非常簡單,如 ls 命令、touch 命令等,它們在執行完後就會結束,相應的程序也就會終結,所以我們很難捕捉到這些程序。但是還有一些程和命令,比如 httpd 程序,啟動之後就會一直駐留在系統當中,我們把這樣的程序稱作常駐記憶體程序。
某些程序會產生一些新的程序,我們把這些程序稱作子程序,而把這個程序本身稱作父程序。比如,我們必須正常登入到 shell 環境中才能執行系統命令,而 linux 的標準 shell 是 bash。我們在 bash 當中執行了 ls 命令,那麼 bash 就是父程序,而 ls 命令是在 bash 程序中產生的程序,所以 ls 程序是 bash 程序的子程序。也就是說,子程序是依賴父程序而產生的,如果父程序不存在,那麼子程序也不存在了。
在使用 windows 系統的過程中,使用任務管理器,很大程度上是為了強制關閉「未反應」的軟體,也就是殺死程序。的確,這是很多使用程序管理工具或程序管理命令的人最常見的使用方法。不過,殺死程序(強制中止程序)只是程序管理工作中最不常用的手段,因為每個程序都有自己正確的結束方法,而殺死程序是在正常方法已經失效的情況下的後備手段。
那麼,程序管理到底應該是做什麼的呢?我以為,程序管理主要有以下 3 個作用。
1) 判斷伺服器的健康狀態
運維工程師最主要的工作就是保證伺服器安全、穩定地執行。理想的狀態是,在伺服器出現問題,但是還沒有造成伺服器宕機或停止服務時,就人為干預解決了問題。
程序管理最主要的工作就是判斷伺服器當前執行是否健康,是否需要人為干預。如果伺服器的 cpu 佔用率、記憶體佔用率過高,就需要人為介入解決問題了。
2) 檢視系統中所有的程序
我們需要檢視看系統中所有正在執行的程序,通過這些程序可以判斷系統中執行了哪些服務、是否有非法服務在執行。
3) 殺死程序
這是程序管理中最不常用的手段。當需要停止服務時,會通過正確關閉命令來停止服務(如 apache 服務可以通過 service httpd stop 命令來關閉)。只有在正確終止程序的手段失效的情況下,才會考慮使用 kill 命令殺死程序。
在 linux 系統中,每個程序都有乙個唯一的程序號(pid),方便系統識別和排程程序。通過簡單地輸出執行程式的程式名,就可以執行該程式,其實也就是啟動了乙個程序。
總體來說,啟動乙個程序主要有 2 種途徑,分別是通過手工啟動和通過排程啟動(事先進行設定,根據使用者要求,程序可以自行啟動),接下來就一一介紹這 2 中方式。
手工啟動程序指的是由使用者輸入命令直接啟動乙個程序,根據所啟動的程序型別和性質的不同,其又可以細分為前台啟動和後台啟動 2 種方式。
前台啟動程序
這是手工啟動程序最常用的方式,因為當使用者輸入乙個命令並執行,就已經啟動了乙個程序,而且是乙個前台的程序,此時系統其實已經處於乙個多程序的狀態(乙個是 shell 程序,另乙個是新啟動的程序)。
假如啟動乙個比較耗時的程序,然後再把該程序掛起,並使用 ps 命令檢視,就會看到該程序在 ps 顯示列表中,例如:
[root@localhost ~]# find / -name demo.jpg <--在根目錄下查詢 demo.jpg 檔案,比較耗時
#此處省略了該命令的部分輸出資訊
#按「ctrl+z」組合鍵,即可將該程序掛起
[root@localhost ~]# ps <--檢視正在執行的程序
pid tty time cmd
2573 pts/0 00:00:00 bash
2587 pts/0 00:00:01 find
2588 pts/0 00:00:00 ps
通過執行 ps 命令檢視程序資訊,可以看到,剛剛執行的 find 命令的程序號為 2587,同時 ps 程序的程序號為 2588。
程序直接從後台執行,用的相對較少,除非該程序非常耗時,且使用者也不急著需要其執行結果的時候,例如,使用者需要啟動乙個需要長時間執行的格式化文字檔案的程序,為了不使整個 shell 在格式化過程中都處於「被占用」狀態,從後台啟動這個程序是比較明智的選擇。
從後台啟動程序,其實就是在命令結尾處新增乙個 " &" 符號(注意,& 前面有空格)。輸入命令並執行之後,shell 會提供給我們乙個數字,此數字就是該程序的程序號。然後直接就會出現提示符,使用者就可以繼續完成其他工作,例如:
[root@localhost ~]# find / -name install.log &
[1] 1920
#[1]是工作號,1920是程序號
以上介紹了手工啟動的 2 種方式,實際上它們有個共同的特點,就是新程序都是由當前 shell 這個程序產生的,換句話說,是 shell 建立了新程序,於是稱這種關係為程序間的父子關係,其中 shell 是父程序,新程序是子程序。
在 linux 系統中,任務可以被配置在指定的時間、日期或者系統平均負載量低於指定值時自動啟動。
例如,linux 預配置了重要系統任務的執行,以便可以使系統能夠實時被更新,系統管理員也可以使用自動化的任務來定期對重要資料進行備份。
實現排程啟動程序的方法有很多,例如通過 crontab、at 等命令。
Linux程序管理概述
程序就是處於執行期的程式,但程序並不僅僅侷限於一段可執行程式 也就是 段,通常程序還包括很多其它的資源,像開啟的檔案,掛起的訊號,核心內部資料,處理器狀態,乙個或多個具有記憶體對映的記憶體位址空間及乙個或多個執行執行緒以及用來存放全域性變數的資料段等。現代作業系統的程序提供兩種虛擬機制 虛擬處理器和...
3 1 程序管理概述
cpu 的工作原理就是取指執行,但如果遇到 io 操作,那麼 cpu 將等待 io 的完成,io 操作的速度很慢,v cpu v io 10 6 1,也就是說,執行乙個 io 操作,cpu 能執行 10 6 條指令,所以為了充分利用 cpu,就要在 io 的時候執行其它程式。這裡引出了乙個概念,併發...
Linux記憶體管理概述
該圖 作者aryang 下面對各部分進行概述。linux程序的線性位址空間 程序虛擬位址空間分布 0 3g是user位址空間,3 4g是kernel位址空間。適用於arm x86等,mips按0 2g,2 3g劃分 1.緊接著核心資料區向上是mem map全域性page陣列。3.核心動態載入驅動模組...