同步、异步概念
同步是指:当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续执行下去,
异步是指:当程序1调用程序2时,程序1径自继续自己的下一个动作,不受程序2的的影响。但是程序1会一直盯着程序2,直到程序2响应了,程序1会直接调用程序2,异步不保证多长时间程序2最中响应
同步调用是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。直到得到最终结果??
异步调用是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。不直接得到最终结果的
区别:
同步、异步、与阻塞、非阻塞不想关;
同步、异步强调的是,是否得到最终的结果
阻塞、与非阻塞强调的时间,是否等待
同步与异步区别在于:调用者是否得到了想要的结果。
同步就是一直要执行到返回最终结果
异步就是直接返回了,但是返回的不是最终结果。调用者不能通过这种调用得到结果,还是通过被调用者,使用其它方式通知调用者,来取回最终结果
阻塞与非阻塞的区别在于,调用者是否还能干其他事
阻塞,调用者就只能干等
非阻塞,调用者可以先去忙会其他的,不用一直等
联系:
同步阻塞:什么事都不干,就等着你打饭给我,打到饭事结果,而且我啥事都不干一直等,同步加阻塞
同步非阻塞:我等着你打饭给我,但我可以完手机、看看电视、大大游戏,打饭时 结果,但是我不一致等
异步阻塞:我要打饭,你说等叫号,并没有返回饭给我,我啥事不干,就等着饭好了你叫我,例如:叫好
异步非阻塞:我要打饭,你说等叫好,并没有返回饭给我,我在旁边看电视,玩手机,饭打好了叫我;
同步IO模型包括:阻塞IO、非阻塞IO、IO多路复用
1、阻塞IO
?进程等待(阻塞),直到读写完成(全程等待);read/write函数
2、非阻塞IO
进程调用read操作,如果IO设备没有准备好,立即返回ERROR,进程不阻塞。在进行下一个轮询,用户可以再次发起系统调用,如果内核已经准备好,就阻塞,然后复制数据到用户空间,
第一阶段数据没有主备好的,就先忙别的了,等会再来看看,检查数据是否准备好了的过程时非阻塞的。
第二阶段时阻塞的,即内核空间和用户空间之间复制数据是阻塞的。
轮询的过程是非常耗CPU时间,一般只有特定场合才能使用
3、IO多路复用
所谓IO多路复用,就是同时监控多个IO,有一个准备好了,就不需要在等了开始处理,提高了同时处理IO的能力??
select 几乎所有操作系统平台都支持,poll是对select的升级
epoll,linux系统内核2.5+开始支持,对select和poll的增强,在监视的基础上,增加回调机制。BSD,MAC平台有kqueue,Windos有iocp
?以select为例,将关注的IO操作告诉Select函数并调用,进程阻塞,内核“监视”select关注的文件描述符fd,被关注的任何一个fd对应的IO准备好了数据,select返回,再使用read将数据复制到用户进程
Select举例,食堂供应很多菜(众多的IO),你需要吃某三菜一汤,大师傅(操作系统)说要先做,需要等,你只好等待,其中一样菜好了,大师傅叫你过来说你点的菜有好的了,你要自己找找哪一样菜好了,请服务员把做好的菜打给你
一般情况下,select最多监听1024个fd(可以修改,但不建议改)但是由于select采用了轮询的方式,当管理的IO多了,每次都要遍历全部fd,效率低下。
epoll没有管理的fd的上下按,且是回调机制,不需要遍历,效率很高
4、异步IO
进程发起异步IO请求,立即返回。内核完成IO的阶段的两个阶段,内核给进程发一个信号。
举例:点了外卖,饭菜在饭店做好了(第一阶段),快递员从饭店送到你家门口(第二阶段)
LInux的aio的系统调用,内核从版本2.6开始支持