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高性能服务器编程第八章(高性能服务器程序框架)相关推荐

  1. 【linux草鞋应用编程系列】_4_ 应用程序多线程

    一.应用程序多线程 当一个计算机上具有多个CPU核心的时候,每个CPU核心都可以执行代码,此时如果使用单线程,那么这个线程只能在一个 CPU上运行,那么其他的CPU核心就处于空闲状态,浪费了系统资源: ...

  2. Linux学习——网络编程基础及TCP服务器

    目录 一.网络采用分层的思想: 二.各层典型的协议: 三.网络的封包和拆包: 四.网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五.TCP编程API TC ...

  3. Linux并发服务器编程之多线程并发服务器

    转载:http://blog.csdn.net/qq_29227939/article/details/53782198 上一篇文章使用fork函数实现了多进程并发服务器,但是也提到了一些问题: fo ...

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

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

  5. 《Linux高性能服务器编程》——导读

    前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的 ...

  6. SMTP协议初探(二)----linux下c编程实现发邮件

    仿照,SMTP协议初探(一)--我的前一篇博客,结合网上的材料,利用socket,写了个Linux下c编程实现的发邮件程序. 大家可以拿自己的邮箱去做实验啦,base64是一种编码方式,网上可以找到一 ...

  7. Linux高性能服务器编程——书籍阅读笔记

    目录 前言 正文 第一章 1. 零拷贝函数 2. TCP/IP协议族 3. OSPF 4. ARP协议 5. RARP 6. ICMP协议 7. TCP协议 8. UDP协议 9. 封装 第四章 TC ...

  8. 《Linux高性能服务器编程》学习笔记

    <Linux高性能服务器编程>学习笔记 Linux高性能服务器编程 TCP/IP协议族 TCP/IP协议族体系结构以及主要协议 数据链路层 网络层 传输层 应用层 封装 分用 测试网络 A ...

  9. Linux 高性能服务器编程——多线程编程

    问题聚焦:     在简单地介绍线程的基本知识之后,主要讨论三个方面的内容:     1 创建线程和结束线程:     2 读取和设置线程属性:     3 线程同步方式:POSIX信号量,互斥锁和条 ...

最新文章

  1. 2021-1-17 随笔
  2. php SQLite mysql_PHP实现的sqlite数据库连接类
  3. MySQL 子查询 嵌套查询
  4. C语言在有序的数组是否存在固定点(附完整源码)
  5. Elasticsearch聚合 之 Date Histogram聚合
  6. UIButton return(textField textView)
  7. 【ZOJ - 2955】Interesting Dart Game(背包,结论,裴蜀定理,数论)
  8. CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现
  9. PHP 读取JSON数据
  10. VirtualBox下安装MacOS11
  11. c语言结构体菜单显示框架,请教c语言结构体嵌套问题。field `atItem' has incomplete type...
  12. oracle设为归档模式,设置oracle归档模式
  13. android 布局属性
  14. import cv2 失败 ImportError:DLL load fail:找不到指定模块
  15. [python] 安装TensorFlow问题 解决Cannot uninstall ‘wrapt‘. It is a distutils installed project
  16. 浙江大学公共管理学院与阿里云计算有限公司达成合作 | 凌云时刻
  17. cubase DCOM connection to programe Synsopose.exe failed
  18. android如何截屏快捷键,安卓手机怎么截图 各大品牌快捷键截屏大集合
  19. SpringBoot的国际化错误信息返回
  20. 幻月大陆辅助多开挂机攻略

热门文章

  1. SEO怎么去优化,如何利用相关软件?
  2. [芬享] 佛家四大经典爱情故事
  3. 用Python免费发短信,实现程序实时报警
  4. iptables命令
  5. Mac下使用iPic+腾讯云cos打造舒服的写作环境
  6. 关于运维,新华三的经验谈
  7. 52张扑克牌排序算法
  8. These critical programs are missing or too old: python
  9. 南阳 779 兰州烧饼
  10. 关于好易网采用GWT技术开发网站的总结