知识图谱https://naotu.baidu.com/file/b8a70ff9e7f3af1437594b2d0fb4ebfd?token=11150672c00909cb
线程、进程
基本概念
进程是程序的真正运行的实例,是资源分配的基本单位
线程是CPU的基本调度单位,每个线程执行的进程代码的某个片段
线程、进程关系与区别
关系
操作系统中可以包含多个进程,每个进程可以包含多个线程
区别
- 起源:先有线程后有进程
- 概念:
- 内存共享方式:默认情况下,内存无法与其他进程共享。线程共享 由系统分配给父进程的内存块
- 拥有资源:
- 进程拥有独立的内存,而线程只拥有在运行中必不可少的资源,但他可以与同进程下的线程分享进程拥有的全部资源
- 线程共享的内容:比如进程的代码块
- 线程独立的内容:比如线程的堆栈
- 数量:一个程序至少有一个进程,一个进程至少有一个线程
- 开销
- 线程的创建时间比进程短
- 同一进程内的线程切换时间比进程短
- 同一进程内的线程共享内存和文件资源,可以不通过内核进行通信
相同点
运行状态:就绪、等待、运行等
Java 与 多线程的关系
- Java 天生支持多线程
- Java 线程会一对一映射到操作系统
- JVM自动启动线程
多线程
什么是多线程
多线程指单个进程中运行多个线程,如果一个程序允许运行多个线程,那么他就是多线程程序
为什么使用多线程
- 提高CPU利用率
- 提高处理速度
- 避免无效等待
- 提高用户体验:避免卡顿,缩短等待时间:比如
tomact
,同时接收多个请求
- 便于编程建模
- 计算机性能定律:阿姆达尔定律
一般情况下,处理器越多,程序的执行速度就越快,但是会有一个上限,上限取决于程序中串行的比例。并行越多,多处理器效果越明显。
什么场景会使用到多线程
- 什么时候开启:通常在需要进行耗时任务时开始,比如IO读写,或从网络获取信息
- 为了同时做多种不同的事情:
- 为了提高工作效率:
tomact
、NIO
- 获取高并发量:压测
多线程的局限
- 上下文切换带来的损耗
- 异构化任务很难高效并行
- 线程安全问题:死锁
串行、并行、并发
- **串行:**单线程,多个任务,顺序执行
- **并行:**多线程,多个任务,同时执行
- **并发:**可单线程,也可多线程。只要保证一段时间内只有一个任务执行即可。
- **并发性:**程序的不同部分可以无序的同时执行,且不影响最终结果
- 并行必定可以并发,
多线程、高并发
- **高并发:**高并发是用户访问量剧增导致的一种状态
- 多线程是高并发的一种解决方案。
- 高并发不一定需要多线程处理,Redis 底层单核也可以处理
同步异步、阻塞非阻塞
- 以 访问者为客户端,被访问者为服务器为例
- 同步异步是服务器的行为
- 阻塞非阻塞是客户端的行为
- **同步:**客户端发出一个请求后,在没有得到结果之前,服务端不返回任何结果。但一旦返回就是客户端想要的结果
- **异步:**请求发出后,服务器立即返回信息表示接收到请求,然后服务器会处理请求,得到结果后再返回。在此期间,客户端可以进行其他操作。
- **阻塞/非阻塞:**客户端发出请求,在请求结果返回前,客户端是否进行其他操作