web服务器[通俗易懂]

web服务器

大家好,又见面了,我是全栈君。

        Web服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有以下三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销,可以使用多线程方式或异步方式。在多线程方式中,使用进程中的多个线程提供服务, 由于线程的开销较小,性能就会提高。事实上,不需要任何额外开销的方式还是异步方式,它使用非阻塞的方式与每个客户通信,服务器使用一个进程进行轮询就行了。虽然异步方式最为高效,但它也有自己的缺点。因为异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题。因此,向这种服务器增加功能,一方面要遵从该服务器自身特定的任务调度方式,另一方面要确保代码中没有错误存在,这就限制了服务器的功能,使得异步方式的Web服务器的效率最高,但功能简单,如Nginx服务器。

      由于多线程方式使用线程进行任务调度,这样服务器的开发由于遵从标准,从而变得简单并有利于多人协作。然而多个线程位于同一个进程内,可以访问同样的内存空间,因此存在线程之间的影响,并且申请的内存必须确保申请和释放。对于服务器系统来讲,由于它要数天、数月甚至数年连续不停的运转,一点点错误就会逐渐积累而最终导致影响服务器的正常运转,因此很难编写一个高稳定性的多线程服务器程序。但是,不是不能做到时。Apache的worker模块就能很好的支持多线程的方式。

     多进程方式的优势就在于稳定性,因为一个进程退出的时候,操作系统会回收其占用的资源,从而使它不会留下任何垃圾。即便程序中出现错误,由于进程是相互隔离的,那么这个错误不会积累起来,而是随着这个进程的退出而得到清除。Apache的prefork模块就是支持多进程的模块。

     

    Web服务器总的来说提供服务的方式有三种,多进程方式,多线程的方式,异步方式。其中效率最高的是异步的方式,最稳定的是多进程方式,占用资源较少的是多线程的方式。

1.多进程

       此种架构方式中,web服务器生成多个进程并行处理多个用户请求,进程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程将会消耗大量的系统资源。(即每个进程只能响应一个请求或多个进程对应多个请求)

优点:

  • 最大的优势就在于稳定性,一个进程出错不会影响其它进程。如,服务器同时连接100个请求对就的是100个进程,其中一个进程出错,只会杀死一个进程,还有99个进程继续响应用户请求。每个进程响应一个请求

缺点:

  • 进程量大,进程切换次数过多,导致CPU资源使用效率低,每个进程的地址空间是独立的,很多空间中重复的数据,所以内存使用效率低,进程切换由于内核完成,占用CPU资源。

2.多线程

       在多线程方式中,每个线程来响应一下请求,由于线程之间共享进程的数据,所以线程的开销较小,性能就会提高。

优点:

  • 线程间共享进程数据,每个线程响应一个请求,线程切换不可避免(切换量级比较轻量),同一进程的线程可以共享进程的诸多资源,对内存的需求较之进程有很大下降,读可以共享,写不可以共享

缺点:

  • 线程快速切换时会带来线程抖动,多线程会导致服务器不稳定

3.异步方式

阻塞

    阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

 

非阻塞

    非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

     一个进程或线程响应多个请求,不需要任何额外开销的,性能最高,占用资源最少。但也有问题一但进程或线程出错就会导致整个服务器的宕机。

转载于:https://my.oschina.net/phybrain/blog/1609679

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107749.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月13日 上午7:18
下一篇 2022年3月13日 上午7:19


相关推荐

  • jQuery中delegate和on的用法与区别详细解析

    jQuery中delegate和on的用法与区别详细解析在 jQuery1 7 中 delegate 已被 on 取代 对于早期版本 它仍然使用事件委托的最有效手段 在事件绑定和委派 delegate 和 on 在一般情况下 这两种方法是等效的 delegate 指定的元素 属于被选元素的子元素 添加一个或多个事件处理程序 并规定当这些事件发生时运行的函数 复制代码代码如下 jQuery1 4 3 elements delegate selector events data handler jQuer

    2026年3月26日
    2
  • K均值聚类的理解和实现

    K均值聚类的理解和实现目录 1 距离的测度 1 1 欧式距离 1 2 马氏距离 1 2 1 利用马氏距离对数据进行归一化 1 2 2 利用马氏距离进行分类 2 K 均值的基本理论 2 1K 均值的原理和实现 2 2K 均值的缺点 2 3K 均值改进 3 算法实现 3 1 获取样本 3 2 协方差逆阵方根的计算方法 3 3 聚类实验 3 3 1 一般的 K 均值聚类 3 3 2 基于马氏距离

    2025年7月23日
    6
  • vue.js和react.js_vue和jquery

    vue.js和react.js_vue和jqueryjquery和框架的区别框架:数据和视图分离,以数据驱动视图,只关心数据变化,dom操作被封装。数据驱动jquery:依靠dom操作去组合业务逻辑。事件驱动React和Vue对比两者本质区别Vue—本质是MVVM框架,由MVC发展而来React—本质是前端组件化框架,由后端组件化发展而来模板的区别Vue—使用模板(最初由Angular提出)React—使用JSX模板语法…

    2026年4月13日
    5
  • uart 时序_8080接口时序

    uart 时序_8080接口时序数据传送速率用波特率来表示,指单位时间内载波参数变化的次数,或每秒钟传送的二进制位数  如每秒钟传送240个字符,而每个字符包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为2400Bd  传输时序如下图    在UART中,信号线上共有两种状态,分别用逻辑1(高电平)和逻辑0(低电平)来区分  在空闲时,数据线应该保持在逻辑高电平状态  其中…

    2025年11月16日
    5
  • s一般怎么称呼自己的m_教师节到了,聊一聊该怎么称呼尊敬的老师[通俗易懂]

    s一般怎么称呼自己的m_教师节到了,聊一聊该怎么称呼尊敬的老师[通俗易懂]01.Teacher当面看到老师不能直接叫teacher哦,但是你可以用Mr/Mrs/Miss/Ms+surname(姓)的方式来称呼老师们,这四个称谓适用的人群如下:Mr/ˈmɪstər/:(已婚/未婚)男性Mrs/ˈmɪsɪz/:(已婚)女性Miss/mɪs/:(未婚)女性Ms/mɪz/:(已婚/未婚)女性一般来讲,因为Ms不透露女性的婚姻状态,所以用其称呼女…

    2022年6月23日
    80
  • python cv.imread_为什么cv2里没有imread

    python cv.imread_为什么cv2里没有imread为什么使用Python-OpenCV虽然python很强大,而且也有自己的图像处理库PIL,但是相对于OpenCV来讲,它还是弱小很多。跟很多开源软件一样OpenCV也提供了完善的python接口,非常便于调用。OpenCV的稳定版是2.4.8,最新版是3.0,包含了超过2500个算法和函数,几乎任何一个能想到的成熟算法都可以通过调用OpenCV的函数来实现,超级方便。一、需要工具本…

    2022年10月14日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号