I/O模型:

   同步模型,一般是指只有在某个I/O操作执行完毕后可以执行后面的操作。

            也就是指进程发出一个过程(功能、函数)调用后,在没有得到结果前,该调用不会返回


   异步模型,则是将某个操作 给 系统,主线程继续执行别的操作,

             由内核完成操作后去负责同志主线程异步操作已完成。异步主要应用于文件I/O。

            也就是指进程发出一个过程(功能、函数)调用后,调用者不能立刻得到结果,

            调用完成后,内核通过状态、通知和回调来通知调用者。性能最好。

   阻  塞,阻塞调用是指调用结果返回前,当前进程会被挂起。

   非阻塞,指在不能立刻得到结果前,被调用函数不会阻塞当前进程,进程会返回等待。


解释:

   过程:

   当执行命令cat /etc/inittab命令时,

   cat命令发起为一个进程,由于进程不能直接与硬件资源交互,所以需要将加载文件的请求

   交给linux内核。

   然后cat进程由于需要等待资源的加载,就被CPU切换出去,称为中断,也叫进入睡眠状态,

   而且此种睡眠是不可中断的。

   睡眠,因为即使被唤醒,也无法继续执行。

   内核将资源从磁盘读入内核的内存地址空间中。这里是I/O的第一个阶段。

   内核将资源从内核的内存地址空间中复制到进程内存。这里是I/O的第二个阶段。


   阻塞  模型:在资源没有彻底被加载到进程的内存地址空间中时,此进程始终是睡眠的。

   非阻塞模型:在进程开始请求时,内核就告诉进程需要等一会才能加载完资源。

               所以进程在I/O第一阶段始终是处于不停查看加载状态的忙等待状态。

               而在I/O的第二个阶段,进程才是被阻塞的。


非阻塞模型的问题:

   当一个进程请求多个资源时,比如tail -f /var/log/messages /root/zhuijia.txt,

   此时,假如其中任何一个资源加载完成后,tail都可以继续往下显示。

   但是如果某一个资源很大需要等待加载很长时间,那么此时,tail就会被阻塞在其中某一个

   资源上面。这是不希望发生的情况。

   所以出现了多路复用器,比如,select、poll。


   多路复用器,就是内核新增的一个系统调用功能,帮助进程监控多个I/O的完成情况。

     此时,进程再发起I/O请求,不是直接请求的linux内核,而是多路复用器,并且多路复用器

     帮助进程监控每个资源的完成情况。每完成一个或几个就会通知进程来取走资源。


   由于最终实现I/O还是linux内核,所以多路复用器也就是一个第三方的监控工具,

   所以在多了一个第三方来传递消息的情况下,这就严重影响了性能。

   而select默认最多支持1024个调用,就是这个原因。


事件模型:

   在I/O的第一个阶段仍为阻塞,而在I/O第一阶段完成后,就内核就通知(notify)进程来取数据。

   但此时第二阶段的I/O尚未完成,所以在进程被切进CPU后发现仍没有资源后,于是又被切出中断


   这里的通知(notify)又分为两种:

   水平触发:也就是内核不断的发送通知,直到进程来取走数据。

   边缘触发:内核发送一个短信给进程,只要进程看到短信,就来取走数据。

             这样可以防止在发送通知时,进程正忙,而造成无法通知成功。


mmap机制:

   就是内存映射,在I/O第一阶段完成后,内核通知进程来取数据时,进程把自己的内存空间

   映射到内核的内核空间中,这样就节省了从内核内存空间复制数据到进程内存空间的时间。


编译安装httpd-2.4.4

   当系统已经安装了httpd-2.2版本的情况下,如果yum卸载,那么在安装2.4时,

   会有很多依赖关系无法解决。所以最好在保留2.2,并将其服务关闭。

准备工作:

   首先需要为编译工作准备开发环境:在centos6.4环境下

# yum groupinstall  -y Server Platform Development Development tools Desktop Platform Development Desktop Debugging and Performance Tools Compatibility libraries
# yum install -y pcre pcre-devel

   编译安装apr(1.4以上)和apr-util。

# tar xf apr-1.4.6.tar.bz2 -C /usr/src/
# cd /usr/src/apr-1.4.6/
# ./configure --prefix=/usr/local/apr  防止装到默认路径下,覆盖原文件
     config.status: executing default commands
# make && make install
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
# tar xf apr-util-1.5.2.tar.bz2 -C /usr/src/
# cd /usr/src/apr-util-1.5.2/
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
# make && make install

     注:如果使用yum直接升级apr那么,依赖老版本apr的程序将会无法运行,

         那么最好将其编译安装


安装:

# tar xf httpd-2.4.6.tar.bz2 -C /usr/src/
# cd /usr/src/httpd-2.4.6/
# ./configure --prefix=/usr/local/apache -sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr  --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event
# make && make install
                                                                                                                                                                                                                                                          
# ln -sv /usr/local/apache/include/ /usr/include/httpd
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
如果在配置阶段出现zlib、openssl等报警和错误,则yum安装zlib、openssl和其对应的zlib-devel,openssl-devel包即可解决问题

配置阶段的参数详解:

   --sysconfdir=/etc/httpd24 如果原来安装过httpd,则这样防止覆盖原文件。

   --enable-so    使用动态模块

   --enable-ssl   使用加密传输

   --enable-cgi   使用cgi动态

   --with-zlib    使用zlib压缩库

   --enable-rewrite 使用地址重写

   --with-apr=/usr/local/apr 指定apr的位置

   --enable-modules=most     把那些功能做进来,一般使用most大多数即可。

   --enable-mpm-shared=all   安装哪些MPM处理模块

   --enable-mods-static=MODULE-LIST  将哪些模块编译安装到内核,而不是做成模块。一般不用

   --with-mpm=event          指定默认启用的MPM处理模块


启动服务:

   # /usr/loca/apache/bin/apachectl    服务的启动脚本

       但是默认安装的httpd,也有/usr/sbin/apachectl。所以需要:

       # echo "export PATH=/usr/local/apache/bin:$PATH" > /etc/profile.d/httpd.sh

       # source /etc/profile.d/httpd.sh

       这样就优先使用编译安装路径下的命令了。启动服务后,可以使用hash查看命中结果。


   # httpd -D DUMP_MODULES        查看所有已经模块

       这里包含 mpm_event_module (shared)


将编译安装的httpd24添加到系统服务:

# cp /etc/init.d/httpd{,24}
# vim /etc/init.d/httpd24
    apachectl=/usr/local/apache/bin/apachectl
    httpd=${HTTPD-/usr/local/apache/bin/httpd}
    pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}不能在httpd.conf中定义,且使用/var/run/httpd/httpd.pid可能会出问题
# service httpd24 start
# chkconfig --add httpd24
# chkconfig httpd24 on
# chkconfig httpd off


httpd24的额外配置文件:

   /etc/httpd24/extra/

       此目录中的配置文件在主配置文件中默认是不启用的。

       需要取消主配置文件中"#Include /etc/httpd24/extra/*.conf"前面的注释。


httpd24的主配置文件:

   #DocumentRoot "/usr/local/apache/htdocs"        一般不使用中心服务器,需注释掉

    Include /etc/httpd24/extra/httpd-vhosts.conf   启用虚拟主机,这里不再使用V2.2中的

                                                   NameVirtualHost IP:80选项

Include /etc/httpd24/extra/httpd-mpm.conf   首先启用额外配置文件中的mpm

    LoadModule mpm_event_module modules/mod_mpm_event.so    然后启用event模块

                                                            如果想更改模块,就改动此行

                                                            后重启服务,使用httpd查看


/etc/httpd24/extra/httpd-mpm.conf额外配置文件对event的属性定义:

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>


/etc/httpd24/extra/httpd-vhosts.conf中定义虚拟主机:


<VirtualHost 192.168.1.210:80>
        ServerName      www.yh.com
        DocumentRoot    "/web/htdocs"
        <Directory "/web/htdocs">
                Options None
                AllowOverride None
               #Require ip 192.168.1.212 只允许访问的白名单
               #Require all deny         拒绝所有人访问
                Require all granted      允许所有人访问,不再使用2.2版中的Order方式
        </Directory>
</VirtualHost>