标签:
C/S架构与多进程多线程
如题,C/S架构指的是服务器(Server)与客户机(Client)协作完成网络程序功能的一种模式。它是已经在计算机世界活跃数十年的一种古老的软件架构。如今已渗入到各领域IT系统中。其模型如下所示。
本文从以下3个方面阐述C/S架构软件设计与多进程多线程实现多任务框架。
1.C/S工作原理
2.多任务设计
3.多进程与多线程选择
1.C/S工作原理
从计算机技术发展到应用到通信金融等商业领域时候起,C/S模式的需求就随之诞生了。
其工作模式能够满足众多客户的计算机使用需求,且能够简化程序设计的过程,还能够实现网络共享,因此备受追捧。时至今日,已有千千万万的C/S模式的程序为我们的生活带来了诸多方便,使人类进入了离不开网络的新时代。小到生活各个角落,如在线交际(QQ,微信,微博等),大到通信商业领域,如移动通信(手机上网,通话等等),电子证券(交易大厅股市图刷新等等),可以不夸张的说,各行各业都在使用计算机,使用计算机的地方就有C/S模式。如上图,客户端(Client)通过网络(Internet)与提高服务器(Server)之间建立通信,获取服务器的数据或是运算结果,或者多客户端同时联通服务器,建立交际网实现多人在线活动。
举一个生活中普遍存在的例子,就是我们日常生活里常用的QQ和微信(今天是2015年,东方文明的人们正使用着叫做QQ和微信的软件,与家人朋友同事甚至网络陌生好友进行着无间隙在线沟通。也许若干年后人类子孙后代不再使用今天我们创造的科技。故而备注于此)
QQ后台的服务器运行着服务端软件,它就像一个魔怪,能够一人对付万千客户端的服务请求。如下图所示,可以形象地看到服务器承担着什么样的角色。同时,客户机做什么呢?
根据用户需要,将要发烧的指令传达给服务器,然后服务器完成任务后将结果传回,客户机负责翻译成用户可理解的语言展示。比如,我们要跟某好友聊天了,就通过QQ客户端点击好友头像。此时客户端就将要跟此好友聊天的请求发送给服务器,然后我们就开始输入聊天内容了,然后服务器再将此内容发送到好友的QQ客户端上。如此一来,在线聊天功能就实现了。
当然,服务器可以干很多事情,可以同时干很多事情,所以呢,就会有不同的客户端来请求不同的服务,服务器根据各自的需求做出相应的处理。如下图,腾讯的各服务关系示意图,展示了腾讯服务器响应着众多客户端的请求。
2.多任务设计
现在我们来讨论下多任务。本节谈论的技术是针对服务端而言的。当客户端数量众多时,过去单进程模式的服务器做不到同时响应全部客户请求,此时服务体验必然不良,因而多任务的概念随之而来。当有多个客户端请求时,服务端生成多个独立的任务子模块,分别服务不同的客户,对客户而言,服务器始终是独立地在服务于自己。
举个例子,若访问搜索引擎,如果服务器是单个服务,则多人访问时就需要排队等待,前面的客户访问时间越长,后面的客户等待地越久。试想,当你急需要搜索查询某个内容的时候,服务器却告诉前面有一千万人排队,你的对要排到下个世纪,这样的搜索引擎你下次还会使用吗?
所以,服务器的多任务是势在必行的,多任务的设计就能保证服务器能够同时服务于多人。
当然,单个服务器的能力是有限的,即便实现多任务,也无法承担日访问量上亿PV的负荷,这个就需要多服务器协调工作,这便是当下流行的集群技术(本知识点以后再论,本文不再赘述)。多任务就像三头六臂一样帮助服务器实现多请求并行响应。
3.多进程与多线程选择
好了,我们已经知道了服务器是集群化的,且每台服务器都是多任务的。现在我们来讨论多任务的实现方式。最早的多任务技术就是多进程了,后来经过技术发展,引入了更为轻量级的多线程概念。如今的操作系统,都支持多进程以及多线程。那么,在开发服务器软件的时候,到底用多进程还是多线程来实现多任务呢?这个得根据实际任务需要,以及采用的网络模型来决定的。(注:关于多进程多线程特性不是本文重点,请读者参阅相关文献)
在TCP/IP协议族中,使用频率最高的上层协议无非是TCP,UDP,HTTP这3者了。其中HTTP用在B/S架构(关于B/S架构更多的内容请查阅相关文献)通信中,前两种协议用在C/S架构中。(注:关于TCP与UDP等协议相关知识,也请读者参阅相关文献)
众所周知,TCP是面向连接的,UDP面向非连接。同时,多进程间是资源隔离的,多线程间是资源共享的。基于以上原因,从程序设计难易程度上说:
采用TCP协议的软件用多进程更简单,采用UDP协议的软件二者都可。
这并不是唯一的,只是基于各人的经验,以及技术特性导致的复杂程度不同作为参考标准。
实质上,不管采用什么协议,采用任何多任务技术都可以在理论上实现。然而,软件追求的是高效和稳定,所以在实际软件设计中,便会参考软件的实现难度和维护性等指标。
下面根据经验简单阐述协议与多任务方式的组合特点:
1. TCP+多进程,由于TCP是面向连接的,而一个服务器的单进程空间内如果多个子任务都能看到连接的话,保存连接的资源会增多,同时各资源维护难度也随之加大。故而采用多进程的话(多线程间资源是共享的),子进程各自独享资源,每个连接对应一个子进程,这样进程之间的资源是自然隔离的,这就省去了管理的代价。
2. UDP+多线程,在UDP程序中,服务端采用多进程还是多线程都可。因为UDP面向非连接,就省去了管理每个连接的成本,这样的话采用多线程即可。但实际情况需要根据特性而定。
本文完结。关于多进程与多线程的区别,将在别文发表。
标签:
原文地址:http://my.oschina.net/cnyinlinux/blog/408529