强烈推荐读者阅读文章最后的参考文章,本文只是归纳和总结,更详细的内容参见引用列表。
你也能够在个人 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