请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

我还是不是很明白IO多路复用是怎么用单线程解决高并发的呀

我还是不是很明白IO多路复用是怎么用单线程解决高并发的呀,当select到了socket的时候,线程去处理这个socket,这个过程不也是阻塞的吗,那么顺序的去执行select到的socket,这算是实现高并发了吗

正在回答

1回答

能问到这个问题,说明你是经过思考的,select之后确实去执行了这个处理了,所以当处理这个socket的时候,理论上即使你有新的数据返回了,但是当前的线程在处理socket逻辑,所以你新数据来了也处理不了。所以这里的关键点在于: cpu的处理速度是远远大于io处理的,所以你应该知道,即使去处理这个socket,只有这个socket处理过程中不涉及到新的io操作,那么即使等待我处理完再回过头来处理下一个socket也是很快的,这就是为什么是并发不是并行的根本,因为这里只是看起来是并行的,实际上是在一个短的时间内处理了大量的请求,还有就是为什么课程中一再强调你的socket处理逻辑中不能有新的io阻塞操作,因为一旦阻塞了,那么select的下一个处理就得等

1 回复 有任何疑惑可以回复我~
  • 提问者 放牛班的春天0 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-11-12 14:56:15
  • 老师,我也有同样的问题哈,这么说来,通过一个select监听多个FD这种多路复用方式,对应的各个socket会调操作,最好都是cpu密集型的吧,因为只有这样才能利用CPU处理更快的优势,等把它处理完了之后再回头进行select遍历下一个就绪的socket也来得及?否则的话,就导致后面的全部因为这个socket被阻塞住了?
    回复 有任何疑惑可以回复我~ 2021-02-18 11:34:17
  • bobby 回复 邱晨100 #3
    当然不是了, 如果都是cpu密集型,那么某一个fd返回的后续操作是cpu密集型就意味着这个逻辑会一直占用cpu导致你的select下一个fd一直执行不到,相反如果是io操作的话,这个时候一旦某个fd的操作是io操作的时候就会立马释放cpu 这个时候select就会找到下一个就绪的fd并执行操作
    回复 有任何疑惑可以回复我~ 2021-02-19 21:21:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信