進程管理
今天我們開始講進程管理的相關知識,進程是學習LInux系統的重要一節內容,不僅能更幫助我們了解LInux系統的原理組成,又能方便我們在平常運維工作中的管理工作,幫助我們故障排查.希望大家牢固的掌握進程知識.
以下是我們分享的內容:
-
概論
-
進程控制
-
進程管理工具
概論
程序執行:
多道程序的執行分為順序執行和并發執行 程序順序執行時的特征: 順序性---程序執行的前驅圖為單鏈條形 封閉性---程序運行時獨占全機資源,資源的狀態(除初始狀態外)只有本程序才能改變它,程序一旦執行,其執行結果不受外界因素影響 可再現性---只要程序執行時的環境和初始條件相同,都可獲得相同的結果 程序并發執行時的特征: 間斷性---程序并發執行時由于共享資源以及完成一項任務時的相互合作造成的相互制約關系將導致并發程序具有“執行-暫停-執行”這種間斷性的活動規律。 失去封閉性---多個并發程序共享系統中的各種資源 不可在現性
進程的描述
進程引入的目的:使程序并發執行并且可以對并發執行的程序加以描述和控制 進程控制塊(Process Control Block,PCB) 用于描述進程的基本情況和活動過程,進而控制和管理進程。操作系統中最重要的記錄行數據結構 進程實體=程序段+相關數據段+PCB 創建進程,實質上是創建進程實體中的PCB;而撤銷過程,實質上是撤銷進程的PCB。 進程的幾種表述(定義): Process 進程是程序的一次執行 進程是一個程序及其數據在處理機上順序執行時發生的活動 進程是具有獨立功能的程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單位 進程基本屬性: 與進程相關的屬性包括進程號(PID)、父進程號(PPID)、進程組號(PGID)。 1:進程號(PID) 進程號是系統維護的唯一標識一個進程的正數,進程號是無法再用戶層修改的。在Linux系統中,系統的第一個用戶進程為init進程,它的PID為1,其他的進程PID以此增加。 getpid函數 獲取當前進程的PID 該函數在unistdd.h文件中聲明 執行失敗 -1 ,錯誤原因存儲于errno中,pid_t類型其實就是int類型 2:父進程號(PPID) 任何進程(除init進程)都是由另一進程創建,該進程稱為被創建進程的父進程,被創建的進程稱為子進程,父進程號無法在用戶層修改,父進程的進程號(PID)即為子進程的父進程號(PPID), 用戶可以通過調用getppid函數來獲取當前進程的父進程號(PPID),其函數定義在/unistd.h文件中。 3: 進程組號(PGID) 在Linux系統中,每個用戶都擁有用戶號(UID)和用戶組號(GUID);和用戶管理一樣,進程也擁有自己的進程號(PID)和進程組號(PGID)。進程組是一個或者多個進程的集合。 它們與同一作業相關聯,可以接受來自同一終端的各種信號,每個進程組都有唯一的進程組號,進程組號可以在用戶層修改。 用戶可以通過調用 getpgid()函數來獲得指定的進程的進程組號(PGID)。其函數定義在 unistd.h文件中 如果執行失敗則返回 -1 ,錯誤原因存儲在errno中。 每個進程組都可以有一個組長進程,組長進程的進程組號等于其他進程號。但組長進程可以先退出,即只要在某個進程中有一個進程存在,則該進程組就存在, 與其組長進程是否終止無關。進程組的最后一個進程可以終止,或者裝一道另一個進程組。 加入一個現有的組或者一個新的進程組的系統調用函數setpgid(),其聲明如下: int setpgid(pid_t pid,pid_t pgid ); 進程用戶屬性: Linux 是權限有嚴格控制的操作系統,某個進程擁有的真實用戶號(RUID)、真實用戶組號(RGID)、有效用戶號(EUID)、有效用戶組號(EGID)信息。 在說道進程用戶時,需要將文件的擁有者與擁有者組加以區別。 1:進程真實用戶號(RUID) 對于進程而言,創建該進程的用戶UID(執行此程序的用戶)為此程序真實用戶號RUID.可以通過getuid 函數來獲取當前進程的真實用戶號(RUID) 函數: extern _uid_t getuid(void) 此函數無參數,如果執行成功將返回當前進程的UID;如果執行失敗則返回-1,錯誤原因存儲在errno中。 2:進程有效用戶號(EUID) EUID 主要用于權限檢查。 3:進程用戶組號(GID) 創建進程的用戶所在的組號為該進程的進程用戶組號(GID)??梢酝ㄟ^調用getgid()函數來獲得當前進程的真實用戶組號。 函數:extern _uid_t getgid(void) 此函數無參數,如果執行成功將返回當前進程的GID;如果執行失敗則返回-1 ,錯誤原因存儲在errno中。 4:有效進程用戶組號(EGID) 一般情況下,EGID和GID 相同,但是,當某可執行文件設置了setgid位,那么任何用戶(包括root用戶)運行此程序時,其有效用戶組號EGID該為文件的擁有者所在組,其原來EUID類似。 函數:extern _uid_t getegid(void) 此函數無參數,如果執行成功將返回當前進程的EGID;如果執行失敗則返回-1 ,錯誤原因存儲在errno中。 進程的特征: 動態性---進程實質是進程實體的執行過程。它由創建產生,由調度而執行,由撤銷而消亡,有一定的生命周期 ?? 程序只是一組有序指令的集合,是靜態的 并發性---多個進程實體同存于內存中,且能在一段時間內同時運行 ?? 程序(沒有建立PCB)是不能參與并發執行的 獨立性---進程實體是一個能獨立運行、獨立獲得資源和獨立接受調度的基本單位 ?? 未建立PCB的程序都不能作為一個獨立的單位參與運行 異步性---進程按各自獨立的、不可預知的速度向前推進
進程的基本狀態: 1.就緒狀態Ready---進程已分配到除CPU以外的所有必要資源后,只要再獲得CPU,便可立即執行。 多個就緒狀態的進程按照一定策略排成一個隊列->就緒隊列 2.執行狀態Running 3.阻塞狀態Block---阻塞狀態的進程排成一個隊列->阻塞隊列
4.創建狀態和終止狀態 1.創建狀態---為了保證進程的調度必須在創建工作完成后進行,以確保對進程控制塊操作的完整性 2.終止狀態---首先是等待操作系統進行善后處理,最后將其PCB清零,并將PCB空間返還系統。進入終止狀態后不能再執行, 但在操作系統中依然保留一個記錄,其中保存此狀態碼和一些計時統計數據,供其他進程收集。 一旦其他進程完成了對其信息的提取之后,操作系統將刪除該進程,即將其PCB清零,并將該空白PCB返還系統。 注意區分到達終止狀態和就緒狀態的條件差別
5.掛起操作: 進程被掛起意味著此時該進程處于靜止狀態。如果進程正在執行,它將暫停執行。若原本處于就緒狀態,則該進程此時暫不接受調度。相對應的是激活操作。 掛起操作的引入 終端用戶的需要---終端用戶希望暫停程序以便研究其執行情況或對程序進行修改 父進程請求---父進程希望掛起某個子進程,以便考察和修改該子進程,或者協調個子進程間的活動 負荷調節的需要---當時是系統中的工作負荷較重以致影響實時任務的控制,掛起部分不重要的進程以便保證系統正常運行 操作系統的需要---操作系統希望掛起進程以便檢查運行中的資源使用情況或者進行記賬 引入掛起原語(Suspend)和激活原語(Active)操作后三個進程狀態的轉換 1. 活動就緒->靜止就緒。未被掛起的就緒狀態稱為活動就緒狀態(Readya),此時進程可以接受調度。該進程被Suspend后變為靜止就緒狀態(Readys),此時進程不再被調度。 2. 活動阻塞->靜止阻塞。未被掛起的阻塞狀態稱為活動阻塞狀態(Blockeda)。被Suspend后變為靜止阻塞狀態(Blockeds),該狀態的進程在其所期待的事件出現后,將從靜止阻塞變為靜止就緒狀態。 3. 靜止就緒->活動就緒。處于Readys狀態的進程若用激活原語Active激活后,轉變為Readys狀態。 4. 靜止阻塞->活動阻塞。處于Blockeds狀態的進程若用Active激活后,進程將轉變為Blockeda狀態。
引入掛起操作后五個進程狀態的轉換,相比于三進程狀態,需要增加下列幾種情況: 1. NULL->創建。一個新進程產生時,該進程處于創建狀態。 2. 創建->活動就緒。在系統性能和內存允許情況下,完成對進程創建的必要操作后,相應的系統進程將進程的狀態轉換為活動就緒狀態。 3. 創建->靜止就緒??紤]到當前資源和性能要求,不分配給新建進程所需資源,主要是主存,相應的系統將進程狀態轉化為靜止就緒狀態,被安置在外村,不參與調度,此時進程創建工作尚未完成。 4. 執行->終止。進程完成任務或是出現無法克服錯誤,或是被OS或其他進程所中金,進入終止狀態。
進程管理中的數據結構 1.用于管理控制的數據結構。每個資源和進程都設置了一個數據結構,用于表征其實體,稱為資源信息表或進程信息表。四類:內存表、設備表、文件表和用于進程管理的進程表。 2.PCB的作用。使一個在多道程序環境下不能獨立運行的的程序(含數據)稱為一個能獨立運行的基本單位,一個能與其他進程并發執行的進程。 A.作為獨立運行基本單位的標志。有了PCB,就能在多到程序環境下獨立運行,具有取得OS服務的權利。PCB是進程存在與系統的唯一標識 B.能實現間斷性運行方式。進程因阻塞而暫停運行時,CPU現場信息被保存在被中斷進程的PCB中。 C.提供進程管理所需要的信息。進程的整個生命期中,操作系統總是根據PCB實施對進程的控制和管理。 D.提供進程調度所需要的信息。PCB中提供了進程處于各種狀態的信息。 E.實現與其他進程的同步與通信。PCB中有進程與用同步的信號量,用于實現進程通信的區域或通信隊列指針等。 進程控制塊中的信息 1.進程標識符。用于為一個標識一個進程。 A.外部標識符。方便用戶(進程)對進程的訪問,每個進程設置一個外部標識符。由創建者提供,字母、數字組成。還設置父進程標識以及子進程標識用于描述進程家族關系。用戶標識用于只是擁有該進程的用戶。 B.內部標識符。方便系統對進程的使用,賦予每一個進程唯一的數字標識符,是一個進程的序號。 2.處理機狀態。由處理機的各種寄存器中的內容組成。處理及執行狀態時,信息存放于寄存器中。進程被切換時,處理及信息保存在相應PCB,以便重新執行時能從斷點繼續。寄存器包括: A.通用寄存器,也稱用戶可視寄存器。用戶可訪問。暫存信息。 B.指令計數器。存放了要訪問的下一條指令的地址。 C.程序狀態字PSW,含有狀態信息,如條件碼、執行方式、中斷屏蔽標志 D.用戶棧指針,每個用戶進程都有至少一條與之相關的系統棧,存放過程和系統調用參數及調用地址。指向該棧的棧頂。 3.進程調度信息。包括: A.進程狀態。作為進程調度和對換時的依據。 B.進程優先級。 C.其他信息。與采用的調度算法有關。 D.事件。進程由執行態轉換為阻塞態所等待發生的事件,即阻塞原因。 4.進程控制信息。 A.程序和數據的地址。內存或外存地址,以便再調度時尋址。 B.進程同步和通信機制。如消息隊列指針、信號量等。全部或部分放于PCB。 C.資源清單。進程在運行期間所需的全部資源(CPU除外),還有已分配到該進程的資源清單。 D.鏈接指針。下一個進程的PCB首址。 進程控制塊的組織方式 A線性方式。存于線性表。表的首址存放于內存的一個專用區域。實現簡單開銷小,是用于進程不多的系統。 B.鏈式方式。把相同狀態進程的PCB通過PCB中的鏈接字鏈接成一個隊列。如就緒隊列、若干阻塞隊列和空白隊列。 C.索引方式。根據進程狀態不同建立幾張索引表。如就緒索引表、阻塞索引表。把索引表的內存首址存放在內存的一些專用單元。
進程控制
(操作系統內核)
將一些與硬件緊密相關的模塊(中斷處理程序),各種常用設備的驅動程序以及運行頻率較高的模塊(時鐘管理、進程調度和公用的一些基本操作) 安排在緊靠硬件的軟件層次中,使其常駐內存,被稱為OS內核。目的:便于對這些軟件進行保護,防止遭受破壞;提高運行效率。 處理機執行狀態: 系統態,又稱管態、內核態。權限高,執行一切指令,訪問所有寄存器和存儲區。 用戶態,又稱目態。的權限。執行規定指令,訪問指定寄存器和存儲區。 OS內核兩大功能: 1.支撐功能.提供給OS其他模塊所需的一些基本操作,支撐其工作。三個基本支撐功能: 中斷處理。內核的最基本功能,整個操作系統活動的基礎。需“有限處理”,以減少處理機中斷時間。 時鐘管理?;竟δ?。時間控制。 原語操作。原語(Primitive),有若干指令組成的,用于完成一定功能的一個過程,操作中的所有動作要么全做,要么不做,不可分割,不允許被中斷。內核中可能有很多原語。 2.資源管理功能 進程管理。將運行頻率高的模塊或者因為多種功能模塊所需要放入內核中以提高OS性能。 存儲器管理。放入內核保證運行速度。 設備管理。因為設備管理與硬件密切相關,很大部分也都設置在內核中。 進程的創建 1.進程的層次結構。在UNIX中,創建進程的進程稱為父進程,被創建的進程稱為子進程。子進程進一步創建,形成一個進程的層次結構。子進程繼承父進程所擁有的資源。子進程被撤銷時應返還資源給父進程。進程不能拒絕其子進程的繼承權。 2.引起創建進程的事件。一個進程區創建另一個進程的時間有四類: A.用戶登錄。系統內核位用戶創建新進程。分時系統中,用戶登錄會為該用戶建立一個進程并插入就緒隊列中。 B.作業調度。系統內核位用戶創建新進程。多到批處理系統,當調度某個作業時,便將他裝入內存,為它創建進程并放入就緒隊列。 C.提供服務。系統內核位用戶創建新進程。用戶提出請求,系統創建一個進程來提供用戶所需的服務。 D.應用請求。由用戶進程自己創建新進程。新進程和創建者進程并發運行。 3.進程的創建。創建新進程請求后,OS便調用進程創建原語Creat創建新進程: A.申請空白PCB,為新進程申請獲得唯一數字標識符,并從PCB集合索取一個空白PCB。 B.微信進程分配器運行所需的資源。物理和邏輯資源,內存、文件、I/O設備、cpu時間等。從OS或父進程獲得。 C.初始化PCB。初始化標識信息---系統分配標識符和父進程標識符放入PCB。初始化處理機狀態信息。初始化處理及控制信息。 D.若果進程就緒隊列能夠接納新進程,將新進程插入就緒隊列。 進程的終止 1.引起進程終止的時間 正常結束。進程的任務已經完成。批處理系統用Holt指令表示運行已結束。分時系統用Logs off。 產生中斷通知OS進程運行完畢。 異常結束。 越界錯。程序訪問的存儲區越出進程的區域。 保護錯。進程試圖訪問一個不允許訪問的資源或文件或用不適當的方式訪問。 非法指令。執行不存在的指令。錯把數據當指令。 特權指令錯。用戶試圖執行只允許OS執行的指令。 運行超時。進程執行時間超過指定的最大值。 等待超時。進程等待某事件時間超過指定的最大值。 算術運算錯。進程執行一個被禁止的運算。如被零除。 I/O故障。I/O過程發生錯誤。 外界干預。進程應外界的請求而終止運行。這些干預有: 操作員或操作系統干預。如發生系統死鎖,終止進程使擺脫死鎖狀態。 父進程請求。子進程已完成父進程所要求任務,父進程提出請求可結束子進程。 因父進程終止。父進程終止,所有子進程均終止。 2.進程的終止過程 A.根據被終止進程的標識符,從PCB集合中檢索出該進程的PCB,從中讀出該進程的狀態。 B.若被終止進程處于執行狀態,立即終止,并置調度標志位真,用于指示該進程被終止后應重新調度。 C.若該進程有子孫進程,均予以終止,以防不可控。 D.將被終止進程所有的全部資源或者換給父進程,或者還給系統。 E.將被終止進程(PCB)從所在隊列一處,等待其他程序來搜集信息。 進程的阻塞與喚醒 1.引起阻塞和喚醒的事件 向系統請求共享資源失敗。系統無足夠資源。 等待某種操作的完成。 新數據尚未到達。 等待新任務的到達。 2.進程阻塞過程。使用阻塞原語block將自己阻塞。進程自身的主動行為。執行狀態->停止執行->把PCB中狀態改為“阻塞”->把PCB插入具有相同事件的阻塞隊列->轉調度程序重新調度,將處理機分配給另一就緒進程并進行切換,重新設置CPU環境。 3.進程喚醒過程。有關進程調用喚醒原語wakeup,等待該事件的進程喚醒。被阻塞進程從該事件的阻塞隊列移出->將PCB狀態改為“就緒”->將PCB插入到就緒隊列。block和wakeup必須成對出現,否則進程將永久處于阻塞狀態 進程的掛起與激活 1.掛起。suspend原語將指定進程或處于阻塞狀態的進程掛起。檢查被掛起進程的狀態->活動就緒改為“靜止就緒”,活動阻塞改為“靜止阻塞”->把PCB復制到指定內存區域->若被掛起的進程正在執行, 則轉向調度程序重新調度。掛起是進程自身或者系統或用戶的干預行為(注意與阻塞行為的區別)。 2.激活。激活原語Active。將進程從外存調入內存->檢查進程的現行狀態,靜止就緒改為“活動就緒”,靜止阻塞改為“活動阻塞”。 搶占調度策略---每當有靜止就緒進程被激活而插入就緒隊列時,邊檢查是否有進行重新調度,優先級高的獲得處理機使用權。
進程同步
1基本概念。 進程同步,是對多個相關進程在執行次序上進行協調,使并發執行的主進程之間能按照一定規則共享系統資源,并能很好地相互合作,是程序的執行具有可再現性。 間接相互制約關系。共享系統資源,如CPU、I/O設備等,是并發執行的程序相互制約,只能互斥訪問。必須有系統實施統一分配,不允許用戶進程直接使用。 直接相互制約關系。某些應用程序建立多個進程,這些進程將為同一項任務相互合作。進程的運行不受自身所控制,進程的異步性。 臨界資源。屬于臨界資源的硬件有打印機、磁帶機等,軟件有消息緩沖隊列、變量、數組、緩沖區等。 諸進程間應采取互斥方式,實現對這種資源的共享。一次僅允許一個進程使用的共享資源. 臨界區。每個進程中訪問臨界資源的那段代碼稱為臨界區。若能保證諸進程互斥地進入自己的臨界區,便可實現諸進程對臨界資源的互斥訪問。 每個進程在進入臨界區之前,先對欲訪問的臨界資源進行檢查是否正被訪問。如果此刻該臨界資源未被訪問,進程便可進入臨界區對該資源進行訪問,并設置它正被訪問的標志; 如果此刻該臨界資源正被某進程訪問,則本進程不能進入臨界區。臨界區前加入進入區代碼段,后面加入退出區代碼段,用于標識臨界區是否正被訪問。多個進程中涉及到同一個臨界資源的臨界區稱為相關臨界區. 同步機制應遵循的規則 空閑讓進 忙則等待 有限等待。進程有限時間內進入自己的臨界區,以免“死等”。 讓權等待。進程不能進入自己臨界區,應立即釋放處理機,以免陷入“忙等”。 2.硬件同步機制。測試和關鎖。為防止多個進程同時測試到鎖為打開的情況,測試和關鎖必須連續不允許分開進行。 A.關中斷。進入鎖測試前關閉中斷,完成鎖測試并上鎖后才打開中斷。最簡單的方法之一。缺點--濫用會導致嚴重后果;時間過長影響效率;不適合多CPU系統。 B.利用Test-and-Set指令實現互斥。初始lock為false,臨界資源空閑。進程進入臨界區前,先檢查lock,若為false進入,對lock賦值true,其余進程無法進入。 C.利用Swap指令實現互斥。會陷入忙等。 3.信號量機制。 A.整形信號量。一個用于表示資源數目的整形量S。S大于等于零是代表可供并發進程使用的資源實體數,當S小于零時則表示正在等待使用臨界區的進程數。原子操作wait(S)和signal(S)。P、V操作。S<=0,wait會陷入忙等。 B.記錄型信號量。一個代表資源數目的整形變量value,一個進程鏈表指針list。若S的初值為1,表示只允許一個進程訪問臨界資源,此時信號量轉化為互斥信號量,用于進程互斥。 C.AND行信號量。位進程一次性全部的分配給所需資源,待進程使用完后一起釋放。 D.信號量集。 4 .信號量的應用 A.實現進程互斥。訪問某臨界資源,為資源設置互斥信號量mutex,初始值為1。mutex=1,兩進程皆未進入需要互斥的臨界區。mutex=0,一個進入,一個掛入阻塞隊列。 mutex=-1一個運行,了一個因等待而阻塞在信號量隊列中,需要被當前已在臨界區運行的進程退出時喚醒。 B.實現前驅關系 5.管程。Monitors,也稱為監視器。是一種程序結構,結構內的多個子程序(對象或模塊)形成的多個工作線程互斥訪問共享資源。這些共享資源一般是硬件設備或一群變量。 管程實現了在一個時間點,最多只有一個線程在執行管程的某個子程序。與那些通過修改數據結構實現互斥訪問的并發程序設計相比,管程實現很大程度上簡化了程序設計。 管程提供了一種機制,線程可以臨時放棄互斥訪問,等待某些條件得到滿足后,重新獲得執行權恢復它的互斥訪問。管程一定能保證互斥,不必特地考慮保護臨界區。
經典進程的同步問題
A.生產者消費者問題。也稱有限緩沖問題。該問題是相互合作的進程關系的一種抽象。資源信號量empty和full,互斥信號量wait(mutex)和signal(mutex)。先執行對資源信號量的wait操作,再執行對互斥信號量的wait操作。否則引起死鎖。這種方法叫信號燈法。 B.哲學家進餐問題。可以用來解釋死鎖和資源耗盡。
進程通信
進程通信的類型 A.共享存儲器系統?;诠蚕頂祿Y構的通信方式(效率低,低級通訊)。基于共享存儲區的通信方式(高級)。 B.管道通信系統。借助共享pipe文件。互斥(讀不寫,寫不讀)、同步、確定對方已存在才可進行通信。 C.消息傳遞系統。不借助共享存儲區或數據結構,利用封裝了數據的message。用戶透明化,應用最廣泛。支持多處理機系統、否輸出系統和計算機網絡。高級。直接通信方式、間接通信方式。 D.客戶機服務器系統。套接字、遠程過程調用、遠程方法調用??蛻舸娓头掌鞔娓秃孟窀髯缘拿貢粯印? 消息傳遞通信的實現方式 A.直接消息傳遞系統。 B.信箱通信。進程間的通信需要某種中間實體(共享數據結構等)來完成。既可以實時通信,又可以非實時。私用郵箱(自己發收,別人只發),公用郵箱(都可發收),共享郵箱(指定發收)。
線程的基本概念
進程:使多個程序能并發執行,以提高資源利用率和吞吐量。
線程:減少程序在并發執行時所付出的時空開銷,是OS有更好的并發性。
進程的兩個基本屬性:一個可擁有資源的獨立基本單位;一個可獨立調度和分派的基本單位。 線程:作為調度和分派的基本單位。線程僅擁有必不可少的、能保證獨立運行的資源。 線程控制塊TCB。線程標識符、一組寄存器、線程運行狀態、線程專有存儲區、信號屏蔽、堆棧指針。 進程就像一個大的倉儲,線程就像快遞員。整個倉儲可以有很多快遞員,共同完成任務??刹l執行。 線程的三種狀態:執行狀態、就緒狀態、阻塞狀態。 多線程OS中進程屬性: * 進程是一個可擁有資源的基本單位 * 多個線程可并發執行 * 進程已不再是可執行的實體。線程是獨立運行或調度的基本單位。 線程的實現方式: 1.內核支持線程KST。都在內核實現。多處理器系統中可多線程并行執行;一個受阻可運行其他線程;很小的數據結構和堆棧,切換快,開銷小;可采用多線程技術。和用戶線程切換時開銷大。 2.用戶級線程ULT。用戶空間實現。不需轉換到內核空間;調度算法可以進程專用;與平臺無關。一個線程執行,其余只能等待;基于進程執行,進程阻塞,線程全阻塞。 3.組合方式。用戶線程對內核線程。 多對一模型。開銷小,效率高。一個線程受阻,整個進程受阻;每次只有一個線程能訪問內核。 一對一模型。更好的并發功能。開銷大,需要限制整個系統的線程數。 多對多。可并行,且效率高。 線程的實現: 1.內核支持線程的實現。建立PTDA任務數據區,內含多個TCB。內核線程的創建撤銷與進程類似。調度切換分搶占式方式和非搶占方式。調度算法有時間片輪轉法、優先權算法。 2.用戶級線程的實現。 A.運行時系統(Runtime System)。用行駛系統中的用于管理和控制線程的函數駐留在用戶空間,并作為用戶級線程與內核間的接口。用戶級線程在切換時不需轉入和心態,由運行時系統的線程切換函數執行切換任務。加快了切換速度。 B.內核控制線程,輕型線程LWP。用LWP實現內核與用戶級線程間的隔離,使用戶級線程與內核無關。 程序啟動時一般只有一個線程在執行,被稱為“初始化線程”,用于創建新線程。 線程終止后并不立即釋放所占資源,只有當進程中其他線程執行了分離函數后,才是資源才被其他線程利用。 線程(thread) 通常在一個進程中可以包含若干個線程,當然一個進程中至少有一個線程,不然沒有存在的意義。線程可以利用進程所擁有的資源, 在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位,由于線程比進程更小, 基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統多個程序間并發執行的程度。 多線程(multiThread) 在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理”。 多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。 最簡單的比喻多線程就像火車的每一節車廂,而進程則是火車。車廂離開火車是無法跑動的,同理火車也不可能只有一節車廂。多線程的出現就是為了提高效率。 二、說說區別 1、進程與線程的區別: 進程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響, 而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯, 但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。 1) 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程. 2) 線程的劃分尺度小于進程,使得多線程程序的并發性高。 3) 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。 4) 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。 5) 從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。 三、說說優缺點 線程和進程在使用上各有優缺點:線程執行開銷小,但不利于資源的管理和保護;而進程正相反。同時,線程適合于在SMP(多核處理機)機器上運行,而進程則可以跨機器遷移。
簡要理解進程
內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、 安全功能等 Process:運行中的程序 (運行中的程序的一個副本,是被載入內存的一個指令集合) 進程ID( Process ID, PID)號碼被用來標記各個進程 UID、 GID、和SELinux語境決定對文件系統的存取和訪問權限, 通常從執行進程的用戶來繼承 存在生命周期 task struct: Linux內核存儲進程信息的數據結構格式 task list:多個任務的的task struct組成的鏈表 進程創建: init:系統第一個進程(所有進程都依賴它 centos6系及以下) 父子關系 進程:都由其父進程創建, .COW 進程函數:fork()生成, clone()克隆
進程優先級
系統優先級:數字越小,優先級越高 范圍: 0-139(centos 4,5) 各有運行隊列和過期隊列,兩個隊列根據進程的時間片互換,來 0-99(centos 6) 實時優先級: 范圍:0-99 數字越大,優先級越高 nice值: (靜態優先級) 范圍: -20-19 值越小,優先級越高 映射到實際的優先級范圍是100-139 1.優先進入cpu執行 2.更長的CPU處理時間 正常情況下,任何一個進程的優先級都是這個值,即使我們通過nice和renice命令調整了進程的優先級,它的取值范圍也不會超出100-139的范圍,除非這個進程是一個實時進程,那么它的優先級取值才會變成0-99這個范圍中的一個。 普通用戶只能調高nice值 管理員可以調高和降低nice值 ni: nice值 pri: priority,優先級 psr: processor, CPU編號 rtprio: 實時優先級 優先級繼承 由于互斥,一個進程(設為A)可能因為等待進入臨界區而睡眠。直到正在占有相應資源的進程(設為B)退出臨界區,進程A才被喚醒。 可能存在這樣的情況:A的優先級非常高,B的優先級非常低。B進入了臨界區,但是卻被其他優先級較高的進程(設為C)搶占了,而得不到運行,也就無法退出臨界區。于是A也就無法被喚醒。 A有著很高的優先級,但是現在卻淪落到跟B一起,被優先級并不太高的C搶占,導致執行被推遲。這種現象就叫做優先級反轉。 出現這種現象是很不合理的。較好的應對措施是:當A開始等待B退出臨界區時,B臨時得到A的優先級(還是假設A的優先級高于B),以便順利完成處理過程,退出臨界區。之后B的優先級恢復。這就是優先級繼承的方法。 3.Big O:時間復雜度,用時和規模的關系 O(1),O(logn),O(N)線性,O(N^2)拋物線,O(2^N) 進程相關概念: 進程內存: Page Frame: 頁框,用存儲頁面數據,存儲Page 4k LRU: Least Recently Used 近期最少使用算法,釋放內存物理地址空間和線性地址空間 MMU: Memory Management Unit負責轉換線性和物理地址 IPC: Inter Process Communication 同一主機上 signal shm: shared memory semophore 信號量,一種計數器 不同主機上: rpc: remote procedure call socket: IP和端口號 進程狀態: Linux內核:搶占式多任務 進程類型: 守護進程: daemon,在系統引導過程中啟動的進程, 和終端無關進程 前臺進程:跟終端相關,通過終端啟動的進程 注意:兩者可相互轉化 ? 進程狀態: 運行態: running 就緒態: ready 睡眠態: 可中斷: interruptable 不可中斷: uninterruptable 停止態: stopped,暫停于內存中,但不會被調度,除非手動啟動 僵死態: zombie,結束進程,父進程結束前,子進程不關閉 什么是僵尸進程 一個進程在調用exit命令結束自己的生命的時候,其實它并沒有真正的被 僵尸進程銷毀, 而是留下一個稱為僵尸進程(Zombie)的數據結構(系統調用exit,它的作用是 使進程退出,但也僅僅限于將一個正常的進程變成一個僵尸進程,并不能將其完全銷毀) 僵尸進程是怎么樣產生 在Linux進程的狀態中,僵尸進程是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其他進程收集,除此之外,僵尸進程不再占有任何內存空間。它需要它的父進程來為它收尸。 如果他的父進程沒安裝SIGCHLD信號處理函數調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態,如果這時父進程結束了,那么init進程自動會接手這個子進程,為它收尸,它還是能被清除的。 但是如果父進程是一個循環,不會結束,那么子進程就會一直保持僵尸狀態,這就是為什么系統中有時會有很多的僵尸進程。系統所能使用的進程號是有限的,如果大量的產生僵死進程,將因為沒有可用的進程號而導致系統不能產生新的進程. 異步回收僵尸進程: fork()之后,子進程從父進程獲取了一份拷貝,和父進程分別獨立運行,僵尸進程的產生是因為父進程沒有給子進程“收尸”造成的,又可以根據危害程度分為下述兩類: 總體來說:當子進程結束之后,但父進程未結束之前,子進程將成為僵尸進程。 (1)當子進程結束之后,但父進程未結束之前,子進程將成為僵尸進程,父進程結束后僵尸被init進程回收。 (2)如果子進程結束了,但是父進程始終沒有結束,那么這個僵尸將一直存在,而且隨著exec,僵尸越來越多。
進程管理工具:
進程的分類:
CPU-Bound: CPU密集型,非交互 IO-Bound: IO密集型,交互
Linux系統狀態的查看及管理工具:
pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup
pstree命令:
pstree - display a tree of processes
ps命令: process state
ps - report a snapshot of the current processes Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中 適用ps來查看進程信息 ps [OPTION]... 支持三種選項: UNIX選項 如-a BSD選項 如a GUN選項 如--help 默認顯示當前終端中的進程 a 選項包括所有終端中的進程 x 選項包括不鏈接終端的進程 u 選項顯示進程所有者的信息 f 選項顯示進程的父進程 o 屬性… 選項顯示定制的信息 ,o必須跟字段名,個字段用逗號相隔: pid、 comm、 %cpu、 %mem、 state、 tty、 euser、 ruser 例: [root@wen-7 ~]# ps ao pid,tty,euser,ruser PID TT EUSER RUSER 1708 tty1 root root 59421 pts/0 root root 60726 pts/0 root root 常用組合: -ef -e: 顯示所有進程 -f: 顯示完整格式程序信息 常用組合: -eFH -F: 顯示更完整格式的進程信息 -H: 以進程層級格式顯示進程相關信息 常用組合:自定義 -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm 最常使用: ps aux| 其他命令 (grep) VSZ: Virtual memory SiZe,虛擬內存集,線性內存 虛擬分配給進程的內存量 RSS: ReSident Size, 常駐內存集 實際使用內存量 STAT:進程狀態 R: running 運行 S: interruptable sleeping 睡眠可中斷 D: uninterruptable sleeping 睡眠不可中斷 T: stopped 停止 Z: zombie 僵尸 +: 前臺進程 l: 多線程進程 N:低優先級進程 <: 高優先級進程 s: session leader,會話(子進程)發起者 [root@wen-7 ~]# ps axuf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2 0.0 0.0 0 0 ? S 9月06 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 9月06 0:03 \_ [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S 9月06 0:00 \_ [migration/0] root 8 0.0 0.0 0 0 ? S 9月06 0:00 \_ [rcu_bh]
按預定義的模式: pgrep
pgrep [options] patter -u uid: effective user,生效者 -U uid: real user,真正發起運行命令者 -t terminal: 與指定終端相關的進程 -l: 顯示進程名 -a: 顯示完整格式的進程名 -P pid: 顯示父進程為此處指定的進程的進程列表 pgerp ssh : 查看進程中有ssh的字符串的進程 pgrep sshd | xargs -i kill -9 {} #將所有sshd進程退出 pgrep sshd | xargs kill -9 #同上 [root@wen-7 ~]# pgrep -u root 1 2 [root@wen-7 ~]# pgrep -U nobody 3290 [root@wen-7 ~]# pgrep -t tty1 1708 [root@wen-7 ~]# pgrep -P 1 719 742 753 [root@wen-7 ~]# pgrep -a 1 10 rcuob/1 19 rcuob/10 20 rcuob/11 21 rcuob/12
按確切的程序名稱: /sbin/pidof
查看進程相關的id信息
[root@wen-7 ~]# pidof bash 59421 1403
uptime
顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載( 1、 5、 10分鐘的平均負載,一般不會超過1)
系統平均負載:
指在特定時間間隔內運行隊列中的平均進程數。
如果每個CPU內核的當前活動進程數不大于3的話,那么
系統的性能良好。 如果每個CPU內核的任務數大于5,那么這臺機器的性能有嚴重問題。
如果linux主機是1個雙核CPU的話,當Load Average 為
6的時候說明機器已經被充分使用了。
例: [root@wen-7 ~]# uptime 12:47:01 up 15:31, 1 user, load average: 0.00, 0.01, 0.05
top:進程監控工具
選項: -d #: 指定刷新時間間隔,默認為3秒 -b: 以批次方式 -n #: 顯示多少批次 -i:忽略不顯示僵尸進程 內置命令: k:結束某個進程 q:退出top r:調整指定進程的nice值 S: 開啟/關閉累加模式 s:調整刷新的延遲時間(修改刷新時間間隔)
O: 指定要按照哪個字段進行排序 o:調整各個字段的先后順序 按大寫是向上移動 按小寫向下移動 m:顯示/隱藏內存信息 M: 根據內存使用率來排序 t:顯示/隱藏CPU信息 P: 根據CPU的使用率進行排序 T: 根據時間/累加時間進行排序 c:顯示完整的命令 W: 將top顯示的信息保存到一個文件當中 排序: P:以占據的CPU百分比,%CPU
M:占據內存百分比,%MEM
T:累積占據CPU時長,TIME+
首部信息顯示: uptime信息: l命令 tasks及cpu信息: t命令 Cpu分別顯示: 1 (數字) memory信息: m命令 上欄位信息簡介 us:用戶空間 sy:內核空間 ni:調整nice時間 id:空閑 wa:等待IO時間 hi:硬中斷 si:軟中斷(模式切換) st:虛擬機偷走的時間
下欄位信息簡介 PID (Process Id):任務的進程ID PPID (Parent Process Pid):父任務的進程ID RUSER (Real User Name):任務的所有者真實名稱 UID (User Id):任務所有者ID USER (User Name):任務所有者名稱 GROUP (Group Name):任務所有者群組名 TTY (Controlling Tty):終端 PR (Priority):優先級 %CPU (CPU usage):CPU使用率 %MEM (Memory usage (RES)):內存使用率 S (Process Status):進程狀態 TIME+ (CPU Time, hundredths):CPU時間,精確到秒
htop
htop命令:需從額外tar包安裝,或rpm包安裝 http://172.16.0.1/fedora-epel/7/x86_64 選項: -d #: 指定延遲時間; -u UserName: 僅顯示指定用戶的進程; -s COLUME: 以指定字段進行排序; 子命令: s: 跟蹤選定進程的系統調用; l: 顯示選定進程打開的文件列表; a:將選定的進程綁定至某指定CPU核心; t: 顯示進程樹
內存工具:
vmstat命令:虛擬內存信息
vmstat [options] [delay [count]] delay:延時#秒更新 count:刷新次數 例: [root@wen-7 ~]# vmstat 2 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 1464 129788 2188 678072 0 0 17 7 81 161 0 0 99 0 0 0 0 1464 129788 2188 678072 0 0 0 0 71 115 0 0 100 0 0 0 0 1464 129788 2188 678072 0 0 0 0 75 117 0 1 100 0 0 0 0 1464 129756 2188 678072 0 0 0 0 84 129 0 1 99 0 0 0 0 1464 129788 2188 678072 0 0 0 0 76 121 0 0 100 0 0 procs: r:等待運行的進程的個數,和核心數有關 b:處于不可中斷睡眠態的進程個數(被阻塞的隊列的長度) memory: swpd: 交換內存的使用總量 free:空閑物理內存總量 buffer:用于buffer的內存總量 cache:用于cache的內存總量 swap: si:從磁盤交換進內存的數據速率(kb/s) so:從內存交換至磁盤的數據速率(kb/s) io: bi:從塊設備讀入數據到系統的速率(kb/s) bo: 保存數據至塊設備的速率 system: in: interrupts, 中斷速率,包括時鐘 cs: context switch, 進程切換速率 cpu: us:Time spent running non-kernel code sy: Time spent running kernel code id: Time spent idle. Linux 2.5.41前,包括IO-wait time. wa: Time spent waiting for IO. 2.5.41前,包括in idle. st: Time stolen from a virtual machine. 2.6.11前, unknown. 選項: -s: 顯示內存的統計數據
pmap命令:進程對應的內存映射
pmap [options] pid [...] -x: 顯示詳細格式的信息; #pmap -x 1 另外一種實現: # cat /proc/PID/maps PID:進程PID
[root@wen-7 ~]# pmap 1 1: /usr/lib/systemd/systemd --switched-root --system --deserialize 21 00007fd608000000 164K rw--- [ anon ] 00007fd608029000 65372K ----- [ anon ] 00007fd60cc0e000 4K ----- [ anon ] 00007fd60cc0f000 8192K rw--- [ anon ] 00007fd60d40f000 4K ----- [ anon ] 00007fd60d410000 8192K rw--- [ anon ] 00007fd60dc10000 16K r-x-- libuuid.so.1.3.0 00007fd60dc14000 2044K ----- libuuid.so.1.3.0 00007fd60de13000 4K r---- libuuid.so.1.3.0 00007fd60de14000 4K rw--- libuuid.so.1.3.0 00007fd60de15000 224K r-x-- libblkid.so.1.1.0 00007fd60de4d000 2048K ----- libblkid.so.1.1.0 [root@wen-7 ~]# pmap -x 512 512: [events_power_ef] Address Kbytes RSS Dirty Mode Mapping ---------------- ------- ------- ------- total kB 0 0 0 [root@wen-7 proc]# cat /proc/1/maps 7fd608000000-7fd608029000 rw-p 00000000 00:00 0 7fd608029000-7fd60c000000 ---p 00000000 00:00 0 7fd60cc0e000-7fd60cc0f000 ---p 00000000 00:00 0 7fd60cc0f000-7fd60d40f000 rw-p 00000000 00:00 0 7fd60d40f000-7fd60d410000 ---p 00000000 00:00 0 7fd60d410000-7fd60dc10000 rw-p 00000000 00:00 0 7fd60dc10000-7fd60dc14000 r-xp 00000000 fd:01 67344992 /usr/lib64/libuuid.so.1.3.0 7fd60dc14000-7fd60de13000 ---p 00004000 fd:01 67344992 /usr/lib64/libuuid.so.1.3.0
glances命令: 系統監控工具 EPEL源
命令格式: glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-Ppassword] [--password] [-t refresh] [-f file] [-o output] 內建命令: a Sort processes automatically l Show/hide logs 顯示/隱藏日志 c Sort processes by CPU% 由CPU % c類流程 b Bytes or bits for network I/O m Sort processes by MEM% w Delete warning logs 刪除警告日志 p Sort processes by name 按名稱排序過程 x Delete warning and critical logs i Sort processes by I/O rate 1 Global CPU or per-CPU stats d Show/hide disk I/O stats h Show/hide this help screen f Show/hide file system stats t View network I/O as combination n Show/hide network stats 查看/隱藏網絡狀態 u View cumulative network I/O s Show/hide sensors stats q Quit (Esc and Ctrl-C also work) y Show/hide hddtemp stats 顯示/隱藏hddtemp統計數據 常用選項: -b: 以Byte為單位顯示網卡數據速率 -d: 關閉磁盤I/O模塊 -f /path/to/somefile: 設定輸入文件位置 -o {HTML|CSV}:輸出格式 -m: 禁用mount模塊 -n: 禁用網絡模塊 -t #: 延遲時間間隔 -1:每個CPU的相關數據單獨顯示 C/S模式下運行glances命令 服務模式: glances -s -B IPADDR IPADDR: 指明監聽的本機哪個地址 客戶端模式: glances -c IPADDR IPADDR:要連入的服務器端地址
dstat命令:系統資源統計
如系統沒有命令,需要安裝軟件 : # yum install dstat
dstat [-afv] [options..] [delay [count]] -c: 顯示cpu相關信息 -C #,#,...,total -d: 顯示disk相關信息 -D total,sda,sdb,... -g:顯示page相關統計數據 -m: 顯示memory相關統計數據 -n: 顯示network相關統計數據 -p: 顯示process相關統計數據 -r: 顯示io請求相關的統計數據 -s: 顯示swapped相關的統計數據 --tcp --udp --unix --raw --socket --ipc --top-cpu:顯示最占用CPU的進程 --top-io: 顯示最占用io的進程 --top-mem: 顯示最占用內存的進程 --top-latency: 顯示延遲最大的進程 [root@Wencx ~]# dstat ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 0 0 99 0 0 0|2385B 16k| 0 0 | 0 0 | 73 154 0 0 100 0 0 0| 0 0 | 780B 1938B| 0 0 | 122 223 0 0 100 0 0 0| 0 0 | 54B 66B| 0 0 | 79 159 [root@Wencx ~]# dstat -c ----total-cpu-usage---- usr sys idl wai hiq siq 0 0 99 0 0 0 0 0 100 0 0 0 1 1 98 0 0 0 0 0 100 0 0 0 [root@Wencx ~]# dstat -d -dsk/total- read writ 2385B 16k 0 72k [root@Wencx ~]# dstat -D /dev/sda dstat: /dev/sda does not exist ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 0 0 99 0 0 0|2385B 16k| 0 0 | 0 0 | 73 154 0 0 100 0 0 0| 0 0 | 108B 150B| 0 0 | 71 145 0 0 100 0 0 0| 0 0 | 54B 838B| 0 0 | 71 146 [root@Wencx ~]# dstat -g ---paging-- in out 0 0 0 0 0 0 [root@Wencx ~]# dstat -m ------memory-usage----- used buff cach free 712M 23.5M 152M 110M 712M 23.5M 152M 110M 712M 23.5M 152M 110M [root@Wencx ~]# dstat -n -net/total- recv send 0 0 54B 118B 54B 214B 780B 1636B^C [root@Wencx ~]# dstat -p ---procs--- run blk new 0 0 1.1 0 0 0 0 0 0 0 0 0 0 0 0^C [root@Wencx ~]# dstat -r --io/total- read writ 0.14 2.10 0 0 0 0 ^C [root@Wencx ~]# dstat -s ----swap--- used free 0 0 0 0 0 0 ^C [root@Wencx ~]# dstat --tcp ----tcp-sockets---- lis act syn tim clo 5 2 0 1 0 5 2 0 1 0^C [root@Wencx ~]# dstat --top-cpu -most-expensive- cpu process barad_agent 0.1 nginx: worker1.0 [root@Wencx ~]# dstat --top-io ----most-expensive---- i/o process crond 9648B 397B sshd: root@ 146B 208B sshd: root@ 78B 128B watchdog.sh 290k 16k secu-tcs-ag 217B 0 [root@Wencx ~]# dstat --top-mem --most-expensive- memory process mysqld 49.0M mysqld 49.0M mysqld 49.0M [root@Wencx ~]# dstat --top-latency --highest-total-- latency process nginx: worker 105 nginx: worker 130 nginx: worker 134 nginx: worker 168 ksoftirqd/0 167 nginx: worker 177 nginx: worker 444
kill命令:
向進程發送控制信號,以實現對進程管理 顯示當前系統可用信號: kill -l
常用信號: man 7 signal 1) SIGHUP: 無須關閉進程而讓其重讀配置文件 2) SIGINT: 中止正在運行的進程;相當于Ctrl+c 9) SIGKILL: 殺死正在運行的進程 15) SIGTERM:終止正在運行的進程 18) SIGCONT:繼續運行 19) SIGSTOP:后臺休眠 指定信號的方法: (1) 信號的數字標識; 1, 2, 9 (2) 信號完整名稱; SIGHUP (3) 信號的簡寫名稱; HUP 按PID: kill [-SIGNAL] pid … -SIGNAL -u uid: effective user,生效者 -U uid: real user,真正發起運行命令者 -t terminal: 與指定終端相關的進程 -l: 顯示進程名 -a: 顯示完整格式的進程名 -P pid: 顯示父進程為此處指定的進程的進程列表 按名稱: killall [-SIGNAL] comm… killall和pkill是相似的,不過如果給出的進程名不完整,killall會報錯。pkill或者pgrep只要給出進程名的一部分就可以終止進程。 $kill all -9 firefox 按模式: pkill [options] pattern pkill=pgrep+kill 殺死進程的方式 1. pkill方式 # pkill -u ttlsa 2. killall方式 # killall -u ttlsa 3. ps方式 ps列出ttlsa的pid,然后依次kill掉,比較繁瑣. # ps -ef | grep ttlsa | awk '{ print $2 }' | sudo xargs kill -9 4. pgrep方式 pgrep -u參數查出用戶的所有pid,然后依次kill # pgrep -u ttlsa | sudo xargs kill -9 例: 1.殺死 終端進程 [root@wen-7 ~]# ps aux| grep pts/1 root 69225 0.1 0.5 145416 5504 ? Ss 15:28 0:00 sshd: root@pts/1 root 69227 0.2 0.3 116692 3312 pts/1 Ss+ 15:29 0:00 -bash root 69273 0.0 0.0 112660 964 pts/0 R+ 15:29 0:00 grep --color=auto pts/1 [root@wen-7 ~]# kill 9 69225
調整進程優先級命令:
可通過nice命令調整進程的優先級,優先級的范圍為100-139,分別對應 -20,19的閥值,進程啟動時nice值為0, 其對應的優先級為120,nice數值越小優先級越高
nice命令
nice - run a program with modified scheduling priority nice [option] [COMMAND][ARGU….] [options] -n NICE : 指定nice值 #nice -n -5 htop #為115優先級啟動htop 注意:nice值只有管理員可調
renic命令
renice - alter priority of running processes renice [-n] NICE PID -n NICE : 指定NICE值 #renice -n -3 5207 : 調整進程PID為5207的nice值為-3
原創文章,作者:wencx,如若轉載,請注明出處:http://www.www58058.com/44371