Linux服务器编程学习||服务器模型简单总结

1、服务器模型

1、C/S模型(客户端/服务端)

一台服务器,多台客户端的模式,适合资源相对集中的场合,且实现比较简单。缺点:当访问量过大的时候,相应会比较慢。

模型工作流程:

1)服务器启动:创建socket()->调用bind()将其绑定到服务器感兴趣的端口->调用listen()等待客户连接->接收accept()->fork() (这一步可以采用线程、子进程或者进程直接处理)->

send()->recv()接收客户端关闭的信号,被动关闭服务器->close()

2)客户端创建socket()->调用connect()->send()->recv()客户端接收服务器的应答-》close()关闭连接

2、P2P模型(点对点模型)

更加适合实际通信,所有主机地位一致。(云计算机群是典型案例),优点:每天计算机在消耗资源的同时也提供服务,资源能够充分自由共享。缺点:当用户之间请求过多时候,负载也比较大。

另外,一般需要配有一个发现服务器,以便于各个主机能够快速找到自己所需要的资源。

二、服务器编程框架

I/O处理单元:服务器管理客户连接的模块。

作用:等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。

逻辑单元:本质是进程或者线程,分析处理客户数据,再将结果传给I/O或者直接给客户端(具体看事件处理模式)。

网络存储单元:数据库,缓存和文件,甚至是一台服务器(并不是必须的)

请求队列:是各个单元之间通信的抽象。 

I/O模型

阻塞I/O:阻塞的文件描述符。系统执行调用无法立即完成时,则会将调用挂起,直到事件发生为止。(可能被阻塞的系统调用包括:accept(),send(),recv(),connect())

非阻塞I/O:非阻塞的文件描述符.系统调用总是立即返回,不管是否发生。事件没有立即发生,系统调用就返回-1.需要用errno区分。(一般与其他通知机制一起,比如I/O复用,SIGIO信号)

I/O复用应用程序通过I/O复用函数向内核注册一组事件,内核通过复用函数将其中就绪的事件通知给应用程序。函数本身是阻塞的,但是可以监听多个I/O事件,对I/O本身的读写是非阻塞的。

SIGIO信号:为一个目标文件描述符指定宿主进程,被指定的进程就可以捕获SIGIO信号,事件发生,信号处理函数就会被触发,即可处理。

异步I/O:由内核执行读写操作并触发读写完成事件,非阻塞。

(蓝色的三者都是同步I/O)

三、事件处理的两种模式

1、Reactor模式

简单来讲就是:I/O处理单元(主线程)只是负责监听文件描述符是否发生,其他工作交给逻辑单元(工作线程)处理。一般常用同步I/O实现。

 2、Proactor模式

简单来讲:就是把所有操作都交给主线程(处理单元)和内核来处理,逻辑单元(工作线程只是负责业务逻辑),这样就需要异步I/O来实现。

四、并发模型

1、半同步/半异步模式

首先明确同步,异步概念

在并发模式中:

同步是指程序完全按照代码序列的顺序执行;

“异步”是指程序的执行需要系统事件来驱动;

系统事件:中断,异常,信号等

在I/O模型中:同步,异步是内核向应用程序通知的是何种I/O事件(就绪/完成),以及该由谁完成I/O读写(应用/内核)

同步线程:逻辑简单,效率较低,实时性较差;异步线程:效率高,但是逻辑复杂,不适合大量并发。

半同步/半异步模式:同步线程用于处理用户逻辑(逻辑单元),异步线程处理I/O事件(I/O处理单元)。

具体流程:异步线程监听到客户请求,将其封装成请求对象插入请求队列,请求队列通知同步线程读取并处理请求对象。

变体:半同步/半反应堆:主线程完成数据的读写,然后将应用程序数据、任务类型等信息封装成一个任务对象,插入请求队列,工作线程取得对象直接处理,就不需要再做读写。

缺点:工作线程,主线程共享请求队列,需要对请求队列加锁保护,浪费CPU

           同一时间工作线程只能处理一个任务,客户 数量较多,就会积压很多任务,响应会越来越慢

          半同步/半异步:主线程只负责监听socket,连接socket交给工作线程去做。即有了新的连接直接分配,后续工作都给工作线程。

2、领导者/追随者模式

是多个工作线程轮流获得事件源的集合,轮流监听,分发并处理事件的一种模式。在任意一个时间点只有一个领导者,其他的都是追随者,休眠在线程池等待成为新的领导者。领导者则负责监听I/O事件,当检测到新的I/O事件,那么从线程池推选一个新的领导者,自己处理I/O事件。

 1)句柄集:句柄用于表示I/O资源,句柄集就是管理众多句柄,使用wait_for_event监听,当有就绪事件就通知领导者,实现处理。

2)线程集:所有的线程都在。负责管理线程之间的同步,领导者的推选。线程集下的线程一定是:领导者,处理中,追随者三中状态之一。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值