写这篇博客(不仅仅是这篇)的初衷是在朋友的推荐下,阅读了一篇文章你应该知道的JAVA面试题,里面提出了若干方面的面试题,有兴趣的你可以点进去看一下。文章的作者是阿里的一位技术大牛方腾飞,从这一角度来看我认为还是非常有意义、有价值的面试题。我与朋友约定,站在自身的知识角度共同来答复这些面试题。一方面在于分享与共同探讨知识,二是培养自己的思考写作习惯,提升自己。本文仅仅是开始。
进程
进程是系统进行资源分配和调度的基本单位。在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
进程相对于程序而言,进程是一个活动的实体,而程序是一个没有生命的实体。只有当系统在执行程序时,它才能转为一个活动的实体(进程)。
进程的状态图示如下:
线程
线程,有时被称为轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
已经有可进程,为何要引入线程呢?
60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。
因此在80年代,出现了能独立运行的基本单位——线程(Threads)。
总之,相较进程而言,线程更加轻巧,同一进程内的线程切换更加迅速且开销小。线程可并发执行(你也可以尝试着去了解并行与并发的区别),共享进程资源。在多线程操作系统中,进程不再是一个可执行的实体,由线程所取代。
线程的状态跟进程类似,也有就绪,运行,阻塞状态,不过可能细节更加丰富具体。
线程的状态示意图如下:
区别总结
上面的阐述中或多或少都有些线程与进程的区别描述,这里做下总结。
- 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
- 通信:进程间通信与线程间通信方式不同。
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
- 在多线程OS中,进程不是一个可执行的实体。
通信方式
线程间通信,参考文章如下:
线程通信
线程间的通信、同步方式与进程间通信方式