linux線程狀態
『壹』 linux下怎麼查看線程的運行情況
1、 cat /proc/${pid}/status 2、pstree -p ${pid} 3、top -p ${pid} 再按H 或者直接輸入 top -bH -d 3 -p ${pid} top -H 手冊中說:-H : Threads toggle 加上這個選項啟動top,top一行顯示一個線程
『貳』 linux 怎麼查看 線程狀態
linux和windows不一樣,好像沒有真正意義上的線程吧,應該是進程模擬的
用這個命令可以看: ps -ef f
『叄』 linux中的線程有哪幾種狀態
就緒:線程分配了CPU以外的全部資源,等待獲得CPU調度
執行:線程獲得CPU,正在執行
阻塞:線程由於發生I/O或者其他的操作導致無法繼續執行,就放棄處理機,轉入線程就緒隊列
掛起:由於終端請求,操作系統的要求等原因,導致掛起。
『肆』 Linux線程的幾種結束方式
Linux線程的幾種結束方式
Linux創建線程使用
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg)
1
2
Linux線程的幾種結束方式:
調用pthread_exit(exit_code),exit_code為線程退出的狀態代碼。同一進程下的其他線程可以通過pthread_join(exit_code)來使用。
函數start_routine使用return返回,與調用pthread_exit()作用相同。
線程被取消pthread_cancel()。
同一進程中的其他線程調用了exit(),,或者主線程從main函數返回。
『伍』 進程和線程的區別和linux運行狀態查看簡單
要了解二者的區別與聯系,首先得對進程與線程有一個宏觀上的了解。
進程,是並發執行的程序在執行過程中分配和管理資源的基本單位,是一個動態概念,竟爭計算機系統資源的基本單位。每一個進程都有一個自己的地址空間,即進程空間或(虛空間)。進程空間的大小 只與處理機的位數有關,一個 16 位長處理機的進程空間大小為 216 ,而 32 位處理機的進程空間大小為 232 。進程至少有 5 種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。
線程,在網路或多用戶環境下,一個伺服器通常需要接收大量且不確定數量用戶的並發請求,為每一個請求都創建一個進程顯然是行不通的,——無論是從系統資源開銷方面或是響應用戶請求的效率方面來看。因此,操作系統中線程的概念便被引進了。線程,是進程的一部分,一個沒有線程的進程可以被看作是單線程的。線程有時又被稱為輕權進程或輕量級進程,也是 CPU 調度的一個基本單位。
說到這里,我們對進程與線程都有了一個大體上的印象,現在開始說說二者大致的區別。
進程的執行過程是線狀的,盡管中間會發生中斷或暫停,但該進程所擁有的資源只為該線狀執行過程服務。一旦發生進程上下文切換,這些資源都是要被保護起來的。這是進程宏觀上的執行過程。而進程又可有單線程進程與多線程進程兩種。我們知道,進程有 一個進程式控制制塊 PCB ,相關程序段 和 該程序段對其進行操作的數據結構集 這三部分,單線程進程的執行過程在宏觀上是線性的,微觀上也只有單一的執行過程;而多線程進程在宏觀上的執行過程同樣為線性的,但微觀上卻可以有多個執行操作(線程),如不同代碼片段以及相關的數據結構集。線程的改變只代表了 CPU 執行過程的改變,而沒有發生進程所擁有的資源變化。出了 CPU 之外,計算機內的軟硬體資源的分配與線程無關,線程只能共享它所屬進程的資源。與進程式控制製表和 PCB 相似,每個線程也有自己的線程式控制製表 TCB ,而這個 TCB 中所保存的線程狀態信息則要比 PCB 表少得多,這些信息主要是相關指針用堆棧(系統棧和用戶棧),寄存器中的狀態數據。進程擁有一個完整的虛擬地址空間,不依賴於線程而獨立存在;反之,線程是進程的一部分,沒有自己的地址空間,與進程內的其他線程一起共享分配給該進程的所有資源。
線程可以有效地提高系統的執行效率,但並不是在所有計算機系統中都是適用的,如某些很少做進程調度和切換的實時系統。使用線程的好處是有多個任務需要處理機處理時,減少處理機的切換時間;而且,線程的創建和結束所需要的系統開銷也比進程的創建和結束要小得多。最適用使用線程的系統是多處理機系統和網路系統或分布式系統。
———————————-
1. 線程的執行特性。
線程只有 3 個基本狀態:就緒,執行,阻塞。
線程存在 5 種基本操作來切換線程的狀態:派生,阻塞,激活,調度,結束。
2. 進程通信。
單機系統中進程通信有 4 種形式:主從式,會話式,消息或郵箱機制,共享存儲區方式。
主從式典型例子:終端控制進程和終端進程。
會話式典型例子:用戶進程與磁碟管理進程之間的通信。
———————————-
參考書籍:計算機操作系統教程(第 3 版)清華大學出版社張堯學 史美林 張高
在java編程中就經常用到進程和線程的概念。
1、線程:程序中單獨順序的控制流
線程本身依靠進程運行,不能獨立存在,線程是進程中的順序控制流,只能使用系統分配給進程的資源和環境,線程沒有獨立的地址空間。
2、進程:執行中的程序
系統會為每個進程創建一個PID,一個進程可以包含一個或多個線程,一個進程至少包含一個線程,每個線程也會有自己的ID,但是這只是在它所屬的進程之內,不屬於系統ID。
3、單線程:程序中只存在一個線程,實際上函數運行的主方法就是一個主線程
4、多線程:就是在一個進程中運行多個任務,多線程的目的是為了更好地使用CPU資源。
前台和後台
我們這里也要注意前台和後台的區別,前台一般就是我們能夠看到的正在執行的程序,一般系統的很多服務都是以後台的形式存在,也就是我們看不到它們在執行,但是它們一般都會常駐在系統中,直到關機才會結束。
linux中查看進程的ps和top
ps指令主要是用來查看目前系統中,有哪些進程正在執行,以及他們執行的狀況。
ps -a 顯示當前終端的所有進程信息
ps -u 以用戶的格式顯示進程信息
ps -x 顯示後台進程運行的參數123
可以根據進程的PID來終止進程
kill 進程PIDkill -9 進程PID //強制終止進程12
此外可以使用killall命令以名字的方式來殺死進程
進程動態監控top
1、監視特定用戶
先執行top命令,再輸入u,之後再輸入需要監視的用戶,然後回車即可,你將會看到顯示的進程都是你所指定的用戶正在運行的程序
2、殺死特定進程
先執行top命令,再輸入k,再輸入你要殺死的進程ID,然後回車即可。
3、指定動態刷新時間
top -d 10 //指定系統更新進程的時間為10秒1
PS:我們從top顯示的內容可以獲取一些有用的信息,其中zombie代表的是僵屍進程,即計算機無法回收內存的進程,Load average顯示的是當前計算機負載情況,當這些值很高的時候說明計算機CPU佔用率很高,需要注意。還有顯示了計算機存儲空間的使用情況。其中PID=1的進程是系統初始運行的總進程,很多進程都是由它開啟的,這是一個特別重要的進程。
監控網路狀態信息
顯示網路統計信息的命令netstat,此命令用來顯示整個系統目前的網路情況,例如目前的鏈接,數據包傳遞數據或是路由表內容。
netstat -an //按一定順序排列netstat -anp //加上p就會顯示進程號和相關程序12
顯示數據包經歷歷程命令
traceroute 域名或者IP1
特別要注意在windows下面該命令是tracert
route命令用於顯示和操作IP路由表
『陸』 Linux裡面什麼是mp線程
線程mp是非常有用的診斷java應用問題的工具,每一個java虛擬機都有及時生成顯示所有線程在某一點狀態的線程mp能力。雖然每個java虛擬機線程mp列印輸出格式上略微有一些不同,但是線程mp的信息包含線程基本信息、線程的運行狀態、標識、調用的堆棧;調用的堆棧包含完整的類名,所執行的方法,如果可能的話還有源代碼的行數。
『柒』 什麼是進程什麼是線程linux系統中的進程有哪些狀態如何獲取系統中各進程的
進程線程都是操作系統的調度單位,有自己的數據結構。線程是比進程更小的調度單位,進程里可以有多個線程。進程間獨占堆棧空間,同一進程內的多個線程可以共享堆空間。
『捌』 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裡面線程的知識嗎
.線程的基本介紹
(1)線程的概述
線程與進程類似,也允許應用程序並發執行多個任務的一種機制。一個進程可以包含多個線程,同一程序中的所有線程共享同一份全局內存區域,線程之間沒有真正意義的等級之分。同一個進程中的線程可以並發執行,如果處理器是多核的話線程也可以並行執行,如果一個線程因為等待I/O操作而阻塞,那麼其他線程依然可以繼續運行
(2)線程優於進程的方面
argv,environ
主線程棧
線程3的棧
線程2的棧
線程1的棧
共享函數庫共享的內存
堆
未初始化的數據段
初始化數據段
文本
.進程間的信息難以共享。由於除去只讀代碼段外,父子進程並未共享內存,因此必須採用一些進程間通訊,在進程之間交換信息
.調用fork()來創建進程代價相對較高
線程很好的解決了上述倆個問題
.線程之間能夠方便,快速的共享信息,只需將數據復制到共享(全局或堆)變數中即可
.創建線程比創建線程通常要快10甚至更多,線程創建之所以快,是因為fork創建進程時所需復制多個屬性,而在線程中,這些屬性是共享的。
(3)創建線程
啟動程序時,產生的進程只有單條線程,我們稱之為主線程
#include<pthread.h>
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start)(void *),void *arg);12
新線程通過調用帶有arg的函數開始執行,調用pthread_create()的線程會繼續執行該調用之後的語句。
(4)終止線程
可以以如下方式終止線程的運行
.線程調用pthread_exit()
.線程start函數執行return語句並返回指定值
.調用pthread_cancel()取消線程
.任意線程調用了exit(),或者主線程執行了return語句,都會導致進程中的所有線程立即終止
pthread_exit()函數可以終止線程,且其返回值可由另一線程通過調用pthread_join()獲得
#include<pthread.h>void pthread_exit(void *retval);12
調用pthread_exit()相當於在線程的start函數中執行return,不同之處在於,pthread_exit()可以在任何地方調用,參數retval指定了線程的返回值
(5)獲取線程ID
#include<pthread.h>pthread_t pthread_self(void);12
線程ID在應用程序中主要有如下用途
.不同的pthreads函數利用線程ID來標識要操作目標線程。
.在具體的應用程序中,以特定線程的線程ID作為動態數據結構的標簽,這頗有用處,既可用來識別某個數據結構的創建者或屬主線程,又可確定隨後對該數據結構執行操作的具體線程
函數pthread_equal()可檢查倆個線程的ID是否相同
#include<pthread.h>int pthread_equal(pthread_t t1,pthread_t t2);//如果相同返回非0值,否則返回0123
(6)連接已終止的線程
函數pthread_join()等待由thread表識的線程終止
#include<pthread.h>int pthread_join(pthread_t thread,void **retval);//返回0調用成功,否則失敗123
如果pthread_join()傳入一個之前已然連接過的線程ID,將會導致無法預知的行為,當相同線程ID在參與一次連接後恰好為另一新建線程所重用,再度連接的可能就是這個新線程
若線程未分離,則就應該使用pthread_join()來連接線程,否則會產生僵屍線程
pthrea_join()函數的要點
.線程之間的關系是對等的,所以任意線程都可以調用pthread_join()來連接其他線程
.pthread_join()無法針對任意線程,只能連接單個線程
(6)線程的分離
默認情況下線程都是可連接的,但有時候,我們並不關心線程退出的狀態,我們可以調用pthread_detach()並向thread參數傳入指定線程的的標識符,將該線程標記為處於分離狀態
#include<pthread.h>int pthread_detach(pthread_t thread);//返回0成功,否則失敗123
一旦線程處於分離狀態,就不能在使用pthread_join()來獲取其狀態,也無法使其重返可連接狀態
(7)在應用程序中如何來選擇進程還是線程
.線程之間共享數據很簡單,進程間的數據共享需要更多的投入
.創建線程要比創建進程塊很多
.多線程編程時,需要確保調用線程安全的函數
.某個線程中的bug可能會危害進程中所有線程
.每個線程都在徵用宿主進程中有限的虛擬地址空間
.在多線程應用中,需要小心使用信號
.除了數據,線程還可以共享文件描述符,信號處置,當前工作目錄,以及用戶ID和組ID
線程的同步
(1)保護共享變數訪問:互斥量
線程的主要優勢在於能夠通過全局變數來共享信息,不過這種共享是有代價的。必須確保多個線程修改同一變數時,不會有其他線程也正在修改此變數,為避免線程更新時共享變數時所出現的問題,必須使用互斥量來確保同時僅有一個線程可以訪問某項共享資源
(2)靜態分配的互斥鎖
互斥鎖既可以像靜態變數那樣分配,也可以在運行時動態分配,互斥量屬於pthread_mutex_t類型的變數,在使用之前必須對其初始化。對於靜態分配的互斥量而言,可如下例所示,將PTHREAD_MUTEX_INITIALIZER賦給互斥量
pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER;1
1.加鎖和解鎖互斥量
初始化之後,互斥量處於未鎖定狀態。函數pthread_mutex_lock()可以鎖定某一互斥量
而函數pthread_mutex_unlock()則可以將一個互斥量解鎖
#include<pthread.h>int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_unlock(pthread_mutex_t *mutex);//返回0成功,其他失敗1234
要鎖定互斥量,在調用pthread_mutex_lock()時需要指定互斥量,如果互斥量當前處於未鎖定狀態,則該調用將會立即返回,如果該互斥量已被其他線程鎖定,那麼該調用將會阻塞,直至互斥量被解鎖
函數pthread_mutex_unlock()將解鎖之前已遭調用線程鎖定的互斥量
2.互斥量的性能
通常情況下,線程會花費更多的時間去做其他工作,對互斥量的加鎖解鎖相對要少的多,因此使用互斥量對大部分程序來說性能並無顯著的影響
3.互斥量的死鎖
當一個線程需要同時訪問多個共享資源時,沒個資源由不同的互斥索管理。當超過一個線程加鎖同一組互斥量時,就有可能發生死鎖。如下圖所示
線程A
1.pthread_mutex_lock(mutex1);
2.pthread_mutex_lock(mutex2);
線程2
1.pthread_mutex_lock(mutex2);
2.pthread_mutex_lock(mutex1);
每個線程都成功的鎖住一個互斥量,接著試圖對以為另一線程鎖定的互斥量加鎖,就會一直等下去
要避免此類死鎖問題,最簡單的就是定義互斥量的層級關系
『拾』 linux 怎麼查看一個進程的所有線程
1。 使用top命令,具體用法是 top -H加上這個選項,top的每一行就不是顯示一個進程,而是一個線程。
2。 使用ps命令,具體用法是 ps -xH
這樣可以查看所有存在的線程,也可以使用grep作進一步的過濾。
3。 使用ps命令,具體用法是 ps -mq PID
這樣可以看到指定的進程產生的線程數目。
更進一步,其實一些系統監控工具,在本質上也是讀取的系統產生的文件罷了。比如說進程這個事情,
看看這個目錄吧,/proc/5000/ 這裡面有你所有想要的。其實stat代表著當前的一些信息。
使用ps命令來查看進程的時候,進程狀態分別對應的含義如下:
D 不可中斷睡眠 (通常是在IO操作) 收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生
R 正在運行或可運行(在運行隊列排隊中)
S 可中斷睡眠 (休眠中, 受阻, 在等待某個條件的形成或接受到信號)
T 已停止的 進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停止運行
W 正在換頁(2.6.內核之前有效)
X 死進程 (未開啟)
Z 僵屍進程 進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放BSD風格的
< 高優先順序(not nice to other users)
N 低優先順序(nice to other users)
L 頁面鎖定在內存(實時和定製的IO)
s 一個信息頭
l 多線程(使用 CLONE_THREAD,像NPTL的pthreads的那樣)
+ 在前台進程組