很多人学习编程技术一般都通过一本编程语言的入门书籍,然后尝试做一些例子和小项目。但是这些都不能让我们深入的学习很多的编程技巧和高深技术,当然这个时候很多有经验的学习人员就会告诉大家,找一个好的开源软件理解它的设计与实现原理,阅读开源项目的源代码,都知道源码之前了无秘密。我也承认读源码能够快速提高我们的编程能力和编程思维,我也经常研究很多项目的源代码,有些是工作需要,有些是兴趣。但是我今天想说的都不是这些,我想说的是更高一层的学习方案,就是通过自己的实践实现一个开源软件,也许这个开源软件没有任何人使用,但是在实现的这个过程中你会学习到很多,因为实现一个真正的开源软件需要使用到很多编程知识和技巧,这就会驱使你不断去学习这些编程知识和技巧,学会之后能够马上用于实践,真正实践完成以后你对这些编程知识和技巧理解就更深入了。
我目前就正在做这样一件事情,我选择的是实现一个类似nginx的高性能http服务器。选择这个的理由很简单,我在一个互联网公司,http协议和http服务器经常和我打交道,在架构设计和分布式系统实现的时候可能都需要考虑这些。我开源的地址如下:https://github.com/brucewoo/JHttpServer,如果你也对这个感兴趣可以一起参与,包括设计功能,架构和实现。做这个开源项目的唯一目的就是学习,通过实践的方式来学习。关于这个开源软件的一切我都会以博客或者wiki的方式记录,包括每一个模块实现的原理,考虑,设计等等,可能还有核心代码的解读,争取做第一个学习型的开源软件。虽然这个开源项目没有实际的需求来驱动,但是nginx就是我的目标和超越的对象,当然实现的过程中肯定会借鉴其他很多开源软件的设计思想和编程思维,也会借鉴某一个模块或者功能的实现,或者基于改进。
说了这么多一点儿也没有和标题扯上关系,今天就是为我这个开源软件写的第一个博客,实现一个高性能的网络服务器的第一个就需要选择一个很好的高性能编程框架,今天就分析这个,这个也算自己开始前的准备,学习高性能服务器编程框架:
网络服务器的编程步骤就不需要多介绍了,有网络编程知识的都很清楚。首先对网络服务器组成的基本软件模块做一个简单的说明,如下表:
服务器基本软件模块
模块
|
单机
|
集群 |
I/O处理单元
|
处理客户端连接,读写网络数据 |
作为介入服务器,实现负载均衡 |
逻辑单元 |
业务进程或者线程 |
逻辑服务器 |
网络存储单元
|
本地数据库,文件或者缓存
|
数据库服务器 |
请求队列
|
各单元之间的同学方式
|
各服务器之间的永久tcp连接 |
既然上面提到的第一个模块是IO处理单元,我们就分析和学习一下IO模型,IO处理单元主要处理客户端连接,接收客户端发送过来的数据,还有就是返回服务器返回给客户端的数据。下面还是通过表格的方式展示IO模型,如下:
IO模型 |
读写操作和阻塞阶段 |
阻塞 |
程序阻塞于读写函数 |
复用 |
程序阻塞于IO复用系统调用,但可同时监听多个IO事件。对IO本身的读写操作是非阻塞的 |
SIGIO信号 |
信号触发读写就绪事件,用户程序执行读写操作,程序没有阻塞阶段 |
异步 |
内核执行读写操作并触发读写完成事件,程序没有阻塞阶段。 |
下面在说说高效的事件处理模式:
三类事件,IO事件,信号和定时事件;两种高效的事件处理模式:Reactor和Proactor。
(1)先说说Reactor模式:主线程负责监听文件描述上的事件,然后把事件丢给工作线程处理。下面以epoll模型为例说明处理流程:
1) 主线程往epoll内核事件表中注册socket的读就绪事件;
2)主线程调用epoll_wait等待socket上有数据可读;
3)当socket上有数据可读时,epoll_wait通知主线程,主线程将可读事件放入请求队列;
4)工作线程被唤醒,读取客户端数据,处理客户端请求然后往epoll内核事件表中注册socket上的可写就绪事件;
5)主线程继续调用epoll_wait等待socket可写事件;
6)socket可写,epoll_wait通知主线程,主线程放入socket可写事件到请求队列;
7)工作线程处理可写事件。
(2)再说说Proactor模式:今天已经很晚,改天再下一篇博客继续介绍。
分享到:
相关推荐
本书信息《 Linux高性能服务器编程》和《 Linux多线程服务端编程:使用muduo C ++网络库》的笔记和源码,以及两个轻量级服务器的项目代码。 GitHub: : 参考链接raichen / LinuxServerCodes:Linux高级服务器编程...
high_performance_linux_server_programming Linux高性能服务器编程(游双)源码
第四部分向大家推荐一系列互联网开发、应用相关的开源软件,也作为我们对开源软件选型方法的实践。此外,在附录中给出了一个软件评估规范的参考范本和一些开源软件相关知识点的详细介绍。 《开源软件成熟度评估及...
c# mqtt高性能服务器端源代码。 你还在使用第三方服务软件吗?不如试试这个开发框架,助你一臂之力,无限制,无全开源,无版权约束,全是自主开发。 开源框架包括服务器和客户端,支持mqtt3.0及5.0。 可嵌入到自己的...
内容包含Linux系统概述、Linux编程环境、Linux文件系统简介、Linux下的进程和线程、TCP/IP协议族、应用层网络服务程序、TCP编程、主机信息获取、数据IO复用、UDP编程、高级套接字、套接字选项、原始套接字、服务器...
物联网的通信协议MQTT,MQTT服务器和客户端的选型,MQTT协议的 一些资料
PHP 教程 一个高性能的PHP框架 php快速开发框架 免费开源的轻量级、高性能PHP框架
·利用免费的开源工具进行测量、监控、系统跟踪以及基准测试 ·对性能数据加以解读,以便分析linux服务器的真实行为.. ·优化linux系统的调度器、内存、i/o、文件系统和网络 ·对运行商业工作负荷的web、文件、...
阿里开源的额高性能 RPC 框架。.zip,Apache Dubbo is a high-performance, java based, open source RPC framework.
第7章 开源软件之框架和库 7.1 Spring 7.2 Struts 7.3 JBossSeam 7.4 Equinox 7.5 Hibernate 7.6 iBATIS 7.7 Lucene 7.8 Webkit 第8章 开源软件之服务器软件 8.1 ApacheHTTP服务器 8.2 Tomcat 8.3 Jetty 8.4 ...
Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一...
第二部分讲述了Linux系统的C编程环境,详细讲述了Linux下C语言编译器(如GCC)、调试工具(如GDB)和程序自动维护工具的使用方法。第三部分详细介绍Linux的系统调用。最后,是一个实现shell简单功能的命令解释器的实例。...
NMS开源软件选型分析评估报告 包括openNMS, zenoss, catci等的比较
orkerman-chatorkerman是一款纯PHP开发的开源高性能的PHP socket服务器框架。被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、硬件通讯服务器、智能家居、车联网、物联网等领域的开发。支持TCP长...
Pony 是开源,actor模型,功能安全,高性能的编程语言
SS5 Linux 下开源的 Socket5 代理软件
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》以构建高性能Linux服务器为核心内容,从Web应用、数据备份与恢复、网络存储应用、运维监控与性能优化、集群高级应用等多个方面深入讲解了如何构建高性能...
EwoMail是基于Linux的开源邮件服务器软件,集成了众多优秀稳定的组件,是一个快速部署、简单高效、多语言、安全稳定的邮件解决方案,帮助你提升运维效率,降低 IT 成本,兼容主流的邮件客户端,同时支持电脑和手机...
简单的volley开源框架的使用案例,代码经过测试没有问题,教你如何使用volley框架进行网络编程,实现安卓客户端与服务器的通信。