
muduo源码分析
文章平均质量分 72
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
muduo源码分析--数据在muduo中的旅程
在实例化一个EvenLoop之后,就会有两个socketfd(这两个套接字分别归属于两个Channel中,一个是异步唤醒的wakeFd,一个timequeue初始化的fd)被添加到监听队列中 数据发送的流程: 数据的发送主要靠异步唤醒,当主IO线程接受到一个新的连接后,在TcpServer中实例化一个TcpConnection,然后这个新的连接被挂载到某个线程池原创 2014-03-28 14:15:20 · 1817 阅读 · 0 评论 -
muduo源码分析--多线程模型适用场合
“服务器开发”包罗万象,本文所指的“服务器开发”的含义请见《常用模型》一文,一句话形容是:跑在多核机器上的 Linux 用户态的没有用户界面的长期运行的网络应用程序。“长期运行”的意思不是指程序 7x24 不重启,而是程序不会因为无事可做而退出,它会等着下一个请求的到来。例如 wget 不是长期运行的,httpd 是长期运行的。正名与前文相同,本文的“进程”指的是 fork() 系统调用的转载 2014-11-08 20:43:40 · 1329 阅读 · 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中的shutdown没有直接关闭TCP连接?
今天收到一位网友来信:在 simple 中的 daytime 示例中,服务端主动关闭时调用的是如下函数序列,这不是只是关闭了连接上的写操作吗,怎么是关闭了整个连接?void DaytimeServer::onConnection(const muduo::net::TcpConnectionPtr& conn) 2: { 3: if (conn->con转载 2014-11-13 21:16:57 · 1228 阅读 · 0 评论 -
muduo源码分析--连接的断开
在Tcp中断开连接比创建连接更加困难 真正执行断开连接的时候是从在channel中的handleEvent函数,在Channel中并没有handleRead、handleWrite、handleClose函数出里的实现,都是借助注册的回调来进行的。 在某一个channel上有事件到达时,执行相应的操作,更具事件类型执行相应的操作这个步骤是在handleEvent原创 2014-03-31 17:02:57 · 2680 阅读 · 1 评论 -
muduo源码分析--Reactor模式在muduo中的使用
一. Reactor模式简介Reactor释义"反应堆",是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为"回调函数"。二. moduo库Reactor模式的实现原创 2014-10-30 20:27:57 · 1777 阅读 · 0 评论 -
muduo源码分析--Reactor模式的在muduo中的使用(二)
一. TcpServer类:管理所有的TCP客户连接,TcpServer供用户直接使用,生命期由用户直接控制。用户只需设置好相应的回调函数(如消息处理messageCallback)然后TcpServer::start()即可。主要数据成员: boost::scoped_ptr acceptor_; 用来接受连接 std::map connections_; 用来存储所有连原创 2014-10-30 20:39:22 · 1352 阅读 · 0 评论 -
互斥锁和条件变量的结合使用
互斥锁一个明显的缺点是他只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,他常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,原创 2014-10-30 21:43:47 · 2365 阅读 · 0 评论 -
常见多线程并发服务器编程模型
一、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 评论 -
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 评论 -
muduo源码分析--事件如何被关注的 EpollPoller Channel TcpServer
首先看TcpServer: 在这里肯定是有socketfd的,不然这个监听套接字是怎么被关注的呢!这样的操作时通过Accept来处理的Acceptor: 在这个类就是提供给TcpServer让其监听的,类中有Channel,也有一个Socket,有一个事件handleRead(),这个函数肯定是提供给Channel的,等到Acceptor中的socketfd原创 2014-03-26 19:56:25 · 1869 阅读 · 0 评论 -
muduo源码分析--数据发送
暂且已经明白在non-blocking+IO multiplexing网络编程模型中应用层的buffer是必须的这个问题,看数据是怎么被发送的: 对于应用程序而言,它只管生成数据,它不应该去关心到底数据是一次性发送还是分成几次发送,这些应该由网络库操心,程序只要调用TcpConnection::send()就行了,网络库会负责到底。网络库应该接管这剩余的20KB数据,把它保存在该原创 2014-03-28 16:35:18 · 1750 阅读 · 0 评论 -
muduo源码分析---EventLoop类
现在暂时记住TcpConnection是TcpServer中Acceptor关注的监听套接字上accept新连接后被初始化的一个对象,接下来分析下EventLoop 这个东西才是真正驱动库的核心,是别的类(EpollPoller Acceptor )帮助他完成了库的功能,看看内部是怎么实现的。EventLoop: 这个类中最重要的成员就是poller_,这个原创 2014-03-27 14:03:29 · 2874 阅读 · 2 评论 -
muduo源码分析--TcpServer
从TcpServer分析,结果又回到了TcpServer来,但是这次是有目的而来,这次是分析在TcpServer类中如何使用EventLoopThreadPool。 原来我们再使用TcpServer的时候,除了自己再次封装外,还在主函数中自己实例化一个EventLoop,这个EventLoop是用来初始化TcpServer中的EvetnLoopThreadPool而存在的,就是作原创 2014-03-27 22:02:38 · 2342 阅读 · 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源码分析--EventLoop 类的实现
首先看EventLoop的具体实现,因为继承了boost::noncopyable。所以这个类是不可拷贝的。 从设计muduo的理念来看,one loop per thread顾名思义每个线程只能有一个EventLoop对象,因此EventLoop的构造函数就会检查当前线程是否已经创建了其他EventLoop对象,遇到错误就终止程序(LOG_FATAL).EventLoop的构造函数会记原创 2014-03-31 13:35:41 · 2491 阅读 · 0 评论 -
《linux多线程服务端编程--muduo网络库的使用》读后感
很少这么认真的读完这么厚的一本书,很少有书能让自己读完以后再读。对于少有开发经验的人来说,书中的内容恰有醍醐灌顶的效果,书中的内容甚是新颖!从去年12月份买来,大概翻看了一遍,今天开学以后诸事安排妥当,就开始认真读这本书,包括附带的源码。源码并不是很多,但是从作者的介绍来看,竟然实现了那么强大的东西,很是好奇,也想通过这本书来看看C++在工程性质的代码中的大作用。也借此学习学习C++.收获确实原创 2014-04-01 22:20:48 · 3870 阅读 · 1 评论 -
原来Muduo是一个人自己写的!!!
陈硕 (giantchen_AT_gmail)Blog.youkuaiyun.com/Solstice2010 Aug 30本文主要介绍 muduo 网络库的使用。其设计与实现将有另文讲解。由来半年前我写了一篇《学之者生,用之者死——ACE历史与简评》,其中提到“我心目中理想的网络库”的样子: 线程安全,支持多核多线程 不考虑可移植性,不跨平台,转载 2013-11-06 15:04:25 · 5601 阅读 · 1 评论 -
muduo源码分析--事件回调层次是怎么传递的Tcpserver Channel TcpConnection
muduo库中的源码并不是很多,但是回调的处理非常巧妙,这里从事件激活(某个套接字上可读/可写)以后这个层次看回调怎么被调用的。首先从最大的EventLoop说起: EventLoop中拥有事件链表(每一个元素都是Channel),在loop函数中调用epoll_wait系统调用的时候,将EpollPollr中EventList,将这个链表中激活事件添加到EventLoop中原创 2014-03-26 19:55:06 · 2283 阅读 · 1 评论 -
muduo源码分析--我对muduo的理解
分为几个模块 EventLoop、TcpServer、Acceptor、TcpConnection、Channel等对于EventLoop来说:他只关注里面的主驱动力,EventLoop中只关注poll,这类系统调用使得其成为Reactor模式,EventLoop中有属于这个loop的所有Channel,这个loop属于哪一个Server. 几个类存在的意义:从应用层使用的角度原创 2014-10-29 21:39:43 · 3827 阅读 · 4 评论