高性能服务器框架

守护进程

一个服务器程序首先是守护进程,一种在后台执行的程序。

守护进程的定义

在一个多任务的电脑操作系统中,守护进程(英语:daemon,/ˈdiːmən/或/ˈdeɪmən/)是一种在后台执行的电脑程序。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。

摘自https://zh.wikipedia.org/wiki/守护进程

守护进程的特点

  • 生存周期长
  • 没有控制终端
  • 不直接和用户交互
  • 不受用户登录注销的影响

守护进程的创建

  1. 创建子进程,父进程退出。脱离控制终端,在后台执行。

  2. 子进程创建新的会话。脱离控制终端的会话组、进程组。

  3. 再次创建子进程并让父进程退出。该子进程不是会话组长,不能重新打开新的控制终端。

  4. 设置守护进程的工作目录为根目录。子进程会继承父进程的工作目录,不设置为根目录,该目录所在的文件系统就无法卸载。

  5. 清除守护进程的文件权限掩码。不清除会影响守护进程创建的文件的权限。

  6. 关闭守护进程中任何不需要的文件描述符。不关闭,会浪费系统资源,并导致所在的文件系统无法卸载。

  7. 守护进程退出处理。处理子进程退出;捕捉退出的信号,释放系统资源,让守护进程正常退出。

注:以上步骤是守护进程创建的完整步骤,服务器框架会根据需要自由选择。但第1、7点是必选,第2、6点通常也会实现。

 

io并发(io多路复用)

io的并发在以前的框架,还会有依靠多进程/多线程的设计。但已经被淘汰了,现在用的是io多路复用。

I/O多路复用机制

  • epoll + 同步非阻塞I/O(Linux)
  • iocp + 异步非阻塞I/O(Windows)
  • kqueue + 同步非阻塞I/O
  • poll + 同步非阻塞I/O
  • select + 同步非阻塞I/O

I/O事件处理模式

Reactor(同步I/O)

步骤:

  • 注册事件
  • 系统通知事件就绪
  • 读取数据
  • 处理数据

如下图:

高性能服务器框架_第1张图片

Proactor(异步I/O)

步骤:

  • 注册操作完成的事件
  • 系统读数据
  • 系统通知事件就绪
  • 处理数据

如下图:

高性能服务器框架_第2张图片

 

任务并发

并发机制

  • 同步:进程/线程
  • 异步:异步回调
  • 异步模拟同步:协程(使用像同步,实际执行是异步)

注:这里的同步/异步,和前面io中的同步/异步是不同的概念。

并发模型

并行工作者

在并行工作者并发模型中,一个代理分配进来的工作到不同的工作者。每一个工作者完成整个的任务。如下图:

高性能服务器框架_第3张图片

流水线(反应式系统、事件驱动系统)

流水线模型类似于工厂里的流水线作业,每个worker只负责一个部分。在服务器框架的实现上往往和并行工作者结合使用(有多条流水线同时进行)。如下图:

高性能服务器框架_第4张图片

 

定时器

服务器经常需要关闭客户端长时间没有请求的、或后端服务长时间没有响应的连接,那么就需要定时器。

红黑树、时间堆(最小堆)

两种定时器操作的时间复杂度是一样的,具体算法暂不介绍

时间复杂度

  • Add: O(logn)
  • Del: O(logn)
  • Process Expired: O(m)

注:m代表超时的节点数

时间轮

时间复杂度

  • Add: O(1)
  • Del: O(1)
  • Process Expired: O(m)

简单时间轮

时间轮是一个循环列表,可以想象成时钟,分为很多格子,一个格子代表一段时间,并用一个链表保存在该格子上到期的所有任务,同时一个指针随着时间流逝一格一格转动,并执行对应链表中所有到期的任务。任务通过取模决定放入哪个格子。如下图:

高性能服务器框架_第5张图片

分层时间轮

简单时间轮里列表的长度会限制定时器的最大超时时间,这时可以用分层时间轮解决。

分层时间轮由多个不同层级的时间轮组成。每个任务在当前时间轮上到期时,该任务将被放到下一层的时间轮上,直到最下层的时间轮。如下图:

高性能服务器框架_第6张图片

转载于:https://my.oschina.net/distroy/blog/1842409

你可能感兴趣的:(高性能服务器框架)