I/O模型

模型分类
Unix下可用的5中模型

  • 阻塞式I/O
  • 非阻塞式I/O
  • I/O复用
  • 信号驱动I/O
  • 异步I/O
    阻塞式I/O
    在这里插入图片描述
    在上图中,应用进程系统调用recvfrom接收数据,但是此时内核缓存区中数据报还未准备好,所以应用进程会一直阻塞直到内核缓存区有数据报到达且被复制到应用进程缓存区。
    内存缓存区和应用进程缓存区所处的阶段:
    一个输入操作通常包括两个不同的阶段:
    1.等待数据报准备好(通常是等待数据从网络上到达,当所等待的分组数据到达后,会被复制到内核的某个缓存区中);
    2.从内核向进程复制数据(把数据从内核缓存区复制到应用进程缓存区中)。
    非阻塞式I/O
    如果不想进程一直阻塞在那里,我们可以设置本次套接字连接为非阻塞的。
    在这里插入图片描述
    从上图可知,在设置连接为非阻塞时,当应用进程系统调用recvfrom没有数据返回时,内核会立即返回一个EWOULDBLOCK错误,而不会一直阻塞到数据准备好。如上图在第四次调用时有一个数据报准备好了,所以这时数据会被复制到应用进程缓存区,于是recvfrom成功返回数据。
    当一个应用进程这样循环调用recvfrom时,我们称之为轮询polling。这么做往往会耗费大量时间CPU时间,实际使用很少。
    I/O复用
    在这里插入图片描述
    Linux I/O复用模型提供了select poll epoll三组系统调用可做选择,进程通过将一个或多个文件描述符(fd)传递给select或poll或epoll系统调用,通过它们来监测多个fd是否处于就绪状态。select或poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此使用上有制约。epoll调用基于事件驱动,因此性能更高,当fd就绪时会立即回调rollback。
    文件描述符
    Linux内核将所有外部设备都看做一个文件夹来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd 文件描述符)。而对一个socket的读写也会有相应的描述符。称为socket fd。
    上图中以select为例,进程会阻塞与select调用,直到所关注的某一个文件描述符(套接字)变为可读状态。
    信号驱动I/O
    在这里插入图片描述
    信号驱动I/O就是让内核在数据就绪时,发信号通知我们。
    调用的步骤是,我们通过系统调用sigaction,并注册一个信号处理的回调函数,该调用会立即返回,但是当内核数据就绪时,内核会为该进程产生一个SIGIO信号,并回调我们注册的信号回调函数,这样我们就可以在信号回调函数中系统调用recvfrom获取数据。
    异步I/O
    在这里插入图片描述
    异步I/O与信号驱动I/O最大的区别是,信号驱动是内核通知我们何时开始一个I/O操作,而异步I/O是由内核通知我们I/O操作何时完成,两者有本质区别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值