真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux進程描述符命令,linux進程符號表

linux查看進程命令

1、首先打開xshell軟件,連接上linux服務器,使用指令ps查看系統(tǒng)進程,參數(shù)a表示全部,u表示以用戶格式顯示,x表示進程參數(shù)。

站在用戶的角度思考問題,與客戶深入溝通,找到阜平網(wǎng)站設(shè)計與阜平網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋阜平地區(qū)。

2、接著通過符號|加上grep查找具體的某個進程,如下圖所示。

3、然后輸入ps -ef用于查看進程的父進程id,如下圖所示。

4、最后使用pstree指令查看進程樹結(jié)構(gòu),如下圖所示就完成了。

【fd】Linux文件描述符

在Linux下一切資源皆文件,普通文件是文件,磁盤打印機是文件,socket 當然也是文件。

關(guān)于Linux下系統(tǒng),進程能最大能打開的文件描述符數(shù)看過好多文章,但大都沒有完整,詳細說明每個值表示什么意思,在實踐中該怎么設(shè)置?

如何通過最簡單的設(shè)置來實現(xiàn)最有效的性能調(diào)優(yōu),如何在有限資源的條件下保證程序的運作?

max-file 表示系統(tǒng)級別的能夠打開的文件句柄的數(shù)量,是對整個系統(tǒng)的限制,并不是針對用戶的。

ulimit -n 控制進程級別能夠打開的文件句柄的數(shù)量,提供對shell及其啟動的進程的可用文件句柄的控制,這是進程級別的。

對于服務器來說,file-max和ulimit都需要設(shè)置,否則會出現(xiàn)文件描述符耗盡的問題。

一般如果遇到文件句柄達到上限時,會碰到"Too many open files"或者Socket/File: Can’t open so many files等錯誤。

相關(guān)的3個文件:

/proc/sys/fs/file-max

/proc/sys/fs/file-nr

/etc/security/limits.conf

/proc/sys/fs/file-max

Linux系統(tǒng)級別限制所有用戶進程能打開的文件描述符總數(shù)。

max-file 表示系統(tǒng)級別的能夠打開的文件句柄的數(shù)量,是對整個系統(tǒng)的限制,并不是針對用戶的。

/etc/security/limits.conf

用戶級別的限制是通過可以通過命令ulimit命令和文件/etc/security/limits.conf

/proc/sys/fs/file-nr 該參數(shù)是只讀的,不能修改。

file-nr的值由3部分組成:

1,已經(jīng)分配的文件描述符數(shù);

2,已經(jīng)分配但未使用的文件描述符數(shù);

3,內(nèi)核最大能分配的文件描述符數(shù)

/proc/${pid}/fd

眾所周知,在相應進程的/proc/$pid/fd 目錄下存放了此進程所有打開的fd。

當然有些可能不是本進程自己打開的,如通過fork()從父進程繼承而來的。

那么這個socket:后面的一串數(shù)字是什么呢?其實是該socket的inode號。

那么,知道了某個進程打開的socket的inode號后,我們可以做什么呢?

這就涉及到/proc/net/tcp(udp對應/proc/net/udp)文件了,其中也列出了相應socket的inode號通過比對此字段,我們能在/proc/net/tcp下獲得此套接口的其他信息,如對應的本地地址:端口號,遠端地址:端口號對,窗口大小,狀態(tài)等信息。

具體字段含義詳見net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函數(shù)。

如果socket創(chuàng)建了,沒有被使用,那么就只會在/proc/pid/fd下面有,而不會在/proc/net/下面有相關(guān)數(shù)據(jù)。

目錄中的每一項都是一個符號鏈接,指向打開的文件,數(shù)字則代表文件描述符。

其中0 = /dev/null ,1 = stdout, 2 = stderr,用cat或tail查看即可。

Number of file descriptors: different between /proc/sys/fs/file-nr and /proc/$pid/fd?

Linux中最大文件描述符數(shù)

How do linux file descriptor limits work?

limits.conf(5) - Linux man page

Why can't I tail -f /proc/$pid/fd/1 ?

Linux查看進程運行輸出(/proc/<pid>/fd)

Linux查看進程打開多少文件描述符命令

linux系統(tǒng)下查看進程打開文件在/proc下,對應每個進程有一個以進程號命名的目錄,該目錄下有一個fd目錄,該目錄下面的每個文件是一個符號連接,其文件名對應該進程占用的一個文件描述符,而連接指向的內(nèi)容表示文件描述符對應的實際文件,有多少個文件描述符表示該進程打開了多少文件。

另外Linux

默認的進程打開文件上限是1024個,可以通過ulimit

-n查看。很多系統(tǒng)上限可以通過修改/etc/security/limits.conf文件改變,這個文件有詳細的注釋,對如何修改做了說明。如果希望

把所有用戶的進程打開文件上限改為65536,可以加入下面兩行

* soft nofile 65535

* hard nofile 65535

還可以只真對某個用戶或某個組做修改,具體方法參見文件注釋。修改后需要重新啟動系統(tǒng)才能生效。

linux中查看進程命令ps aux和ps -ef

Linux下顯示系統(tǒng)進程的命令ps,最常用的有ps -ef 和ps aux。這兩個到底有什么區(qū)別呢?兩者沒太大差別,討論這個問題,要追溯到Unix系統(tǒng)中的兩種風格,System V風格和BSD 風格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,兩者輸出略有不同?,F(xiàn)在的大部分Linux系統(tǒng)都是可以同時使用這兩種方式的。

ps -ef 是用標準的格式顯示進程的、其格式如下:?

其中各列的內(nèi)容意思如下?

UID //用戶ID、但輸出的是用戶名?

PID //進程的ID?

PPID //父進程ID?

C //進程占用CPU的百分比?

STIME //進程啟動到現(xiàn)在的時間?

TTY //該進程在那個終端上運行,若與終端無關(guān),則顯示? 若為pts/0等,則表示由網(wǎng)絡(luò)連接主機進程。?

CMD //命令的名稱和參數(shù)

ps aux 是用BSD的格式來顯示、其格式如下:?

同ps -ef 不同的有列有?

USER //用戶名?

%CPU //進程占用的CPU百分比?

%MEM //占用內(nèi)存的百分比?

VSZ //該進程使用的虛擬內(nèi)存量(KB)?

RSS //該進程占用的固定內(nèi)存量(KB)(駐留中頁的數(shù)量)?

STAT //進程的狀態(tài)?

START //該進程被觸發(fā)啟動時間?

TIME //該進程實際使用CPU運行的時間

其中STAT狀態(tài)位常見的狀態(tài)字符有?

D //無法中斷的休眠狀態(tài)(通常 IO 的進程);?uninterruptible sleep (usually IO)不可中斷?

R //正在運行可中在隊列中可過行的;?

S //處于休眠狀態(tài);?

T //停止或被追蹤;?traced or stopped?

W //進入內(nèi)存交換 (從內(nèi)核2.6開始無效);?

X //死掉的進程 (基本很少見);?

Z //僵尸進程;??a defunct (”zombie”) process

//優(yōu)先級高的進程?

N //優(yōu)先級較低的進程?

L //有些頁被鎖進內(nèi)存;?

s //進程的領(lǐng)導者(在它之下有子進程);?

l //多線程,克隆線程(使用 CLONE_THREAD, 類似 NPTL pthreads);?

+ //位于后臺的進程組;

「圖文結(jié)合」Linux 進程、線程、文件描述符的底層原理

開發(fā)十年經(jīng)驗總結(jié),阿里架構(gòu)師的手寫Spring boot原理實踐文檔

阿里架構(gòu)師的這份:Redis核心原理與應用實踐,帶你手撕Redis

Tomcat結(jié)構(gòu)原理詳解

說到進程,恐怕面試中最常見的問題就是線程和進程的關(guān)系了,那么先說一下答案: 在 Linux 系統(tǒng)中,進程和線程幾乎沒有區(qū)別 。

Linux 中的進程其實就是一個數(shù)據(jù)結(jié)構(gòu),順帶可以理解文件描述符、重定向、管道命令的底層工作原理,最后我們從操作系統(tǒng)的角度看看為什么說線程和進程基本沒有區(qū)別。

首先,抽象地來說,我們的計算機就是這個東西:

這個大的矩形表示計算機的 內(nèi)存空間 ,其中的小矩形代表 進程 ,左下角的圓形表示 磁盤 ,右下角的圖形表示一些 輸入輸出設(shè)備 ,比如鼠標鍵盤顯示器等等。另外,注意到內(nèi)存空間被劃分為了兩塊,上半部分表示 用戶空間 ,下半部分表示 內(nèi)核空間 。

用戶空間裝著用戶進程需要使用的資源,比如你在程序代碼里開一個數(shù)組,這個數(shù)組肯定存在用戶空間;內(nèi)核空間存放內(nèi)核進程需要加載的系統(tǒng)資源,這一些資源一般是不允許用戶訪問的。但是注意有的用戶進程會共享一些內(nèi)核空間的資源,比如一些動態(tài)鏈接庫等等。

我們用 C 語言寫一個 hello 程序,編譯后得到一個可執(zhí)行文件,在命令行運行就可以打印出一句 hello world,然后程序退出。在操作系統(tǒng)層面,就是新建了一個進程,這個進程將我們編譯出來的可執(zhí)行文件讀入內(nèi)存空間,然后執(zhí)行,最后退出。

你編譯好的那個可執(zhí)行程序只是一個文件,不是進程,可執(zhí)行文件必須要載入內(nèi)存,包裝成一個進程才能真正跑起來。進程是要依靠操作系統(tǒng)創(chuàng)建的,每個進程都有它的固有屬性,比如進程號(PID)、進程狀態(tài)、打開的文件等等,進程創(chuàng)建好之后,讀入你的程序,你的程序才被系統(tǒng)執(zhí)行。

那么,操作系統(tǒng)是如何創(chuàng)建進程的呢? 對于操作系統(tǒng),進程就是一個數(shù)據(jù)結(jié)構(gòu) ,我們直接來看 Linux 的源碼:

task_struct 就是 Linux 內(nèi)核對于一個進程的描述,也可以稱為「進程描述符」。源碼比較復雜,我這里就截取了一小部分比較常見的。

我們主要聊聊 mm 指針和 files 指針。 mm 指向的是進程的虛擬內(nèi)存,也就是載入資源和可執(zhí)行文件的地方; files 指針指向一個數(shù)組,這個數(shù)組里裝著所有該進程打開的文件的指針。

先說 files ,它是一個文件指針數(shù)組。一般來說,一個進程會從 files[0] 讀取輸入,將輸出寫入 files[1] ,將錯誤信息寫入 files[2] 。

舉個例子,以我們的角度 C 語言的 printf 函數(shù)是向命令行打印字符,但是從進程的角度來看,就是向 files[1] 寫入數(shù)據(jù);同理, scanf 函數(shù)就是進程試圖從 files[0] 這個文件中讀取數(shù)據(jù)。

每個進程被創(chuàng)建時, files 的前三位被填入默認值,分別指向標準輸入流、標準輸出流、標準錯誤流。我們常說的「文件描述符」就是指這個文件指針數(shù)組的索引 ,所以程序的文件描述符默認情況下 0 是輸入,1 是輸出,2 是錯誤。

我們可以重新畫一幅圖:

對于一般的計算機,輸入流是鍵盤,輸出流是顯示器,錯誤流也是顯示器,所以現(xiàn)在這個進程和內(nèi)核連了三根線。因為硬件都是由內(nèi)核管理的,我們的進程需要通過「系統(tǒng)調(diào)用」讓內(nèi)核進程訪問硬件資源。

PS:不要忘了,Linux 中一切都被抽象成文件,設(shè)備也是文件,可以進行讀和寫。

如果我們寫的程序需要其他資源,比如打開一個文件進行讀寫,這也很簡單,進行系統(tǒng)調(diào)用,讓內(nèi)核把文件打開,這個文件就會被放到 files 的第 4 個位置,對應文件描述符 3:

明白了這個原理, 輸入重定向 就很好理解了,程序想讀取數(shù)據(jù)的時候就會去 files[0] 讀取,所以我們只要把 files[0] 指向一個文件,那么程序就會從這個文件中讀取數(shù)據(jù),而不是從鍵盤:

同理, 輸出重定向 就是把 files[1] 指向一個文件,那么程序的輸出就不會寫入到顯示器,而是寫入到這個文件中:

錯誤重定向也是一樣的,就不再贅述。

管道符其實也是異曲同工,把一個進程的輸出流和另一個進程的輸入流接起一條「管道」,數(shù)據(jù)就在其中傳遞,不得不說這種設(shè)計思想真的很巧妙:

到這里,你可能也看出「Linux 中一切皆文件」設(shè)計思路的高明了,不管是設(shè)備、另一個進程、socket 套接字還是真正的文件,全部都可以讀寫,統(tǒng)一裝進一個簡單的 files 數(shù)組,進程通過簡單的文件描述符訪問相應資源,具體細節(jié)交于操作系統(tǒng),有效解耦,優(yōu)美高效。

首先要明確的是,多進程和多線程都是并發(fā),都可以提高處理器的利用效率,所以現(xiàn)在的關(guān)鍵是,多線程和多進程有啥區(qū)別。

為什么說 Linux 中線程和進程基本沒有區(qū)別呢,因為從 Linux 內(nèi)核的角度來看,并沒有把線程和進程區(qū)別對待。

我們知道系統(tǒng)調(diào)用 fork() 可以新建一個子進程,函數(shù) pthread() 可以新建一個線程。 但無論線程還是進程,都是用 task_struct 結(jié)構(gòu)表示的,唯一的區(qū)別就是共享的數(shù)據(jù)區(qū)域不同 。

換句話說,線程看起來跟進程沒有區(qū)別,只是線程的某些數(shù)據(jù)區(qū)域和其父進程是共享的,而子進程是拷貝副本,而不是共享。就比如說, mm 結(jié)構(gòu)和 files 結(jié)構(gòu)在線程中都是共享的,我畫兩張圖你就明白了:

所以說,我們的多線程程序要利用鎖機制,避免多個線程同時往同一區(qū)域?qū)懭霐?shù)據(jù),否則可能造成數(shù)據(jù)錯亂。

那么你可能問, 既然進程和線程差不多,而且多進程數(shù)據(jù)不共享,即不存在數(shù)據(jù)錯亂的問題,為什么多線程的使用比多進程普遍得多呢 ?

因為現(xiàn)實中數(shù)據(jù)共享的并發(fā)更普遍呀,比如十個人同時從一個賬戶取十元,我們希望的是這個共享賬戶的余額正確減少一百元,而不是希望每人獲得一個賬戶的拷貝,每個拷貝賬戶減少十元。

當然,必須要說明的是, 只有 Linux 系統(tǒng)將線程看做共享數(shù)據(jù)的進程 ,不對其做特殊看待 ,其他的很多操作系統(tǒng)是對線程和進程區(qū)別對待的,線程有其特有的數(shù)據(jù)結(jié)構(gòu),我個人認為不如 Linux 的這種設(shè)計簡潔,增加了系統(tǒng)的復雜度。

在 Linux 中新建線程和進程的效率都是很高的,對于新建進程時內(nèi)存區(qū)域拷貝的問題,Linux 采用了 copy-on-write 的策略優(yōu)化,也就是并不真正復制父進程的內(nèi)存空間,而是等到需要寫操作時才去復制。 所以 Linux 中新建進程和新建線程都是很迅速的 。


當前標題:linux進程描述符命令,linux進程符號表
當前鏈接:http://weahome.cn/article/heioci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部