阻塞,非阻塞,异步 ,同步

阻塞:

做一件事就一定要出结果,比如去银行取钱,把卡交给柜员,然后等待,直到取到钱,这个过程就是阻塞。

阻塞,就是这个时间段内的IO一直等待,应用程序不能做其他的事情。


非阻塞:

做一件事如果是否成功没有马上得到反馈,就先放着。如果以后要知道是否真正成功了,那就自己得去询问。

比如你去汇款,现在说我要去汇款了,然后柜员说汇了,至于钱什么时候能到,那就要自己去问了,反正现在是得不到结果的。

比如read(),现在设置为非阻塞之后呢,如果现在没有内容去读取,那么就返回说没有读到,至于数据什么时候来呢,你要去自己询问。所以配合非阻塞呢,一般是轮询。但是这样有个缺点,浪费了大量的CPU时间。

有两种类型的文件IO同步:同步文件IO和异步文件IO

异步文件IO也就是重叠IO。在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行。而异步文件IO方式中,线程发送一个IO请求到内核,然后继续处理其他的事情,内核完成IO请求后,将会通知线程IO操作完成了。


如果IO请求需要大量时间执行的话,异步文件IO方式可以显著提高效率,因为在线程等待的这段时间内,CPU将会调度其他线程进行执行,如果没有其他线程需要执行的话,这段时间将会浪费掉(可能会调度操作系统的零页线程)。如果IO请求操作很快,用异步IO方式反而还低效,还不如用同步IO方式。


IO 多路复用:

对于有多个文件描述符的进程来说,不能对于某个做阻塞,这样其他的就收不到。 也不适宜做非阻塞,这样就需要一直轮询,不太高效。这样就需要多路复用:

poll select 。

这里就是构造一张有关描述符的列表,然后调用一个函数,直到这些列表的一个准备好进行IO操作时,函数才返回,从而告知是哪些个描述符已经准备好了。这样可以不用多线程就解决了并发的访问。


---------------我是分界线,以下是转载----------------------

selectpollepoll_wait参数及实现对比

1.  select的第一个参数nfdsfdset集合中最大描述符值加1fdset是一个位数组,其大小限制为__FD_SETSIZE1024),位数组的每一位代表其对应的描述符是否需要被检查。

 

select的第二三四个参数表示需要关注读、写、错误事件的文件描述符位数组,这些参数既是输入参数也是输出参数,可能会被内核修改用于标示哪些描述符上发生了关注的事件。所以每次调用select前都需要重新初始化fdset

 

timeout参数为超时时间,该结构会被内核修改,其值为超时剩余的时间。

 

select对应于内核中的sys_select调用,sys_select首先将第二三四个参数指向的fd_set拷贝到内核,然后对每个被SET的描述符调用进行poll,并记录在临时结果中(fdset),如果有事件发生,select会将临时结果写到用户空间并返回;当轮询一遍后没有任何事件发生时,如果指定了超时时间,则select会睡眠到超时,睡眠结束后再进行一次轮询,并将临时结果写到用户空间,然后返回。

 

select返回后,需要逐一检查关注的描述符是否被SET(事件是否发生)。

 

2.  pollselect不同,通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。

 

poll的实现机制与select类似,其对应内核中的sys_poll,只不过poll向内核传递pollfd数组,然后对pollfd中的每个描述符进行poll,相比处理fdset来说,poll效率更高。

 

poll返回后,需要对pollfd中的每个元素检查其revents值,来得指事件是否发生。

 

3.  epoll通过epoll_create创建一个用于epoll轮询的描述符,通过epoll_ctl添加/修改/删除事件,通过epoll_wait检查事件,epoll_wait的第二个参数用于存放结果。

 

epollselectpoll不同,首先,其不用每次调用都向内核拷贝事件描述信息,在第一次调用后,事件信息就会与对应的epoll描述符关联起来。另外epoll不是通过轮询,而是通过在等待的描述符上注册回调函数,当事件发生时,回调函数负责把发生的事件存储在就绪事件链表中,最后写到用户空间。

 

epoll返回后,该参数指向的缓冲区中即为发生的事件,对缓冲区中每个元素进行处理即可,而不需要像pollselect那样进行轮询检查。



猜你喜欢

转载自blog.csdn.net/u012606764/article/details/39958743
今日推荐