linux高性能服务器编程第八章(高性能服务器程序框架)
C/S模型
传统C/S,一端作为客户端,一端作为服务器,这里不做多介绍。
P2P模型
peer 2 peer ,每台机器使用服务的同时也提供服务,通俗的讲,没有绝对客户端和服务端的概念,当下云计算的模型就是这样实现的,但他具有一个缺点,就是难以被发现,所以通常加上一个发现服务器。
服务器编程框架
通常分为四块,
IO处理模块
若是单个服务器,用于处理用户链接和收发
若是服务器集群,作为传入服务器,实现负载均衡
逻辑处理单元
若是单个服务器,线程或进程形式存在
若是服务器集群,逻辑服务器形式存在
网络存储单元
若是单个服务器,本地数据库文件或者缓存
若是服务器集群,数据库服务器
请求队列
若是单个服务器,各个单元通信
若是服务器集群,永久的TCP
IO模型
阻塞I/O
阻塞读写函数
I/O复用
I/O服用也是阻塞的,但可以同时监视多个I/O,对于I/O本身是非阻塞的
SIGIO信号
信号触发读写事件,用于用户的读写操作。程序没有阻塞阶段
异步IO
内核执行读写操作并触发读写事件的完成,程序没有阻塞阶段
两种高效的事件处理模式
服务器通常要处理的三件事情,I/O事件、信号、定时器
Reactor:有数据来了通知我(主线程),然后唤醒工作线程执行读写。
1.主线程往epoll内核事件表注册socket上的读就绪事件
2.调用epoll_wait等待socket的读写事件
3.当socket上的数据可读时候,epoll_wait通知主线程,主线程将socket刻度事件放入请求队列;
4.睡眠在请求队列的某个工作线程被唤醒,它从socket读取数据,并处理客户的请求,然后往epoll内核这侧该socket的写就绪事件‘
5.主线程继续调用sokcet的可写;
6.可写的情况也是一样的
Proactor:你(内核)给我取10字节数据,取完了通知我。
1.主线程调用aio_read函数向内核注册读写事件,并告诉内核用户缓冲区的位置。以及读写操作时如何通知应用程序
2.主线程继续处理其他逻辑
3.当socket上数据被读入到用户缓冲区时候,内核向应用程序发一个信号,已通知应用程序有数据可用
4.应用程序预先定义好的信号函数选择一个工作线程去处理。工作线程处理用户请求后,调用aio_write函数注册内核写事件,并告诉缓冲区的位置
5.当内核处理完毕时候向主线程发送一个信号,通知其处理完毕
7.主线程进行后续事件的处理,如关闭当前socket
模拟proactor模式
两种高效的并发模式
半同步和半异步模式
异步线程只有一个,就是主线程,负责监听链接,再把读写事件放到epoll内核事件
剩下的是同步线程,主要负责用户数据的处理;
衍生的是版反应堆模型,用一个队列维护被封装成对象;
会出现,加锁效率低,同一时间只能处理一个客户请求的问题;
而半同步半异步是在主线程收到链接后,将注册epoll读写的事件放到工作线程里,这样就可以在同一时间处理大量请求;
领导者和追随者
由四个部分组成,句柄集,线程集,事件处理器,具体事件处理器
句柄集,负责I/0资源,管理多个句柄,使用wait_for_event()来监听IO,并将其中的就绪事件通知给领导者,领导者用绑定好句柄的事件处理器来处理事件
线程集,有三种角色,分别是领导者、追随者、正在处理事件的线程
事件处理器,拥有多个回调函数,绑定句柄后,当有新的事件发生时候,调用回调函数。
具体事件处理器,是事件处理器的派生类
说白了就是:
大哥在的时候,大哥当家。负责家里的管理;
大哥不在的时候(大哥执行任务),二哥当家,负责家里的管理;
依次类推,增加执行效率;
优点是,不需要线程之间的数据交互,减少cpu切换线程所花费的时间;
缺点是,一个线程只能处理一个socket的io事件;
有限状态机
while (state != STATE_E)
{
switch( state)
{
case STATE_A:
process_A();
state = STATE_B;
break;
case STATE_B:
process_B();
state = STATE_D;
break;
case STATE_C:
process_C();
state = STATE_E;
break;
case STATE_D:
process_D();
state = STATE_E;
break;
}
case STATE_E:
process_E();
break;
}
提高服务器性能的其他建议
除了上述提的外,还可以用池子,减少数据复制,减少上下问的切换和锁;
linux高性能服务器编程第八章(高性能服务器程序框架)相关推荐
- 【linux草鞋应用编程系列】_4_ 应用程序多线程
一.应用程序多线程 当一个计算机上具有多个CPU核心的时候,每个CPU核心都可以执行代码,此时如果使用单线程,那么这个线程只能在一个 CPU上运行,那么其他的CPU核心就处于空闲状态,浪费了系统资源: ...
- Linux学习——网络编程基础及TCP服务器
目录 一.网络采用分层的思想: 二.各层典型的协议: 三.网络的封包和拆包: 四.网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五.TCP编程API TC ...
- Linux并发服务器编程之多线程并发服务器
转载:http://blog.csdn.net/qq_29227939/article/details/53782198 上一篇文章使用fork函数实现了多进程并发服务器,但是也提到了一些问题: fo ...
- Linux C网络编程 ————7、域名解析服务器设计
代码实现 #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <sys/so ...
- 《Linux高性能服务器编程》——导读
前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的 ...
- SMTP协议初探(二)----linux下c编程实现发邮件
仿照,SMTP协议初探(一)--我的前一篇博客,结合网上的材料,利用socket,写了个Linux下c编程实现的发邮件程序. 大家可以拿自己的邮箱去做实验啦,base64是一种编码方式,网上可以找到一 ...
- Linux高性能服务器编程——书籍阅读笔记
目录 前言 正文 第一章 1. 零拷贝函数 2. TCP/IP协议族 3. OSPF 4. ARP协议 5. RARP 6. ICMP协议 7. TCP协议 8. UDP协议 9. 封装 第四章 TC ...
- 《Linux高性能服务器编程》学习笔记
<Linux高性能服务器编程>学习笔记 Linux高性能服务器编程 TCP/IP协议族 TCP/IP协议族体系结构以及主要协议 数据链路层 网络层 传输层 应用层 封装 分用 测试网络 A ...
- Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程: 2 读取和设置线程属性: 3 线程同步方式:POSIX信号量,互斥锁和条 ...
最新文章
- 2021-1-17 随笔
- php SQLite mysql_PHP实现的sqlite数据库连接类
- MySQL 子查询 嵌套查询
- C语言在有序的数组是否存在固定点(附完整源码)
- Elasticsearch聚合 之 Date Histogram聚合
- UIButton return(textField textView)
- 【ZOJ - 2955】Interesting Dart Game(背包,结论,裴蜀定理,数论)
- CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现
- PHP 读取JSON数据
- VirtualBox下安装MacOS11
- c语言结构体菜单显示框架,请教c语言结构体嵌套问题。field `atItem' has incomplete type...
- oracle设为归档模式,设置oracle归档模式
- android 布局属性
- import cv2 失败 ImportError:DLL load fail:找不到指定模块
- [python] 安装TensorFlow问题 解决Cannot uninstall ‘wrapt‘. It is a distutils installed project
- 浙江大学公共管理学院与阿里云计算有限公司达成合作 | 凌云时刻
- cubase DCOM connection to programe Synsopose.exe failed
- android如何截屏快捷键,安卓手机怎么截图 各大品牌快捷键截屏大集合
- SpringBoot的国际化错误信息返回
- 幻月大陆辅助多开挂机攻略