線程與進程的區別及其通信方式
強烈推薦讀者閱讀文章最后的參考文章,本文只是概括和總結,更詳細的內容參見引用列表。
你也可以在我的 GitHub 里獲得所有文章:https://github.com/didikee/Android-Learning-Report/tree/master/Blog
或者blog :segmentFault & 博客園
其次是為了響應之前一篇 Android面試題 的第八道題。-->上篇文章 2017 Android 面試題 [ 基礎與細節 ]
概念
線程:是操作系統能夠進行運算調度的最小單位。是進程中的一個執行流程,一個進程中可以運行多個線程。
進程:一個執行中的程序的實例。
進程 與 線程 的區別
一個程序至少有一個進程,一個進程至少有一個線程.
線程的划分尺度小於進程,使得多線程程序的並發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行.
總結:
進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的並發操作,只能用線程,不能用進程。如果有興趣深入的話,我建議你們看看《現代操作系統》或者《操作系統的設計與實現》。對就個問題說得比較清楚。
摘自:http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html
補充:
線程一般是New
出來的,而進程一般fork
某個母體而產生的。
進程間通信
在 linux 下進程間通信的幾種主要手段簡介:
-
管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;
-
信號(Signal):信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標准的信號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數);
-
消息隊列(Message):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩沖區大小受限等缺點。
-
** 共享內存**:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
-
信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
-
套接口(Socket):更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。
各種通信方式的比較和優缺點:
-
管道:速度慢,容量有限,只有父子進程能通訊
-
有名管道(named pipe):任何進程間都能通訊,但速度慢
-
消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題
-
信號量:不能傳遞復雜消息,只能用來同步
-
共享內存:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於線程中的線程安全,當然,共享內存區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存
線程間通信
java中常用兩種:
- 通過訪問共享變量的方式**(注:需要處理同步問題) **
- 通過管道流
Android 中線程通信與進程通信
線程通信: Handler
消息隊列
進程通信: binder
機制,底層用的還是共享內存的方式。
引用文獻
本文參考的文章:
java多線程通信方法: https://my.oschina.net/u/248570/blog/53226#comment-list
深刻理解Linux進程間通信(IPC): https://www.ibm.com/developerworks/cn/linux/l-ipc/
Linux進程間通信的幾種方式總結--linux內核剖析(七): http://blog.csdn.net/gatieme/article/details/50908749
遠程過程調用(RPC)詳解: http://www.importnew.com/21660.html
wiki-線程: https://zh.wikipedia.org/wiki/%E7%BA%BF%E7%A8%8B
wiki-進程: https://zh.wikipedia.org/wiki/%E8%A1%8C%E7%A8%8B
Thread Communication: https://www.safaribooksonline.com/library/view/efficient-android-threading/9781449364120/ch04.html
線程與進程通俗講解: http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
進程概念: https://defrur.gitbooks.io/introduction-to-process/concept.html
進程和線程的區別: http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html