专栏首页owent网络编程小结

网络编程小结

写这个小结主要是因为之前研究Boost.Asio的时候,其内部使用了很多不同的方法来实现异步网络编程 然后就顺便把一些高级的玩意看了一下,也顺便把以前低级的玩意放到一起,哇哈哈。很多东西只是个人的理解,不一定正确

Socket嘛,最早是在Unix上被设计出来的,所以Unix上嘛,显然性能要好一点点。

最早接触的网络编程应该是阻塞型Socket吧,就是所有操作都等操作完成了才干下面的事 这样的话如果是很多很多连接,那就要有很多很多进程,如果1万条连接,那么CPU除了线程资源调度,其他就不要干什么事了

所以就来了非阻塞型Socket这种Socket操作是立即返回滴,但是由于socket数据是在内核态,所以每次要枚举所有的socket,才能知道有没数据。so,如果连接数一多,也就只能在系统调用间穿梭来,跑回去。

所以,就来了后面的IO复用机制。

IO复用里,最简单的应该就是select了吧,select是同步IO复用机制 这个操作在Windows下和Linux下都支持。使用上基本一样,但是还是有一点点小区别。之前写了个适配的东东,可以参照下 https://github.com/owent-utils/c-cpp/tree/master/src/Socket 其实select和非阻塞型Socket的自己轮询差不多,但是是在内核态完成的,所以效率稍微高一点。但是有socket可用的时候,会发生数据拷贝,把数据copy到用户态里来。 而且select受进程打开文件个数的限制,一般是1024或者2048,应该很少有BT人物和我们这开发机一样把文件个数设为好几十万的吧。 而且select每次也是每个socket枚举一遍的,然后sleep一下,再枚举,所以连接数高了以后,性能急剧下降。

接下来就是poll,也是同步IO复用机制 他的实现原理和select一样,就是改成了由系统通知用户关心的事件,没了打开文件个数的限制。但是也是内部枚举,所以连接数高了以后,效率仍然存在问题。

再接下来就是epollkqueue了,这两个也都是同步IO复用,但是他们是基于事件的,Linux里有epoll,FreeBSD里有kqueue 他们都是向系统注册关系的事件,然后系统在事件发生是返回。并且其内部的数据是mmap进内核态的,就少了一次拷贝 epoll和kqueue主要部分是一样的,性能相差也不大 使用epoll的时候,还可以一起使用一个linux内核里比较新的东西,eventfd。这玩意可以用来代替进程锁或者代替管道来进行进程或线程间的事件通知,简化了很多操作的说。eventfd会创建一个可以被read和write的描述符,拥有一个uint64_t型的计数器,每次write的时候都是累加的,read的时候把累加的值读出来,所以每次读写都是8字节数据。 并且read时如果eventfd里的计数为0,操作就会阻塞。在释放的时候,一个eventfd的所有句柄都被释放时,资源才会被销毁。类似引用计数,比较Nice。 详见 http://man7.org/linux/man-pages/man2/eventfd.2.html 用epoll+eventfd来实现Boost.Asio的全异步IO,轻松+愉快啊。

其实还有一种操作是 /dev/poll 但是我想偷个懒,就没看这个玩意。好像区别不太大,就是用了 /dev/poll 这个驱动来完成事件响应

最后一个就是Windows下的全异步IO复用模型的IO Complete Port了 详细说明看这里 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.11).aspx 微软的说明书太绕了,所以示例看这里 http://blog.csdn.net/likexx/article/details/5222762 和前面的epoll和kqueue不一样的是,IO Complete Port可以拿来管理一个线程池(通过某接口把线程block掉的方式),在IO可用时数据下发到某个线程里操作。 这个使用流程基本和Boost.Asio一样,只是Asio在外面有加装了一层io_service来管理所有服务。他们的回调都可以是异步的。所以也省了一些自己写线程调度的麻烦

这篇总结写得比较乱,也懒得整理了。仅是写个小总结,普及一下知识。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【倒计时7天】2018教育部-腾讯公司产学合作协同育人项目申请即将截止!

    腾讯高校合作
  • 中国互联网协会发布:《2018中国互联网发展报告》

    在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

    钱塘数据
  • 考研英语-1-导学

    英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

    用户1335799
  • 【系统设置】CentOS 修改机器名

    ken.io
  • 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

    haifeiWu
  • 不只是软件,在线也可以免费下载百度文库了。

    不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

    课代表
  • 理工男图解零维到十维空间,烧脑已过度,受不了啦!

    让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

    钱塘数据
  • SQL中GROUP BY用法示例

    GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

    Awesome_Tang
  • ISUX Xcube智能一键生成H5

    腾讯ISUX
  • 知识体系解决迷茫的你

    最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

    桃翁

扫码关注云+社区

领取腾讯云代金券