linux程序管理,你不得不知道的事兒?

2021-08-10 14:18:59 字數 2120 閱讀 3352

說明:本文所有案例均在linux 2.6.32-642.el6.x86_64驗證成功

程序基本概念

寫在最後的話

在linux系統中,觸發任何乙個事件,系統都會將它定義為乙個程序,並且給予這個程序乙個id,稱為pid。同時依據觸發這個程序的使用者與相關屬性的關係,給予這 個pid一組有效的許可權設定。

程式

程式是一組有序的靜態指令,是一種靜態的概念。

通常為二進位制程式放置在儲存媒介中(如硬碟、光碟等),以物理檔案的形式存在,如:/etc/init.d/httpd本身是乙個軟體**;

程序

程序是程式的一次執行活動,屬於一種動態的概念。

程式被觸發執行後,執行者的許可權和屬性、程式的程式**與所需的資料等都會被載入到記憶體中,作業系統會給予這個記憶體內的單元乙個pid,如:如果啟動/etc/init.d/httpd會產生相對應的程序;

注意程式和程序無一一對應關係,乙個程式可以由多個程序共用,乙個程序在活動中可順序地執行若干個程式;

我們以乙個案例來理解這2個名詞:

人:執行緒;桌子:程序;開一張桌子:程序開銷

程序是資源排程的最小單位,執行緒是cpu排程的最小單位;

在linux系統中,系統呼叫fork建立程序,子程序是由乙個程序產生的程序,產生這個子程序的程序為父程序

我們來看乙個實驗

由上例可以看到,後乙個程序的父程序為前乙個程序

正常情況下,父程序終止子程序終止,特別的:

- 孤兒程序:父程序終止,子程序未終止,則子程序變為孤兒程序,其父程序會自動指向init程序;

- 殭屍程序:爸爸不知道我的傻兒子已經掛掉了,所以兒子就變成為了殭屍(程序);

我們可以用ps -z來找到殭屍程序,再用kill -s singnal pid來殺死他,注意這個pid為父程序的id(殭屍程序本身已經死掉了,你不能殺死死人~~)

- 死鎖:若干個程序/執行緒在執行過程中,因爭奪資源而造成互信等待的現象;

前台程序

在shell提示出打入命令後,建立乙個子程序,執行命令,shell等待命令退出,然後返回到對使用者給出提示符,這個命令與shell非同步執行,即在前台執行,使用者在它完成前不能執行另乙個命令。

後台程序

在shell提示出打入命令後,後隨乙個&,執行命令,shell建立的子程序執行此命令,但不等待命令退出,直接返回到對使用者給出提示符,這個命令與shell同步執行,即後台執行。

程序和程式的主要區別是動態性,動態的產生和終止,從產生程序到終止程序可以具有的基本狀態為就緒態、執行態、阻塞態

就緒狀態:當程序已經分配到除cpu以外的必要資源,只要再獲得cpu,便可立即執行,這時的狀態稱為就緒狀態;

執行狀態:程序已獲得cpu,其程式正在執行;

等待狀態:程序的執行受到阻塞,比如:請求i/o、申請緩衝空間等等,把這種暫停狀態稱為阻塞狀態,又稱阻塞狀態。

#通常將相同狀態的程序排成乙個或者多個佇列,如:就緒佇列、阻塞佇列等;

當你執行乙個程式時,系統產生乙個父程序以及呼叫fork方式複製若干個子程序,然後暫停程序以exec的方式載入實際要執行的程式,當子程序終止的時候,會返回乙個exit訊號,父程序會呼叫wait命令讀取子程序狀態為死亡,然後把子程序從程序表中移除;

fork

系統先以fork的方式複製乙個和父程序相同的中間快取子程序

唯一區別就是pid不同,且這個暫存程序還會多乙個ppid的引數

fork複製的內容包括父程序的資料和堆疊段以及父程序的程序環境,使得子程序實現了繼承

exec

然後暫存程序開始以exec的方式載入實際要執行的程式,新的程序名為daidai,最終子程序的程式**就為daidai

不得不知道的補碼知識

無論什麼程式語言,其 最終都會被編譯解釋成計算機可讀取和執行的二進位制資料。其中,數字在二進位制資料中可劃分成原碼 補碼和反碼。原碼 數值前面增了一位符號位 例如 10 和 10 的二進位制表示如下 10 的原碼 0000 1010 10 的原碼 1000 1010其中,最高位表示符號位,0 表示正...

程式猿不得不知道的業內「黑話」

程式猿的隊伍越來越龐大了,這裡整理了一些開發周邊的各個渠道的 黑話 趕快瞅瞅吧,別下次聽到時還是一頭霧水了!程式猿 沒必要做那麼複雜 複雜的我不會 外面大家都是這麼做的 我直接複製的 你這個需求不清晰 我不想做 目前技術實現不了 我不想做 那個 有句話 不知 專案要延期了 你告訴我輸什麼我自己來 你...

程式猿不得不知道的業內「黑話」

程式猿的隊伍越來越龐大了,這裡整理了一些開發周邊的各個渠道的 黑話 趕快瞅瞅吧,別下次聽到時還是一頭霧水了!程式猿 沒必要做那麼複雜 複雜的我不會 外面大家都是這麼做的 我直接複製的 你這個需求不清晰 我不想做 目前技術實現不了 我不想做 那個 有句話 不知 專案要延期了 你告訴我輸什麼我自己來 你...