分析源码的第一步便是要弄清整个系统设计结构,模块组成。
系统设计
Mathopd是一个单进程单线程的HTTP服务器程序。单进程单线的构建决定了其简单的设计结构。系统采用的是select多路复用,来处理并发连接。现在的Linux2.6内核支持epoll,它比select更高效。作者可能最初在2.4内核上开发,或是想保持和2.4内核的兼容性而采用了select。但作者对select进行了封装(参见poll-emul.c文件),使接口用起来像poll,这个封装方便了接口的使用。
Mathopd系统维护了4种连接队列,分别表示连接的4中不同状态,分别是:
free_connections: 空闲连接队列
waiting_connections: 等待连接队列
reading_connections: 读连接队列
writing_connections: 写连接队列
一个连接发起HTTP请求,其状态在请求的生命周期内不断变化。个人认为,Mathopd设计的如此简洁,这4种连接队列的设计功不可没。在以后的文章中我将着重分析这4种连接队列。状态的变化调用set_connection_state函数,可将一个连接对象从一个状态队列移动到另一个状态队列。
模块组成
Mathopd可分为如下几个模块:
1. 核心模块 : 主要是维护上面提到的4种状态队列,并负责数据的收发;
2. 请求模块 : 分析并处理客户端的请求;这个模块最复杂;
3. 配置模块 : 这个模块很重要,主要是读取文件的配置信息,对系统进行配置。作者的这个模块设计的很好,用了编译原理中词法分析的自动状态机的思想,以后会详细分析此模块。
4. 日志模块 : 用来记录系统运行日志。
5. CGI模块 : 用来处理CGI脚本
6. Util模块 : 最简单,一些实用的函数集。
接下来的文章将介绍Mathopd服务器的启动过程。它为你设计Linux下服务器程序的启动提过了蓝本。 阅读全文
类别:Mathopd 查看评论
系统设计
Mathopd是一个单进程单线程的HTTP服务器程序。单进程单线的构建决定了其简单的设计结构。系统采用的是select多路复用,来处理并发连接。现在的Linux2.6内核支持epoll,它比select更高效。作者可能最初在2.4内核上开发,或是想保持和2.4内核的兼容性而采用了select。但作者对select进行了封装(参见poll-emul.c文件),使接口用起来像poll,这个封装方便了接口的使用。
Mathopd系统维护了4种连接队列,分别表示连接的4中不同状态,分别是:
free_connections: 空闲连接队列
waiting_connections: 等待连接队列
reading_connections: 读连接队列
writing_connections: 写连接队列
一个连接发起HTTP请求,其状态在请求的生命周期内不断变化。个人认为,Mathopd设计的如此简洁,这4种连接队列的设计功不可没。在以后的文章中我将着重分析这4种连接队列。状态的变化调用set_connection_state函数,可将一个连接对象从一个状态队列移动到另一个状态队列。
模块组成
Mathopd可分为如下几个模块:
1. 核心模块 : 主要是维护上面提到的4种状态队列,并负责数据的收发;
2. 请求模块 : 分析并处理客户端的请求;这个模块最复杂;
3. 配置模块 : 这个模块很重要,主要是读取文件的配置信息,对系统进行配置。作者的这个模块设计的很好,用了编译原理中词法分析的自动状态机的思想,以后会详细分析此模块。
4. 日志模块 : 用来记录系统运行日志。
5. CGI模块 : 用来处理CGI脚本
6. Util模块 : 最简单,一些实用的函数集。
接下来的文章将介绍Mathopd服务器的启动过程。它为你设计Linux下服务器程序的启动提过了蓝本。 阅读全文
类别:Mathopd 查看评论
浙公网安备 33010602011771号