并发,并行同步,异步阻塞,非阻塞
# <并发,并行/同步,异步/阻塞,非阻塞>理解
- io操作:
- i (input) 向内存输入 input/read/recv/recvfrom/accept/connect/close
- o (output) 向内存输出 print/write/send/sendto
# 1.并发,并行
并发和并行都可以处理“多任务”,二者的主要区别在于是否是“同时进行”多个的任务。
并发:交替做不同事情的能力,不同的代码块交替执行
并行:同时做不同事情的能力,不同的代码块同时执行
#帮助理解 并发:老师甲先给学生A去讲思路,A听懂了自己书写过程并且检查,而甲老师在这期间直接去给B讲思路,讲完思路再去给C讲思路,让B自己整理步骤。这样老师就没有空着,一直在做事情,很快就完成了三个任务。与顺序执行不同的是,顺序执行,老师讲完思路之后学生在写步骤,这在这期间,老师是完全空着的,没做事的,所以效率低下。 并行:直接让三个老师甲、乙、丙三个老师“同时”给三个学生辅导作业,也完成的很快。
1
2
3
# 2.同步,异步
同步和异步关注的是--消息通信机制--同步与异步是针对应用程序与内核的交互而言的
- 同步:就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。
- 调用者主动等待这个调用的结果。
- 异步:在异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者.
- 调用者不会等待这个调用的结果。
#针对IO操作而言
同步过程中进程触发IO操作,并等待或者轮询的去查看IO操作是否完成。
异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。
1
2
3
2
3
# 3.阻塞,非阻塞
同步异步是个操作方式,阻塞非阻塞是线程的一种状态。涉及到CPU线程调度
- 阻塞:调用结果返回前,线程挂起.
- 非阻塞:调用不会阻塞线程,而且立即返回.
#涉及到CPU线程调度
- 阻塞,就是调用结果返回之前,该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;
- 非阻塞,就是在没有获取调用结果时,不是一直等待,线程可以往下执行,如果是同步的,通过轮询的方式检查有没有调用结果返回,如果是异步的,会通知回调。
1
2
3
2
3
# 4.同步阻塞/异步非阻塞 组合
- start /terminate /join
- start /terminate 异步非阻塞
- join 同步阻塞
小张喜欢喝咖啡,同时养了好多狗;
出场:
1. 小张:相当于我们的客户端进程
2. 小狗大黑:阻塞处理的IO函数
3. 小狗大黄:非阻塞处理的IO函数
4. 小狗大白、大红:异步处理的IO函数
#同步阻塞:
小张派大黑去看咖啡煮好没,大黑等咖啡煮开了才回来;
#同步非阻塞:
小张派大黄去看咖啡煮好没,大黄看了一眼就回来了,过了一会,再大黄再去看看咖啡煮好没;
#异步非阻塞:
小张派大白和大红去看咖啡煮好没,大白和大红到了厨房后,大白就回来告诉小张,大红已经到厨房啦;过了一会咖啡煮好了,大红回到客厅告诉小张
#异步阻塞:(这个太傻了,目前还没遇到)
小张派大白和大红去看咖啡煮好没,大白和大红到了厨房后,一起在那等着;过了一会咖啡煮好了,大红大白一起回到客厅告诉小张
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
上次更新: 2023/04/16, 18:35:33