基本概念和原理
进程和线程
进程和线程需要从操作系统层面理解
进程包括:
唯一的进程标识
可执行代码
安全的上下文
环境变量
虚拟(内存)地址空间
系统对象的引用,文件,设备,socket,窗口
至少一个线程,这个线程称为主线程
线程包括
唯一的线程标识
共享进程的虚拟(内存)地址空间
共享进程的系统资源
线程上下文
本地线程存储
总结
- 进程是资源分配的最小单位,线程是CPU调度的最小单位。
- 进程是对正在运行的程序的抽象,注意:一个程序可以有多个进程
- 进程是线程的容器,一个进程包括一个或多个线程
- 线程共享进程的系统资源:内存空间,文件,设备等
- 线程拥有
- 程序计数器,记录下一条执行指令
- 寄存器,保存线程正在使用的变量
- 堆栈,记录程序的执行路径
java中的进程和线程
我们使用java命令启动一个java程序,这个java程序的运行时就是一个进程。
比如我们将项目打成jar包,使用java -jar命令启动项目,产生了一个进程,这个进程里有许多线程,一些线程是JVM创建的,比如GC线程,程序的入口main函数必然需要启动一个线程执行,我们还可以在程序中启动新的线程执行任务。
java的线程实现
java线程实现是使用的内核线程的实现:https://blog.csdn.net/aajjw/article/details/115713556
并发和并行
cpu一个核心同一时间只能执行一个线程,因此多核处理器同一时间可以执行多个线程,这个就是并行。
并行是同一时刻不同的任务(线程)同时执行。
并发的则是多个任务交替进行。
方法调用中的同步和异步
同步和异步是形容方法调用的。
同步方法需要等到方法调用结束,才能继续执行
异步方法像是消息传递,调用后立即返回,调用者继续后续的工作,通常调用方法会在其他的线程中真正的执行。
线程中的阻塞和非阻塞
阻塞和非阻塞多线程间的相互影响。
比如一个线程占用了临界区的资源,其他线程如果要使用这个资源就必须在临界区等待,这个就是阻塞。
同步和异步,阻塞和非阻塞也出现在IO模型中
为什么我们需要线程
早期的操作系统中没有线程,进程就是cpu执行的最小单位。
操作系统采用调度策略调度不同的进程轮流执行。
如果采用多进程的方式提高程序的运行效率,会有以下问题:
- 进程资源不共享
- 进程间通信效率低
- 进程创建,销毁,进程间切换开销大
所以我们需要线程 - 线程共享进程的系统资源
- 线程间通信效率高,通过信号量等方式
- 线程创建更快,比进程快10到100倍,线程间切换开销小
多线程
多线程为啥效率高?一定效率高吗?
cpu一个核心同一时间只能执行一个线程,操作系统调度线程,
如果是计算密集型的程序,它已经可以将cpu性能塞满,
假设操作系统将固定的时间比例分配给我们,我们使用多线程,反而会造成性能将低,因为涉及到线程切换的代价,任务拆分和合并代价。
如果是IO密集型的程序,cpu大部分时间空闲,需要等待IO
假设操作系统将固定的时间比例分配给我们,我们使用多线程,操作系统可以在cpu空闲时切换线程,处理其他线程的任务,就提高了效率。