unix下的I/O——阻塞,非阻塞,同步,异步

前4种模型的主要区别在于第一阶段,因为它们的第二阶段都是一样的:在数据从内核缓冲区拷贝到进程缓冲区期间,进程阻塞与recvfrom这个系统调用中。

参考 Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking”。
Stevens一共提出了五种 IO Model:
• blocking IO
• nonblocking IO
• IO multiplexing (select and poll)
• signal driven IO (SIGIO)
• asynchronous IO (the POSIX aio_functions)
先说一下IO发生时所涉及的对象和步骤。
一个输入操作通常包括下面两个阶段:
1. 等待数据准备好 (Waiting for the data to be ready)。对于一个套接口上的输入操作,通常涉及等待数据从网络到达,到达后它被拷贝到内核的某个缓冲区。
2. 将数据从内核缓存区拷贝到进程缓冲区中 (Copying the data from the kernel to the process)
记住这两个阶段很重要,因为以下要讨论的五种IO Model的区别就是在两个阶段上各有不同的情况。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Blocking I/O Model(阻塞I/O)
默认情况下所有的套接口都是blocking。

 


前三次调用recvfrom时数据还没准备好,这是内核立即返回一个EWOULDBLOCK错误。第四次调用recvfrom时数据已准备好,它被拷贝到应用进程缓冲区,recvfrom接着成功返回,然后应用进程开始处理数据报。
这里最关键的一个操作就是轮询(polling)。应用进程持续轮询内核,以查看数据是否就绪。这样做往往会耗费大量的CPU时间,这种模型通常会在专门提供某种功能的系统才有。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I/O Multiplexing Model(I/O复用模型)

 

我们首先开启套接口的信号驱动I/O功能,并通过sigaction系统调用安装一个信号处理函数。该系统调用将立即返回,我们的进程这是并没有被阻塞,而是继续执行。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它来读取数据报。无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达(第一阶段)期间,进程可以继续执行,不被阻塞。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Asynchronous I/O Model(异步I/O模型)

 


前4种模型的主要区别在于第一阶段,因为它们的第二阶段都是一样的:在数据从内核缓冲区拷贝到进程缓冲区期间,进程阻塞与recvfrom这个系统调用中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值