非阻塞io的疑问

这两天,在水木linux开发版讨论多线程的问题,其中谈到非阻塞io+单线程与多线程+阻塞io的一些比较。

其实,这段时间因为研究bbs高并发的问题,也看过不少多线程,异步,io,事件驱动方面的文章,受益匪浅。

但还有很多疑问,今天先列三个:

单线程+非阻塞IO,典型的就是lighttpd,在linux下,它是通过select或者epoll加上非阻塞io socket。
select的用法,首先是调用select函数,如果没有socket就绪,则阻塞,等有某个socket可读或者可写的时候,解除阻塞,然后调用系统函数read来从就绪的socket中读取或者发送数据。我想问的是:非阻塞io主要用途在于当调用read时(这里就拿读数据举例吧),如果此socket没有接收到数据,则程序不阻塞与read这个系统调用,直接返回。但是现在如果select因为有socket数据就绪,返回解除阻塞后,走到read()的时候,这些socket都是可以立即读取数据的啊,为什么要用非阻塞io呢,这里阻塞io也没什么不同吧?两者都是可以立即读取数据的。
另外还有两个问题

首先是关于read()系统调用的,,据我所知,一般情况下,从客户端传到服务器的数据首先是传到内核缓冲当中,然后从内核缓冲拷贝到用户缓冲。系统调用read()时,是不是先检查内核缓冲是否有数据,有的话就将数据拷贝到用户缓冲。也就是说它的工作是不是仅仅从内核缓冲拷贝数据到用户缓冲呢?

其次是关于非阻塞io的。用非阻塞io的话,当调用read()的时候,是不是这个函数要等到数据从内核缓冲拷贝到用户缓冲后结束呢才返回呢,还是马上返回,异步拷贝数据?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值