本篇文章内容皆是笔者学习《Java并发编程实战》总结摘抄而来,仅作笔记。
在早期的计算机中不包含操作系统,并且从头到尾只执行一个程序,这个程序能访问计算机中的所有资源。操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行。操作系统为各个独立执行的进行分配各种资源,包括内存、文件句柄和安全证书等。如果需要的话,在不同的进程之间可以通过一些粗粒度的通信机制来交换数据,如套接字、信号处理器、共享内存、信号量和文件等。
之所以在计算机中加入操作系统系统来实现多个程序的同时执行,主要基于一下原因:
- 资源利用率。某些情况下,程序要等待某个外部操作完成才可以继续执行,在等待的时候可以运行另一个程序,无疑将提高资源的利用率。
- 公平性:不同的用户和程序对计算机上的资源有着同等的特权。一种高效的运行方式是通过粗粒度的时间分片使这些用户和程序能共享计算机资源,而不是由一个程序从头运行到尾,然后再启动下一个程序。
- 便利性:通常来说,在计算多个任务时,应该编写多个程序。每个程序执行一个任务并在必要时相互通信。
这些促使进程出现的因素同样也促进着线程的出现。线程允许在同一个进程中同时存在多个程序控制流。线程会共享进程范围内的资源,例如内存句柄和文件句柄,但每个线程都有各自的程序计数器、栈以及局部变量等。
由于多个线程要共享相同的内存地址空间,并且是并发运行,因此它们可能会访问或修改其他线程正在使用的变量。虽然这种方式比其他的线程间通信机制更容易实现数据共享,但同样带来了巨大的风险:线程会由于无法预料的数据变化而发生错误。当多个线程同时访问和修改相同的变量时,将会在串行编程模型中引入非串行因素,而这种非串行性是很难分析的。要使多线程程序的行为可以预测,必须对共享变量的访问操作进行协同,这样才不会在线程之间发生彼此干扰。Java提供了各种同步机制来协同这种访问。
下面介绍一下进程和线程以及他们的区别。
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
线程也被称作轻量级进程,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程是独立调度和分派的基本单位。
进程和多线程的区别如下:
- 进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。
- 线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
- 进程之间的地址空间和资源是相互独立的,同一进程的线程共享本进程的地址空间和资源。
- 进程切换要比线程切换花费更多的资源。
- 多进程程序更健壮,一个进程挂了对其他进程没有影响,但一个线程挂了整个进程都挂了。