導航:首頁 > 程序命令 > linux命令線程

linux命令線程

發布時間:2022-09-23 20:11:04

1. linux線程數怎麼看

1.使用命令查看Linux進程的線程數 1、使用top命令,具體用法是 top -H 加上這個選項,top的每一行就不是顯示一個進程,而是一個線程。 2、使用ps命令,具體用法是 ps -xH 這樣可以查看所有...
2.Linux系統工具查看Linux進程 看看這個目錄吧,/proc/5000/ 這裡面有你所有想要的。其實stat代表著當前的一些信息。 使用ps命令來查看進程的時候,進程狀態分別對應的含義如下: D 不可中斷...

2. linux查看線程優先順序命令

用top或者ps -l查看進程會發現有PR(PRI) NI兩個欄位:

NI 是優先值,是用戶層面的概念, PR是進程的實際優先順序, 是給內核(kernel)看(用)的。
一般情況下,PR=NI+20, 如果一個進程的優先順序PR是20, 那麼它的NI(nice)值就是20-20=0。
進程調度優先順序是從-20到19,一共40個級別,數字越大,表示進程的優先順序越低。默認時候,進程的優先順序是0。查看進程優先順序有兩個辦法:ps和top。top命令顯示的NI列的值。或者可以使用ps -efl來查看,也是在ni列表示了進程的優先順序。《Linux就該這么學》 一起學習,進程的優先順序可以在程序運行的時候設置,也可以在程序運行過程中動態的修改。

3. Linux中進程和線程的區別詳解

進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變數,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的並發操作,只能用線程,不能用進程。
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。
線程的劃分尺度小於進程,使得多線程程序的並發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的,每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

4. linux如何進行線程管理

方法一:PS
在ps命令中,「-T」選項可以開啟線程查看。下面的命令列出了由進程號為<pid>的進程創建的所有線程。
1.$ ps -T -p <pid>

「SID」欄表示線程ID,而「CMD」欄則顯示了線程名稱。

方法二: Top
top命令可以實時顯示各個線程情況。要在top輸出中開啟線程查看,請調用top命令的「-H」選項,該選項會列出所有Linux線程。在top運行時,你也可以通過按「H」鍵將線程查看模式切換為開或關。
1.$ top -H

要讓top輸出某個特定進程<pid>並檢查該進程內運行的線程狀況:
$ top -H -p <pid>

5. Linux - 進程間通信與線程通信方式

每個進程的用戶地址空間都是獨立的,一般而言是不能互相訪問的,但內核空間是每個進程都共享的,所以進程之間要通信必須通過內核。

上面命令行里的「|」豎線就是一個管道,它的功能是將前一個命令(ps auxf)的輸出,作為後一個命令(grep mysql)的輸入,從這功能描述,可以看出管道傳輸數據是單向的,如果想相互通信,我們需要創建兩個管道才行。

同時,我們得知上面這種管道是沒有名字,所以「|」表示的管道稱為匿名管道,用完了就銷毀。

管道還有另外一個類型是命名管道,也被叫做 FIFO,因為數據是先進先出的傳輸方式。

在使用命名管道前,先需要通過 mkfifo 命令來創建,並且指定管道名字

myPipe 就是這個管道的名稱,基於 Linux 一切皆文件的理念,所以管道也是以文件的方式存在,我們可以用 ls 看一下,這個文件的類型是 p,也就是 pipe(管道) 的意思:

你操作了後,你會發現命令執行後就停在這了,這是因為管道里的內容沒有被讀取,只有當管道里的數據被讀完後,命令才可以正常退出。

於是,我們執行另外一個命令來讀取這個管道里的數據:

可以看到,管道里的內容被讀取出來了,並列印在了終端上,另外一方面,echo 那個命令也正常退出了。

我們可以看出,管道這種通信方式效率低,不適合進程間頻繁地交換數據。當然,它的好處,自然就是簡單,同時也我們很容易得知管道里的數據已經被另一個進程讀取了。

前面說到管道的通信方式是效率低的,因此管道不適合進程間頻繁地交換數據。

對於這個問題,消息隊列的通信模式就可以解決。比如,A 進程要給 B 進程發送消息,A 進程把數據放在對應的消息隊列後就可以正常返回了,B 進程需要的時候再去讀取數據就可以了。同理,B 進程要給 A 進程發送消息也是如此。

再來,消息隊列是保存在內核中的消息鏈表,在發送數據時,會分成一個一個獨立的數據單元,也就是消息體(數據塊),消息體是用戶自定義的數據類型,消息的發送方和接收方要約定好消息體的數據類型,所以每個消息體都是固定大小的存儲塊,不像管道是無格式的位元組流數據。如果進程從消息隊列中讀取了消息體,內核就會把這個消息體刪除。

消息隊列生命周期隨內核,如果沒有釋放消息隊列或者沒有關閉操作系統,消息隊列會一直存在,而前面提到的匿名管道的生命周期,是隨進程的創建而建立,隨進程的結束而銷毀。

消息這種模型,兩個進程之間的通信就像平時發郵件一樣,你來一封,我回一封,可以頻繁溝通了。

但郵件的通信方式存在不足的地方有兩點,一是通信不及時,二是附件也有大小限制,這同樣也是消息隊列通信不足的點。

消息隊列不適合比較大數據的傳輸,因為在內核中每個消息體都有一個最大長度的限制,同時所有隊列所包含的全部消息體的總長度也是有上限。在 Linux 內核中,會有兩個宏定義 MSGMAX 和 MSGMNB,它們以位元組為單位,分別定義了一條消息的最大長度和一個隊列的最大長度。

消息隊列通信過程中,存在用戶態與內核態之間的數據拷貝開銷,因為進程寫入數據到內核中的消息隊列時,會發生從用戶態拷貝數據到內核態的過程,同理另一進程讀取內核中的消息數據時,會發生從內核態拷貝數據到用戶態的過程。

消息隊列的讀取和寫入的過程,都會有發生用戶態與內核態之間的消息拷貝過程。那共享內存的方式,就很好的解決了這一問題。

現代操作系統,對於內存管理,採用的是虛擬內存技術,也就是每個進程都有自己獨立的虛擬內存空間,不同進程的虛擬內存映射到不同的物理內存中。所以,即使進程 A 和 進程 B 的虛擬地址是一樣的,其實訪問的是不同的物理內存地址,對於數據的增刪查改互不影響。

用了共享內存通信方式,帶來新的問題,那就是如果多個進程同時修改同一個共享內存,很有可能就沖突了。例如兩個進程都同時寫一個地址,那先寫的那個進程會發現內容被別人覆蓋了。

為了防止多進程競爭共享資源,而造成的數據錯亂,所以需要保護機制,使得共享的資源,在任意時刻只能被一個進程訪問。正好,信號量就實現了這一保護機制。

信號量其實是一個整型的計數器,主要用於實現進程間的互斥與同步,而不是用於緩存進程間通信的數據。

信號量表示資源的數量,控制信號量的方式有兩種原子操作:

P 操作是用在進入共享資源之前,V 操作是用在離開共享資源之後,這兩個操作是必須成對出現的。

接下來,舉個例子,如果要使得兩個進程互斥訪問共享內存,我們可以初始化信號量為 1。

具體的過程如下:

可以發現,信號初始化為 1,就代表著是互斥信號量,它可以保證共享內存在任何時刻只有一個進程在訪問,這就很好的保護了共享內存。

另外,在多進程里,每個進程並不一定是順序執行的,它們基本是以各自獨立的、不可預知的速度向前推進,但有時候我們又希望多個進程能密切合作,以實現一個共同的任務。

例如,進程 A 是負責生產數據,而進程 B 是負責讀取數據,這兩個進程是相互合作、相互依賴的,進程 A 必須先生產了數據,進程 B 才能讀取到數據,所以執行是有前後順序的。

那麼這時候,就可以用信號量來實現多進程同步的方式,我們可以初始化信號量為 0。

具體過程:

可以發現,信號初始化為 0,就代表著是同步信號量,它可以保證進程 A 應在進程 B 之前執行。

跨機器進程間通信方式

同個進程下的線程之間都是共享進程的資源,只要是共享變數都可以做到線程間通信,比如全局變數,所以對於線程間關注的不是通信方式,而是關注多線程競爭共享資源的問題,信號量也同樣可以在線程間實現互斥與同步:

6. linux下的命令都是干什麼用的

前三個和最後一個是兩個類型。前三個主要是Linux用來創建新的進程(線程)而設計的,exec()系列函數則是用來用指定的程序替換當前進程的所有內容。所以exec()系列函數經常在前三個函數使用之後調用,來創建一個全新的程序運行環境。Linux用init進程啟動其他進程的過程一般都是這樣的。
下面說fork、vfork和clone三個函數。這三個函數分別調用了sys_fork、sys_vfork、sys_clone,最終都調用了do_fork函數,差別在於參數的傳遞和一些基本的准備工作不同。可見這三者最終達到的最本質的目的都是創建一個新的進程。在這里需要明確一下,Linux內核中沒有獨立的「線程」結構,Linux的線程就是輕量級進程,換言之基本控制結構和Linux的進程是一樣的(都是通過struct task_struct管理)。
fork是最簡單的調用,不需要任何參數,僅僅是在創建一個子進程並為其創建一個獨立於父進程的空間。fork使用COW(寫時拷貝)機制,並且COW了父進程的棧空間。
vfork是一個過時的應用,vfork也是創建一個子進程,但是子進程共享父進程的空間。在vfork創建子進程之後,父進程阻塞,直到子進程執行了exec()或者exit()。vfork最初是因為fork沒有實現COW機制,而很多情況下fork之後會緊接著exec,而exec的執行相當於之前fork復制的空間全部變成了無用功,所以設計了vfork。而現在fork使用了COW機制,唯一的代價僅僅是復制父進程頁表的代價,所以vfork不應該出現在新的代碼之中。在Linux的manpage中隊vfork有這樣一段話:It is rather unfortunate that Linux revived this specter from the past. The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are implemented. Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."
clone是Linux為創建線程設計的(雖然也可以用clone創建進程)。所以可以說clone是fork的升級版本,不僅可以創建進程或者線程,還可以指定創建新的命名空間(namespace)、有選擇的繼承父進程的內存、甚至可以將創建出來的進程變成父進程的兄弟進程等等。clone和fork的調用方式也很不相同,clone調用需要傳入一個函數,該函數在子進程中執行。此外,clone和fork最大不同在於clone不再復制父進程的棧空間,而是自己創建一個新的。
關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html

7. linux進程、線程及調度演算法(三)

調度策略值得是大家都在ready時,並且CPU已經被調度時,決定誰來運行,誰來被調度。

兩者之間有一定矛盾。
響應的優化,意味著高優先順序會搶占優先順序,會花時間在上下文切換,會影響吞吐。
上下文切換的時間是很短的,幾微妙就能搞定。上下文切換本身對吞吐並多大影響, 重要的是,切換後引起的cpu 的 cache miss.
每次切換APP, 數據都要重新load一次。
Linux 會盡可能的在響應與吞吐之間尋找平衡。比如在編譯linux的時候,會讓你選擇 kernal features -> Preemption model.
搶占模型會影響linux的調度演算法。

所以 ARM 的架構都是big+LITTLE, 一個很猛CPU+ 多個 性能較差的 CPU, 那麼可以把I/O型任務的調度 放在 LITTLE CPU上。需要計算的放在big上。

早期2.6 內核將優先順序劃分了 0-139 bit的優先順序。數值越低,優先順序越高。0-99優先順序 都是 RT(即時響應)的 ,100-139都是非RT的,即normal。
調度的時候 看哪個bitmap 中的 優先順序上有任務ready。可能多個任務哦。

在普通優先順序線程調度中,高優先順序並不代表對低優先順序的絕對優勢。會在不同優先順序進行輪轉。
100 就是比101高,101也會比102高,但100 不會堵著101。
眾屌絲進程在輪轉時,優先順序高的:

初始設置nice值為0,linux 會探測 你是喜歡睡眠,還是幹活。越喜歡睡,linux 越獎勵你,優先順序上升(nice值減少)。越喜歡幹活,優先順序下降(nice值增加)。所以一個進程在linux中,干著干著 優先順序越低,睡著睡著 優先順序越高。

後期linux補丁中

紅黑樹,數據結構, 左邊節點小於右邊節點
同時兼顧了 CPU/IO 和 nice。
數值代表著 進程運行到目前為止的virtual runtime 時間。

(pyhsical runtime) / weight * 1024(系數)。
優先調度 節點值(vruntime)最小的線程。權重weight 其實有nice 來控制。

一個線程一旦被調度到,則物理運行時間增加,vruntime增加,往左邊走。
weight的增加,也導致vruntime減小,往右邊走。
總之 CFS讓線程 從左滾到右,從右滾到左。即照顧了I/O(喜歡睡,分子小) 也 照顧了 nice值低(分母高).所以 由喜歡睡,nice值又低的線程,最容易被調度到。
自動調整,無需向nice一樣做出獎勵懲罰動作,個人理解權重其實相當於nice

但是 此時 來一個 0-99的線程,進行RT調度,都可以瞬間秒殺你!因為人家不是普通的,是RT的!

一個多線程的進程中,每個線程的調度的策略 如 fifo rr normal, 都可以不同。每一個的優先順序都可以不一樣。
實驗舉例, 創建2個線程,同時開2個:

運行2次,創建兩個進程
sudo renice -n -5(nice -5級別) -g(global), 會明顯看到 一個進程的CPU佔用率是另一個的 3倍。

為什麼cpu都已經達到200%,為什麼系統不覺得卡呢?因為,我們的線程在未設置優先順序時,是normal調度模式,且是 CPU消耗型 調度級別其實不高。

利用chrt工具,可以將進程 調整為 50 從normal的調度策略 升為RT (fifo)級別的調度策略,會出現:

chrt , nice renice 的調度策略 都是以線程為單位的,以上 設置的將進程下的所有線程進行設置nice值
線程是調度單位,進程不是,進程是資源封裝單位!

兩個同樣死循環的normal優先順序線程,其中一個nice值降低,該線程的CPU 利用率就會比另一個CPU的利用率高。

8. linux怎麼查看線程cpu

可以用下面的命令將 cpu 佔用率高的線程找出來:
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu

這個命令首先指定參數'H',顯示線程相關的信息,格式輸出中包含:user,pid,ppid,tid,time,%cpu,cmd,然後再用%cpu欄位進行排序。這樣就可以找到佔用處理器的線程了。

直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 獲取對於的進程號和線程號,然後跳轉到3.
查看哪個進程線程佔用cpu過高; top / ps -aux, 獲得進程號
確定哪個線程佔用cpu過高,進入進程號的目錄:/proc/pid/task,
執行:grep SleepAVG **/status | sort -k2,2 | head, 確定cpu佔用較高的線程號。
使用kill -3 pid 會列印線程堆棧的情況

在 Linux 下 top 工具可以顯示 cpu 的平均利用率(user,nice,system,idle,iowait,irq,softirq,etc.),可以顯示每個 cpu 的利用率。但是無法顯示每個線程的 cpu 利用率情況,這時就可能出現這種情況,總的 cpu 利用率中 user 或 system 很高,但是用進程的 cpu 佔用率進行排序時,沒有進程的 user 或 system 與之對應。

9. linux怎麼查看線程阻塞原因

linux查看線程阻塞原因:pthread_join一般主線程來調用,用來等待子線程退出,因為是等待,所以是阻塞的,一般主線程會依次join所有它創建的子線程。

1)執行top命令,或使用-H選項(顯示所有線程),找到相關的高CPU的PID。

2)生成thread mp 快照(kill -3 PID)。

3)將top命令輸出PID轉換為HEX格式(16進制)。

4)在thread mp data中搜索nid=<Hex PID>。

5)分析受影響的thread和stack trace,精確定位代碼。

特點:

Linux,全稱GNU/Linux,是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX的多用戶、多任務、支持多線程和多CPU的操作系統。伴隨著互聯網的發展,Linux得到了來自全世界軟體愛好者、組織、公司的支持。

它除了在伺服器方面保持著強勁的發展勢頭以外,在個人電腦、嵌入式系統上都有著長足的進步。使用者不僅可以直觀地獲取該操作系統的實現機制,而且可以根據自身的需要來修改完善Linux,使其最大化地適應用戶的需要。

Linux不僅系統性能穩定,而且是開源軟體。其核心防火牆組件性能高效、配置簡單,保證了系統的安全。在很多企業網路中,為了追求速度和安全,Linux不僅僅是被網路運維人員當作伺服器使用,甚至當作網路防火牆,這是Linux的一大亮點。

Linux具有開放源碼、沒有版權、技術社區用戶多等特點,開放源碼使得用戶可以自由裁剪,靈活性高,功能強大,成本低。尤其系統中內嵌網路協議棧,經過適當的配置就可實現路由器的功能。這些特點使得Linux成為開發路由交換設備的理想開發平台。

閱讀全文

與linux命令線程相關的資料

熱點內容
日本影視網站 瀏覽:932
伺服器點亮埠以後有什麼特徵 瀏覽:980
51單片機定時器pwm 瀏覽:685
民國修真 瀏覽:386
php數組作為參數傳遞 瀏覽:991
運行命令查ip 瀏覽:202
漲奶吃奶小說 瀏覽:340
股票十大戰法主圖指標源碼 瀏覽:702
查看網路的命令是什麼意思 瀏覽:589
《鬼吹燈》1-8全本txt 瀏覽:336
python繪圖兩個圓代碼 瀏覽:607
python中end的用法 瀏覽:682
大概率30選股源碼 瀏覽:206
阿里雲伺服器如何鏡像 瀏覽:161
能看的 瀏覽:403
京東伺服器為什麼會崩 瀏覽:836
php超類 瀏覽:822
怎麼在美團APP上請假 瀏覽:100
午夜激情影院 瀏覽:242
歐拉app怎麼下訂單 瀏覽:422