- 论坛徽章:
- 0
|
看到不少地方在搭建一些性能要求高的socket服务,然后看人家在讨论i/o模型,然后引起我的兴趣看看linux网络的内核代码;把驱动到传输层的代码过了一遍后,才发现原来socket服务的搭建问题都集中在如何管理大量的连接问题以及一些多线程多进程问题;
实际上linux内核网络内码于此相关需要注意的东西不多,每个ip包到达后,内核会提取出saddr daddr port 信息然后__xx_lookup_hash 找相应的sock结构(体现在用户层就是fd),然后通知相应的fd数据已经准备好了,可以读取;
考虑到成千上万的client,所以每个client对应一个进程或线程不现实,然后就出来epoll模型。但是对于内核来讲所做的通知工作没有改变,都是通过sock->sk_sleep,然后wakeup实现;所以只是表现出来的形式有所变化,但是涉及内容实在不多;
再看epoll模型,建议有兴趣的兄弟先看看select.c中普通poll的实现方式,否则可能会有点看糊涂;poll的方式就是把需要通知的多个fd挂到sk_sleep的等待队列wait queue上,再利用内核wakeup时有个回调func的功能实现的,然后eventpoll 会利用func的功能多些。
eventpoll看起来通过一个独立的文件系统实现的,不过不用看到文件系统感觉太内核,其实linux除了(ext2,3)其他严格讲不叫文件系统,称文件系统类型的接口比较合适,内核其实只有一种文件系统,其他都是扩充;就像eventpollfs提供了用户层和内核层的一个接口;
所以socket服务做得好,如果不满足于epoll,可以建自己的接口文件系统,再不满足可以改tcp/udp对sock的管理部分代码,如果有自己在处理逻辑,就该协议;应该讲协议栈不难,而且相对独立,不过内核相关代码的难度还在对内核和体系结构的熟悉程度,不然做不了这个事;但是内核编程还是能做高端的事,也能赚钱; |
|