`
xombat
  • 浏览: 163501 次
  • 性别: 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 机制剖析

相关推荐

    拟态构造的Web服务器异构性量化方法.pdf

    通过这种方式,可以更好地设计和配置拟态构造的Web服务器,以达到最佳的安全状态。 总结来说,本文的贡献在于提出了一种用于量化拟态构造Web服务器异构性的有效方法,这有助于我们更好地理解和优化这种新型安全防御...

    最好的web服务器(个人认为)

    在IT领域,Web服务器是构建和运行互联网应用的基础。...本文将深入探讨“最好的Web服务器”这一主题,以及如何根据个人需求选择合适的服务器。...在不断学习和实践中,我们可以更好地理解和优化我们的Web服务器设置。

    miniweb服务器一键搭建静态网站

    标题中的"miniweb服务器一键搭建静态网站"表明我们要讨论的是一个小型、简易的Web服务器软件,主要用于快速构建静态网页服务。这种服务器可能设计简洁,易于安装和操作,适合个人开发者或者小型团队进行本地开发和...

    Web程序设计13 Web程序设计13 Web程序设计13 Web程序设计13

    下面将详细探讨Web程序设计的相关知识点。 首先,Web程序设计的基础是HTML(超文本标记语言),它是网页内容的结构化表示。HTML5是当前的标准,提供了更多的元素和功能,如音频、视频和离线存储,以提升用户体验。 ...

    web服务器编程代码

    在实际开发中,这样的简单Web服务器可能用于学习目的,或者作为更复杂服务器架构的基础组件。例如,它可以作为一个轻量级的本地开发服务器,用于测试静态网页或API。此外,这样的服务器可能不支持所有HTTP特性,比如...

    web服务器控件与html服务器控件的区别及用法

    本文将深入探讨这两种控件的特点、用法及其适用场景,帮助开发者更好地理解并选择合适的控件。 #### Web服务器控件与HTML服务器控件概述 - **Web服务器控件**:这是ASP.NET框架提供的一系列内置控件,如Button、...

    基于STM32的嵌入式web服务器的设计

    本文以设计基于STM32的嵌入式Web服务器为主题,探讨了在嵌入式系统中如何利用STM32微控制器构建一个能够实现与互联网连接的Web服务器,从而实现远程通信、在线升级和访问互联网资源等多样化功能。 首先,随着半导体...

    VB6.0编写的简易WEB服务器

    VB6.0编写的简易WEB服务器是一个非常适合初学者入门网络编程的项目。VB6.0(Visual Basic 6.0)是微软推出的一种可视化编程工具,以其易学易用的特性,深受程序员喜爱。在这个项目中,我们将探讨如何利用VB6.0构建一...

    Linux- 用C语言实现的简单Web服务器源代码

    首先,让我们了解一下Web服务器的工作原理。Web服务器的主要职责是接收来自客户端(通常是浏览器)的HTTP请求,并根据请求返回相应的HTTP响应。这通常涉及到解析请求头、处理请求方法(GET、POST等)、查找并发送...

    Web程序设计 第5版

    《Web程序设计 第5版》是一本深入探讨Web开发技术的专业书籍,主要针对希望学习或提升Web应用程序设计技能的读者。在当今互联网时代,Web程序设计是不可或缺的技术领域,涵盖前端交互、后端处理以及数据库集成等多个...

    web服务器和tomcat服务器配置

    了解Web服务器和Tomcat服务器的源码能帮助开发者深入理解其工作原理,从而更好地优化性能或定制功能。例如,查看Apache HTTP Server和Tomcat的源代码,可以学习如何处理HTTP请求、管理连接器以及实现Servlet容器。 ...

    多线程web服务器

    在IT行业中,构建一个多线程Web服务器是一项基础但至关重要的任务,这涉及到网络编程、并发处理和HTTP协议的...通过深入研究和实践,我们可以更好地理解和掌握这些核心概念,并将它们应用到更复杂的网络服务开发中去。

    毕业论文-于基龙芯2f平台的web服务器性能测试设计.doc

    通过本文的研究,我们可以更好地了解龙芯2F平台的Web服务器性能测试问题,并探讨龙芯2F平台在Web服务器市场的应用前景。本文的研究结果将对我国计算机产业的发展和龙芯技术的应用产生重要的影响。 知识点: 1.龙芯...

    C#基于TCP写的简单WEB服务器

    本文将深入探讨一个基于C#语言实现的简单TCP Web服务器,标题为"C#基于TCP写的简单WEB服务器"。这个项目主要展示了如何利用C#的网络编程库来构建一个基本的HTTP服务器,以处理GET请求并返回相应的网页内容。 首先,...

    Java Web 服务器原理

    了解这些基础原理后,深入研究Tomcat的源码可以帮助开发者更好地理解Web服务器的内部运作,优化性能,解决故障,甚至为社区贡献自己的改进。通过阅读源码,我们可以学习到线程池管理、请求调度、内存管理等高级话题...

    基于esp8266的精简web服务器

    在本项目中,我们将探讨如何使用ESP8266构建一个简单的Web服务器,该服务器在FreeRTOS实时操作系统上运行,并通过网页控制LED灯。这个项目对于理解网络通信、HTTP协议以及微控制器与硬件交互的基本原理非常有帮助。 ...

    搭建web服务器实验截图

    在IT领域,搭建Web服务器是一项基础且关键的技能,它涉及到网络配置、操作系统管理、安全设置等多个方面。...在未来的学习和工作中,不断深化对Web服务器相关知识的理解,将有助于更好地应对日益复杂的网络环境挑战。

    通用web服务器(支持IOCP)

    本文将深入探讨一款由Delphi10.4集成开发环境(IDE)和INIOCP控件构建的通用Web服务器,该服务器特别支持IOCP(I/O完成端口)技术,以实现高效、低延迟的服务。 首先,我们来理解IOCP(I/O完成端口)的概念。IOCP是...

    web服务器、网站下载、浏览器例程.rar_c web 服务器_web 服务器_web服务器_从web服务器_网络浏览

    对于开发者而言,理解这些概念有助于创建更好的用户体验,而对于普通用户,了解这些基础知识可以帮助他们更好地理解和利用网络资源。 总的来说,Web服务器、网站下载和浏览器是互联网的三大支柱,它们共同构成了...

    nginx高性能web服务器.pdf

    《Nginx高性能Web服务器》是一本深入探讨Nginx技术的权威著作,它涵盖了Nginx的基础知识、配置技巧以及优化策略。Nginx,以其高性能、轻量级和反向代理能力著称,是现代互联网架构中的关键组件。在本资料中,我们将...

Global site tag (gtag.js) - Google Analytics