⑴ 什麼是多線程,多進程
1、多線程:是指從軟體或者硬體上實現多個線程並發執行的技術。具有多線程能力的計算機因有硬體支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶元級多處理或同時多線程處理器。
在一個程序中,這些獨立運行的程序片段謹銷叫作「線程」,利用它編程的概念就叫作「多線程處理」。具有多線程能力的計算機因有硬體支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。
2、多進程:Windows應用程序中消息有兩種送出途徑;直接和排隊。Windows或某些運行的應用程序可直接發布消息給窗口過程,或者,消息可送到消息列象桐渣連續不斷輪詢消息隊列的OS中當前執行的每個進程都事件驅動程序不是由事件的順序來控制,而是由事件的發生來控,而事件的發生是隨機的、不確定的,這就允許程序的用戶用各種合理的順序來安排程序的流程。
(1)多進程編程多線程編程擴展閱讀:
多線程優點:
1、使用線程可以把占據時間長的程序中的任務放到後台去處理
2、用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度
3、程序的運行速度可能加快
4、在一些等待的任務實現上如用戶輸入、文件讀寫和網路收發數據等,線程就比較祥輪游有用了。在這種情況下可以釋放一些珍貴的資源如內存佔用等等。
5、多線程技術在IOS軟體開發中也有舉足輕重的位置。
參考資料來源:
網路-多線程
網路-多進程
⑵ 多進程和多線程有什麼區別
線程和進程都是現在電腦概念里比較時髦的用語,什麼是多線程,什麼是多進程?本文詳細的給您介紹一下,希望能增進您對當代電腦技術的了解,有不到之處,還往高手予以更正。進程(英語:Process,中國大陸譯作進程,台灣譯作行程)是計算機中已運行程序的實體。進程本身不會運行,是線程的容器。程序本身只是指令的集合,進程才是程序(那些指令)的真正運行。若干進程有可能與同一個程序相關系,且每個進程皆可以同步(循序)或不同步(平行)的方式獨立運行。進程為現今分時系統的基本運作單位
線程(英語:thread,台灣譯為運行緒),操作系統技術中的術語,是操作系統能夠進行運算調度的最小單位。它被包涵在進程之中,一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。在Unix
System
V及SunOS中也被稱為輕量進程(lightweight
processes),但輕量進程更多指內核線程(kernel
thread),而把用戶線程(user
thread)稱為線程。
線程是獨立調度和分派的基本單位。線程可以操作系統內核調度的內核線程,如Win32
線程;由用戶進程自行調度的用戶線程,如linux
Portable
Thread;
或者由內核與用戶進程,如Windows
7的線程,進行混合調度。
同一進程中的多條線程將共享該進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但同一進程中的多個線程有各自的調用棧(call
stack),自己的寄存器環境(register
context),自己的線程本地存儲(thread-local
storage)。
一個進程可以有很多線程,每條線程並行執行不同的任務。
在多核或多CPU,或支持Hyper-threading的CPU上使用多線程程序設計的好處是顯而易見,即提高了程序的執行吞吐率。在單CPU單核的計算機上,使用多線程技術,也可以把進程中負責IO處理、人機交互而常備阻塞的部分與密集計算的部分分開來執行,編寫專門的workhorse線程執行密集計算,從而提高了程序的執行效率
進程是資源分配的最小單位,線程是CPU調度的最小單位。線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文.多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定.
線程的運行中需要使用計算機的內存資源和CPU。
多進程:
進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啟動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分為系統進程和用戶進程。凡是用於完成操作系統的各種功能的進程就是系統進程,它們就是處於運行狀態下的操作系統本身;所有由用戶啟動的進程都是用戶進程。進程是操作系統進行資源分配的單位。
進程又被細化為線程,也就是一個進程下有多個能獨立運行的更小的單位。在同一個時間里,同一個計算機系統中如果允許兩個或兩個以上的進程處於運行狀態,這便是多任務。現代的操作系統幾乎都是多任務操作系統,能夠同時管理多個進程的運行。
多任務帶來的好處是明顯的,比如你可以邊聽mp3邊上網,與此同時甚至可以將下載的文檔列印出來,而這些任務之間絲毫不會相互干擾。那麼這里就涉及到並行的問題,俗話說,一心不能二用,這對計算機也一樣,原則上一個CPU只能分配給一個進程,以便運行這個進程。我們通常使用的計算機中只有一個CPU,也就是說只有一顆心,要讓它一心多用,同時運行多個進程,就必須使用並發技術。實現並發技術相當復雜,最容易理解的是「時間片輪轉進程調度演算法」,它的思想簡單介紹如下:在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許佔用CPU的時間非常短(比如10毫秒),這樣用戶根本感覺不出來
CPU是在輪流為多個進程服務,就好象所有的進程都在不間斷地運行一樣。但實際上在任何一個時間內有且僅有一個進程佔有CPU。
如果一台計算機有多個CPU,情況就不同了,如果進程數小於CPU數,則不同的進程可以分配給不同的CPU來運行,這樣,多個進程就是真正同時運行的,這便是並行。但如果進程數大於CPU數,則仍然需要使用並發技術。
進行CPU分配是以線程為單位的,一個進程可能由多個線程組成,這時情況更加復雜,但簡單地說,有如下關系:
匯流排程數<=
CPU數量:並行運行
匯流排程數>
CPU數量:並發運行
並行運行的效率顯然高於並發運行,所以在多CPU的計算機中,多任務的效率比較高。但是,如果在多CPU計算機中只運行一個進程(線程),就不能發揮多CPU的優勢。
這里涉及到多任務操作系統的問題,多任務操作系統(如Windows)的基本原理是:操作系統將CPU的時間片分配給多個線程,每個線程在操作系統指定的時間片內完成(注意,這里的多個線程是分屬於不同進程的).操作系統不斷的從一個線程的執行切換到另一個線程的執行,如此往復,宏觀上看來,就好像是多個線程在一起執行.由於這多個線程分屬於不同的進程,因此在我們看來,就好像是多個進程在同時執行,這樣就實現了多任務
多線程:在計算機編程中,一個基本的概念就是同時對多個任務加以控制。許多程序設計問題都要求程序能夠停下手頭的工作,改為處理其他一些問題,再返回主進程。可以通過多種途徑達到這個目的。最開始的時候,那些掌握機器低級語言的程序員編寫一些「中斷服務常式」,主進程的暫停是通過硬體級的中斷實現的。盡管這是一種有用的方法,但編出的程序很難移植,由此造成了另一類的代價高昂問題。中斷對那些實時性很強的任務來說是很有必要的。但對於其他許多問題,只要求將問題劃分進入獨立運行的程序片斷中,使整個程序能更迅速地響應用戶的請求。
最開始,線程只是用於分配單個處理器的處理時間的一種工具。但假如操作系統本身支持多個處理器,那麼每個線程都可分配給一個不同的處理器,真正進入「並行運算」狀態。從程序設計語言的角度看,多線程操作最有價值的特性之一就是程序員不必關心到底使用了多少個處理器。程序在邏輯意義上被分割為數個線程;假如機器本身安裝了多個處理器,那麼程序會運行得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個問題:共享資源!如果有多個線程同時運行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個線程不能將信息同時發送給一台列印機。為解決這個問題,對那些可共享的資源來說(比如列印機),它們在使用期間必須進入鎖定狀態。所以一個線程可將資源鎖定,在完成了它的任務後,再解開(釋放)這個鎖,使其他線程可以接著使用同樣的資源。
多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。
一個採用了多線程技術的應用程序可以更好地利用系統資源。其主要優勢在於充分利用了CPU的空閑時間片,可以用盡可能少的時間來對用戶的要求做出響應,使得進程的整體運行效率得到較大提高,同時增強了應用程序的靈活性。更為重要的是,由於同一進程的所有線程是共享同一內存,所以不需要特殊的數據傳送機制,不需要建立共享存儲區或共享文件,從而使得不同任務之間的協調操作與運行、數據的交互、資源的分配等問題更加易於解決。
進程間通信(IPC,Inter-Process
Communication),指至少兩個進程或線程間傳送數據或信號的一些技術或方法。進程是計算機系統分配資源的最小單位。每個進程都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的進程互相訪問資源並進行協調工作,才有了進程間通信。這些進程可以運行在同一計算機上或網路連接的不同計算機上。
進程間通信技術包括消息傳遞、同步、共享內存和遠程過程調用。
⑶ 多進程編程 相對於 多線程編程的優勢在哪 誰能給解釋一下, 謝謝了
1. 多進程的優勢在於任務的獨立性,比如某個任務單獨作為一個進程的話,崩潰隻影響自己的服務,其他任務不受影響.如果是多個任務在同一個進程內部利用多個線程進行處理,某個線程發生了未處理的異常的話,會導致整個進程完蛋,所有的任務跟著遭殃.
2. 從資源悉如世分配上來說,多進程方案比多線程方案更加靈活和自由.
3. 不過任務間的通睜肢信方面多進程要比多線程復雜些,編一個好的多進程通信方案要比多線程橡型間的通信方案困難多了.
-------------------------
以web server為例的話,比如我的伺服器上架設了三個網站,如果是用一個進程管理的話, 網站A遭受攻擊死掉了,意味著另外兩個網站會出現同樣的現象. 如果是分開獨立的進程的話,三個網站互不影響.
⑷ 開發中為何要用多線程
絕大多數程序都是單線程程序,如果程序中有多個任務,比如讀寫文件、更新用戶界面、網路連接、列印文檔等操作,比如按照先後次序,先完成前面的任務才能執行後面的任務。如果某個任務持續的時間較長,比如讀寫一個大文件,那麼用戶界面也無法及時更新,這樣看起來程序像死掉一樣,用戶體驗很不好。怎麼解決這個問題呢?人們提出了多線程編程技術。在採用多線程編程技術的程序中,多個胡埋任務由不同的線程去執行,不同線程各自佔用一段CPU時間,即使線程任務還沒有完成,也會讓出CPU時間給其他線程有機會去執行。這樣在用戶角度看起來,好像是幾個任務同時進行的,至少界面上能得到及時更新了,大大改善了用戶對軟體的體中做嫌驗,提高了軟體的友好度。根據進程與線程的支持情況,可以把操作賣手系統大致分為如下幾類:
(1)單進程、單線程,MS-DOS大致是這種操作系統。
(2)多進程、單線程,多數UNIX(及類UNIX的Linux)是這種操作系統。
(3)多進程、多線程,Win32(Windows NT/2000/XP/7/8/10等)、Solaris 2.x和OS/2都是這種操作系統。
(4)單進程、多線程,VxWorks是這種操作系統。
⑸ linux用戶空間 - 多進程編程(三)
管道用於有學園關系的進程之間。
管道的pipe 系統調用實際上就是創建出來兩個文件描述符。
當父進P1程創建出 fd[2] 時,子進程P2 會繼承父進程的所有,所以也會得到pipe 的 2個 文件描述符。
所以毫無瓜葛的兩個進程,一定不會訪問到彼此的pipe。無法用管道進行通信。
管道一般是單工的。f[0]讀,f[1]寫
管道也可以適用於 兄弟進程(只要有血緣即可)。由於管道是單工的,當兩個進程之間需要雙向通信,則需要兩跟管道。
執行
ctrl-c(2號信號) + SIGUSR1 信號 綁了一個新函數。則 ctrl-c 無效。
查看進程的信號
號信號被捕獲。
將2號信號忽略掉
9號信號 kill 和19號信號 stop 不能亂搞,只能用預設。
其它信號甚至段信號也都可以捕獲。
改變程序的執行現場,修改PC指針,有些像goto,只不過返回非0值
運行結果
making segment fault
after segment fault
程序不會死。
如果不忽略 page fault
則會產生 core mp.
不停的給data 賦值,同時每隔1s會有信號進來,列印 data的值。
理論上列印出來的結果同時為0,同時為1
但並非如此,是 0,1,交替隨機的。
signal 非同步的,隨時都可以進來,所以列印出來的結果,並不是我想要的。
信號對於應用程序來說,很像中斷對於內核,都是訪問臨界區數據
信號被屏蔽,延後執行。
寫多線程的程序時,不要以為只有線程之間有競爭,其實信號也會有競爭
system v 的IPC 年代有些久遠。
有血緣關系的進程 key_t 都是相同的。
Key 是私有key IPV PRIVATE
可能用消息隊列,可能用共享內存,可能用信號量進行通訊。
利用 _pathname 路徑,約定好一條路徑。和tcp/ip地址很像,來生成一個key_t key, 用msg_get shm_get 得到共享內存or 信號量。
int id 可以理解為文件描述符 fd。
其中Sys V 的共享內存 最為常用。
一定要檢查路徑,如果僅僅有2個進程,你沒有創建路徑,兩者都是 -1(相當於大家約定好了),那當然能通信拉。但更多的進程出現,則會有問題。
一定要檢查返回值
依然依靠key,但是api 實在是太挫了。P&V 操作都是 semop. (posix 的 ipc跟為簡潔)
POSIX 共享內存當然也需要一個名字,但並不是路徑。
無論讀進程還是寫進程,都需要傳入相同的名字。
如果是unbuntu 會在以下路徑生成文件
其實 2和3 是1 的符號鏈接。 只要保證是一個就能互相通信
關鍵點,mmap 內存的屬性修改為 private 後,產生寫時,虛擬地址一樣,但是物理地址已經不同了
當然 如果子進程修改了程序背景,執行了 exec,那麼完全不一樣了,直接修改了內存邏輯。
⑹ python多進程和多線程的區別
進程是程序(軟體,應用)的一個執行實例,每個運行中的程序,可以同時創建多個進程,但至少要有一個。每個進程都提供執行程序所需的所有資源,都有一個虛擬的地址空間、可執行的代碼、操作系統的介面、安全的上下文(記錄啟動該進程的用戶和許可權等等)、唯一的進程ID、環境變數、優先順序類、最小和最大的工作空間(內存空間)。進程可以包含線程,並且每個進程必須有至少一個線程。每個進程啟動時都會最先產生一個線程,即主線程,然後主線程會再創建其他的子線程。
線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不獨立擁有系統資源,但它可與同屬一個進程的其它線程共享該進程所擁有的全部資源。每一個應用程序都至少有一個進程和一個線程。在單個程序中同時運行多個線程完成不同的被劃分成一塊一塊的工作,稱為多線程。
舉個例子,某公司要生產一種產品,於是在生產基地建設了很多廠房,每個廠房內又有多條流水生產線。所有廠房配合將整個產品生產出來,單個廠房內的流水線負責生產所屬廠房的產品部件,每個廠房都擁有自己的材料庫,廠房內的生產線共享這些材料。公司要實現生產必須擁有至少一個廠房一條生產線。換成計算機的概念,那麼這家公司就是應用程序,廠房就是應用程序的進程,生產線就是某個進程的一個線程。
線程的特點:
線程是一個execution context(執行上下文),即一個cpu執行時所需要的一串指令。假設你正在讀一本書,沒有讀完,你想休息一下,但是你想在回來時繼續先前的進度。有一個方法就是記下頁數、行數與字數這三個數值,這些數值就是execution context。如果你的室友在你休息的時候,使用相同的方法讀這本書。你和她只需要這三個數字記下來就可以在交替的時間共同閱讀這本書了。
線程的工作方式與此類似。CPU會給你一個在同一時間能夠做多個運算的幻覺,實際上它在每個運算上只花了極少的時間,本質上CPU同一時刻只能幹一件事,所謂的多線程和並發處理只是假象。CPU能這樣做是因為它有每個任務的execution context,就像你能夠和你朋友共享同一本書一樣。
進程與線程區別:
同一個進程中的線程共享同一內存空間,但進程之間的內存空間是獨立的。
同一個進程中的所有線程的數據是共享的,但進程之間的數據是獨立的。
對主線程的修改可能會影響其他線程的行為,但是父進程的修改(除了刪除以外)不會影響其他子進程。
線程是一個上下文的執行指令,而進程則是與運算相關的一簇資源。
同一個進程的線程之間可以直接通信,但是進程之間的交流需要藉助中間代理來實現。
創建新的線程很容易,但是創建新的進程需要對父進程做一次復制。
一個線程可以操作同一進程的其他線程,但是進程只能操作其子進程。
線程啟動速度快,進程啟動速度慢(但是兩者運行速度沒有可比性)。
由於現代cpu已經進入多核時代,並且主頻也相對以往大幅提升,多線程和多進程編程已經成為主流。Python全面支持多線程和多進程編程,同時還支持協程。
⑺ linux操作系統多進程和多線程的區別
用ps -eLf 在linux下查看,每一行是一個進程,NLWP列代表這個進程裡面有多少個線程
LWP是輕量級進程的意思
⑻ linux下多進程或者多線程編程的問題。新手,望指教!
你好,多進程或多線程,都不會阻塞當前語句代碼。為了您的理解,我就大膽舉下面兩個例子:
多進程:你可以看成是本來是一條路的,現在從中間拆成兩條,然後每一條路都有屬於自己這條路的代碼在運行。
多線程:你可以看成是一條路,然後分出車道,比如左車道和右車道甚至是停車道,然後每條車道都單獨通車,其他車道的不能對這條車道進行干擾。
所以,把一條路從中間拆成兩條,成本是很高的。但是把一條路分車道,成本就不是很高了。
對於您提出的main函數的疑問,當main函數最後執行完畢,程序退出後,所有的進程包括線程,都會被關閉的,哪怕你的程序中沒有關閉,操作系統也會幫你關閉的,現在的操作系統都非常的完善了。當然,也存在有線程或進程不被釋放的特殊情況,最好在編程中要記得釋放。
⑼ python 多線程和多進程的區別 mutiprocessing theading
在socketserver服務端代碼中有這么一句:
server = socketserver.ThreadingTCPServer((ip,port), MyServer)
ThreadingTCPServer這個類是一個支持多線程和TCP協議的socketserver,它的繼承關系是這樣的:
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
右邊的TCPServer實際上是主要的功能父類,而左邊的ThreadingMixIn則是實現了多線程的類,ThreadingTCPServer自己本身則沒有任何代碼。
MixIn在Python的類命名中很常見,稱作「混入」,戲稱「亂入」,通常為了某種重要功能被子類繼承。
我們看看一下ThreadingMixIn的源代碼:
class ThreadingMixIn:
daemon_threads = False
def process_request_thread(self, request, client_address):
try:
self.finish_request(request, client_address)
self.shutdown_request(request)
except:
self.handle_error(request, client_address)
self.shutdown_request(request)
def process_request(self, request, client_address):
t = threading.Thread(target = self.process_request_thread,
args = (request, client_address))
t.daemon = self.daemon_threads
t.start()
在ThreadingMixIn類中,其實就定義了一個屬性,兩個方法。其中的process_request()方法實際調用的正是Python內置的多線程模塊threading。這個模塊是Python中所有多線程的基礎,socketserver本質上也是利用了這個模塊。
socketserver通過threading模塊,實現了多線程任務處理能力,可以同時為多個客戶提供服務。
那麼,什麼是線程,什麼是進程?
進程是程序(軟體,應用)的一個執行實例,每個運行中的程序,可以同時創建多個進程,但至少要有一個。每個進程都提供執行程序所需的所有資源,都有一個虛擬的地址空間、可執行的代碼、操作系統的介面、安全的上下文(記錄啟動該進程的用戶和許可權等等)、唯一的進程ID、環境變數、優先順序類、最小和最大的工作空間(內存空間)。進程可以包含線程,並且每個進程必須有至少一個線程。每個進程啟動時都會最先產生一個線程,即主線程,然後主線程會再創建其他的子線程。
線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不獨立擁有系統資源,但它可與同屬一個進程的其它線程共享該進程所擁有的全部資源。每一個應用程序都至少有一個進程和一個線程。在單個程序中同時運行多個線程完成不同的被劃分成一塊一塊的工作,稱為多線程。
舉個例子,某公司要生產一種產品,於是在生產基地建設了很多廠房,每個廠房內又有多條流水生產線。所有廠房配合將整個產品生產出來,單個廠房內的流水線負責生產所屬廠房的產品部件,每個廠房都擁有自己的材料庫,廠房內的生產線共享這些材料。公司要實現生產必須擁有至少一個廠房一條生產線。換成計算機的概念,那麼這家公司就是應用程序,廠房就是應用程序的進程,生產線就是某個進程的一個線程。
線程的特點:
線程是一個execution context(執行上下文),即一個cpu執行時所需要的一串指令。假設你正在讀一本書,沒有讀完,你想休息一下,但是你想在回來時繼續先前的進度。有一個方法就是記下頁數、行數與字數這三個數值,這些數值就是execution context。如果你的室友在你休息的時候,使用相同的方法讀這本書。你和她只需要這三個數字記下來就可以在交替的時間共同閱讀這本書了。
線程的工作方式與此類似。CPU會給你一個在同一時間能夠做多個運算的幻覺,實際上它在每個運算上只花了極少的時間,本質上CPU同一時刻只能幹一件事,所謂的多線程和並發處理只是假象。CPU能這樣做是因為它有每個任務的execution context,就像你能夠和你朋友共享同一本書一樣。
進程與線程區別:
同一個進程中的線程共享同一內存空間,但進程之間的內存空間是獨立的。
同一個進程中的所有線程的數據是共享的,但進程之間的數據是獨立的。
對主線程的修改可能會影響其他線程的行為,但是父進程的修改(除了刪除以外)不會影響其他子進程。
線程是一個上下文的執行指令,而進程則是與運算相關的一簇資源。
同一個進程的線程之間可以直接通信,但是進程之間的交流需要藉助中間代理來實現。
創建新的線程很容易,但是創建新的進程需要對父進程做一次復制。
一個線程可以操作同一進程的其他線程,但是進程只能操作其子進程。
線程啟動速度快,進程啟動速度慢(但是兩者運行速度沒有可比性)。
由於現代cpu已經進入多核時代,並且主頻也相對以往大幅提升,多線程和多進程編程已經成為主流。Python全面支持多線程和多進程編程,同時還支持協程。