1.迭代型和并发型服务器迭代型:服务器每次只处理一个客户端,只有当完全处理完一个客户端的请求之后才去处理下一个客户端并发型:这种类型的服务器被设计为能够同时处理多个客户端的请求并发型服务器的其他设计方案:1.在服务器上预先创建进程或线程,其核心理念如下:1.服务器程序在启动阶段就立即预先创建好一定数量的子进程(或线程),而不是针对每个客户端来创建一个新的子进程(或线程)。这些子进程构成了一个服务池2.服务池中的每个子进程一次只处理一个客户端。在处理完客户端请求后,子进程并不会终止,而是获取下一个待处理的客户端继续处理。采用上述技术需要在服务器应用中仔细的管理子进程。服务池应该足够大,以确保能充分响应客户端的请求。这意味着服务器父进程必须对未占用的子进程加以监视,并且在服务器处于负载高峰时增加服务池的大小,这样就总会有足够的子进程存在。如果负载下降了,那么应该响应的减少服务池的大小,因为过多的空余进程会降低系统的整体性能。此外,服务池中的子进程必须遵循某些协议,使得它们能够以独占的方式选择一个客户端连接。在大多数 Unix 实现中(包括Linux),让服务池中的每个子进程在监听描述符的 accept() 调用上阻塞就足够了。换句话说,服务器父进程在创建任何子进程之前先创建监听套接字,然后每个子进程在 fork()调用中继承该套接字的文件描述符。当一个新的客户端连接到来时,只有其中一个子进程能够完成 accept() 调用。但是,由于 accpet() 在一些老式的实现中不是一个原子化的系统调用,因此可能需要通过一些互斥技术,如文件锁等来支持,以确保每次只有一个子进程可以执行 accept() 调用。还有其他方法可以让服务池中所有的子进程都执行 accept() 调用。如果服务池由分离的进程组成,服务器父进程可以执行 accept() 调用,然后将代表新连接的文件描述符传递给空闲的进程之一。如果服务池由线程组成,主线程可以执行 accept() 调用,然后通知服务池上的空闲线程,有新的已连接上的客户端正在等待处理。2.在单个进程中处理多个客户端在某些情况下,我们可以设计让单个服务器进程来处理多个客户端。为了实现这一点,我们必须采用一种能够允许单个进程同时监视多个文件描述符上IO事件的IO模型(IO多路复用,信号驱动IO 或者 epoll())在设计单进程服务器时,服务器进程必须做一些通常由内核来处理的调度任务。在每个客户端一个服务器进程的解决方案中,我们可以依靠内核来确保每个服务器进程能够公平的访问到服务器主机的资源。但当我们用单个服务器进程来处理多个客户端时,服务器进程必须自行确保一个或多个客户端不会霸占服务器,从而使其他客户端处于饥饿状态。3.采用服务器集群其他用来处理高客户端负载的方法还包括使用多个服务器系统---服务器集群(server farm)构建服务器集群最简单的方法就是 --- DNS 轮转负载均衡,一个地区的域名权威服务器将同一个域名映射到多个 IP 地址上。DNS 轮询的优势是,成本低,而且容易实施。问题是,远端 DNS 服务器上所执行的缓存操作,这意味着今后位于某个特定主机上的客户端发出的请求会绕过循环轮转的 DNS 服务器,并总是由一个服务器来负责处理。此外,DNS 轮询并没有任何内建的用来确保到达良好负载均衡或者是高可用性的机制。另外一个需要我们考虑的是服务器的亲和性。这就是说,确保一个客户端的请求序列能够全部定向到同一台服务器,这样由服务器维护的任何有关客户端状态的信息都能够保持准确。一个更灵活的解决方案是服务器负载均衡。在这种场景下,由一台负载均衡服务器将客户端请求路由到服务器集群中的一个成员上。(为了确保高可用,可能还会有一台备用服务器。一旦负载均衡主服务器崩溃,备用服务器就立刻接管主服务器的任务)。这消除了远端 DNS 缓存引起的问题,因为服务器集群只对外提供了一个单独的IP地址(也就是负载均衡服务器的IP地址)。负载均衡服务器结合一些算法来衡量或计算服务器的负载,并智能的将负载分发到服务器集群的各个成员上。负载均衡器也会自动检测集群中失效的成员。最后,负载均衡服务器还可能提供对服务器的亲和力。2.inetd 守护进程inetd 被设计用来消除大量非常用服务器进程的需要,inetd 提供了2个好处:1.与其为每个服务运行一个单独的守护进程,现在只需要一个进程--- inetd 守护进程,就可以监听一组指定的套接字接口,并按照需要启动其他的服务。因此,可以降低系统上运行的进程数量。2.inetd 简化了启动其他服务的编程工作。inetd 守护进程所做的操作:通常在系统启动时运行1.对于配置在 /etc/inetd.conf 中指定的每项服务,inetd 都会创建恰当类型的套接字,然后绑定到指定的端口上。此外,每个 tcp 套接字都会通过 listen() 调用允许客户端发来连接。2.通过 select() 调用, inetd 对前一步中创建的所有套接字进行监视,看是否有数据报或者连接请求发送过来。3.select() 进入阻塞状态,直到一个 udp 数据报可读或者 tcp 套接字上接收到了连接请求。在 tcp 连接中,inetd 在进入下一个步骤之前会先为连接执行 accept()调用。4.要启动这个套接字上指定的服务,inetd 调用 fork() 创建一个新的进程,然后通过 exec() 启动服务器程序。在执行 exec() 之前,子进程执行如下的步骤:1.除了用于 udp 数据报和接受 tcp 连接的文件描述符之外,将其他所有从父进程继承而来的文件描述符都关闭2.在文件描述符 0,1,2上复制套接字文件描述符,并关闭套接字文件描述符本身。完成这一步之后,启动的服务器进程就能够通过这3个标准的文件描述符同套接字通信了3.这一步是可选的,为启动的服务器进程设定用户和组 ID, 设定的值可在 /etc/inetd.conf 中设置。5.在第3步中,如果在 tcp 套接字上接受了一个连接,inetd 就关闭这个连接套接字6.inetd 服务跳回第2步继续执行。

60.Linux/Unix 系统编程手册(下) -- SOCKET: 服务器设计相关推荐

  1. linux/unix系统编程手册11-15

    title: linux/unix编程手册-11_15 date: 2018-05-27 11:53:07 categories: programming tags: tips linux/unix编 ...

  2. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  3. Linux/UNIX系统编程手册gg

    Linux系统: "所见皆文件" 一个比较好的博客 一.Linux基础操作 Linux系统目录: bin:存放二进制可执行文件 boot:存放开机启动程序 dev:存放设备文件: ...

  4. Linux/Unix系统编程 五:进程

    进程是一个可执行程序的实例. 一.linux系统进程管理 1.进程管理的作用 判断机器健康状态 查看系统中所有进程 杀手进程 2.查看系统进程 1.ps -aux BSD操作系统格式: TTY说明: ...

  5. Linux C网络编程 ————7、域名解析服务器设计

    代码实现 #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <sys/so ...

  6. Linux系统编程手册-源码的使用

    Linux系统编程手册-源码的使用 转自:http://www.cnblogs.com/pluse/p/6296992.html 第三章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下: ...

  7. Linux/Unix服务端和客户端Socket编程入门实例(含源码下载)

    前言 本章节是用基本的Linux/Unix基本函数编写一个完整的服务器和客户端例子,可在Linux(ubuntu)和Unix(freebsd)上运行,客户端和服务端的功能如下: 客户端从标准输入读入一 ...

  8. Linux/Unix系统下nginx+php安装简明教程

    本文转载自Linux/Unix系统下nginx+php安装简明教程,请保留转载信息~ 一.安装nginx: 1. 安装pcre库,nginx的rewrite模板需用到pcre库: mkdir -p / ...

  9. 在Linux/Unix系统下用iconv命令处理文本文件中文乱码问题

    iconv命令是运行于linux/unix平台的文件编码装换工具.当我们在linux/unix系统shell查看文本文件时,常常会发现文件的中文是乱码的,这是由于文本文件的编码与当前操作系统设置的编码 ...

  10. 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

    文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...

最新文章

  1. Struts详细用法
  2. ASP.NET Web 表单
  3. 深度学习核心技术精讲100篇(三十一)-大众点评搜索基于知识图谱的深度学习排序实践
  4. Nginx配置wss访问实现微信小程序的websocket通信
  5. usb4java android,USB audio on Android platform
  6. Python的开源人脸识别库:离线识别率高达99.38%
  7. ctfmon.exe
  8. sagemath matlab,开源跨平台数学软件SageMath v8.1
  9. 国家集训队 种树 题解
  10. 总体分布概况符合无界约翰逊分布(johnsonsu)的情况
  11. 【自主无人机】无人机领域中知名课题组介绍 - 转自阿木实验室
  12. 微信如何为好友设置特殊铃声提醒提示音
  13. HGAME 2022 week1 个人部分WP
  14. 解决ActiveX组件及Office程序等在Chrome、Edge新内核、360系列、FireFox、IE、Opera等桌面浏览器各版本中的嵌入使用问题
  15. APT(Advanced Packaging Tool)
  16. java云同桌学习系列(十四)——JavaScript语言
  17. 清理SONY D-NE10 的线控器
  18. 2021年广西艺术高考成绩查询,2021广西艺术类统考成绩查询
  19. 永中Office的魅力何在?
  20. 计算机论文写法,计算机专业论文写作方法.ppt

热门文章

  1. 【音乐欣赏】《Sunflower》 - Post Malone / Swae Lee
  2. 稀疏矩阵相乘-Python版
  3. APP的UI自动化测试框架及平台化探索
  4. Java Swing Action 动作
  5. Java课堂作业-------参数求和
  6. P1352 没有上司的舞会[树形dp]
  7. PHP移动互联网开发笔记(6)——MySQL数据库基础回想
  8. 搭建mock-server
  9. python基础之列表、元组和字典
  10. 大量原创视频教程分享(01)---XSL语法教程