加入收藏 | 设为首页 | 会员中心 | 我要投稿 漯河站长网 (https://www.0395zz.cn/)- 云服务器、混合云存储、网络、内容创作、云渲染!
当前位置: 首页 > 站长资讯 > 评论 > 正文

深入理解高性能网络开发路上的绊脚石

发布时间:2021-03-28 16:28:59 所属栏目:评论 来源:互联网
导读:是在高并发的服务器开发中,这种网络 IO 的性能奇差。因为 1.进程在 recv 的时候大概率会被阻塞掉,导致一次进程切换 2.当连接上数据就绪的时候进程又会被唤醒,又是一次进程切换 3.一个进程同时只能等待一条连接,如果有很多并发,则需要很多进程 如果用一

是在高并发的服务器开发中,这种网络 IO 的性能奇差。因为

1.进程在 recv 的时候大概率会被阻塞掉,导致一次进程切换

2.当连接上数据就绪的时候进程又会被唤醒,又是一次进程切换

3.一个进程同时只能等待一条连接,如果有很多并发,则需要很多进程

如果用一句话来概括,那就是:同步阻塞网络 IO 是高性能网络开发路上的绊脚石! 俗话说得好,知己知彼方能百战百胜。所以我们今天先不讲优化,只深入分析同步阻塞网络 IO 的内部实现。

在上面的 demo 中虽然只是简单的两三行代码,但实际上用户进程和内核配合做了非常多的工作。先是用户进程发起创建 socket 的指令,然后切换到内核态完成了内核对象的初始化。接下来 Linux 在数据包的接收上,是硬中断和 ksoftirqd 进程在进行处理。当 ksoftirqd 进程处理完以后,再通知到相关的用户进程。

从用户进程创建 socket,到一个网络包抵达网卡到被用户进程接收到,总体上的流程今天用图解加源码分析的方式来详细拆解一下上面的每一个步骤,来看一下在内核里是它们是怎么实现的。阅读完本文,你将深刻地理解在同步阻塞的网络 IO 性能低下的原因!

一、创建一个 socket

开篇源码中的 socket 函数调用执行完以后,内核在内部创建了一系列的 socket 相关的内核对象(是的,不是只有一个)。它们互相之间的关系如图。当然了,这

(编辑:漯河站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读