标签:方法调用 修改 请求 *** sele one ioc linux 函数
1、异步 同步
函数或方法被调用时,调用者是否得到最终的结果
直接得到最终结果的,就是同步调用
不直接得到最终结果的,就是异步调用
2、阻塞 非阻塞
函数或方法调用的时候,是否立刻返回
立即返回就是非阻塞
不立即返回就是阻塞调用
3、区别
同步,异步,与 阻塞,非阻塞 没有关系
同步,异步强调的是,是否得到最终的结果。
阻塞,非阻塞强调的是时间,是否等待
同步与异步区别在于:调用者是否得到了想要的结果
同步就是一直要执行到返回最终的结果
异步就是直接返回额,但是返回的不是最终的结果,调用者不能通过这种嗲用得到结果,需要童工被调用者的其他方式通知调用者,来取回最终结果。
阻塞与非阻塞 的区别在于,调用者是否还能干其他的事
阻塞,调用者就只能干等
非阻塞,调用者可以先去忙别的,不用一直等。
4、联系
同步阻塞:什么都不做,直到拿到最终的结果
同步非阻塞:等最终结果的期间,可以做别的
异步阻塞:给一个信息,让等通知,但是期间什么都不干
异步非阻塞:等通知,但是期间可以做别的
5、同步IO,异步IO,IO 多路复用
5.1、IO 两个阶段:
1、数据准备阶段
2、内核空间复制数据到用户进程缓冲区阶段
5.2、发生IO的时候:
1、内核从输入设备读,写数据
2、进程从内核复制数据
系统调用 ---- read 函数
6、IO 模型
同步IO:
同步IO 模型包括:阻塞IO,非阻塞IO, IO多路复用
***阻塞IO:
进程等待(阻塞),知道读写完成(全程等待)
read/ write 函数
****非阻塞IO
进程调用read操作,如果IO设备没有准备好,立即返回error ,进程不阻塞,用户可以再次发起系统调用,如果内核已经准备好,就阻塞,然后复制数据到用户空间。
第一阶段数据没有准备好,就先忙别的,等会再来看看,检查数据是否准备好了的过程是非阻塞的。
第二阶段是阻塞的,即内核空间和用户空间之间复制数据 是阻塞的。
****IO 多路复用
所谓IO 多路复用,就是同事监控多个IO,有一个准备好了,就不需要等了,开始处理,提高了同时处理IO 的能力
select 几乎所有的操作系统平台都支持,poll是对select的升级
epoll,Linux系统内核2.5+开始支持,对select和poll的增强,在监视的基础上,增加了回调机制,BSD,Mac平台有kqueque,windows有iocp
select 为例,将关注的IO 操作 告诉select函数 并调用,进程阻塞,内核监视select关注的文件描述符fd,被关注的任何一个fd对应的IO准备好了数据,select 返回,在使用read将数据复制到用户进程。
一般情况下,select最多能监听1024个fd(可以修改,不建议修改),但是由于select 采用轮询的方式,当管理的IO 多了,每次都要遍历全部额fd,效率低下(每次某个IO 设备准备好了,都需要遍历一遍select)
基于事件驱动的epoll没有管理的fd的上限, 且是回调机制,不需要遍历,效率很高。
事件驱动IO:
通知机制:
1、水平触发通知,一直通知,直到处理
2、边缘触发, 只通知一次
event 是事件驱动IO
异步IO:
进程发起异步IO 请求,立即返回,内核完成 IO 的两个阶段,内核给进程发一个信号
7、Python中 IO 多路 复用
IO 多路复用:
Python的select库
实现了select , poll 系统调用,这个基本上操作系统都支持,部分实现了epoll
底层的IO 多路复用模块。
开发中的选择:
1、完全夸平台,使用select ,poll,但是性能较差
2、针对不同操作系统自行选择支持的技术,
select 维护一个文件描述符数据结构,单个进程使用有上限,通常1024,线性扫描这个数据结构,效率低,
poll和select的区别是内部数据结构使用链表,没有这个最大限制,但是依然是线性遍历才能知道那个设备就绪了
epoll使用事件通知机制,使用回调机制提高效率
select poll 还要从内核空间复制消息到用户空间,而epoll通过内核空间 和用户空间共享的一块内存来减少复制(mmap))
标签:方法调用 修改 请求 *** sele one ioc linux 函数
原文地址:https://www.cnblogs.com/JerryZao/p/9914399.html