java多线程学习 基础篇(一) 进程和线程的概念
进程产生的背景
早期,在单道处理系统下,CPU和I/O设备的运行是串行的,即在程序进行输入输出时,CPU只能等待。CPU只能不断询问I/O操作是否完成,因而不能执行别的程序。由于I/O设备的运行速度相对于CPU来说实在太慢,这种让高速设备等待低速设备的状况效率较低。
人们想,能否将CPU运行和I/O设备的运行重叠起来而改善整个系统的效率呢?基于此想法,人们想起将多个程序同时加载到计算机里面,并发执行。这些同时存在于计算机内存中的程序就称为进程。进程让每个用户感觉到自己独占CPU,因此进程就是为了在CPU上实现多道编程而出现的概念
线程产生的背景
在早期的操作系统中并没有线程的概念,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。
后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程,线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。
一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。
线程和进程的区别
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。
进程process:进程就是时间总和=执行环境切换时间+程序执行时间-->CPU加载执行环境->CPU执行程序->CPU保存执行环境
线程thread:线程也是时间总和=执行环境切换时间(共享进程的)+程序模块执行时间-->CPU加载执行环境(共享进程的)->CPU执行程序摸块->CPU保存执行环境(共享进程的)
区别:
- 线程程序任务调度和执行的最小单位。进程是资源分配的最小单位
- 进程拥有独立的栈堆空间和数据段,启动一个新的进程必须分配给它独立的地址空间,系统开销大。线程拥有独立的栈堆空间,但是共享数据段,开销小,切换速度快,效率高。
- 进程间相对独立,安全性高。一个线程死掉等于整个进程死掉。
- 进程间相对独立,通信机制较复杂。线程通信机制由于共享数据段,通信机制方便。
- 同进程的所有线程贡献该进程的所有资源,包括文件描述符,而不同进程相对独立。
- 线程必定只能属于一个进程,而进程可以拥有多个线程而且至少拥有一个线程。
线程和进程场景选择:
- 创建和销毁一个进程代价很大,需要频繁创建销毁优先使用线程。
- 线程切换速度快,在需要大量计算、切换频繁时用线程,耗时的操作使用线程可提高应用程序的响应。
- 对CPU系统的效率上线程占有,所以可能要发展到多级分布的用进程、多喝分布用线程。
- 并行操作用线程。
为什么需要多线程?
多线程出现的原因比较直接,就是为了解决负载均衡问题,充分利用CPU资源,为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰,为了处理大量的IO操作时或处理的情况需要花费大量的时间等等,比如:读写文件,视频图像的采集,处理,显示,保存等
多线程的好处:
- 进程间的通信比较复杂,而线程间的通信比较简单,通常情况下,我们需要使用共享资源,这些资源在线程间的通信比较容易。
- 进程是重量级的,而线程是轻量级的,故多线程方式的系统开销更小。
- 程序的运行效率可能会提高
多线程的缺点:
- 如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换.
- 更多的线程需要更多的内存空间
- 线程中止需要考虑对程序运行的影响.
- 通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生

浙公网安备 33010602011771号