网络服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销,可以使用多线程方式或异步方式。在多线程方式中,使用进程中的多个线程提供服务,由于线程的开销较小,性能就会提高。事实上,不需要任何额外开销的方式还是异步方式,它使用非阻塞的方式与每个客户通信,服务器使用一个进程进行轮询就行了。
虽然异步方式最为高效,但它也有自己的缺点。因为异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题。因此,向这种服务器增加功能,一方面要遵从该服务器自身特定的任务调度方式,另一方面要确保代码中没有错误存在,这就限制了服务器的功能,使得异步方式的Web 服务器的效率最高,但功能简单。例如Unix 平台上的thttpd 就是这样的一种服务器,然而由于它提供的功能少,只能是满足少部分人的需要。即便如此,thttpd 每隔一段时间还会出现一些问题,幸运的是,它出问题时从不是进入死循环,而是被操作系统杀死,这样就可以使用一个shell 循环立即重启动thttpd,从而基本不影响Web 服务。
由于多线程方式使用线程进行任务调度,这样服务器的开发由于遵从标准,从而变得简单并有利于多人协作。然而多个线程位于同一个进程内,可以访问同样的内存空间,因此存在线程之间的影响,并且申请的内存必须确保申请和释放。对于服务器系统来讲,由于它要数天、数月甚至数年连续不停的运转,一点点错误就会逐渐积累而最终导致影响服务器的正常运转,因此很难编写一个高稳定性的多线程服务器程序。微软的IIS 就是使用的多线程方式,由于微软聚集了相当多优秀程序员,所以IIS 基本上还是值得信赖的,当然我也遇到过很多系统管理员,他们根据经验定期启动所管理的NT 服务器,以预防不可预料的Web 服务停止现象。
多进程方式的优势就在于稳定性,因为一个进程退出的时候,操作系统会回收其占用的资源,从而使它不会留下任何垃圾。即便程序中出现错误,由于进程是相互隔离的,那么这个错误不会积累起来,而是随着这个进程的退出而得到清除。
虽然异步方式最为高效,但它也有自己的缺点。因为异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题。因此,向这种服务器增加功能,一方面要遵从该服务器自身特定的任务调度方式,另一方面要确保代码中没有错误存在,这就限制了服务器的功能,使得异步方式的Web 服务器的效率最高,但功能简单。例如Unix 平台上的thttpd 就是这样的一种服务器,然而由于它提供的功能少,只能是满足少部分人的需要。即便如此,thttpd 每隔一段时间还会出现一些问题,幸运的是,它出问题时从不是进入死循环,而是被操作系统杀死,这样就可以使用一个shell 循环立即重启动thttpd,从而基本不影响Web 服务。
由于多线程方式使用线程进行任务调度,这样服务器的开发由于遵从标准,从而变得简单并有利于多人协作。然而多个线程位于同一个进程内,可以访问同样的内存空间,因此存在线程之间的影响,并且申请的内存必须确保申请和释放。对于服务器系统来讲,由于它要数天、数月甚至数年连续不停的运转,一点点错误就会逐渐积累而最终导致影响服务器的正常运转,因此很难编写一个高稳定性的多线程服务器程序。微软的IIS 就是使用的多线程方式,由于微软聚集了相当多优秀程序员,所以IIS 基本上还是值得信赖的,当然我也遇到过很多系统管理员,他们根据经验定期启动所管理的NT 服务器,以预防不可预料的Web 服务停止现象。
多进程方式的优势就在于稳定性,因为一个进程退出的时候,操作系统会回收其占用的资源,从而使它不会留下任何垃圾。即便程序中出现错误,由于进程是相互隔离的,那么这个错误不会积累起来,而是随着这个进程的退出而得到清除。