服务器的多任务并发处理(三)---两种高效的事件处理/并发模式

一、同步,异步,阻塞,非阻塞

(一)同步、异步

首先我们要知道同步I/O和异步I/O是针对应用程序和内核的交互而言的。

(1) 同步I/O是指用户代码自行执行I/O操作,将数据从内核缓冲区读入用户缓冲区,或从用户到内核。它需要等待或者轮询的去查看I/O操作是否就绪,返回给用户的是I/O就绪事件

(2) 异步I/O是指用户可以直接对I/O执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及I/O操作完成后内核通知应用程序的方式。异步I/O总是立即返回,不管I/O是否阻塞,因为真正的读写操作已经有内核结构。用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。即异步I/O向用硬程序通知的是I/O完成事件

(二)阻塞、非阻塞

  1. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式。

(1) 阻塞I/O是系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。在网络编程中,socket在创建的时候默认是阻塞的。但是我们可以通过fcntl系统调用去设置为非阻塞。阻塞和非阻塞的概念应用于所有文件描述符。如客户端通过connect向服务端发起连接时,connect三次握手先发送同步报文给服务器,等待服务端的确认报文,如果没到则connect被挂起,直到客户端收到确认报文,唤醒connect调用。socket的基础API中可能被阻塞的系统调用有:accept,send,recv,connect。我们在ET模式时将recv系统调用设置为了非阻塞,就是为了防止它数据接收完毕一直阻塞,不能进行下一次epoll唤醒。

(2) 非阻塞I/O就是执行的系统调用总是立即返回,而不管事件是否已经发生,如果事件没有立即发生,这些系统调用就立即返回-1,和出错的情况一样,这时我们必须根据errno全局变量来区分这两种情况。对于accept,send,recv,事件未发生时errno被设置为EAGAIN(再来一次),或为EWOULDBLOCK(期望阻塞),对于connect来说erron被设置为EINPROGRESS(在处理中)

(三)同步阻塞,同步非阻塞,异步阻塞,异步非阻塞I/O

一个I/O操作可以分为两个步骤:发起I/O请求和实际的I/O操作。

  • 阻塞I/O和非阻塞I/O的区别在于第一步,发起I/O请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞I/O,如果不阻塞,那么就是非阻塞I/O。
  • 同步I/O和异步I/O的区别就在于第二个步骤是否阻塞,如果实际的I/O读写阻塞请求进程,I/O操作完成后才能返回,那么就是同步I/O。如果不阻塞,而是操作系统做完IO两个阶段的操作再将结果返回给用户线程,那么就是异步IO。

一般来说I/O模型可以分

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值