
muduo源码分析
文章平均质量分 69
一款使用C++写的基于 one loop per thread的网络库,只支持TCP,值支持Linux平台
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
muduo源码分析--连接的断开
在Tcp中断开连接比创建连接更加困难 真正执行断开连接的时候是从在channel中的handleEvent函数,在Channel中并没有handleRead、handleWrite、handleClose函数出里的实现,都是借助注册的回调来进行的。 在某一个channel上有事件到达时,执行相应的操作,更具事件类型执行相应的操作这个步骤是在handleEvent原创 2014-03-31 17:02:57 · 2680 阅读 · 1 评论 -
muduo源码分析--EventLoop 类的实现
首先看EventLoop的具体实现,因为继承了boost::noncopyable。所以这个类是不可拷贝的。 从设计muduo的理念来看,one loop per thread顾名思义每个线程只能有一个EventLoop对象,因此EventLoop的构造函数就会检查当前线程是否已经创建了其他EventLoop对象,遇到错误就终止程序(LOG_FATAL).EventLoop的构造函数会记原创 2014-03-31 13:35:41 · 2491 阅读 · 0 评论 -
muduo源码分析--buffer中的线程安全
在栈上准备了一个65536字节的extrabuf(这个空间是在readFd函数内部定义的,说以说是内部栈空间,在这个函数返回以后这个栈空间就会消失,属于临时变量),然后利用readv(0来读取数据,iovec有两块,第一块指向Muuod Buffer中的writable字节,另一快指向栈上extrabuf。这样如果读入的数据不多,那么全部都读到Buffer中去了;如果长度超过Buffer的writ原创 2014-03-29 10:15:26 · 2438 阅读 · 0 评论 -
muduo源码分析--数据发送
暂且已经明白在non-blocking+IO multiplexing网络编程模型中应用层的buffer是必须的这个问题,看数据是怎么被发送的: 对于应用程序而言,它只管生成数据,它不应该去关心到底数据是一次性发送还是分成几次发送,这些应该由网络库操心,程序只要调用TcpConnection::send()就行了,网络库会负责到底。网络库应该接管这剩余的20KB数据,把它保存在该原创 2014-03-28 16:35:18 · 1750 阅读 · 0 评论 -
muduo源码分析--数据在muduo中的旅程
在实例化一个EvenLoop之后,就会有两个socketfd(这两个套接字分别归属于两个Channel中,一个是异步唤醒的wakeFd,一个timequeue初始化的fd)被添加到监听队列中 数据发送的流程: 数据的发送主要靠异步唤醒,当主IO线程接受到一个新的连接后,在TcpServer中实例化一个TcpConnection,然后这个新的连接被挂载到某个线程池原创 2014-03-28 14:15:20 · 1817 阅读 · 0 评论 -
muduo源码分析--TcpServer
从TcpServer分析,结果又回到了TcpServer来,但是这次是有目的而来,这次是分析在TcpServer类中如何使用EventLoopThreadPool。 原来我们再使用TcpServer的时候,除了自己再次封装外,还在主函数中自己实例化一个EventLoop,这个EventLoop是用来初始化TcpServer中的EvetnLoopThreadPool而存在的,就是作原创 2014-03-27 22:02:38 · 2342 阅读 · 0 评论 -
muduo源码分析--EventLoopThreadPool类
这个貌似是个池,池里全是EventLoopThread。貌似很强大 这个类对外的接口也很简单 一个构造函数,需要传递的是EventLoop 一个设置个数的函数 setThreadNum,这个函数好像决定了开启几个EventLoopThread 一个start 从感觉上来看这个函数是按照numThreads_的数目来开启线原创 2014-03-27 15:45:57 · 2007 阅读 · 0 评论 -
muduo源码分析---EventLoopThread
这个类只有两个对外接口的函数,一个构造函数,一个开始Loop的函数类的内部成员: 一个Loop指针 loop_(说明内部并没有实例化EventLoop) 一个线程 thread_ 一个锁 Mutex 一个条件变量 cond_ 一个初始化回调 callback_EventLoopThread初原创 2014-03-27 14:51:29 · 2118 阅读 · 0 评论 -
muduo源码分析---EventLoop类
现在暂时记住TcpConnection是TcpServer中Acceptor关注的监听套接字上accept新连接后被初始化的一个对象,接下来分析下EventLoop 这个东西才是真正驱动库的核心,是别的类(EpollPoller Acceptor )帮助他完成了库的功能,看看内部是怎么实现的。EventLoop: 这个类中最重要的成员就是poller_,这个原创 2014-03-27 14:03:29 · 2874 阅读 · 2 评论 -
muduo源码分析--事件如何被关注的 EpollPoller Channel TcpServer
首先看TcpServer: 在这里肯定是有socketfd的,不然这个监听套接字是怎么被关注的呢!这样的操作时通过Accept来处理的Acceptor: 在这个类就是提供给TcpServer让其监听的,类中有Channel,也有一个Socket,有一个事件handleRead(),这个函数肯定是提供给Channel的,等到Acceptor中的socketfd原创 2014-03-26 19:56:25 · 1869 阅读 · 0 评论 -
muduo源码分析--事件回调层次是怎么传递的Tcpserver Channel TcpConnection
muduo库中的源码并不是很多,但是回调的处理非常巧妙,这里从事件激活(某个套接字上可读/可写)以后这个层次看回调怎么被调用的。首先从最大的EventLoop说起: EventLoop中拥有事件链表(每一个元素都是Channel),在loop函数中调用epoll_wait系统调用的时候,将EpollPollr中EventList,将这个链表中激活事件添加到EventLoop中原创 2014-03-26 19:55:06 · 2283 阅读 · 1 评论 -
muduo源码分析--详解muduo多线程模型
6.3 非阻塞网络编程应该用边沿触发(ET)还是电平触发(LT)?如果是电平触发,那么什么时候关注POLLOUT事件?会不会造成busy-loop?如果是边沿触发,如果和防止漏读造成的饥饿?epoll一定比poll快么?6.4 在finger的测试程序中,没有设置onConnection这个函数,就可以连接?6.6 详解muduo多线程模型原创 2014-03-26 11:27:55 · 4202 阅读 · 1 评论 -
常见多线程并发服务器编程模型
一、3点基础知识1、一个主机的端口号为所有进程所共享,但普通用户进程绑定不了一些特殊端口号如20、80等。 2、每个进程都有自己的文件描述符(包括file fd, socket fd, timer fd, event fd, signal fd),一般是1024,可以通过ulimit -n 设置,但所有进程打开的文件描述符总数有上限,跟主机的内存有关。3、一个进原创 2013-12-26 20:52:18 · 4448 阅读 · 1 评论 -
《linux多线程服务端编程--muduo网络库的使用》读后感
很少这么认真的读完这么厚的一本书,很少有书能让自己读完以后再读。对于少有开发经验的人来说,书中的内容恰有醍醐灌顶的效果,书中的内容甚是新颖!从去年12月份买来,大概翻看了一遍,今天开学以后诸事安排妥当,就开始认真读这本书,包括附带的源码。源码并不是很多,但是从作者的介绍来看,竟然实现了那么强大的东西,很是好奇,也想通过这本书来看看C++在工程性质的代码中的大作用。也借此学习学习C++.收获确实原创 2014-04-01 22:20:48 · 3870 阅读 · 1 评论