`
xombat
  • 浏览: 162526 次
  • 性别: Icon_minigender_1
  • 来自: 乌托邦
社区版块
存档分类
最新评论

探讨一下web服务器的设计,有没有更好的设计方法

阅读更多

在学习 Linux编程方面,最近我写了一个 web服务器程序,使用 linux下的纯 c写的, web服务器能基本实现动态服务请求和静态服务请求。但是我总觉得我的设计不是很好,下面我说一说我的设计,你们看看有没有什么更好的设计。

web服务器的静态服务请求的实现使用的是线程池,由主线程统一获得连接请求,然后将已连接描述符压到一个缓冲区中,线程池中的空闲线程从缓冲区中获得描述符(这里使用互斥量维持线程间的同步),如果发现是静态的请求,就直接回应请求,如果是动态请求,就将描述符压到另一个缓冲区中。

这里有一个线程,和一个进程池共同来服务动态请求。这个线程使用i/o 复用和进程通信,发现进程有空闲的就将缓冲区中的动态请求的描述符发送给这个进程,因此这个线程主要作为进程的调度。

进程通过生成一个子进程,调用服务器目录中的cgi 程序来服务动态请求。

虽然程序已经编出来了,但是我总感觉程序太复杂,为了实现两个简简单单的功能( 动态服务和静态服务) ,居然要使用如此多的复杂的技术。之所以使用线程,是因为他在性能方面高于进程,之所以使用线程池,是因为这样能减少后期生成线程的性能影响。之所以又使用进程,是因为我还不知道如何使用线程来服务动态请求。

我问过几个老师,但可能他们的方向没有在这里,因此都没有提出多少可行的建议。我总感觉这个设计方法不是很好,一定会有很多需要改进的地方,比如在设计复杂度上需要改进,比如在描述符的共享上会有更好的设计,等等。我也不知道apache 的设计是怎样的,希望大家讨论给点指点,非常感谢

分享到:
评论
8 楼 4google 2007-07-25  
恩 楼上的想法 跟我差不多 而且我正在想一个socks5 server的实现。
7 楼 RyanPoy 2007-07-04  
上面发贴格式错了,删了吧。
我重发。

引用

这堆线程是哪里来的?预先创建的话,这些线程就组成了线程池。

我说了。我只是做了一个线程数组而已。这个离一个线程池还有很远的距离。一个线程池至少要能管理这堆线程,包括运行,挂起,休眠,中断等等。而我的却很简单。这个数组里面的线程一直都活着。每次都去任务队列里面取任务。没有取到就休眠一段时间。然后再取。取到即工作。
关于IO复用。我看了你的说明。然后又找了点资料。发现是自己把问题想错了。我把非阻塞的socket误当成是io复用。
然后,查了些资料。发现,对于select函数。效率不是很高。因为是采用轮询的方式来判断。现在很多人都推荐使用epoll。
我想,我离实现web服务器应该还有段距离。首先,工作重心不在这。然后,目前空闲时间也不多。等我把这段时间的工作搞定,我再研究下。到时候,跟你讨论。
6 楼 RyanPoy 2007-07-04  

这堆线程是哪里来的?预先创建的话,这些线程就组成了线程池。

我说了。我只是做了一个线程数组而已。这个离一个线程池还有很远的距离。一个线程池至少要能管理这堆线程,包括运行,挂起,休眠,中断等等。而我的却很简单。这个数组里面的线程一直都活着。每次都去任务队列里面取任务。没有取到就休眠一段时间。然后再取。取到即工作。
关于IO复用。我看了你的说明。然后又找了点资料。发现是自己把问题想错了。我把非阻塞的socket误当成是io复用。
然后,查了些资料。发现,对于select函数。效率不是很高。因为是采用轮询的方式来判断。现在很多人都推荐使用epoll。
我想,我离实现web服务器应该还有段距离。首先,工作重心不在这。然后,目前空闲时间也不多。等我把这段时间的工作搞定,我再研究下。到时候,跟你讨论。
5 楼 xombat 2007-07-03  
引用
然后一堆的线程去不停的访问这个序列。
这堆线程是哪里来的?预先创建的话,这些线程就组成了线程池。

socket池这个名词我也没接触过。
用c语言写的东西,即使你实现了一个功能我也不知道它能对上哪个名词,当时实现线程池的时候,我自己给他选了个名字,叫预线程,因为是预先生成一堆线程,让老师看的时候这把老师给弄懵了,我说了说原理,老师说这不就是线程池嘛。

io复用:
假如要编写一个特殊的服务器,它既要对网络客户端的请求作出反应,又要对用户从标准输入端的交互命令作出反应,怎么办呢?如果先等待前者,后者就不会被响应,反之又会影响前者的响应。io复用就可以解决这个问题,它使用select函数,要求内河挂起进程,当有一个或多个i/o事件发生时,才将控制权返回给应用进程,同时通知应用程序准备好的描述符集合。
4 楼 RyanPoy 2007-07-03  
说实话,看了你的关于这个讨论。我觉得我没有到你的层次。至少我都不晓得你这得动态请求和静态请求都是什么。我现在做的只是一个简单的socket通信。因为要把一台服务器的的数据分散到几台服务器上。所以,才开始做这个东西的。我实现的东西比较简单:1个Thread,一直在accept,一旦accept成功,则把socket加入到一个序列中。然后一堆的线程去不停的访问这个序列。有东西,则拿出来,然后作相应的处理。原理就是这么简单。没有用到socket池。线程池也没有用到。只是一个线程数组而已。下一步,就是想做成socket池的。然后想采用你说的io复用。说来惭愧,查了n多资料。至今对io复用也没有一个完整的认识。也不知道什么是io复用。不知道你能否说一下。如果能有一个小demo,那就更好。嘻嘻。没想到到头来变成要代码的了。惭愧啊,惭愧!
3 楼 RyanPoy 2007-07-03  
我在圈子里提了这个问题。http://cpp-circle.group.iteye.com/group/topic/1823
然后你如下回复。
xombat 写道
自己写? 我也用c语言写过web服务器,你那个问题我解决过,就是sigpipe信号的处理问题。

我没看你的代码,不知道你的服务器是怎么设计的,我可以说一说我的服务器设计,我总觉得不好,太过复杂,大家可以商讨商讨。

索性写了一篇博客,设计就在这里了:
http://xombat.iteye.com/admin/show/93518

我就来了。
2 楼 xombat 2007-06-25  
非常感谢
1 楼 iunknown 2007-06-24  
关于使用线程池实现 web server ,可以对照一下
http://iunknown.iteye.com/blog/78561

关于 apache 提供的不同 MPM 模块,可以参考

http://blog.csdn.net/tingya/archive/2006/08/09/1040799.aspx

http://blog.csdn.net/tingya/archive/2006/08/28/1133825.aspx

http://blog.csdn.net/tingya/archive/2006/08/28/1133836.aspx

Apache中预创建Preforking MPM 机制剖析

相关推荐

    编写可扩展的高质量代码的高级 JavaScript 概念 深入研究该语言最先进的概念和技术,以构建更好、更强大的 Web 应用程

    JavaScript 是一种功能强大的编程语言,广泛用于 Web 开发、服务器端脚本等。虽然它对初学者来说学习起来很容易,但 JavaScript 也可用于构建需要许多高级编程概念的复杂应用程序和系统。 在这篇文章中,我将解释...

    web安全-dvwa实战手

    本文档旨在提供DVWA靶场的攻略和实践技巧,帮助用户更好地理解和应对Web应用程序漏洞,其主要分类为 1。DVWA部署暴力破解:介绍如何使用DVWA模拟暴力破解攻击,即通过尝试大量的用户名和密码组合来尝试登录系统,以...

    二十三种设计模式【PDF版】

    为能和大家能共同探讨"设计模式",我将自己在学习中的心得写下来,只是想帮助更多人更容易理解 GoF 的《设计模式》。由 于原著都是以C++为例, 以Java为例的设计模式基本又都以图形应用为例,而我们更关心Java在中间件等...

    微服务设计与解决方案.docx

    回忆一下微服务架构是如何一步一步进化产生的,最早是应用是单块架构,后来为了具备一定的扩展和可靠性,就有了垂直架构,也就是加了个负载均衡,接下来是前几年比较火的SOA,主要讲了应用系统之间如何集成和互通,...

    基于J2EE架构下网络教学平台的设计与实现

    提供更好的扩展接口Web Service(SOAP/XML)到其 它相关系统等。 同时通过标准和可重用的J2EE技术(如:JSP, Servlet,EJB组件等),可以快速和安全的部署实施 网络教学远程培训的基础设施。 2 实现网络教学平台的几种J2EE...

    网站设计方案(完整版).doc

    3、面向各类用户XXXX提供信息发布、意见反馈的处理平台,加强与社会的沟通,更好地 提供信息服务; 4、内部建立信息内容的编辑、审核、发布的严格审批流程,确保发布信息的严肃性、严 谨性; 5、按照XX公司外部信息...

    asp.net知识库

    如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然...

    计算机论坛开发毕业设计.doc

    在WEB 服务器上,利用ASP.NET技术等技术,实现了一个很简单的网上在线论坛系统,并详细讨论 了该系统的结构及其实现过程。具有显示版面、查看版面、查看贴子、查看发表的贴子 、查看跟帖内容、用户注册、用户登入、发表...

    数据库原理(第5版)

    最后,附录E给出了启动和运转Microsoft IIS Web服务器、PHP和Eclipse PHP开发工具(PDT)的详细指导,这些将有助于我们更好地学习第7章。 在快速变化的环境下保持最新 为使数据库的概念在各版中保持最新,我们将根据...

    办公自动化网络安全防护策略探讨.docx

    办公自动化网络安全防护策略探讨全文共4页,当前为第1页。办公自动化网络安全防护策略探讨全文共4页,当前为第1页。 办公自动化网络安全防护策略探讨 办公自动化网络安全防护策略探讨全文共4页,当前为第1页。 办公...

    Junit In Action 学习笔记----下载不扣分,回帖加1分,童叟无欺,欢迎下载

    随着测试越来越复杂,我们把用junit创建更好的测试方案来展现。 第2章:进一步深入研究了Junit的类,生命周期和框架。为了把这些联系起来,我们描述了一些 测试的方法和例子。 第3章:描述了一个复杂的TestCase...

    大名鼎鼎的IBM公司 Ajax 培训资料

    好消息是您可能已经非常熟悉其中的大部分技术,更好的是这些技术都很 容易学习,并不像完整的编程语言(如 Java 或 Ruby)那样 困难。 下面是 Ajax 应用程序所用到的基本技术:  HTML 用于建立 Web 表单并确定...

    计算机专业毕设ASP+ACCESS房产信息管理系统(源代码+论文).rar

    对于计算机专业的学生来说,这是一个很好的学习和实践平台,可以帮助他们更好地掌握ASP和ACCESS数据库技术,提高解决实际问题的能力。同时,该项目也可以作为其他类似应用场景的参考案例,具有一定的推广价值。

    ASP.NET 2.0 跟我一起学Visual.Studio2005 1/9

    开发人员,测试人员,技术架构师,公司领导,文档人员等项目团队成员之间的有效的沟通在项目时间较长,项目较大的项目中,总是存在较多瓶颈,产生一些无法预料的风险,利用VSTS Team Foundation Server可以更好地使...

    ASP.NET 2.0 跟我一起学Visual.Studio2005 2/9

    开发人员,测试人员,技术架构师,公司领导,文档人员等项目团队成员之间的有效的沟通在项目时间较长,项目较大的项目中,总是存在较多瓶颈,产生一些无法预料的风险,利用VSTS Team Foundation Server可以更好地使...

    Java编程思想(完整版)

    “尽管以C++为基础,但Java是一种更纯粹的面向对象程序设计语言”。 无论C++还是Java都属于杂合语言。但在Java中,设计者觉得这种杂合并不象在C++里那么重要。杂合语言允许采用多种编程风格;之所以说C++是一种杂合...

    详解HTML5中表单验证的8种方法介绍

    另一方面,设计表单验证是为了让Web应 用更快地抛出错误。换句话说,最好利用浏览器内置的处理机制来告知用户网页内包含无效的表单控件值。过去,数据在网络上转一圈,仅仅是为了让服务器通知用 户他输入了错误的...

    linux管理员指南

    第2章介绍Linux的安装过程,但是又有一些独到的内容:我们没有机械地重复软件本身提供的安装事项,而是帮助你把Linux系统专门配置成为一台作为服务器使用的计算机。第3章继续介绍安装过程,讲述如何设置两种Linux...

    JAVA自学之路

    有没有过这样的感觉,一本书的上册没有学好,觉着下册心里也没底儿,甚至非要把上册复习一遍才敢继续学习。如果你也是这样,要去看看心理医生啦,没准儿会有洁癖的毛病。 任何事情都要追求完美才敢继续往后进行,是...

Global site tag (gtag.js) - Google Analytics