《深入理解Linux网络》读书笔记

本文深入探讨了Linux网络开发中的阻塞概念,分析了同步阻塞IO的开销,并重点阐述了epoll如何通过减少进程上下文切换提高网络性能。此外,还解释了Redis网络性能突出的原因,主要归功于其单进程设计和高效利用epoll。
摘要由CSDN通过智能技术生成

1、阻塞到底是啥?

网络开发模型中,阻塞其实说的就是进程因为等待某个事件而主动让出CPU挂起的操作。在网络IO中,当进程等待Socket上的数据时,如果数据还没有到来,那就把当前进程状态从TASK_RUNNKNG修改为TASK_INTERRUPTIPLE,然后主动让出CPU。由调度器来调度下一个就绪状态的进程来执行。

所以在分析某个技术方案是不是阻塞的时候,关键要看进程有没有放弃CPU。如果放弃了,那就是阻塞。如果没放弃,那就是非阻塞。

2、同步阻塞IO需要哪些开销?

  • 进程通过recv系统调用接受一个Socket上的数据时,如果数据没有到达,进程就被从CPU上拿下来,然后换上另一个进程。这导致一次进程上下文切换所产生的开销。
  • 当连接上的数据就绪的时候,睡眠的进程又会被唤醒,又是一次进程切换产生的开销。
  • 一个进程同时只能等待一条连接,如果由很多并发,则需要很多进程。每个进程都会占用几MB的内存。

总体上说,同步阻塞网络IO是高性能网络开发路上的绊脚石。

3、多路复用epoll为啥能提高网络性能

最根本原因:epoll极大程度地减少了无用的进程上下文切换,让进程更专注地处理网络请求。

  • 在内核的硬、软中断上下文中,包从网卡接手过来进行处理,然后放到Socket的接收队列。再找到Socket关联的epitem,并把它添加到epoll对象的就序链表中。
  • 在用户进程中,通过调用epoll_wait来查看就绪链表中是否有事件到达,如果有,直接取走进行处理。处理完毕再次调用epoll_wait
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值