新聞中心
在Linux系統(tǒng)中,進(jìn)程是系統(tǒng)中最重要的概念之一。進(jìn)程是一個運行程序的實體,可以執(zhí)行各種操作,如文件讀寫、網(wǎng)絡(luò)通信等。進(jìn)程管理對于系統(tǒng)的運行和性能有著重要的影響。但是有的時候,我們發(fā)現(xiàn)一些進(jìn)程看不到,怎么辦呢?

創(chuàng)新互聯(lián)建站主要從事網(wǎng)站制作、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)濱海,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
本文將介紹Linux進(jìn)程的基本概念和管理方式,同時探討常見的進(jìn)程看不到的原因和解決方法。
一、進(jìn)程的基本概念
1.進(jìn)程的概念
進(jìn)程是一個正在運行的程序?qū)嵗?。每個進(jìn)程都有自己的地址空間、資源和權(quán)限,它們是Linux系統(tǒng)中最小的可調(diào)度實體。在Linux系統(tǒng)中,進(jìn)程是通過fork函數(shù)創(chuàng)建的。
2.進(jìn)程的狀態(tài)
在Linux系統(tǒng)中,進(jìn)程的狀態(tài)分為五種:
1)運行態(tài)(R):進(jìn)程正在運行。
2)等待態(tài)(S):進(jìn)程正在等待某個事件的發(fā)生,例如等待磁盤I/O完成。
3)中斷睡眠(D):進(jìn)程正在等待設(shè)備中斷或信號。
4)停止(T):進(jìn)程已被終止,但它的父進(jìn)程尚未進(jìn)行清理工作。
5)僵尸(Z):進(jìn)程已經(jīng)終止,但它的父進(jìn)程尚未進(jìn)行清理工作。
3.進(jìn)程間關(guān)系
在Linux系統(tǒng)中,進(jìn)程間存在父子關(guān)系。一個進(jìn)程可以通過fork函數(shù)創(chuàng)建一個子進(jìn)程,子進(jìn)程和父進(jìn)程共享一部分資源。子進(jìn)程可以通過exec函數(shù)替換自己的鏡像,父進(jìn)程可以通過wt函數(shù)回收子進(jìn)程資源。
二、進(jìn)程管理方式
在Linux系統(tǒng)中,我們可以使用命令行工具或者圖形化界面來管理進(jìn)程。
1.命令行管理進(jìn)程
在命令行中,我們可以使用ps、top、kill等命令來管理進(jìn)程。
1)ps命令
ps命令用于查看系統(tǒng)中運行的進(jìn)程信息。常用參數(shù)有:
-a:顯示全部進(jìn)程。
-u:顯示進(jìn)程的詳細(xì)信息。
-x:顯示沒有控制終端的進(jìn)程。
2)top命令
top命令可以實時地顯示進(jìn)程的狀態(tài)和資源使用情況。常用參數(shù)有:
-p:查看指定進(jìn)程的狀態(tài)和資源使用情況。
3)kill命令
kill命令用于終止進(jìn)程。常用參數(shù)有:
-9:強行終止進(jìn)程。
2.圖形化管理進(jìn)程
在圖形化界面中,我們可以使用系統(tǒng)監(jiān)視器等工具來管理進(jìn)程。
1)系統(tǒng)監(jiān)視器
系統(tǒng)監(jiān)視器可以實時地顯示進(jìn)程的狀態(tài)和資源使用情況。
2)任務(wù)管理器
任務(wù)管理器可以維護(hù)系統(tǒng)中的進(jìn)程,包括終止進(jìn)程、調(diào)整進(jìn)程優(yōu)先級等。
三、進(jìn)程看不到的原因和解決方法
有時候我們會發(fā)現(xiàn)一些進(jìn)程在ps命令或者系統(tǒng)監(jiān)視器中看不到,這是因為這些進(jìn)程處于后臺或者守護(hù)進(jìn)程的狀態(tài)。
對于后臺進(jìn)程,我們可以使用jobs命令或者fg、bg命令將其調(diào)至前臺。對于守護(hù)進(jìn)程,我們可以通過/var/run/和/etc/init.d/目錄下相關(guān)文件的設(shè)置和啟動來管理它們。
1.后臺進(jìn)程
后臺進(jìn)程是指在命令行模式下運行的程序,可以使用&符號將其放到后臺運行。例如:
$ ./test &
這時候,我們使用ps命令將看不到該進(jìn)程。要查看及管理該進(jìn)程,可以使用以下命令:
1)jobs命令
jobs命令可以列出當(dāng)前所有在后臺運行的進(jìn)程,例如:
$ jobs
[1]+ Running ./test &
其中[1]+代表該進(jìn)程的編號。
2)fg命令
fg命令可以將一個后臺進(jìn)程調(diào)到前臺,并將其標(biāo)準(zhǔn)輸入重定向到當(dāng)前終端。例如:
$ fg %1
其中%1代表進(jìn)程編號。
3)bg命令
bg命令可以將一個在前臺停止的進(jìn)程放到后臺運行。例如:
$ bg %1
其中%1代表進(jìn)程編號。
2.守護(hù)進(jìn)程
守護(hù)進(jìn)程是一種在后臺運行的程序,不和任何終端交互,通常在系統(tǒng)啟動時自動啟動。守護(hù)進(jìn)程將自己脫離控制臺,不受控制臺關(guān)閉的影響。守護(hù)進(jìn)程一般保存在/etc/init.d目錄下,控制腳本保存在/var/run目錄下。要查看及管理守護(hù)進(jìn)程,可以使用以下命令:
1)service命令
service命令可以啟動、停止、重啟一個守護(hù)進(jìn)程。例如:
$ service httpd start
$ service httpd stop
$ service httpd restart
2)systemctl命令
systemctl命令可以列出系統(tǒng)中所有的守護(hù)進(jìn)程。例如:
$ systemctl status
4.
本文介紹了Linux進(jìn)程的基本概念和管理方式。同時對于進(jìn)程看不到的原因和解決方法進(jìn)行了講解。通過這篇文章,我們應(yīng)該能夠更加深入地了解和管理Linux系統(tǒng)中的進(jìn)程。
相關(guān)問題拓展閱讀:
- Linux 進(jìn)程管理之進(jìn)程調(diào)度與切換
- 如何在Linux中查看所有正在運行的進(jìn)程
Linux 進(jìn)程管理之進(jìn)程調(diào)度與切換
我們知道,進(jìn)程運行需要各種各樣的系統(tǒng)資源,如內(nèi)存、文件、打印機和最
寶貴的 CPU 等,所以說,調(diào)度的實質(zhì)就是資源的分配。系統(tǒng)通過不同的調(diào)度算法(Scheng Algorithm)來實現(xiàn)這種資源的分配。通常來說,選擇什么樣的調(diào)度算法取決于資源分配的策略(Scheng Policy)。
有關(guān)調(diào)度相關(guān)的結(jié)構(gòu)保存在 task_struct 中,如下:
active_mm 是為內(nèi)核線程而引入的,因為內(nèi)核線程沒有自己的地址空間,為了讓內(nèi)核線程與普通進(jìn)程具有統(tǒng)一的上下文切換方式,當(dāng)內(nèi)核線程進(jìn)行上下文切換時,讓切換進(jìn)來的線程的 active_mm 指向剛被調(diào)度出去的進(jìn)程的 active_mm(如果進(jìn)程的mm 域不為空,則其 active_mm 域與 mm 域相同)。
在 linux 2.6 中 sched_class 表示該進(jìn)程所屬的調(diào)度器類有3種:
進(jìn)程的調(diào)度策略有5種,用戶可以調(diào)用調(diào)度器里不同的調(diào)度策略:
在每個 CPU 中都有一個自身的運行隊列 rq,每個活動進(jìn)程只出現(xiàn)在一個運行隊列中,在多個 CPU 上同時運行一個進(jìn)程是不可能的。
運行隊列是使用如下結(jié)構(gòu)實現(xiàn)的:
tast 作為調(diào)度實體加入到 CPU 中的調(diào)度隊列中。
系統(tǒng)中所有的運行隊列都在 runqueues 數(shù)組中,該數(shù)組的每個元素分別對應(yīng)于系統(tǒng)中的一個 CPU。在單處理器系統(tǒng)中,由于只需要一個就緒隊列,因此數(shù)組只有一個元素。
內(nèi)核也定義了一下便利的宏,其含義很明顯。
Linux、c/c++服磨沖務(wù)器開發(fā)篇我們來聊聊進(jìn)程的那些事
Linux內(nèi)核 進(jìn)程間通信組件的實現(xiàn)
學(xué)習(xí)視頻教程-騰訊課堂
需要C/C++ Linux服務(wù)器架構(gòu)師學(xué)習(xí)資料加qun獲取(資料包括
C/C++,Linux,golang技術(shù),Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg
等),免費分享
在分析調(diào)度流程之前,我們先來看在什么情況下要執(zhí)行調(diào)度程序,我們把這種情況叫做調(diào)度時機。
Linux 調(diào)度時機主要有。
時機1,進(jìn)程要調(diào)用 sleep() 或 exit() 等函數(shù)進(jìn)行狀態(tài)轉(zhuǎn)換,這些函數(shù)會主動調(diào)用調(diào)度程序進(jìn)行進(jìn)程調(diào)度。
時機2,由于進(jìn)程的時間片是由時鐘中斷來更新的,因此,這種情況和時機4 是一樣的。
時機3,當(dāng)設(shè)備驅(qū)動程序執(zhí)行長而重復(fù)的任務(wù)時,直接調(diào)用調(diào)度程序。在每次反復(fù)循環(huán)中,驅(qū)動程序都檢查 need_resched 的值,如果必要,則調(diào)用調(diào)度程序 schedule() 主動放棄 CPU。
時機4 , 如前所述, 不管是從中斷、異常還是系統(tǒng)調(diào)用返回, 最終都調(diào)用 ret_from_sys_call(),由這個函數(shù)進(jìn)行調(diào)度標(biāo)志的檢測,如果必要,則調(diào)用調(diào)用調(diào)度程序。那么,為什么從系統(tǒng)調(diào)用返回時要調(diào)用調(diào)度程序呢?這當(dāng)然是從效率考慮。從系統(tǒng)調(diào)用返回意味著要離開內(nèi)核態(tài)而返回到用戶態(tài),而狀態(tài)的轉(zhuǎn)換要花費一定的時間,因此,在返回到用戶態(tài)前,系統(tǒng)把在內(nèi)核吵圓態(tài)該處理的事全部做完。
Linux 的調(diào)度程序是一個叫 Schedule() 的函數(shù),這個函數(shù)來決定是否要進(jìn)行進(jìn)程的切換,如果要切換的話,切換到哪個進(jìn)程等。
從代碼分析來看,Schedule 主要完成了2個功能:
進(jìn)程上下文切換包括進(jìn)程的地址空間的切換和執(zhí)行環(huán)境的切換。
對于 switch_mm 處理,關(guān)鍵的一步就是它將新進(jìn)程頁面目錄的起始物理地址裝入到寄瞎碰殲存器 CR3 中。CR3 寄存器總是指向當(dāng)前進(jìn)程的頁面目錄。
switch_to 把寄存器中的值比如esp等存放到進(jìn)程thread結(jié)構(gòu)中,保存現(xiàn)場一邊后續(xù)恢復(fù),同時調(diào)用 __switch_to 完成了堆棧的切換。
在進(jìn)程的 task_struct 結(jié)構(gòu)中有個重要的成分 thread,它本身是一個數(shù)據(jù)結(jié)構(gòu) thread_struct, 里面記錄著進(jìn)程在切換時的(系統(tǒng)空間)堆棧指針,取指令地址(也就是“返回地址”)等關(guān)鍵性的信息。
關(guān)于__switch_to 的工作就是處理 TSS (任務(wù)狀態(tài)段)。
TSS 全稱task state segment,是指在操作系統(tǒng)進(jìn)程管理的過程中,任務(wù)(進(jìn)程)切換時的任務(wù)現(xiàn)場信息。
linux 為每一個 CPU 提供一個 TSS 段,并且在 TR 寄存器中保存該段。
linux 中之所以為每一個 CPU 提供一個 TSS 段,而不是為每個進(jìn)程提供一個TSS 段,主要原因是 TR 寄存器永遠(yuǎn)指向它,在任務(wù)切換的適合不必切換 TR 寄存器,從而減小開銷。
在從用戶態(tài)切換到內(nèi)核態(tài)時,可以通過獲取 TSS 段中的 esp0 來獲取當(dāng)前進(jìn)程的內(nèi)核棧 棧頂指針,從而可以保存用戶態(tài)的 cs,esp,eip 等上下文。
TSS 在任務(wù)切換過程中起著重要作用,通過它實現(xiàn)任務(wù)的掛起和恢復(fù)。所謂任務(wù)切換是指,掛起當(dāng)前正在執(zhí)行的任務(wù),恢復(fù)或啟動另一任務(wù)的執(zhí)行。
在任務(wù)切換過程中,首先,處理器中各寄存器的當(dāng)前值被自動保存到 TR(任務(wù)寄存器)所指定的任務(wù)的 TSS 中;然后,下一任務(wù)的 TSS 被裝入 TR;最后,從 TR 所指定的 TSS 中取出各寄存器的值送到處理器的各寄存器中。由此可見,通過在 TSS 中保存任務(wù)現(xiàn)場各寄存器狀態(tài)的完整映象,實現(xiàn)任務(wù)的切換。
因此,__switch_to 核心內(nèi)容就是將 TSS 中的內(nèi)核空間(0級)堆棧指針換成 next->esp0。這是因為 CPU 在穿越中斷門或者陷阱門時要根據(jù)新的運行級別從TSS中取得進(jìn)程在系統(tǒng)空間的堆棧指針。
thread_struct.esp0 指向進(jìn)程的系統(tǒng)空間堆棧的頂端。當(dāng)一個進(jìn)程被調(diào)度運行時,內(nèi)核會將這個變量寫入 TSS 的 esp0 字段,表示這個進(jìn)程進(jìn)入0級運行時其堆棧的位置。換句話說,進(jìn)程的 thread_struct 結(jié)構(gòu)中的 esp0 保存著其系統(tǒng)空間堆棧指針。當(dāng)進(jìn)程穿過中斷門、陷阱門或者調(diào)用門進(jìn)入系統(tǒng)空間時,處理器會從這里恢復(fù)期系統(tǒng)空間棧。
由于棧中變量的訪問依賴的是段、頁、和 esp、ebp 等這些寄存器,所以當(dāng)段、頁、寄存器切換完以后,棧中的變量就可以被訪問了。
因此 switch_to 完成了進(jìn)程堆棧的切換,由于被切進(jìn)的進(jìn)程各個寄存器的信息已完成切換,因此 next 進(jìn)程得以執(zhí)行指令運行。
由于 A 進(jìn)程在調(diào)用 switch_to 完成了與 B 進(jìn)程堆棧的切換,也即是寄存器中的值都是 B 的,所以 A 進(jìn)程在 switch_to 執(zhí)行完后,A停止運行,B開始運行,當(dāng)過一段時間又把 A 進(jìn)程切進(jìn)去后,A 開始從switch_to 后面的代碼開始執(zhí)行。
schedule 的調(diào)用流程如下:
如何在Linux中查看所有正在運行的進(jìn)程
最簡單的查看正在運行的命令是top,可以動態(tài)顯示進(jìn)程,負(fù)載,CPU等。
這個只需要輸入下面命令就可以了
ps -fe
linux看不到進(jìn)程管理的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux看不到進(jìn)程管理,Linux進(jìn)程看不到?管理進(jìn)程應(yīng)該這樣操作,Linux 進(jìn)程管理之進(jìn)程調(diào)度與切換,如何在Linux中查看所有正在運行的進(jìn)程的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
新聞標(biāo)題:Linux進(jìn)程看不到?管理進(jìn)程應(yīng)該這樣操作(linux看不到進(jìn)程管理)
轉(zhuǎn)載注明:http://fisionsoft.com.cn/article/cosiioc.html


咨詢
建站咨詢
