开源软件实践之linux高性能服务器编程框架和选型
很多人学习编程技术一般都通过一本编程语言的入门书籍,然后尝试做一些例子和小项目。但是这些都不能让我们深入的学习很多的编程技巧和高深技术,当然这个时候很多有经验的学习人员就会告诉大家,找一个好的开源软件理解它的设计与实现原理,阅读开源项目的源代码,都知道源码之前了无秘密。我也承认读源码能够快速提高我们的编程能力和编程思维,我也经常研究很多项目的源代码,有些是工作需要,有些是兴趣。但是我今天想说的都不是这些,我想说的是更高一层的学习方案,就是通过自己的实践实现一个开源软件,也许这个开源软件没有任何人使用,但是在实现的这个过程中你会学习到很多,因为实现一个真正的开源软件需要使用到很多编程知识和技巧,这就会驱使你不断去学习这些编程知识和技巧,学会之后能够马上用于实践,真正实践完成以后你对这些编程知识和技巧理解就更深入了。
我目前就正在做这样一件事情,我选择的是实现一个类似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高性能服务器编程 (一) --Tcp/Ip协议族
前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...
- Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程: 2 读取和设置线程属性: 3 线程同步方式:POSIX信号量,互斥锁和条件变量 ...
- Linux 高性能服务器编程——多进程编程
问题聚焦: 进程是Linux操作系统环境的基础. 本篇讨论以下几个内容,同时也是面试经常被问到的一些问题: 1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调 ...
- Linux 高性能服务器编程——I/O复用
问题聚焦: 前篇提到了I/O处理单元的四种I/O模型. 本篇详细介绍实现这些I/O模型所用到的相关技术. 核心思想:I/O复用 使用情景: 客户端程序要同时处理多个socket ...
- Linux 高性能服务器编程——高性能服务器程序框架
问题聚焦: 核心章节. 服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...
- Linux 高性能服务器编程——Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...
- Linux 高性能服务器编程——Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字(so ...
- Linux 高性能服务器编程——TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一 ...
- Linux 高性能服务器编程——IP协议详解
1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的. ...
随机推荐
- 对于java用发送http请求,请求内容为xml格式
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStr ...
- 使用约束给tableview添加暂无数据的提示
在tableview没有数据的时候,我们经常需要在tableview的正中间插入一张图片,来提示用户暂无数据 /** * 添加一个view,提示暂无数据 */ - (void)addPromptVie ...
- JavaSE学习总结第05天_Java语言基础1
05.01 方法概述和格式说明 简单的说:方法就是完成特定功能的代码块 在很多语言里面都有函数的定义,函数在Java中被称为方法 格式: 修饰符返回值类型方法名(参数类型参数名1,参数类型参数名2 ...
- 子进程管理模块subprocess
subprocess模块允许你生成子进程,连接管道,并获取返回的代码. 一.使用subprocess模块 模块中定义了一个Popen类: subprocess.Popen(args, bu ...
- Mysql 外键设置
MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 有些人认为外键的建立会给 ...
- leetcode 15. 3Sum 双指针
题目链接 给n个数, 找出三个数相加结果为0的所有的组, 不可重复. 用双指针的思想,O(n^2)暴力的找, 注意判重复. class Solution { public: vector<vec ...
- python成长之路17
一:web框架的本质,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1.1:python实现: #!/usr/bin/env python ...
- 解决ASP.NET回传后div滚动条位置复位的问题
中心思想:用一个隐藏控件保存当前scorll值.回传回来后根据scrollTop的值,然后在Page_Load中重新设置scrollTop. 首先是为DIV添加一个 onscroll="ja ...
- cyq.data开源
终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了 前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也 ...
- nginx配置ssl加密(单双向认证、部分https)
nginx配置ssl加密(单双向认证.部分https) nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始 ...