一、进程&&线程

  1.进程模型

    (1) 单进程模型:一个进程响应多个请求

容易造成请求的阻塞

    (2) 多线程模型:每个进程响应一个请求

进程量大,进切换次数过多

每个进程地址空间独立,很多空间是重复的数据,所以内存使用率低

  2.线程模型(thread)

        LWPlight Weight Process

       Linux上称为轻量级进程;是进程内部的自运行单位,在Linux上表现形式和进程一样,占用一个端口,但管理方式不同

       多核CPU使用下,线程的优势才能发挥,并行执行线程,更好的分配系统资源,减少切换次数,但需要多线程编程

       线程切换过快会造成线程抖动

    (1) 单进程多线程模型

每个线程响应一个请求,线程间依然切换,但是切换轻量级

同一进程管理下的线程可以共享进程的诸多资源,例如多个用户对同一文件的访问

对内存的需求较之进程模型降低

    (2) 多进程多线程模型

多个进程,分批管理线程;例如每个进程管理1000个线程,这样在每个进程内部的线程资源争用不会太严重

多核心CPU的情况下,可以做CPU亲和性绑定(进程绑定),每个进程内线程切换

    (3) 多线程

N个请求,一个线程响应多个请求

 

 

 

二、I/O模型

  1.IO动作执行

      进程无法直接操作IO设备,必须通过系统调用请求内核来协助,内核会为你每个IO设备维护提供有一个buffer

对于输入而言其等待时间:wait + copy

wKioL1ctf3WS2Q7qAAAiyIVwL6o983.png

  2.I/O类型

    (1)同步和异步:synchronous, asyncrhonous

           关注的是消息通知机制

        1)同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;

        2)异步:调用发出之后,被调用方立即返回消息,但返回的非最终结果;被调用者通过状态、通知机制来通知调者,或通过回调函数来处理结果;

    (2)阻塞和非阻塞:block, nonblock

            关注的是调用者等待被调用者返回调用结果时的状态

        1)阻塞:调用结果返回之前,调用者(调用线程)会被挂起;调用者只有在得到结果之后才会返回;

        2)非阻塞:调用结果返回之前,调用不会阻塞当前线程;

  3.I/O模型

       blocking IO:阻塞式IO

       nonblocking IO:非阻塞式IO

       IO multiplexing:复用型IO

       signal driven IO:事件驱动型IO

       asyncrhonous IO:异步IO(不导致进程阻塞)

 

 

 

三、Apache httpd多路模块

    httpd是一个重量级别web服务器,支持的功能模块多

  1.prefork多进程模型

一个进程响应一个请求;内核select()调用算法最多并行处理1024个请求

主进程,生成多个子进程,每个子进程处理一个请求

  2.worker多进程多线程模型

一个线程响应一个请求;内核调用select()模型

主进程,生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求

           只能看到主控进程和对应进程,每个进程速欧开启的线程是基于线程库研发,每个线程响应一个用户请求,线程无法用ps显示,生成子进程处理,并发响应能力差,但是很稳定,进程间的影响小

  3.event事件驱动模型

状态转换通知,一个进程响应n个请求;内核调用epoll()

主进程,生成多个子进程,每个子进程响应多个请求

单进程多请求,并发响应强,占用资源少

    触发机制:水平触发(多次通知)、边缘触发(仅一次通知机制)

 

 

 

四、Apache httpdNginx对比

  1.Nginx

轻量级web服务器,其相对于apache占用更少的内存及资源

nginx 处理请求是异步非阻塞的,而,在高并发下nginx 能保持低资源低消耗高性能

高度静态模块化的设计,在1.9版本之前不能够动态加载模块

epoll and kqueue 作为开发模型

支持热部署,平滑升级

 

  2.Apache httpd

重量级web服务器,支持众多模块

httpd处理请求是阻塞型

bug相对于nginx少,稳定轻强

 

  注意:

    1) epoll(freebsd是kqueue)网络IO模型是nginx处理大量静态服务时才能提供高web性能

         nginx使用资源少,支持并发连接数量众多。能够支持高达 50,000 个并发连接数的响应

    2) apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

    3) nginx的负载能力比apache高很多

    4) nginx处理静态文件好,耗费内存少,但是处理动态请求不行,一般动态请求要apache去做,nginx只适合静态和反向

    5) 在静态文件处理、PHP-CGI的支持、反向代理功能、前端Cache、维持连接等方面nginx优于apcche httpd,但是在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。