強烈推薦讀者閱讀文章最后的參考文章,本文只是概括和總結,更詳細的內容參見引用列表。
你也可以在我的 GitHub 里獲得所有文章:https://github.com/didikee/Android-Learning-Report/tree/master/Blog
或者blog :segmentFault & 博客園

其次是為了響應之前一篇 Android面試題 的第八道題。-->上篇文章 2017 Android 面試題 [ 基礎與細節(jié) ]

概念

線程:是操作系統(tǒng)能夠進行運算調度的最小單位。是進程中的一個執(zhí)行流程,一個進程中可以運行多個線程。

進程:一個執(zhí)行中的程序的實例

進程 與 線程 的區(qū)別

一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。
另外,進程在執(zhí)行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應用程序中,由應用程序提供多個線程執(zhí)行控制。
從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應用,來實現(xiàn)進程的調度和管理以及資源分配。這就是進程和線程的重要區(qū)別。

進程是具有一定獨立功能的程序關于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行.

總結:

進程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進程。如果有興趣深入的話,我建議你們看看《現(xiàn)代操作系統(tǒng)》或者《操作系統(tǒng)的設計與實現(xiàn)》。對就個問題說得比較清楚。

摘自:http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html

補充:

線程一般是New出來的,而進程一般fork某個母體而產生的。

進程間通信

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

  1. 管道(Pipe)及有名管道(named pipe):管道可用于具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;

  2. 信號(Signal):信號是比較復雜的通信方式,用于通知接受進程有某種事件發(fā)生,除了用于進程間通信外,進程還可以發(fā)送信號給進程本身;linux除了支持Unix早期信號語義函數(shù)sigal外,還支持語義符合Posix.1標準的信號函數(shù)sigaction(實際上,該函數(shù)是基于BSD的,BSD為了實現(xiàn)可靠信號機制,又能夠統(tǒng)一對外接口,用sigaction函數(shù)重新實現(xiàn)了signal函數(shù));

  3. 消息隊列(Message):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。

  4. ** 共享內存**:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

  5. 信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。

  6. 套接口(Socket):更為一般的進程間通信機制,可用于不同機器之間的進程間通信。起初是由Unix系統(tǒng)的BSD分支開發(fā)出來的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。

摘自:https://www.ibm.com/developerworks/cn/linux/l-ipc/

各種通信方式的比較和優(yōu)缺點:

  1. 管道:速度慢,容量有限,只有父子進程能通訊

  2. 有名管道(named pipe):任何進程間都能通訊,但速度慢

  3. 消息隊列:容量受到系統(tǒng)限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數(shù)據(jù)的問題

  4. 信號量:不能傳遞復雜消息,只能用來同步

  5. 共享內存:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當于線程中的線程安全,當然,共享內存區(qū)同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存

摘自:http://blog.csdn.net/gatieme/article/details/50908749

線程間通信

java中常用兩種:

  1. 通過訪問共享變量的方式(注:需要處理同步問題)

  2. 通過管道流

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
進程和線程的區(qū)別: http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html

作者:didikee

出處:http://www.cnblogs.com/didikee/

GitHub:https://github.com/didikee

本博客文章大多為原創(chuàng),轉載請請在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

http://www.cnblogs.com/didikee/p/6565885.html