多進程與多線程

進程(有時被稱爲重量級進程)是程序的一次執行。每個進程都有自己的地址空間,內存,數據棧以及其它記錄其運行軌跡的輔助數據。操作系統管理在其上運行的所有進程,併爲這些進程公平地分配時間。進程也可以通過 fork 和 spawn 操作來完成其它的任務。不過各個進程有自己的內存空間,數據棧等,所以只能使用進程間通訊(IPC),而不能直接共享信息。

線程(有時被稱爲輕量級進程)跟進程有些相似,不同的是,所有的線程運行在同一個進程中,共享相同的運行環境。它們可以想像成是在主進程或“主線程”中並行運行的“迷你進程” 。線程有開始,順序執行和結束三部分。它有一個自己的指令指針,記錄自己運行到什麼地方,線程的運行可能被搶佔(中斷)或暫時的被掛起(也叫睡眠),讓其它的線程運行,這叫做讓步。

一個進程中的各個線程之間共享同一片數據空間,所以線程之間可以比進程之間更方便地共享數據以及相互通訊。線程一般都是併發執行的,正是由於這種並行和數據共享的機制使得多個任務的合作變爲可能。實際上,在單 CPU 的系統中,真正的併發是不可能的,每個線程會被安排成每次只運行一小會,然後就把 CPU 讓出來,讓其它的線程去運行。在進程的整個運行過程中,每個線程都只做自己的事,在需要的時候跟其它的線程共享運行的結果。當然,這樣的共享並不是完全沒有危險的。如果多個線程共同訪問同一片數據,則由於數據訪問的順序不一樣,有可能導致數據結果的不一致的問題。這叫做競態條件(race condition)。幸運的是,大多數線程庫都帶有一系列的同步原語,來控制線程的執行和數據的訪問。另一個要注意的地方是,由於有的函數會在完成之前阻塞住,在沒有特別爲多線程做修改的情況下,這種“貪婪”的函數會讓 CPU 的時間分配有所傾斜。導致各個線程分配到的運行時間可能不盡相同,不盡公平。

進程是資源分配的最小單位,線程是CPU調度的最小單位

進程可以打開和操作系統資源而線程不行,所以在併發運行的環境中,如果程序要操作的資源比較大,最好可以做成多進程,由進程動態加載和資源。

好處:分配到多個進程動態加載資源,可以避免程序啓動時一起性加載大型資源的長時間的等待,並且按需加載和釋放資源, 還能起到節省內存空間的作用。


系統資源分配給進程,而線程只有cpu資源和一些必須的棧和寄存器,所以進程切換比線程切換慢得多,如果是切換比較頻繁的job的話,用線程。windows中進程只是資源管理者,不是真正的程序執行者,執行工作由線程完成,即使不顯式產生線程,系統有一個缺省得主線程運行。


子進程有自己的資源,比線程獨立於父進程,可以在父進程退出後執行,如LINUX的守護進程就是這樣的,線程使用的是父進程的資源,在父進程退出後跟着退出。


linux下進程間通信的幾種主要手段簡介:

  1. 管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係進程間的通信;
  2. 信號(Signal):信號是比較複雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD爲了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數);
  3. 報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩衝區大小受限等缺點。
  4. 共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
  5. 信號量(semaphore):主要作爲進程間以及同一進程不同線程之間的同步手段。
  6. 套接口(Socket):更爲一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章