一、进程
- 程序由指令和数据组成,指令需要加载至CPU,数据需要加载至内存,指令运行也需要网络、磁盘等设备,而进程就是用来加载指令、管理内存、管理IO。进程可以理解为程序的执行过程,是动态的
二、线程
- 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU运行
Java中,线程作为最小调度单位(CPU找指令),进程作为资源分配的最小单位(加载指令、管理内存、管理IO) - 每个线程都有自己的线程栈,自己的寄存器环境,自己的线程本地存储。JVM启动时会创建一个主线程,该主线程负责执行main方法
2.1 超线程技术(引申)
- 利用特殊的硬件指令,把一个物理核模拟成两个逻辑核,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高了CPU的运行速度。虽然采用超线程技术能同时执行两个线程,但它并不像两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能
三、协程
- 协程 (纤程,用户级线程),目的是为了追求最大力度的发挥硬件性能和提升软件的速度
- 协程基本原理:在某个点挂起当前的任务,并且保存栈信息,去执行另一个任务;等完成或达到某个条件时,再还原原来的栈信息并继续执行(整个过程线程不需要上下文切换)
- Java原生不支持协程,在纯java代码里需要使用协程的话需要引入第三方包,如:quasar
四、进程与线程对比
- 进程相互独立,而线程存在于进程内,是进程的一个子集
- 进程拥有共享的资源,如内存空间等,供其内部的线程共享(多个线程可以访问同一个共享变量)
- 线程上下文切换要比进程成本低
五、并行
- 单核CPU下,任务调度器将CPU时间片(几十毫秒)分给不同线程使用,切换非常快,感觉是同时运行的(宏观并行,微观串行)
- 并行是同一时间动手做多件事情的能力——>多个线程同时执行
六、并发
- 并发是同一时间处理多件事情的能力——>多个线程交替执行
七、同步
- 同步和异步关注的是消息通信机制
- 需要等待结果返回,才能继续运行
八、异步
- 同步和异步关注的是消息通信机制
- 不需要等待结果返回,才能继续运行
九、阻塞
- 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
- 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回
十、非阻塞
- 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
- 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程
十一、同步/异步/阻塞/非阻塞例子
- 同步阻塞:
小明把普通水壶放到火上,然后等水开
同步非阻塞:
小明把普通水壶放到火上,然后去客厅看电视,时不时的去厨房看看水开没有
异步阻塞:
小明把响水壶放到火上,然后等水开
异步非阻塞:
小明把响水水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去处理 - 普通水壶:同步
响水壶:异步 - 等水开的小明:阻塞
边看电视,边等水开的小明:非阻塞