1、服务器中的并发问题
并发是指真正的或表面呈现的同时计算。通常,一个多用户的计算机系统可以通过分时或多处理器来获得并发,其中,分时机制是使得单个处理器在多个计算任务(或多个用户)之间快速地切换,从而使得从表面上看这些计算(或用户所获得的服务)是同时进行的;而多处理器机制则是让多个处理器同时执行多个任务,因此所实现的是真正的同时计算(即真正的并发)。
在客户——服务器模型中,很多时候会有多个客户使用服务器的一个熟知协议端口与服务器联系,如上图所示,在一台主机上有可能会运行有多个服务器进程,并且每个服务器进程也可能需要及时处理多个客户的请求,并将处理的结果返回给客户,因此,服务器软件还必须在设计中处理好并发请求。
设想一个远程登陆服务器,如果其不能并发运行,而是一次只能处理一个远程登陆。此时,一旦有一个客户与该服务器建立了联系,则服务器在第一个用户会话结束之前,必须忽略或拒绝所有其它客户的请求。显然,这样的设计限制了服务器的使用效率,而且还使得多个远程用户不能在同一时间对该服务器进行访问。
2、服务器并发的实现方法
Linux提供了两种方法来实现服务器的并发性,其中,一种实现方法是服务器创建多个进程(process),每个进程都有一个线程(thread),使得不同进程中的多个线程并行工作以完成多项任务,从而以提高系统的效率;另一种实现方法则是服务器在一个进程中创建多个线程,使得同一进程中的多个线程并行工作以完成多项任务,从而提高系统的效率。
其中,进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程是系统进行资源分配和调度的一个独立单位,是具有一定独立功能的程序关于某个数据集合上的一次运行活动。由于每个进程都拥有自己独立的地址空间,因此,当一个进程崩溃后,在保护模式下它不会对其它进程产生影响。而线程则是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。但线程自己基本上不拥有系统资源,但可与同属一个进程内的其他线程共享该进程所拥有的全部资源。由于线程除了只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈)之外,没有单独的地址空间,因此一个线程的崩溃也就等于整个进程的崩溃。这也就意味着多进程的程序要比多线程的程序健壮,但线程间彼此切换所需的时间要远远小于进程间切换所需要的时间,因此,多进程服务器的效率也就要比多线程的服务器差。