一个好的服务器,一般都是并发服务器(同一时刻可以响应多个客户端的请求)。并发服务器设计技术一般有:多进程服务器、多线程服务器、I/O复用服务器等。
1、多进程服务器
多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是在客户服务器交互系统中。对于一个 TCP 服务器,客户与服务器的连接可能并不马上关闭,可能会等到客户提交某些数据后再关闭,这段时间服务器端的进程会阻塞,所以这时操作系统可能调度其它客户服务进程,这比起循环服务器大大提高了服务性能。
总结:通过为每个客户端创建⼀个进程的方式, 能够同时为多个客户端进行服务,当客户端不是特别多的时候, 这种方式还行, 如果有成百上千个, 就不可取了, 因为每次创建进程等过程需要消耗较多的资源。
2、多线程服务器
多线程服务器与多进程服务器在代码上十分相似,只需要做出稍微的改动,这里不再赘述。
3、进程与线程的比较
从以上可以看出,多进程和多线程都实现了同样的目的,从表面来看并没有太大区别,那么进程和线程的区别究竟表现在哪里呢?
1、进程:子进程是父进程的复制品,是获得父进程数据空间、堆和栈的复制品;而线程,相对与进程而言,线程是一个更加接近执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。两者都可以提高程序的并发度,提高程序运行效率和响应时间。
2、线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器(简单来讲就是平时所说的双CPU系统,是对称多处理机中最常见的一种)上运行,而进程则可以跨机器迁移。
3、根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:a、速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内;b、资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内;c、同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内。
举一个比较形象的例子,多进程的服务器就好比是立体的交通系统(立交桥),虽然说建造的时候花费比较大,消耗的资源比较多,但是真要是跑起来不会交通堵塞。但是汽车在上面跑,相互通信就是个很费事儿问题(进程间通信比较麻烦);多线程就好比是平面的交通系统,造价低,但是很容易交通堵塞,但是也有好处,同步的时候方便。
在网络服务器方面:
单进程 < 多进程(单线程)< 多进程(多线程)