muduo学习笔记(一)

单线程服务器编程模型

reactor模式:non-blocking IO + IO multiplexing模型

这种模型的程序基本结构:

一个事件循环(event loop),以事件驱动(event-driven)和事件回调的方式实现业务逻辑:

while(!done)
{
    int timeout_ms=max(1000,getNextTimedCallback());
    int retval=::poll(fds,nfds,timeout_ms);
    if(retval<0){
        处理错误,回调用户的error handler
    }else{
        处理到期的timers,回调用户的timer handler
        if(retval<0){
            处理IO事件,回调用户的IO event handler
        }
    }
}

这种模式要求回调函数是非阻塞的。

多线程服务器编程模型

non-blocking IO + one loop per thread

每个IO线程有一个event loop(或者叫reactor),处理读写和定时器事件(周期性或者单次)

基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式。原来是

  • 主动调用recv(2)来接受数据,
  • 主动调用accept(2)来接收连接,
  • 主动调用send(2)来发送数据,

现在是:

  • 注册一个收数据的回调,网络库收到数据会回调,直接把数据提供给用户。
  • 注册一个接收连接的回调,网络库接受了新连接会回调,直接把新的连接对象传给服务器。
  • 需要发送数据的时候,只管往连接写,网络库会负责无阻塞地发送

tcp编程最本质的是处理三个半事件:

  • 1.连接的建立:包括服务端接受新连接和客户端发起连接
  • 2.连接的断开:主动断开和被动断开
  • 3.消息到达,文件描述符可读。这是最重要的一个事件,对他的处理决定网络编程的风格(阻塞或者非阻塞,处理分包,应用层缓冲如何设计)
  • 3.5消息发送完毕,这算半个。这里的发送完毕指将数据写入操作系统缓冲区。

基于事件编程的特点:程序主体被动等待事件发生,事件发生后网络库会调用注册的事件处理函数。

Reactor的意义在于将消息(IO事件)分发到用户提供的处理函数,并保证网络部分通用代码不变,独立于用户的业务逻辑。

没有事件的时候,线程等待在select/poll/epoll_wait函数上。时间到达由网络库处理IO,再把消息回调客户代码。Reactor事件循环所在的线程叫做IO线程。网络库负责读写socket,用户代码解码、计算、编码。

全部的IO工作都在一个reactor线程完成,计算任务交给thread poll.

线程池的另外一个作用是执行阻塞操作。有的数据库客户端只提供同步访问,那么查询数据库放到线程池,避免阻塞IO线程,不会影响其他客户连接。

muduo的特点

one loop per thread,有一个main reactor负责accept(2)连接,然后把连接挂在某个sub Reactor中,这样该连接的所有操作都在那个sub Reactor所处的线程完成。

总结:

one loop per thread+ thread poll

event loop用作non-blocking IO 和定时器

thread poll用来做计算,具体可以是任务队列或者生产者消费者队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值