什么是进程
开发写的代码我们称为程序,那么将开发的代码运行起来。我们称为进程。
-
通俗解释
当我们运行一个程序,那么我们将运行的程序叫进程。 -
专业解释
进程是申请一块内存空间,将数据放到内存空间中去, 是申请数据的过程是最小的资源管理单元
进程是线程的容器
程序与进程的区别
程序是数据和指令的集合, 是一个静态的概念, 就是一堆代码, 可以长时间的保存在系统中
进程是程序运行的过程, 是一个动态的概念, 进程存在着生命周期, 也就是说进程会随着程序的终止而销毁, 不会永久存在系统中
进程之间交互
进程之间通过 TCP/IP 端口实现
什么是线程
线程是操作系统能够进行运算调度的最小单位。
它被包含在进程之中,是进程中的实际运作单位。
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
- 专业解释
进程的一条流水线, 只用来执行程序,而不涉及到申请资源, 是程序的实际执行者最小的执行单元
线程之间交互
多个线程共享同一块内存,通过共享的内存空间来进行交互
进程与线程的关系
可以说 "进程" 包含 "线程", "线程" 是 "进程" 的子集
例子:
我们打开一个聊天软件,这就是开启了一个进程;当我们在软件里面打开一些功能,比如空间, 扫一扫, 设置...,这些操作就是线程
- 进程是线程的容器
并发
并发是多个任务交替使用CPU,同一时刻只有一个任务在跑;
针对一个问题,想到了一个可以拆解为多个【并发】的任务,这些任务执行时因为只有一个CPU只能“切换”的跑。
- 单核下使用多道技术实现
并行
并行是多个任务同时跑;
并行必须有多核才能实现,否则只能实现并发(伪并行)
如果这些并行执行的任务是解决同一个问题的,那么他们既是【并发】的,同时也是【并行】的。
串行
一个程序完完整整的运行完,再运行下一个进程。
高并发
不像【并发】说的是“处理”,【并行】说的是“执行”,【高并发】说的是最终效果。只要能达到效果,不管怎么实现都行。
因此,极端一点【高并发】甚至并不一定需要【并行】,只要处理速度快的足够满足要求就可以。
如启动一个nginx的【OS进程】,它只能用到一个CPU核心,也就不可能【并行】。但是他如果能每秒能处理10万个请求,而业务需求只要求8万个请求就可以了,那么这个单进程的nginx本身就算【高并发】了。
【高并发】是指可以让软件系统在一段时间内能够处理大量的请求。比如每秒钟可以完成10万个请求。这是互联网系统的一个重要的特征。
除了【并发】和【并行】,【高并发】还需要:
数据表普遍被分库分表,否则单机放不下,或者查询性能不足解决分布式事务因为机器都可能坏,为了保证少数机器坏掉不会影响处理的性能,必须引入HA机制因为系统都有极限,超过极限响应能力就会急剧下降。因此必须引入限流的方案来保护系统这么复杂的系统会涉及到N个service,N个存储,N个队列…… 这些资源的管理又成为了新的问题,这又需要对集群和服务做管理这么多服务,肯定要解决分布式的Tracing和报警问题……当面试的时候提起【高并发】,大概率是希望面试者聊聊上面这些主题。但请特别特别留意,不同领域的【高并发】实际的意思(怎么算“高”,如何达成,哪些问题是关键问题)会非常不同。电商的高并发,抖音的高并发,12306卖火车票的高并发,基金交易系统的高并发,海量数据处理的高并发,这些问题其实都很不同。所以我很建议每次都讨论具体的问题,而非泛泛谈论【高并发】这个名词。
参考和转载
https://www.zhihu.com/question/307100151
https://www.zhihu.com/question/307100151/answer/894486042