強烈推薦讀者閱讀文章最後的參考文章,本文只是歸納和總結,更詳細的內容參見引用列表。
你也能夠在個人 GitHub 裏得到全部文章:https://github.com/didikee/Android-Learning-Report/tree/master/Blog
或者blog :segmentFault & 博客園html
其次是爲了響應以前一篇 Android面試題 的第八道題。-->上篇文章 [2017 Android 面試題 [ 基礎與細節 ]](https://segmentfault.com/a/11...java
線程:是操做系統可以進行運算調度的最小單位。是進程中的一個執行流程,一個進程中能夠運行多個線程。linux
進程:一個執行中的程序的實例。android
一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。
線程在執行過程當中與進程仍是有區別的。每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。git
進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源.
一個線程能夠建立和撤銷另外一個線程;同一個進程中的多個線程之間能夠併發執行.github
總結:面試
進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。若是有興趣深刻的話,我建議大家看看《現代操做系統》或者《操做系統的設計與實現》。對就個問題說得比較清楚。segmentfault
摘自: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中經常使用兩種:
經過訪問共享變量的方式(注:須要處理同步問題)
經過管道流
線程通訊: 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