同步 --异步 --- 阻塞--- 非阻塞 ---半同步/半异步 --- 半同步/半反应堆

《一》同步和异步

I/O同步和I/O异步关注的是消息通知机制

I/O同步:是有消息处理者自己去等待消息是否被触发,(同步需要主动读写数据,在读写数据的时候还是会阻塞,要等待这两个操作成功才能返回)

I/O异步:当所关注的消息被触发是,由消息触发机制通知触发对消息的处理、是由触发机制通知消息处理者,类似于select、poll(异步只需要I/O操作完成消息通知,并不主动读取数据,由操作系统内核完成对数据的读写)

《二》阻塞与非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)的状态

阻塞:是指调用结果返回之前,当前线程会被挂起,调用线程在得到结果后才返回

非阻塞:是指不能立刻得到调用结果之前,该调用不会阻塞当前线程,而会立刻返回

在举个例子:

很多人也会把异步和非阻塞混淆,
因为异步操作一般都不会在真正的IO 操作处被阻塞,
比如如果用select 函数,当select 返回可读时再去read 一般都不会被阻塞
就好比当你的号码排到时一般都是在你之前已经没有人了,所以你再去柜台办理业务就不会被阻塞.
可见,同步/异步与阻塞/非阻塞是两组不同的概念,它们可以共存组合,

而很多人之所以把同步和阻塞混淆,我想也是因为没有区分这两个概念,
比如阻塞的read/write 操作中,其实是把消息通知和处理消息结合在了一起,
在这里所关注的消息就是fd 是否可读/写,而处理消息则是对fd 读/写.
当我们将这个fd 设置为非阻塞的时候,read/write 操作就不会在等待消息通知这里阻塞,
如果fd 不可读/写则操作立即返回.

 

《三》同步运行和异步运行

这里的同步和异步和I/O同步和I/O异步不一样,大家不要混淆了哦!

同步运行:是指两个进程运行的过程会存在相互依赖关系(比如信号量)

异步运行:A进程执行A进程,B进程执行B进程,但两者之间会有联系(有内核驱动机制),(比如:父子进程-->僵死进程)

《四》串行运行和并行运行

串行运行:A进程执行完B再执行

并行运行:A和B同时执行,(伪并发:由于时间片很短,所以视觉上看起来像是并发)

《五》同步阻塞,同步非阻塞,异步非阻塞,异步阻塞

现在有两个茶壶:普通茶壶(水开不会响铃),高级茶壶(水开会响铃)

这四个概念不好描述,我就用例子说明也好理解

同步阻塞:是效率是最低的,相当于你用普通茶壶烧水,在烧水的时候你不可以做别的事,要专心烧水

异步阻塞:相当于你用高级水壶烧水,烧水的时候你不可以做别的事,水开时水壶会响铃通知你

同步非阻塞:相当于你用普通水壶烧水,在烧水的时候你可以干别的事情,不过你要时不时过来看看水是否开了

异步非阻塞:是效率最高的,相当于你用高级水壶烧水,在烧水的时候你可以干别的时,水开水壶会响铃通知你

《六》半同步/半异步

半同步半异步原理图如下:

半同步半异步原理

半同步/半异步可以分为三层:同步任务层,队列层,异步任务层。

同步任务层:是子线程负责的一层,本层的任务完成上层的I/O操作,使用同步I/O模型,通过队列层的队列中传输数据。和异步层不同,同步层的任务使用活动对象执行,这些活动对象有自己运行栈和寄存器状态。当执行同步I/O的时候,他们会被阻塞/睡眠。

队列层:这个层在同步任务层和异步任务层之间,提供了同步控制和缓存的功能。异步任务的I/O 事件被缓存到消息队列中,同步任务层在队列中提取这些事件

异步任务层:是主线程负责的一层,处理低层的事件,这些事件由多个外部的事件源产生(例如网卡,终端)。和异步任务不同,此层的实体是被动对象,没有自己的运行栈,要求不能被阻塞。

《七》高效的半同步半异步

原理图如下:

原理:主线程选取监听队列中套接字最少的子线程,把客户端套接字传输到该子线程,子线程将套接字加入监听队列进行监听

《八》半同步半反应堆

原理:主线程accept  并没有立马把客户端套接字发送给子线程,而是等待客户端套接字上面有事件发生才将套接字发送给子线程,为了防止客户端套接字是个死的连接上去之后什么都不做,子线程接收到套接字后才进行监听(监听已经有事件产生的套接字)主线程只监听一次,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值