0%

上一篇 nanomsg源码阅读(二),介绍了nanomsg的实用工具类utils模块,这篇将试图解析下nanomsg最核心的aio(即用线程池模拟带状态机的异步IO)模块,当然这里的IO是广义上的IO,包含了用户自定义事件的输入输出,后面的分析中我们会看到。

定时任务集合:timerset.h timerset.c

采用有序链表方式实现,新增定时任务时,根据到期timeout时间,排序插入,最近到期置于链表头,通过nn_timerset_timeout函数获取最近到期时间与当前时间的差,作为参数传入nn_poller_wait

IO多路分离器:poller.h poller.c poller_kqueue.h poller_kqueue.inc poller_epoll.h poller_epoll.inc poller_poll.h poller_poll.inc

我的Post not found: thoughts-about-io 关于IO的这篇文章提到常用的IO多路分离器,网上对他们各自的对比也有很多,这里不再细述了,值得注意的是nanomsg打开任意的fd都会设置CLOEXEC标志(出于安全方面的考虑)。

阅读全文 »

IO简介

The C10K problem提出后,不仅给web服务器的代码设计开发提供了思路,也给整个网络通信的架构提出了建议和意见,于是各种eventloop层出不穷(libevent/libev/libuv/redis的ae/nginx的event等等,这样的说法可能不正确,这些代码的出现应该是伴随着C10K问题完善的)。

《UNIX网络编程》将IO模型分为五类:阻塞式IO/非阻塞式IO/IO多路复用/信号驱动式IO/异步IO(参考:《Unix系统的IO模型》),而IO的多路分离及异步非阻塞这样的通信模型几乎集成在目前所有的高性能服务端程序框架中。

个人理解

下面谈谈我对他们的理解:

关于IO的多路分离

IO的多路分离器有select,poll,dev/poll,epoll,kqueue等,网络上已经有很多对他们的对比和解释,此处不再赘述了。

值得关注的是,从陈硕大牛的这篇《Linux 新增系统调用的启示》中可以发现linux kernel引入了timerfd,signalfd,eventfd后,带来的好处在于我不需要再自己维护一个timer结构(list或者rbtree)便可处理timeout事件了,不需要makepipe便可处理signal事件了,而eventfd不仅提供一种线程间通信方式,实际上也为用户级事件提供了接口(实际上nanomsg正是用它来处理task的)。这样我们在linux上实现一个eventloop要容易很多,通过接口创建对应事件的fd后加入到epoll池中即可,当然需要注意的是可能要设置最大打开句柄数(ulimit -n,默认的1024可能不一定够用)。

阅读全文 »

上一篇 nanomsg源码阅读(一),简单介绍了下nanomsg的代码框架。这篇开始,我将深入代码细节,从基础的实用工具类开始一窥nanomsg的真面目。

精细类型定义:int.h

stackoverflow上有人回答了关于int和精细类型的差异,C程序员还是推荐在知道具体长度或需要明确具体长度时用精细类型取代int。

windows下老版本的MSVC没有定义stdint.h,需要自己包装;Solaris 和 OpenVMS下定义在<inttypes.h>里;posix下采用<stdint.h>头文件。

windows相关:win.h

包含了windows下的几个头文件,同时define了ssize_t为int

1
2
3
4
5
6
7
#include <windows.h>
#include <winsock2.h>
#include <mswsock.h>
#include <process.h>
#include <ws2tcpip.h>

#define ssize_t int
阅读全文 »