精华内容
下载资源
问答
  • 服务器模型

    2018-06-03 20:31:51
    目前最常用的服务器模型:1)循环服务器:循环服务器在同一个时刻只能响应一个客户端的请求2)并发服务器:并发服务器在同一个时刻可以响应多个客户端的请求 2. 循环服务器模型无论是TCP循环服务器还是UDP循环...

    1. 在网络程序里面,通常都是一个服务器处理多个客户机。为了处理多个客户机的请求,服务器端的程序有不同的处理方式。目前最常用的服务器模型:

    1)循环服务器:

    循环服务器在同一个时刻只能响应一个客户端的请求

    2)并发服务器:

    并发服务器在同一个时刻可以响应多个客户端的请求

     

    2. 循环服务器模型

    无论是TCP循环服务器还是UDP循环服务器,其本质就是一个while循环,这种模型低效也很少使用,本博文不再叙述。

     

    3. 并发服务器

    1)TCP服务器

    并发服务器的设计思想是服务器接受客户端的连接请求后创建子进程/子线程来为客户端服务

    a) 创建子进程来为客户端服务模型

     //接收到SIFCHLD信号后,回收子进程 

    void handler(int signo) 

       pid_t    pid; 

       while((pid = waitpid(-1, NULL, WNOHANG)) > 0) 

       { 

           printf("child(%d) is over!\n",pid); 

       } 

    }  

    listenfd = socket()   

    bind();

    listen();

    signal(SIGCHLD,handler);//捕捉SIGCHLD信号,子进程死亡后,调用handler回收   

    while(1) 

           clientfd = accept();  

           pid = fork();

            if(pid == 0) 

            { 

                         /*注:子进程fork之后,子进程中会复制父进程中所有资源,包括listenfd,所以在子进程中首先需要关掉属于子进程的listenfd,但是并不影响父进程继续使用listenfd继续监听是否有新的client*/

               close(listenfd); 

                while(1) 

                { 

                     Recv();

                    /*对接收的数据进行处理*/

                     Process();

                     Send();

                 }

                 exit(0); 

           } 

           else 

           { 

               /*注:在父进程中关掉clientfd,不影响子进程与client通信,原因通上注*/

               close(clientfd); 

           } 

     

    b) 创建子线程来为客户端服务模型

    /*子线程处理函数*/

    void *func(void *arg)

    {

         while(1) 

         { 

             Recv();

             Process();

              Send();  

          }

          pthread_exit(NULL);

    }

    listenfd = socket()  

    bind();

    listen();

    while(1)

    {

          

                  client_fd= accept();

                  /*注:如果直接将client_fd值传递给pthread_create 函数时,可能会发生在传递过程中accept();又传来一个新的client_fd覆盖原*client_fd会导致值传递错误/

                  tempfd= (int *)malloc(sizeof(int));

                  *tempfd= client_fd;

                  /*建立新的线程*/

                  pthread_create(&thread, NULL,func, (void *)tempfd);

     

    }

    close(listenfd);

    return 0;

    2)UDP服务器并发模型参照TCP服务器并发模型

     

    4. I/O多路复用并发服务器

    请参考博文: select()与poll实现多路复用。


    展开全文
  • 单线程服务器模型是最简单的一个服务器模型,几乎我们所有程序员在刚开始接触网络编程(不管是B/S结构还是C/S结构)都是从这个简单的模型开始。这种模型只提供同时一个客户端访问,多个客户端访问必须要等到前一个...

    单线程服务器模型是最简单的一个服务器模型,几乎我们所有程序员在刚开始接触网络编程(不管是B/S结构还是C/S结构)都是从这个简单的模型开始。这种模型只提供同时一个客户端访问,多个客户端访问必须要等到前一个客户端访问结束,一个一个排队,即提供一问一答服务。

    图2-6-1-1 单线程阻塞服务器模型

     

        图2-6-1-1展示了单线程阻塞服务器是怎样响应客户端的访问。首先,服务器必须初始化一个Serversocket实例,绑定某个端口号,并使之监听客户端的访问,以此提供一种服务。接着客户端1远程调用服务器的这个服务,服务器接受到请求后,对其进行处理,并返回信息给客户端1,整个过程都是在一个线程里面完成的。最后,就算客户端2在服务器处理完客户端1之前就进行请求访问,也要等服务器对客户端1响应完后,才会对客户端2进行响应处理。

        我们注意到,大部分的socket操作都是阻塞的,所谓阻塞是指调用后不马上返回调用结果,而让当前线程一直阻塞,只有当该调用获得结果或者超时时才会返回。而我们的图2-6-1-1也有很多个节点都是阻塞的,例如,服务器阻塞监听客户端,直到有客户端访问才返回一个socket;对于客户端,建立一个socket连接后,也进行阻塞,直到服务器响应。几乎所有的IO操作都会产生阻塞,在网络编程中体现在socket的通信。这种阻塞给网络编程带来了一个问题,如图中黑块1和黑块2部分,当服务器处理完进行IO操作(这里的IO操作其实是给客户端发送消息)时,服务器必须要等到客户端成功接收才能继续往下处理另外一个客户端的请求,在此期间,线程将无法执行任何运算跟响应任何客户端请求。而如果这过程永远发送不到客户端,服务器就一直阻塞在那里了,不会接着处理任何事情。

        这种模型的特点是:最简单的服务器模型,整个运行过程都只有一个线程,只能支持同时处理一个客户端的请求,如果多个客户端访问必须排队等待,服务器系统资源消耗较小,但并发能力低,如果遇到IO操作出现错误异常将导致服务器停止运行,容错能力差。一般这种模型一般用在访问跟并发量少,请求是短暂的、无状态的,对响应时间要求不高,处理逻辑较复杂的场合。




    ==========广告时间==========

    公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。


    鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。


    [为什么写《Tomcat内核设计剖析》](http://blog.csdn.net/wangyangzhizhou/article/details/74080321)

    =========================

    展开全文
  • 针对单线程服务器模型的特点,我们可以对其进行改进,使之能对多个客户端同时进行响应。最简单的改进即是使用多线程(或多进程)服务器模型,在应用层级别,我们一般采用多线程模式。多线程能让多个客户端同时请求,...

    针对单线程服务器模型的特点,我们可以对其进行改进,使之能对多个客户端同时进行响应。最简单的改进即是使用多线程(或多进程)服务器模型,在应用层级别,我们一般采用多线程模式。多线程能让多个客户端同时请求,并能几乎同时对这些请求进行响应,而不用排队一个一个处理,能同时为多个客户端提供一问一答的服务。

    图2-6-1-2 多线程阻塞服务器模型

     

    多线程服务器模型核心就是利用多线程机制,为每个客户端分配一个线程。如图2-6-1-2,服务器初始化一个Serversocket实例,绑定某个端口号,并使之监听客户端的访问。两个客户端几乎同时过来请求,服务器在接收到客户端请求后,创建两条线程进行处理,直到响应完成。在这过程中,服务器只是简单的负责接收消息,然后交给处理者线程来处理,服务器能在短时间内接收多个客户端的请求。

    这种模型也是阻塞式的,因为每个线程向客户端写入消息并不是马上返回的,图2-6-1-2中黑块这段时间片就是阻塞时间。但这种模式比单线程处理性能明显高了,不用等到第一个请求处理完才处理第二个。对于多线程,如果线程数大于CPU数量,那么操作系统将会在多个线程之间调度,从而使其他线程能使用CPU,每调度一次导致一次上下文切换,大多通用的处理器中,每次调度大概需要5000-10000个时钟周期,大概几微妙。

    用这种多线程服务器模型就能真正地完美解决问题了吗?其实不然,随着客户端的数量越来越多,当达到成百上千路连接请求时,多线程操作会严重消耗系统cpu资源,并且多线程更容易进入假死状态。对此提出了“线程池”的概念,线程池在启动时先把一定数量的线程先创建好放到内存中,并且使用完不真正销毁线程,而是放回池里,以供新任务使用。这种缓存池机制能有效减少线程创建与销毁的频率,大大降低系统开销。这种机制在Tomcat中也是有所体现,如图2-6-1-3,当一个请求过来时尝试从池里获取一个线程,如果有空闲线程则返回一个线程供使用,而如果没有空闲线程了则直接关闭socket连接拒绝服务,保证服务器在处理能力范围内运行


    图2-6-1-3 多线程阻塞服务器模型-线程池

     

    多线程服务器模型的特点:能支持对多个客户端同时进行响应,处理能力得到大大的提高,有较大的并发量,但服务器系统资源消耗较大,同时拥有较复杂的结构,实现的代码也相对比较复杂。这种模型适用于访问并发量较大,请求是短期的、无状态的,业务逻辑比较复杂,对响应时间要求较高的场合。




    ==========广告时间==========

    公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。


    鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。


    [为什么写《Tomcat内核设计剖析》](http://blog.csdn.net/wangyangzhizhou/article/details/74080321)

    =========================

    展开全文
  • 进程服务器模型和线程服务器模型

    千次阅读 2009-12-02 12:40:00
    进程服务器模型和线程服务器模型 点击这里下载文件: 进程服务器模型和线程服务器模型.doc服务器开发中模型的选择是决定程序运行的关键因素,最近开发的一个Linux下BT下载均衡器则抛弃了多线程模型,而采用了多进程...
    
    


    服务器开发中模型的选择是决定程序运行的关键因素,最近开发的一个Linux下BT下载均衡器则抛弃了多线程模型,而采用了多进程模型,在不同的模型的选择过程中,自然涉及到了各自的优势和劣势。
    多进程模型服务器具有以下特点:
      系统对立,功能清晰明显,可以同时启动多个进程,以提高系统的输出能力。
      系统需要处理好进程间数据共享问题。
    多线程模型服务器具有如下特点:
      系统线程间数据共享方便,开发相对简单,而线程间互斥以及全局数据的互斥可能也是造成系统瓶颈的一个关键因素。
    在网络服务器的开发过程中,参照木桶原理,系统的性能决定在瓶颈最大的那块木板上面。而在分析的过程中,网络IO部分无疑是那块最短的木板。

    图一:典型的多线程服务器模型程序流程图
    多线程服务器模型中,系统完成了初始化后,启动各自的线程,由全局队列保证各自的数据操作协调。伪数据结构及代码可以如下:
    1. Class System{   
    2.   //接受客户端连接线程   
    3.   Static void AcceptThread();   
    4.   //数据操作线程,涉及到了socket的数据操作   
    5.   Static void DoDataThread();   
    6.   //辅助操作线程,比如数据库的缓存,批量入库等的   
    7.   Static void OtherThread();   
    8.   //保存客户端连接队列   
    9.   List<Client *> pLists;   
    10.   //数据库连接对象   
    11.   DBConnection dbConn;   
    12.   //全局服务器端socket   
    13.   Socket globalSock;   
    14.   //系统初始化   
    15.   Void Initial();   
    16.   //系统启动   
    17.   Void Start();   
    18.   //系统退出时清理资源   
    19.   Void Clean();   
    20. };   

    如上伪代码阐述了多线程模型下,网络服务器开发的基本流程和数据结构相关。

    图二:典型的多进程服务器模型UML时序图
    合理的多进程调度管理程序应该根据当前负载压力情况,决定该启动的进程数量。

    图三:典型进程服务器模型执行图
    多进程的服务器程序涉及到了如下程序的开发:
      1:多进程调度服务器
      2:进程服务器
    调度服务器负责接收网络请求,并将请求转化为进程服务器需要的格式,后通过进程间通讯发送到进程服务器程序,后采用进程间通讯获取处理结果,使用网络IO发送给客户端。
    进程调度器在不同的平台上面处理方法可能不太一致:
      1:windows平台
        网络部分可以采用异步模式,如select或者IOCP。进程间通讯可以采用共享内存、SOCKET或者其他,视具体项目所要求的时间效率而定。
      2:Linux平台
        网络部分也采用异步模式,如select、/dev/poll、epoll。进程间通讯可以采用shm或者SOCKET之类。
      3:其他平台
        网络部分异步,如freebsd的kqueue。进程间通讯按照特定系统提供的最佳进程通讯而定。
    调度服务器考虑采用单线程执行,讲网络IO封装成为事件驱动机制,这样避免了线程间的互斥以及线程数据之间的锁定带来的负荷,可以大大的提高整个系统的效率和伸缩性。
    进程服务器使用进程间通讯模式,等待调度服务器发送来的特定数据,进行处理该数据,将结果再由进程间通讯方法发送给进程调度服务器。
    按照进程服务器和调度服务器的部署方式不同,系统模型也会有很大的区别。如果进程服务器和调度服务器部署在同一台服务器上面,可以采用的进程间通讯方法就比较多,而且也比较方便快速,但是并不是特别适合集群以及系统压力分解。优点是系统性能可以达到最佳状态。
    进程服务器和调度服务器部署在多台服务器上面的话,通讯的方式Socket为最佳。这种方式适合集群系统以及压力分解,缺点是系统的性能可能会较差。
    对调度服务器的伪代码模型如下:
    1. Class System{   
    2.   //保存进程列表   
    3.   List<Process *> pLists;   
    4.   //保存客户端列表   
    5.   List<Client *> pClients;   
    6.   Socket sock;   
    7.   Void Initial();   
    8.   Void Start();   
    9.   Void Clean();   
    10. }   

    对象的主函数Start为系统关键函数:
    伪代码如下:
    1. Void Start(){   
    2.   //启动N个进程服务器   
    3. StartNProcess();   
    4.   //主线程循环   
    5.   While(flag){   
    6.     //获取Socket发生事件   
    7.     Event = GetClientEvent();   
    8.     Switch(event){   
    9.       //客户端连接事件   
    10.       Case ClientCome:   
    11.         //更新客户端队列   
    12.         UpdateClientList();   
    13.       //收到客户端数据   
    14.       Case GetClientData:   
    15.         //获取数据   
    16.         GetData();   
    17.         //分析处理数据   
    18.         ProcessData();   
    19.         //使用进程间通讯发送给某个进程   
    20.         SendToAProcess();   
    21.       //客户端离开   
    22.       Case ClientGoes:   
    23.          //更新客户端队列   
    24.         UpdateClientList();   
    25.       //客户端错误   
    26.       Case ClientError:   
    27.         UpdateClientList();   
    28.       //默认   
    29.       Default:   
    30.         DoSth();   
    31.      }   
    32.      //获取进程事件   
    33.      Event = GetProcessEvent();   
    34.      Switch(event){   
    35.       //进程处理完数据   
    36.       Case ParseData:   
    37.         //发送给客户端   
    38.         SendToClient();   
    39.       //错误   
    40.       Case Error:   
    41.         UpdateProcessList();   
    42.       Default:   
    43.         DoSth();   
    44.     }   
    45.     //进程队列处理   
    46.     PerformProcessList();   
    47.     //客户端队列处理   
    48.     PerformClientList();   
    49.   }   
    50. }   


    从上面的伪代码中,我们可以大致了解到进程调度服务器所需要处理的工作。
      
      目前的WEB服务器apache可以通过配置文件的方式配置多种执行模式,包含:进程模式或者线程模式。
      另外由俄罗斯人开发的nginx web服务器以其极其优秀的性能,越来越受到大型运营商的青睐。而该服务器采用的就是进程服务器模型。通过配置多个PHP-FastCGI进程服务器程序,可以极大的提高动态web服务器的性能。

    胡章优,吉林大学教师,博士,长春优狐科技开发有限公司总经理。专注于服务器开发,集群web服务器配置管理,系统安全配置,CDN网络架设以及机械电子控制系统开发。
    个人博客:http://doserver.net

    参考文献:
      进程服务器
      线程服务器
      Apache
      Nginx
      http://blog.codingnow.com/2006/10/multi_process_design.html

    展开全文
  • 服务器模型——C/S模型和P2P模型

    千次阅读 2017-09-03 21:26:08
    呦呦切克闹,煎饼果子来一套本篇学习两种服务器模型~~ TCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源都被数据提供者所垄断,所以几乎所有的网络应用程序都...
  • 浏览器/服务器模型

    千次阅读 2016-11-21 21:48:49
    一、浏览器/服务器模型的概念 浏览器/服务器模型(B/S模型)是一种对C/S模型的变化和改进,在这种模型中,用户界面完全通过WWW浏览器实现,一部分事务逻辑在浏览器实现,大部分事务逻辑在服务器中实现,它是一种特殊...
  • redis服务器模型分析

    2015-07-25 17:49:24
    下图是整个服务器模型原理图。  首先我们来说明下整个服务器初始化的过程:  1.初始化asEventLoop。  2.初始化服务器socket监听,并且绑定acceptTcpHandler事件函数,以应对建立客户端连接的请求。  3...
  • **常见服务器模型:** - 循环服务器 - 并发服务器 简单的并发服务器模型 使用线程池或进程池的服务器模型 使用I/O复用的并发服务器模块
  • 我们学习一下目前最常用的服务器模型. 循环服务器:循环服务器在同一个时刻只可以响应一个客户端的请求 并发服务器:并发服务器在同一个时刻可以响应多个客户端的请求 9.1 循环服务器: UDP服务器 UDP...
  • windows下并发I/O服务器模型对比 windows下有5种并发I/O服务器模型,罗列他们,并简述其优缺点。每一种更高级的模型,都是基于解决它的前一种模型的不足而诞生的。只有了解了他们之间的差别,才能理解他们的优缺点...
  • 1、服务器模型1.1C/S模型【1】C/S(客户端/服务器)模型:所有客户端都通过访问服务器来获取所需的资源【2】C/S模型逻辑:服务器启动后,先创建一个或者多个监听socket,并调用bind函数将其绑定到服务器的端口上,...
  • 上一篇文章:【Linux】Linux网络编程(含常见服务器模型,上篇)。   高级嵌套字函数 前面介绍的一些函数(read、write等)都是网络程序里最基本的函数,也是最原始的通信函数。下面介绍一下几个网络编程的高级...
  • JAVA实现简单的客户端服务器模型

    千次阅读 2016-11-07 16:32:34
    1、客户端-服务器模型  我们每天都在上网,聊QQ、聊微信、看视频、看新闻......基本每个网络应用都是基于客户端-服务器模型的,在这个模型下,一个应用就是一个服务器进程和多个客户端进程组成。服务器进程启动...
  • linux网络服务器模型

    2011-09-07 13:50:56
    Linux系统网络服务器模型主要有两种:并发服务器和循环服务器。所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服务器是指服务器
  • TCP并发服务器模型(一)

    千次阅读 2016-03-14 10:13:47
    本篇叙述的TCP并发服务器模型如下图所示: 服务器创建并绑定套接字后fork出几个子进程,子进程中分别进行accept(该函数为阻塞函数)、recv、处理数据然后再次acept,这样循环下去。所有客户端发来的信息都是直接由...
  • 优秀的服务器模型

    2011-06-23 10:40:00
    服务器模型包括数据层-服务层-连接层-终端层
  • 常用服务器模型总结

    千次阅读 2012-08-19 14:15:10
    UNPv3上一共总结了9种服务器模型分别是: 1.迭代服务器 2.并发服务器,为每个客户fork一个进程 3.预先派生子进程,每个子进程都调用accept,accept无上锁保护  4.预先派生子进程,以文件锁的方式保护accept 5....
  • Linux系统网络服务器模型主要有两种:并发服务器和循环服务器。 所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服务器是指服务器在同一时刻指可以响应一个客户端的请求。而且对于TCP和UDP套...
  • windows下并发I/O服务器模型对比(二) 在实际开发过程中,服务器程序需要和多个客户端程序进行通信。为了提高服务器程序的并发处理能力,通常为每个客户端启动一个线程,用于处理与客户端的数据通信。网络通信属于...
  • 服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: * 单线程/多线程阻塞I/O模型 * 单线程非阻塞I/O模型 * 多线程非阻塞I/O模型,Reactor及其改进 前言 这里探讨的...
  • 服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: * 单线程/多线程阻塞I/O模型 * 单线程非阻塞I/O模型 * 多线程非阻塞I/O模型,Reactor及其改进 前言 这里探讨的...
  • 前言的前言服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: * 单线程/多线程阻塞I/O模型 * 单线程非阻塞I/O模型 * 多线程非阻塞I/O模型,Reactor及其改进前言这里...
  • 常用服务器模型-001

    2013-06-27 10:09:59
    CS架构中,常见的几种服务器模型,可能有许多错误,请各位朋友拍砖。 1、  进程模型: 单进程、单线程处理请求。  I/O : 阻塞read,write。  这种模型,同一时刻只能响应一个客户端请求;处理完一个客户端请求...
  • 13linux服务器模型选型
  • 服务器模型分析与验证

    千次阅读 2012-03-06 15:28:05
     对于常见的几种服务器模型,有过服务器端开发经验或研究了解过这个领域的可能都清楚。类似介绍这些模型,分析各自特点优劣的文章不胜枚举,本来在这个方向班门弄斧的挥上一笔似乎已经没有太大价值。但是,正由于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,813
精华内容 15,525
关键字:

服务器模型