基础知识
概念梳理
进程与线程
操作系统、进程、线程之间的关系:
一个操作系统(operating system)包含多个进程,一个进程(process)包含一个或多个线程(thread)。
进程的概念: 进程是程序运行的实例,是资源分配的基本单元。
当程序运行时操作系统就会给当前程序分配内存、cpu等资源。(一个程序执行时会产生一个或多个进程)。
线程的概念:线程是cpu的基本调度单位,每个线程执行的都是进程代码的某个片段。
线程间共享的资源:【进程代码段】、【进程的公有数据‘利用这些数共享数据】、【线程很容易实现线程间的通讯】、【进程打开的文件描述符】、【信号的处理器】、【进程的当前目录】、【进程用户ID与进程组ID】。
线程间私有的资源: 【线程ID】、【寄存器组的值】、【线程的堆栈】、【错误返回码】、【线程的信号屏蔽码】
多线程
多线程的概念: 如果一个程序允许两个或多个线程,那么就是多线程程序。多线程是在一个进程中运行多个线程。
什么时候用到多线程: 当不同任务间相互独立,且能够满足业务需求,那么可以不使用多线程。如果不同任务间存在共享相同的数据、资源,需要相互配合,可以使用多线程。
- 为了同时做多件不同的事:①开网页时听音乐②后台定时任务
- 为了提高工作效率、处理能力:①tomcat②并行下载③NIO
- 需要很大并发量的时候:①对服务器压测
多线程的局限(弊端):
- 性能问题:上下文切换带来的消耗
- 异构化任务(任务结构不一样)很难高效并行
- 会引发线程安全问题:数据安全问题(例如:i++,非原子操作)、活跃性问题(线程饥饿,死锁)。
jvm会在程序启动时默认创建一些线程。
main线程: 主线程,程序的入口
finalizer: 负责对象的fanalizer()方法
Sigal Dispatcher: 把操作系统发来的信号分发给适当的处理程序
Reference handler: GC、引用相关的线程
为什么要使用多线程:
-
最主要的目的就是为了提高cpu的利用率(cpu是多核的)。
①提高处理速度
②避免无效等待(进行IO操作时可以做其他任务)。
③提高用户体验:避免卡顿,缩短等待时间
④并行处理、提高性能,例如在服务器领域,用多个线程接收HTTP请求,而不是单线程处理。 -
便于编程建模
-
计算机性能定律
摩尔定律: 集成电路上可以容纳的晶体管数目在大约每经过24个月便会增加一倍。换言之,处理器的性能每隔两年翻一倍。(已失效)因为现在的元器件已经到达纳米级别,无法在短期内再次提升。
阿姆达尔定律: 处理器越多,程序执行就越快,但有上限,取决于程序中串行部分的比例,并行比例越高,多处理器效果越明显。
串行、并行、并发
并发的两种概念:
(1)形容多个任务的执行状态: 一个处理器不停地切换线程执行任务(不会同一时间执行多个线程)。
(2)对“并发性”的简称: 程序中不同的部分可以无序或同时执行,且不影响最终的执行结果。
并行: 多个处理器同时执行不同的线程任务。
串行: 按照线程顺序依次执行(同一时间只能执行一个线程)。
易混淆的概念(正确的观点): 并行的同时一定是并发的。
并发并行产生的原因: cpu升级,操作系统升级,编程语言升级。
高并发
高并发是一种状态,同时间多个请求到达服务器。
多线程是处理高并发的一种解决方案。
高并发不意味着多线程:redis就是单线程的。
高并发的指标:
QPS(Queries Per Second)每秒查询数/每秒请求数
带宽
PV(Page View)24小时的页面访问量点击量
UV(Unique Visitor)去除相同用户的PV
IP(相同IP地址访问量)
并发连接数(The number of concurrent connections)
服务器平均请求等待时间(Time per request :across all concurrent request)
同步异步、阻塞非阻塞
同步与异步: 被动者是否主动告诉调用者结果。
例如:客户端向服务器发送请求,同步:会一只等待直到服务器响应,才发送下一个请求。异步:客户端会同时发送多个请求,此时服务器会告知客户端收到请求,正在处理。客户端可以继续完成其他工作,服务器处理完之后会正常响应。
同步: 同步异步指的是被调用者(服务器)的行为而不是请求方的行为。在没有得到结果之前,不会给客户端任何信息。
异步: 客户端发出请求后,服务器会立刻返回已接收信息。
阻塞与非阻塞: 指的是调用者(客户端)的行为,也就是发出请求时能否在等待响应的期间做其他的事。
同步阻塞: 调用者发出请求后不会收到被调用者的通知,并且调用者不能做其他的事。
同步非阻塞: 调用者发出请求后不会收到被调用者的通知,调用者可以做其他的事。
异步阻塞: 调用者发出请求后会收到调用者的通知,但由于是阻塞的所以调用者还是不能做其他的事请,只能等待响应。
异步非阻塞: 调用者发出请求后会收到调用者的通知,调用者可以做其他的事。
面试题
进程与线程的区别:
- 起源不同: 先有进程后有线程,为了提高cpu的利用率诞生了线程。线程为了提高程序的运行效率。
- 概念不同: 进程是程序运行的实例,系统分配资源,调度的单位。线程是cpu调度的单位。
- 内存共享方式上不同: 系统会为进程分配内存空间,不同进程之间的通常(IPC可实现进程间通信)是内存不共享的,线程可以一定量的直接访问共享内存。
- 拥有的资源不同: 进程拥有的资源大于线程。
- 数量不同: 一个进程至少拥有一个线程。
- 开销不同: ①线程的创建、终止时间比进程短。②同一进程内的线程切换时间比进程短。 ③ 同一进程的各个线程间共享内存和资源文件,可以不通过内核进行通信。
- 相同点: 生命周期:都有 就绪、等待、运行的状态。