1 进程(process)
进程,是资源(CPU,内存)分配的基本单位
,是运行程序的一个实例;
- 程序运行时系统会创建一个进程,并分配资源,然后将进程放入进程就绪队列,进程调度器选中他的时候会为其分配CPU资源,程序真正开始运行;
- 进程有独立的地址空间,每启动一个进程,系统会为其分配一个地址空间,建立数据表来维护代码段,堆栈段和数据段,消耗系统资源较多;
- 进程通信IPC进行,同步和互斥是难点;
- 进程间独立,程序健壮性强,进程A不影响进程B;
Linux系统,在父进程中创建子进程,当进程接受到客户端的请求是,可以复制出一个子进程来处理,父进程仅监控请求,然后创建子进程去处理,实现并发.
CPU的核数,表示可以同时执行的进程数,解析一下,CPU可以处理成千上万个进程,但是,CPU每个核每个时刻只能处理一个任务即进程,所以,多任务并行是指同一时刻可以执行的进程数量.
2 线程(thread)
线程,是程序运行的基本单位
,是进程的一个执行流,是CPU调度和分配的基本单位.
- 一个进程可由多个线程组成,线程间共享所有资源,使用相同的地址空间,消耗进程资源;
- 每个线程有自己的堆栈和局部变量,线程有CPU独立调度执行,多CPU允许多个线程同时运行;
- 通信方便,共享全局变量;
- 健壮性弱,一个线程挂掉,整个进程随即挂掉;
3 并发&并行&高并发
3.1 并发(concurrency)
并发:分时运行;
CPU每个核每个时刻只能运行一个程序或计算;多任务来临是,需要进行分时间运行,如设置优先级,单片机中的中断优先级,可以插入运行队列,直接运行,直到结束;
3.2 并行(parallel)
并行:同时运行;
多核CPU可同时指定多个任务;
3.3 高并发(high concurrency)
某一时刻,大量请求
向服务器请求资源.
术语:
- 响应时间: 服务器对请求做出响应的时间;
- 吞吐量: 单位时间内处理的请求数量;
- QPS: 每秒响应的请求数量;
4 堆(heap)
堆可被看成树状
的数组对象,性质:
- 堆中某节点值不大于父节点值;
- 堆总是一个完整的二叉树;
- 根节点最大的堆称为最大堆或大根堆,根节点最小的堆称为最小堆或小根堆,常见有二叉堆,斐波那契堆;
- 堆是在程序运行时,不是在编译时,申请某个大小的
内存
空间,即动态分配内存; - 由程序员分配释放,若不释放,程序结束可能由操作系统回收,类似于链表分配方式;
- 使用二级缓存,声明周期由虚拟机的垃圾回收算法决定,调用速度慢一些;
5 栈(stack)
栈是堆栈的简称,是一种抽象数据类型,由操作系统自动分配释放,存放函数参数值,局部变量等.
特性:
- 后进先出(LIFO);
- PUSH数据入站,POP数据出栈;
- 类似于数据
水桶
,后进先出; - 栈使用的是一级缓存,调用完即释放;
6 队列(queue)
特殊的线性表,特点:
- 删除操作,只能在表前端(front);
- 插入操作,只能在表后端(rear);
- 插入操作的端称为队尾,删除操作的端称为队首;
- 先进先出(FIFO);
7 同步&异步
同步通信(synchronous communication),异步通信(asynchronous communication)描述的是消息通信机制。
7.1 同步通信
- 解释
一问一答,结束;即问题发出后,等待回复结果,直到结果返回,问答结束; - 微信或QQ语音聊天
A问:发起请求?(一直等待)
B答:接收请求。
AB完成对话,即结束。
7.2 异步通信
- 解释
一问,结束,回复;即问题发出后,不会立即返回结果,通信结束,回复方有答案之后,向问题发出者回复答案; - 使用微信或QQ文字聊天
A问:你干什么?(问了问题之后,退出软件)
结束,信息已经发出,就可以做别的事情了。
n分钟后
B答:(回复)我去逛街了
结束
A发出信息,不用实时监视(等待)B是否回复,可以做其他事情(此时无返回消息结果),等B有时间,自然会回复。
8 阻塞&非阻塞
阻塞(block),非阻塞(non-block)描述线程等待返回结果时的状态。
8.1 阻塞
- 解释
请求数据线程中的A函数发起请求,等待返回数据,若无数据返回,该线程挂起即进入阻塞状态,A函数一直等待,该线程占线,不能执行其他操作,直到A函数得到结果,继续执行其他操作; - 打电话
A拨打:123
123:无人接听
A:一直等待
123:喂
A:打通了
结束
8.2 非阻塞
- 解释
请求数据线程A函数发起请求,不等待数据返回,此时无返回结果,该线程执行A函数后面函数,但需要A隔一定时间去检查是否有结果返回; - 打电话
A:拨打123
123:无人接听
A:离开电话亭或手机(未挂断),去做其他事情,但时不时去电话亭看看有没有人回应;
123:我在,通话完成;
9 总结
- 同步&异步是信息收发,阻塞&非阻塞是线程状态,阻塞和非阻塞线程都是运行的,区别是执行线程中函数状态,阻塞则等待A函数的结果,非阻塞,不等待A函数结果,继续执行B函数。
- 同步异步结合阻塞和非阻塞,出现了同步阻塞等。
[参考文献]
[1]https://www.cnblogs.com/zhuzhu2016/p/5804875.html
[2]https://www.cnblogs.com/zhuzhu2016/p/5804875.html
[3]https://blog.csdn.net/DreamWeaver_zhou/article/details/78587580
[4]https://baike.baidu.com/item/%E5%B9%B6%E5%8F%91/11024806?fr=aladdin
[5]https://jingyan.baidu.com/article/6c67b1d6a09f9a2786bb1e4a.html
[6]https://www.cnblogs.com/Anker/p/5965654.html