高并发的服务器有什么模式

高并发的服务器有什么模式,第1张

服务程序最为关键的设计是并发服务模型,当前有以下几种典型的模型:
- 单进程服务,使用非阻塞IO
使用一个进程服务多个客户,通常与客户通信的套接字设置为非阻塞的,阻塞只发生在select()、poll()、epoll_wait()等系统调用上面。这是一种行之有效的单进程状态机式服务方式,已被广泛采用。
缺点是它无法利用SMP(对称多处理器)的优势,除非启动多个进程。此外,它尝试就绪的IO文件描述符后,立即从系统调用返回,这会导致大量的系统调用发生,尤其是在较慢的字节传输时。
select()本身的实现也是有局限的:能打开的文件描述符最多不能超过FD_SETSIZE,很容易耗尽;每次从select()返回的描述符组中扫描就绪的描述符需要时间,如果就绪的描述符在末尾时更是如此(epoll特别彻底修复了这个问题)。
- 多进程服务,使用阻塞IO
也称作 accept/fork 模型,每当有客户连线时产生一个新的进程为之服务。这种方式有时是必要的,比如可以通过 *** 作系统获得良好的内存保护,可以以不同的用户身份运行程序,可以让服务运行在不同的目录下面。但是它的缺点也很明显:进程比较占资源,进程切换开销太大,共享某些信息比较麻烦。Apache 13就使用了这种模型,MaxClients数很容易就可以达到。
- 多线程服务,使用阻塞IO
也称之 accept/pthread_create模型,有新客户来时创建一个服务线程而不是服务进程。这解决了多进程服务的一些问题,比如它占用资源少,信息共享方便。但是麻烦在于线程仍有可能消耗光,线程切换也需要开销。
- 混合服务方式
所谓的混合服务方式,以打破服务方和客户方之间严格的1:1关系。基本做法是:
新客户到来时创建新的工作线程,当该工作线程检测到网络IO会有延迟时停止处理过程,返回给Server一个延迟处理状态,同时告诉 Server被延迟的文件描述符,延迟超时时间。Server会在合适的时候返回工作线程继续处理。注意这里的工作线程不是通过 pthread_create()创建的,而是被包装在专门用于处理延迟工作的函数里。
这里还有一个问题,工作线程如何检测网络IO会有延迟?方法有很多,比如设置较短的超时时间调用poll(),或者甚至使用非阻塞IO。如果是套接字,可以设置SO_RCVTIMEO和SO_SNDTIMEO选项,这样更有效率。
除了延迟线程,Server还应提供了未完成线程的支持。
如有有特别耗费时间的 *** 作,你可以在完成部分工作后停止处理,返回给Server一个未完成状态。这样Server会检查工作队列是否有别的线程,如果有则让它们运行,否则让该工作线程继续处理,这可以防止某些线程挨饿。
典型的一个混合服务模型开源实现ServerKit
Serverkit的这些线程支持功能可简化我们的服务程序设计,效率上应该也是有保证的。
2 队列(queue)
ServerKit提供的队列是一个单向链表,队列的存取是原子 *** 作,如果只有一个执行单元建议不要用,因为原子 *** 作的开销较大。
3 堆(heap)
malloc()分配内存有一定的局限,比如在多线程的环境里,需要序列化内存分配 *** 作。ServerKit提供的堆管理函数,可快速分配内存,可有效减少分配内存的序列化 *** 作,堆的大小可动态增长,堆有引用计数,这些特征比较适合多线程环境。目前ServerKit堆的最大局限是分配单元必须是固定大小。
4 日志记录
日志被保存在队列,有一个专门的线程处理队列中的日志记录:它或者调用syslog()写进系统日志,或者通过UDP直接写到远程机器。后者更有效。
5 读写锁
GNU libc也在pthreads库里实现了读写锁,如果定义了__USE_UNIX98就可以使用。不过ServerKit还提供了读写锁互相转换的函数,这使得锁的应用更为d性。比如拥有读锁的若干个线程对同一个hash表进行检索,其中一个线程检索到了数据,此时需要修改它,一种办法是获取写锁,但这会导致释放读锁和获取写锁之间存在时间窗,另一种办法是使用ServerKit提供的函数把读锁转换成写锁,无疑这种方式更有效率。
除了以上这些功能,ServerKit还提供了数据库连接池的管理(当前只支持MySQL)和序列化(Sequences),如感兴趣可参见相关的API文档。
二、ServerKit服务模块编写
ServerKit由3部分组成:server程序,负责加载服务模块、解析配置文件、建立数据库连接池;libserver,动态链接库,提供所有功能的库支持,包括server本身也是调用这个库写的;API,编程接口,你编写的服务模块和ServerKit框架进行对话的接口。
ServerKit需要libConfuse解析配置文件,所以出了安装ServerKit,还需要安装libConfuse。关于libConfuse可参考 >一群性质相近同的「东西」,如果译名一贯,阅读的感觉就很好。
一贯性的术语,扩充性高,延伸性高,系统化高。
● 我喜欢「式」:
constructor 建构式
declaration 宣告式
definition 定义式
destructor 解构式
expression 算式(运算式)
function 函式
pattern 范式、模式、样式
program 程式
signature 标记式
● 我喜欢「件」:(这是个d性非常大的可组合字)
assembly (装)配件
component 组件
construct 构件
control 控件
event 事件
hardware 硬件
object 物件
part 零件、部件
singleton 单件
software 软件
work 工件、机件
● 我喜欢「器」:
adapter 配接器
allocator 配置器
compiler 编译器
container 容器
iterator 迭代器
linker 联(连)结器
listener 监听器
● 我喜欢「别」:
class 类别
type 型别
● 我喜欢「化」:
generalized 泛化
specialized 特化
overloaded 多载化(重载)
● 我喜欢「型」:
polymorphism 多型
genericity 泛型
● 我喜欢「程」:
process 行程(or 进程,大陆用语)
thread 线程(大陆用语)
programming 编程
●英中繁简编程术语对照
英文 繁体译词
(有些是侯捷个人喜好,普及与否难说) 大陆惯用术语
---------------------------------------------------------------------------------------
#define 定义 预定义
abstract 抽象的 抽象的
abstraction 抽象体、抽象物、抽象性 抽象体、抽象物、抽象性
access 存取、取用 存取、访问
access function 存取函式 存取函数
activate
active
adapter 配接器 适配器
address 位址 地址
address space 位址空间,定址空间
address-of operator 取址运算子 取地址运算符
aggregation 聚合
algorithm 演算法 算法
allocate 配置 分配
allocator (空间)配置器 分配器
application 应用程式 应用、应用程序
application framework 应用程式框架、应用框架 应用程序框架
argument 引数(传给函式的值)。叁见 parameter 叁数、实质叁数、实叁、自变量
array 阵列 数组
arrow operator arrow(箭头)运算子 箭头运算符
assembly 配件
assembly language 组合语言 汇编语言
assign 指派、指定、设值、赋值 赋值
assignment 指派、指定 赋值、分配
assignment operator 指派(赋值)运算子 = 赋值运算符
associated 相应的、相关的 相关的、关联、相应的
associative container 关联式容器(对应 sequential container) 关联式容器
atomic 不可分割的 原子的
attribute 属性 特性
background 背景 背景(用於图形着色)
后台(用於行程)
base class 基础类别 基类
base type 基础型别 (等同於 base class)
batch 批次(意思是整批作业) 批处理
best viable function 最佳可行函式 最佳可行函式
(从 viable functions 中挑出的最佳吻合者)
binary search 二分搜寻法 二分查找
binary tree 二元树 二叉树
binary operator 二元运算子 二元运算符
binding 系结 绑定
bit 位元 位
bit field 位元栏 位域
bitmap 位元图 位图
bitwise 以 bit 为单元逐一┅
bitwise copy 以 bit 为单元进行复制;位元逐一复制 位拷贝
block 区块 块、区块、语句块
boolean 布林值(真假值,true 或 false) 布尔值
border 边框、框线 边框
brace(curly brace) 大括弧、大括号 花括弧、花括号
bracket(square brakcet) 中括弧、中括号 方括弧、方括号
breakpoint 中断点 断点
build-in 内建 内置
bus 汇流排
byte 位元组(由 8 bits 组成) 字节
cache 快取 高速缓存
call 呼叫、叫用 调用
callback 回呼 回调
call operator call(函式呼叫)运算子 () 调用运算符
(同 function call operator)
candidate function 候选函式 候选函数
(在函式多载决议程序中出现的候选函式)
chain 串链(例 chain of function calls) 链
character 字元 字符
check box 核取方块 (ie check button) 复选框
check button 方钮 (ie check box) 复选按钮
child class 子类别(或称为derived class, subtype) 子类
class 类别 类
class body 类别本体 类体
class declaration 类别宣告、类别宣告式 类声明
class definition 类别定义、类别定义式 类定义
class derivation list 类别衍化列 类继承列表
class head 类别表头 类头
class hierarchy 类别继承体系, 类别阶层 类层次体系
class library 类别程式库、类别库 类库
class template 类别模板、类别范本 类模板
class template partial specializations
类别模板偏特化 类模板部分特化
class template specializations
类别模板特化 类模板特化
cleanup 清理、善后 清理、清除
client 客端、客户端、用户端 客户端
client-server 主从架构 客户/服务器
clipboard 剪贴簿 剪贴板
clone 复制 克隆
(易与 copy 混淆)
collection 群集 集合
combo box 复合方块、复合框 组合框
command line 命令列 命令行
(系统文字模式下的整行执行命令)
communication 通讯 通讯
compile time 编译期 编译期、编译时
compiler 编译器 编译器
component 组件 组件
composition 复合、合成、组合 组合
computer 电脑、计算机 计算机、电脑
concrete 具象的 实在的
concurrent 并行 并发
configuration 组态 配置
container 容器 容器
(存放资料的某种结构如 list, vector)
context 背景关系、周遭环境、上下脉络 环境、上下文
control 控制元件、控件 控件
const 常数(constant 的缩写,C++ 关键字)
constant 常数(相对於 variable) 常量、常数
constructor(ctor) 建构式 构造函数、构造器
(与class 同名的一种 member functions)
copy 复制、拷贝 拷贝
cover 涵盖 覆盖
create 产生、生成 创建、生成
creation 产生、生成 创建、生成
data 资料 数据
data member 资料成员、成员变数 数据成员、成员变量
data structure 资料结构 数据结构
datagram 资料元 数据报文
dead lock 死结 死锁
debug 除错 调试
declaration 宣告、宣告式 声明
deduction 推导(例:template argument deduction) 推导、推断
default 预设 缺省、默认
definition 定义、定义区、定义式 定义
delegate 委派、委托、委任
delegation (同上)
dereference 提领(取出指标所指物体的内容) 解叁考
dereference operator dereference(提领)运算子 解叁考算符
derived class 衍生类别 派生类
design by contract 契约式设计
design pattern 设计样式 设计模式
※ 最近我比较喜欢「设计范式」一词
destructor(dtor) 解构式 析构函数、析构器
device 装置、设备 设备
dialog 对话窗、对话盒 对话框
directive 指令(例:using directive) (编译)指示符
directory 目录 目录
distributed computing 分布式计算 (分布式电算) 分布式计算
分散式计算 (分散式电算)
document 文件 文档
dot operator dot(句点)运算子 (圆)点运算符
driver 驱动程式 驱动(程序)
dynamic binding 动态系结 动态绑定
efficiency 高效、效率、效能
entity 物体 实体、物体
encapsulation 封装 封装
enclosing class 外围类别(与巢状类别 nested class 有关)外围类
enum (enumeration) 列举(一种 C++ 资料型别) 枚举
enumerators 列举元(enum 型别中的成员) 枚举成员、枚举器
equality operator equality(等号)运算子 == 等号运算符
evaluate 评估、求值、核定 评估
event 事件 事件
event driven 事件驱动的 事件驱动的
exception 异常情况 异常
exception declaration 异常宣告(ref C++ Primer 3/e, 113) 异常声明
exception handling 异常处理、异常处理机制 异常处理、异常处理机制
exception specification 异常规格(ref C++ Primer 3/e, 114) 异常规范
exit 退离(指离开函式时的那一个执行点) 退出
explicit 明白的、明显的、显式 显式
export 汇出 引出、导出
expression 运算式、算式 表达式
facility 设施、设备 设施、设备
feature 特性
field 栏位 字段
file 档案 文件
firmware 韧体 固件
flush 清理、扫清 刷新
form 表单(programming 用语)
formal parameter 形式叁数 形式叁数
forward declaration 前置宣告 前置声明
fractal 碎形 分形
framework 框架 框架
full specialization 全特化(ref partial specialization)
function 函式、函数 函数
function call operator 同 call operator
function object 函式物件(ref C++ Primer 3/e, 123) 函数对象
function overloaded resolution
函式多载决议程序 函数重载解决(方案)
function template 函式模板、函式范本 函数模板
functor 仿函式 仿函式、函子
generic 泛型、一般化的 一般化的、通用的、泛化
generic algorithm 泛型演算法 通用算法
global 全域性的(对应於 local) 全局的
global scope resolution operator
全域生存空间(范围决议)运算子 :: 全局范围解析运算符
group 群组
group box 群组方块 分组框
hand shaking 握手协商
handle 识别码、识别号、号码牌、权柄 句柄
handler 处理常式 处理函数
hardware 硬体 硬件
hash table 杂凑表 哈希表、散列表
header file 表头档、标头档 头文件
heap 堆积 堆
hierarchy 阶层体系 层次结构(体系)
hook 挂钩 钩子
hyperlink 超链结 超链接
IDE 整合开发环境 集成开发环境
identifier 识别字、识别符号 标识符
immediate base 直接的(紧临的)上层 base class。 直接上层基类
immediate derived 直接的(紧临的)下层 derived class。 直接下层派生类
implement 实作 实现
implementation 实作品、实作物、实作体、实作码 实现
implicit 隐喻的、暗自的、隐式 隐式
import 汇入 导入
increment operator 累加运算子 ++ 增加运算符
information 资讯 信息
infrastructure 公共基础建设
inheritance 继承、继承机制 继承、继承机制
inline 行内 内联
inline expansion 行内展开 内联展开
initialization 初始化(动作) 初始化
initialization list 初值列 初始值列表
initialize 初始化 初始化
instance 实体 实例
(根据某种表述而实际产生的「东西」)
instantiated 具现化、实体化(常应用於 template) 实例化
instantiation 具现体、具现化实体(常应用於 template) 实例
integrate 整合 集成
interface 介面 接口
invoke 唤起 调用
iterate 迭代(回圈一个轮回一个轮回地进行) 迭代
iterative 反覆的,迭代的
iterator 迭代器(一种泛型指标) 迭代器
iteration 迭代(回圈每次轮回称为一个 iteration) 迭代
item 项目、条款 项、条款、项目
laser 雷射 激光
level 阶 层
例 high level 高阶 高层
library 程式库、函式库 库、函数库
lifetime 生命期、寿命 生命期、寿命
link 联结、连结 连接
linker 联结器、连结器 连接器
literal constant 字面常数(例 314 或 "hi" 这等常数值) 字面常数
list 串列(linked-list) 列表、表、链表
list box 列表方块、列表框 列表框
load 载入 装载、加载
loader 载入器 装载器、载入器
local 区域性的(对应於 global) 局部的
lock 机锁
loop 回圈 循环
lvalue 左值 左值
macro 巨集 宏
maintain 维护 维护
manipulator *** 纵器(iostream 预先定义的一种东西) *** 纵器
mechanism 机制 机制
member 成员 成员
member access operator 成员取用运算子(有 dot 和 arrow 两种) 成员存取运算符
member function 成员函式 成员函数
member initialization list
成员初值列 成员初始值列表
memberwise 以 member 为单元┅、members 逐一┅ 以成员为单位
memberwise copy 以 members 为单元逐一复制
memory 记忆体 内存
menu 表单、选单 菜单
message 讯息 消息
message based 以讯息为基础的 基於消息的
message loop 讯息回圈 消息环
method (java) 方法、行为
micro 微 微
modeling 模塑
modeling language 塑模语言,建模语言
module 模组 模块
most derived class 最末层衍生类别 最底层的派生类
mouse 滑鼠 鼠标
mutable 可变的 可变的
multi-tasking 多工 多任务
namespace 命名空间 名字空间、命名空间
nested class 巢状类别 嵌套类
object 物件 对象
object based 以物件为基础的 基於对象的
object model 物件模型 对象模型
object oriented 物件导向的 面向对象的
online 线上 在线
operand 运算元 *** 作数
operating system (OS)

从专业的角度说,TCP的可靠保证,是它的三次握手机制,这一机制保证校验了数据,保证了他的可靠性。而UDP就没有了,所以不可靠。不过UDP的速度是TCP比不了的,而且UDP的反应速度更快,QQ就是用UDP协议传输的,>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13148864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-12
下一篇 2023-06-12

发表评论

登录后才能评论

评论列表(0条)

保存