一、什么是线程、进程
1、进程、线程的定义
进程:程序的运行实例(程序的一次执行),是资源分配的基本单位。
线程:进程实际执行的细分,将任务切分成可供CPU调度的多个单位。
2、进程、线程的关系
进程是线程的容器,即同一个进程可以包含多个线程,多个线程可以共享同一进程间的资源。
例如:可以把厨房比作线程,厨房内的厨师比作进程,要实现的功能是做菜,一个厨房至少要拥有一个厨师才可以完成做菜的功能,也可以有多个厨师来分别执行洗菜、切菜、炒菜的工作,同时厨师间协作所需的锅碗瓢盆归属于同一个厨房,可以相互共享。
3、进程、线程的不同
- 起源不同
先有进程、为提高CPU的利用率才有了进程
- 概念不同
进程是系统资源分配的单位
线程是CPU的调度单位
- 内存共享方式不同
进程与进程之间的内存不共享
同一进程的线程与线程间内存共享
- 拥有的资源不同
线程拥有的资源取决于进程拥有的资源
- 数量不同
对于同一个程序,进程只能有一个,线程可以有多个
- 开销不同
线程较于进程更加轻量级,进程的创建、终止时间、上下文切换时间比线程长
同一进程的各个线程共享的资源可以不通过内核进行通信
二、什么是串行、并行、并发
1、串行、并行
串行是多个任务按照一定顺序依次执行
并行是多个任务同时执行
2、并发、并行
并发是单个处理器上的多个任务同时执行,因为单核处理器处理多个任务时会发生上下文切换,故此时并不是真正的同时执行,是因处理器处理速度较快,而看起来像同时执行(逻辑上的同时执行)
并行是多个处理器上的多个任务同时执行(物理上的同时执行)
3、并发、并行的异同
相似:
都具有并发性,即多个任务可以在重叠的时间内运行,且不影响最终的执行结构
不同:
并发单核处理、并行多核处理
三、什么是多线程
1、多线程定义
在同一个进程内运行了多个线程即为多线程。
2、引入多线程的目的
最主要的目的是提高CPU的利用率,达到如下的效果:
- 提高处理速度
- 避免无效等待
CPU会等待IO执行完毕后在执行其他任务,由于CPU的处理速度远大于IO的处理速度,故造成了资源浪费,此时可以引入多线程让CPU执行其他的任务
- 提高用户体验
并行处理,不同的任务交由不同的线程去处理,缩短整体的等待时间,减少卡顿
3、多线程的局限
性能问题:上下文切换带来的消耗
异构化任务(任务结构不一样)很难高效并行
线程安全问题:包括数据安全问题(共享资源的访问),线程活跃性问题(线程饥饿、死锁、活锁)
四、什么是高并发
1、高并发的定义
高并发是指多个请求同时进入服务器
2、多线程与高并发的关系
多线程是高并发的其中一种解决方案,可以解决高并发导致的一些问题
3、高并发的指标
- QPS(每秒查询数):每秒请求的数量
- 带宽
- PV(综合浏览量):一天内的页面访问量或点击量
- UV(独立访客浏览量):对PV按用户进行去重
- 并发连接数:发起请求后建立的TCP连接总数
- 服务器平均请求等待时间:服务器处理一个请求平均所需时间
五、什么是同步与异步、阻塞及非阻塞
1、同步与异步(消息的通信机制)
被调用者是否主动通知
同步:调用者主动等待被调用者的结果
异步:被调用者主动通知调用者结果
例如:
吃饭时进行点单,点好单后,排队自取(同步),服务员送到餐桌上(异步)
2、阻塞与非阻塞(程序等待调用结果时的状态)
调用者是否等待处理结果
阻塞:调用者在获得调用结果前挂起(等待),有结果后继续执行
非阻塞:调用者在获得结果前无需挂起(等待),仍然可以执行其他事
例如:
吃饭时进行点单,点好单后,在窗口等待食物做好(阻塞),过一段时间来拿(非阻塞)
3、同步异步、阻塞非阻塞的组合例子
同步阻塞:
无声响的壶烧水,需要人一直守着水壶等烧开,在此期间人一直处于等待状态
同步非阻塞:
无声响的壶烧水,每过一段时间后回来查看水壶是否烧开,在此期间可以做其他事
异步阻塞:
有声响的壶烧水,人一直等待水壶烧开发出声响,在此期间人一直处于等待状态
异步非阻塞:
有声响的壶烧水,水壶烧开后会发出声响告诉烧水人水烧好了,在此期间可以做其他事