當前位置:首頁 » 操作系統 » linux進程線程區別

linux進程線程區別

發布時間: 2024-10-22 05:01:44

linux裡面,進程與線程到底有什麼本質的區別

線程:是進程中執行的一條路徑,是系統調度的最小單位。

進程:是正在運行的程序,是系統分配資源的最小單位。

線程與進程關系

1.一個進程可以有多個線程,一個線程只能屬於一個進程。

2.同一個進程下的所有線程共享該進程下的所有資源。

3.真正在處理機上運行的是線程,不是進程,線程是進程內的一個執行單元,是進程內的可調度實體。

Linux線程與進程區別

進程:

優點:多進程可以同時利用多個CPU,能夠同時進行多個操作。

缺點:耗費資源(創建一個進程重新開辟內存空間)。

進程不是越多越好,一般進程個數等於cpu個數。

線程:

優點:共享內存,尤其是進行IO操作(網路、磁碟)的時候(IO操作很少用cpu),可以使用多線程執行並發操作。

缺點:搶占資源。

② 在windows中的進程、線程和在linux中的進程、線程有什麼區別

對於windows來說,進程和線程的概念都是有著明確定義的,進程的概念對應於一個程序的運行實例(instance),而線程則是程序代碼執行的最小單元。CreateThread()用於建立一個新的線程,傳遞線程函數的入口地址和調用參數給新建的線程,然後新線程就開始執行了。

windows下,一個典型的線程擁有自己的堆棧、寄存器(包括程序計數器PC,用於指向下一條應該執行的指令在內存中的位置),而代碼段、數據段、打開文件這些進程級資源是同一進程內多個線程所共享的。因此同一進程的不同線程可以很方便的通過全局變數(數據段)進行通信,大家都可以對數據段進行讀寫,這很方便,也被在安全性方面詬病,因為它要求程序員時刻意識到這些數據不是線程獨立的。

對於linux來說,則沒有很明確的進程、線程概念。首先linux只有進程而沒有線程,然而它的進程又可以表現得像windows下的線程。linux利用fork()和exec函數族來操作多進程。fork()函數可以在進程執行的任何階段被調用,一旦調用,當前進程就被分叉成兩個進程——父進程和子進程,兩者擁有相同的代碼段和暫時相同的數據段(雖然暫時相同,但從分叉開的時刻就是邏輯上的兩個數據段了,之所以說是邏輯上的,是因為這里是「寫時復制」機制,也就是,除非萬不得已有一個進程對數據段進行了寫操作,否則系統不去復制數據段,這樣達到了負擔最小),兩者的區別在於fork()函數返回值,對於子進程來說返回為0,對於父進程來說返回的是子進程id,因此可以通過if(fork()==0)…else…來讓父子進程執行不同的代碼段,從而實現「分叉」。

而linux下的進程不能像windows下線程那樣方便地通信,因為他們沒有共享數據段、地址空間等。它們之間的通信是通過所謂IPC(InterProcess Communication)來進行的。具體有管道(無名管道用於父子進程間通信,命名管道可以用於任意兩個進程間的通信)、共享內存(一個進程向系統申請一塊可以被共享的內存,其它進程通過標識符取得這塊內存,並將其連接到自己的地址空間中,效果上類似於windows下的多線程間的共享數據段),信號量,套接字。

③ 麻煩解釋一下linux下進程和線程有什麼區別和聯系,linux下多線程和多進程通信的實現方法,請通俗解釋

兄弟看到你這么高的分我就找了些資料:也算是對昨天學的知識總結一下吧
一、先說概念不管是windows還是linux下的進程和線程概念都是一樣的,只是管理進程和線程的方式不一樣,這個是前提,到時候你可別問我windows下進程和線程啊。這個涉及到操作系統原理。下面給你解答。
說道進程不得不提作業這個名詞 ,我想兄弟你電腦里不會有一個程序吧對不?當你的系統啟動完畢後你看看你的任務管理器里是不是有很多進程呢?那麼多程序是怎麼調如內存呢?能理解嗎?這里要明白程序和進程的關系,程序是你磁碟上的一個文件,當你需要它時進入內存後才成為進程,好比QQ在磁碟上就是一個文件而已,只有進入了內存才成為進程,進程是活動的。QQ要掃描你文件啊,記錄你聊天記錄啊,偷偷上傳個啥東西什麼的你也不知道對不,他是活動的。這個能明白嗎?
再看作業,這個作業可不是你寫作業的那個作業啊。系統一看好傢伙你個QQ那麼大的傢伙你想一下子進入內存啊?沒門!慢慢來嘛,系統就把QQ程序分為好幾塊,這幾塊不能亂分的,要符合自然結構就是循環啦選擇啦這樣的結構,你把人家循環結構咔嚓截斷了,怎麼讓人家QQ運行啊?這就是作業要一塊一塊的進入內存,同時要為作業產生JCB(JOB CONTROL BLOCK)作業控制塊,你進入內存不能亂跑啊,要聽系統的話,你要是進入系統自己的內存。框一下,內存不能讀寫 對話框就出來了,嚴重點直接藍臉給你!你懂得。這是window下的,linux下直接給你報錯!沒事了就!所一系統通過jcb控制進程。JCB包含了進程號優先順序好多內容,你打開你的windows任務管理器看看進程是不是有好多屬性啊?那就是PCB(PRCESS,CONTROL BLOCK)同理作業也包含那些內容只是多少而已。下面寫出進程特點:
1、進程是分配計算機資源最小的單位。你想啊人是要用程序幹活的吧?你把程序調入內存成了就成了進程,所以說進程是分配資源的最小單位。你在linux下打開終端輸入top命令看是不是有好多進程?
2、進程有操作系統為作業產生。有「父進程」產生「子進程」之間是父子關系,並可以繼續向下產生「子進程」。還拿QQ來說,你雙擊QQ.exe。QQ啟動了輸入賬號密碼打開主界面了。這時候你要聊天,QQ進程趕緊產生個「兒子」說 「兒子你去陪主人聊天去吧。這樣子進程產生了。突然你想看美女要傳照片這時候那個」兒子「有」生「了一個」兒子「說」兒子「你去傳照片。那個「兒子領到任務去傳照片了。這時你想關了QQ,QQ提示你說」你還有個「兒子」和「孫子」還在幹活呢你真要結束嗎?你蒽了確定。QQ對他「兒子」(你聊天窗口)說:」兒子啊對不起了,主人要關閉我你也不能活啊「咔嚓一下」兒子「死了,兒子死之前對他兒子說:「兒子啊你爺爺不讓我活了,你也別活了咔嚓孫子也死了。最後世界安靜了。這就是進程的父子關系。能明白嗎?記住:進程之活動在內存中。不能使用CPU,只管分配資源。
再說線程:線程也產生在內存中並且在內存中存在相當長的時間,但它的活動區域主要在CPU中,並且運行和滅亡都存在於CPU中,可以這么說,線程是程序中能被系統調度進入CPU中最小程序單位,它能直接使用進程分配的CPU的資源。
還拿QQ來說當你要傳文件時QQ總要判斷一下文件的擴展名吧,ok這時那個」兒子「趕緊對它爸爸說我需要一個線程判斷擴展名QQ趕緊對一個管這個的線程說:」快點去CPU里計算下那個擴展名是什麼然後向主人報告計算完了就「死了」消亡了,但是它的線程還在內存中!還等著你下一次傳文件然後計算然後消亡!
線程之間是相互獨立的。一個在CPU,一個在內存里還能有關系嗎對不?CPU在每一個瞬間只能進入一個線程,當線程進入CPU時立即產生一個新的線程,新線程仍停留在內存中,就好比上面那個傳文件還會等著你再傳文件再計算擴展名。
線程相對線程是獨立的,但它在內存中並不是獨立的,這就好比你不開QQ能用QQ傳輸文件嗎?它只存在與進程分配的資源中,也就是說計算擴展名這個線程只能停留在QQ這個進程中,不能跑到別的進程里!!相當於程序產生了新的進程和線程,進程向CPU申請資源,再有線程來使用,他們都是為程序服務的只是分工不同!
因為你沒提問linux下是怎麼管理進程和線程的所以我就不回答了,這個問題我建議你還是看看《笨兔兔的故事》裡面講到了linux是怎麼管理進程和線程的。挺幽默的比我說得還好。
你第二個問題說實話我回答不了你!我想你現在連進程和線程還沒理解第二個你更理解不了了你說對不?我猜的其實你用C/C++不管是在windows下編程還是在Linux下編程思想都是一樣的對吧,如果你理解了在windows下線程間通信,在linux更沒問題了!
參考資料:黑客手冊2009合訂本非安全第一二季244頁,245頁,328頁,329頁,398頁,399頁
淺談操作系統原理 (一 二三)
ubuntu中文論壇 笨兔兔的故事
http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=267518
希望我的回答你能理解

④ linux中多進程程序和多線程程序的區別

IBM有個傢伙做了個測試,發現切換線程context的時候,windows比linux快一倍多。進出最快的鎖(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。當然這並不是說linux不好,而且在經過實際編程之後,綜合來看我覺得linux更適合做high performance server,不過在多線程這個具體的領域內,linux還是稍遜windows一點。這應該是情有可原的,畢竟unix家族都是從多進程過來的,而 windows從頭就是多線程的。
如果是UNIX/linux環境,採用多線程沒必要。
多線程比多進程性能高?誤導!
應該說,多線程比多進程成本低,但性能更低。
在UNIX環境,多進程調度開銷比多線程調度開銷,沒有顯著區別,就是說,UNIX進程調度效率是很高的。內存消耗方面,二者只差全局數據區,現在內存都很便宜,伺服器內存動輒若干G,根本不是問題。
多進程是立體交通系統,雖然造價高,上坡下坡多耗點油,但是不堵車。
多線程是平面交通系統,造價低,但紅綠燈太多,老堵車。
我們現在都開跑車,油(主頻)有的是,不怕上坡下坡,就怕堵車。
高性能交易伺服器中間件,如TUXEDO,都是主張多進程的。實際測試表明,TUXEDO性能和並發效率是非常高的。TUXEDO是貝爾實驗室的,與UNIX同宗,應該是對UNIX理解最為深刻的,他們的意見應該具有很大的參考意義。

多線程的優點:
無需跨進程邊界;
程序邏輯和控制方式簡單;
所有線程可以直接共享內存和變數等;
線程方式消耗的總資源比進程方式好;
多線程缺點:
每個線程與主程序共用地址空間,受限於2GB地址空間;
線程之間的同步和加鎖控制比較麻煩;
一個線程的崩潰可能影響到整個程序的穩定性;
到達一定的線程數程度後,即使再增加CPU也無法提高性能,例如Windows Server 2003,大約是1500個左右的線程數就快到極限了(線程堆棧設定為1M),如果設定線程堆棧為2M,還達不到1500個線程總數;
線程能夠提高的總性能有限,而且線程多了之後,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU

多進程優點:
每個進程互相獨立,不影響主程序的穩定性,子進程崩潰沒關系;
通過增加CPU,就可以容易擴充性能;
可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運行的模塊演算法效率低也沒關系;
每個子進程都有2GB地址空間和相關資源,總體能夠達到的性能上限非常大
多線程缺點:
邏輯控制復雜,需要和主程序交互;
需要跨進程邊界,如果有大數據量傳送,就不太好,適合小數據量傳送、密集運算
多進程調度開銷比較大;
最好是多進程和多線程結合,即根據實際的需要,每個CPU開啟一個子進程,這個子進程開啟多線程可以為若干同類型的數據進行處理。當然你也可以利用多線程+多CPU+輪詢方式來解決問題……
方法和手段是多樣的,關鍵是自己看起來實現方便有能夠滿足要求,代價也合適。

⑤ Linux中進程和線程的對比與區別

線程和進程是另一對有意義的概念,主要區別和聯系如下:

  • 進程是操作系統進行資源分配的基本單位,擁有完整的進程空間。進行系統資源分配的時候,除了CPU資源之外,不會給線程分配獨立的資源,線程所需要的資源需要共享。

  • 線程是進程的一部分,如果沒有進行顯示的線程分配,可以認為進程是單線程的;如果進程中建立了線程,則可認為系統是多線程的。

  • 多線程和多進程是兩種不同的概念。多線程與多進程有不同的資源共享方式。

  • 進程有進程式控制制塊PCB,系統通過PCB對進程進行調度。進程有線程式控制制塊TCP,但TCB所表示的狀態比PCB要少的多。

⑥ 進程和線程的區別和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路由表

熱點內容
緩存直通 發布:2024-11-24 03:12:46 瀏覽:641
手機如何從安卓10升級安卓11 發布:2024-11-24 03:01:40 瀏覽:852
phpmvc開發框架 發布:2024-11-24 02:57:44 瀏覽:944
編程腦子疼 發布:2024-11-24 02:31:23 瀏覽:169
c語言狀態機 發布:2024-11-24 02:26:56 瀏覽:281
用友加密狗破解 發布:2024-11-24 02:23:16 瀏覽:707
鴻蒙系統如何變回安卓桌面 發布:2024-11-24 02:18:26 瀏覽:412
c語言填充 發布:2024-11-24 02:10:48 瀏覽:822
命名空間存儲 發布:2024-11-24 02:10:45 瀏覽:472
java重載與重寫 發布:2024-11-24 01:59:05 瀏覽:699