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面向非连接,就省去了管理每个连接的成本,这样的话采用多线程即可。但实际情况需要根据特性而定。

本文完结。关于多进程与多线程的区别,将在别文发表。

时间: 2024-10-10 10:43:12

C/S架构与多进程多线程的相关文章

重学浏览器(1)-多进程多线程的浏览器

浏览器是我们上网的一个重要工具,是我们重要的信息来源,这里以Chrome浏览器为对象,同时作为一名前端工程师,之前对于浏览器的认知还不够深入,所以借着这一系列的文章,进行浏览器的逐步分析与学习,加深自己的知识储备.同时这部分知识也是做页面性能优化,健康度监控等工具时所必须的基础知识. 进程和线程 进程是系统内存分配的一小部分内存空间 进程之间相互独立(不同进程之间可以相互通信,不过代价很大) 进程由单个或多个线程组成 多个线程之间是可以相互协作完成工作的 同一个进程中各个线程之间共享同一块内存空

Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <纲要> Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理 UDP服务器 客户端最小模型,处理字符转大写 TCP 多进程并发服务器模型,为每个客户端开启一个进程: TCP 多线程服务器模型,使用wrap函数封装 作业: ---------------------------------------------------- UDP服务器 客户端最小模型,处理字符转大写 [em

一个简单的多进程+多线程+协程的例子

因为一个朋友最近想搞接口压力测试,推荐了jmeter,因为jmeter开源,且有命令行启动模式,方便封装.兴起时,自己也简单实现了一下高并发的脚本. 采用的是多进程+多线程+协程.想法是这样的,多进程是为了有效利用多核,理论上最好一个核对应一个进程比较好:那我为什么还要用多线程呢?不怕GIL全局锁吗?这是因为我用了gevent处理,请求采用requests,但requests是阻塞的方法,所以我把requests操作丢到协程做,就没啥问题了.接下来看看脚本,实现了一个2000并发量的脚本(写的比

关于Python和Java的多进程多线程计算方法对比

原文请见 关于Python和Java的多进程多线程计算方法对比 搞大数据必须要正视的一个问题就是并行计算.就像执行一件任务一样,大伙一起同时干,才有效率,才会很快出成果.正所谓"众人拾柴火焰高"~ 对于并行计算,有很多高大上的概念,我也不全懂.这里就单单罗列一下我对于多进程和多线程计算的理解和总结. 在计算机中,处理一个任务,可以在一个进程中,也可以在一个线程中,确切的说,执行的话都得靠一个个线程来.在我们做某件事的时候,往往需要同时干多个任务才能达到我们所要的效果,比如说看电影,就要

[转帖]Windows和Linux对决(多进程多线程)

Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好呢.. 关于 windows 和 linux的东西 先放这里 晚上有时间仔细啃一下. 并行程序设计分为共享内存和消息驱动(其实就是分布式内存)两种, 共享内存:所有CPU共内存,所有CPU由一个操作系统控制的,例如Windows和Linux/UNIX,目前流行的多核.多CPU机器都是属于这种: 消息

Linux 多进程多线程相关概念

进程:可执行程序是存储在磁盘设备上的由代码和数据按某种格式组织的静态实体,而进程是可被调度的代码的动态运行.在Linux系统中,每个进程都有各自的生命周期.在一个进程的生命周期中,都有各自的运行环境以及所需的资源,这些信息都记录在各自的进程控制块中,以便系统对这些进程进行有效的管理,进程控制块的结构如下图所示: 每个进程都有各自独立的虚拟地址空间,空间的大小与所基于的硬件体系结构有关.虚拟空间中各区代表的意义,代码段存储指令序列和只读数据,多个进程实例可共享代码段.数据段用来存放全局变量和静态变

(转)多进程 &amp; 多线程的区别与适用场景

转自:http://www.cnblogs.com/huntfor/p/4021327.html 关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害.经常在网络上看到有的XDJM问“多进程好还是多线程好?”.“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有最好,只有更好.根据实际情况来判断,哪个更加合适就是哪个好.我

【转】多进程 &amp; 多线程的区别与适用场景

关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害.经常在网络上看到有的XDJM问“多进程好还是多线程好?”.“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有最好,只有更好.根据实际情况来判断,哪个更加合适就是哪个好.我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个

GDB常用调试命令以及多进程多线程调试

转载自:http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令 1.list命令 list  linenum      显示程序第linenum行周围的程序 list  function      显示函数名为function的函数的源程序 list                      显示当前行后面的源程序 list -                    显示当前行前面的源程序 2.run(r) 运行命令. ru