- 博客(6)
- 收藏
- 关注
原创 了解实现一个高并发的内存池——TLS Memmory Pool
为什么需要内存池?1.效率问题:如果我们直接向系统申请内存,当我们需要频繁的申请释放内存时,就需要频繁的与系统层产生交互,多次切换用户态和内核态,而用户态和内核态之间的切换的消耗是非常大的,因此申请内存的消耗就会很大,程序效率也就随之降低了。2.内存碎片问题:如果我们频繁的申请和释放小块的内存,系统的内存就会因此被碎片化,虽然总的内存被占用并不多,但是却没有了连续的大块内存,这个时候如果我们需要使用大内存的空间时,就无法申请了。实现一个高并发的内存现在大部分的开发环境都是多核多线程,在申请内存的场景
2020-08-18 21:46:14 642 1
转载 muduo net库学习笔记8——件驱动循环线程池EventLoopThreadPool
感谢并转载自https://blog.csdn.net/sinat_35261315/article/details/78376821线程池的作用体现在用户启动TcpServer服务器时创建大量子线程,每个子线程创建一个EventLoop并开始执行EventLoop::loop主线程的线程池保存着创建的这些线程和EventLoop当Acceptor接收到客户端的连接请求后返回TcpServer,TcpServer创建TcpConnection用于管理tcp连接TcpServer从事件驱动线程池中
2020-08-14 08:06:04 287 4
原创 muduo net库学习笔记7——用于创建服务器的类TcpServer
muduo为每个EventLoop设计了runInLoop和queueInLoop函数用来将本该在其他线程执行的线程不安全函数放到它所属线程执行,从而达到线程安全。muduo采用采用one loop per thread的设计思想,即每个线程运行一个循环,这里的循环也就是事件驱动循环EventLoop。所以,EventLoop对象的loop函数,包括间接引发的Poller的poll函数,Channel的handleEvent函数,以及TcpConnection的handle*函数都是在一个线程内完成的。而
2020-08-13 21:58:43 251 1
转载 muduo net库学习笔记6——缓冲区Buffer及TcpConnection的读写操作
在tcp的通信过程中,内核其实为tcp维护着一个缓冲区当调用write/send时,会向内核缓冲区中写入数据,内核和tcp协议栈负责将缓冲区中的数据发送到指定<ip,port>的目标位置。当有数据到达内核的tcp缓冲区中,如果开启了对套接字可读事件的监听,那么内核会让套接字变为可读状态,从而从poll函数中返回,调用read/recv进行读操作但是,内核维护的tcp缓冲区通常都比较小如果调用write/send时,内核缓冲区已满,那么阻塞io将会阻塞在io函数上直到内核缓冲区有足够
2020-08-13 17:32:41 427
原创 muduo net库学习笔记5——服务器监听类Acceptor、Tcp连接(优雅关闭连接)、TcpConnection的建立与关闭
简单回顾一下Channel和TcpConnection的关系Channel的回调函数就是根据被激活原因调用不同的回调函数, 这些回调函数是在TcpConnection创建时就被设置的每个TcpConnection对象代表一个tcp连接,所以每个TcpConnection中需要保存用于服务器/客户端通信的套接字,这个套接字就记录在Channel中TcpConnection在创建之初就会为Channel设置回调函数,如果套接字可读/可写/错误/关闭等就会执行TcpConnection的函数TcpCon
2020-08-13 14:58:53 636
原创 muduo net库学习笔记4——事件驱动循环EventLoop、runInLoop和queueInLoop及对应唤醒
首先总体情况:每个muduo网络库有一个事件驱动循环线程池 EventLoopThreadPool,线程池用在事件驱动循环上层,也就是事件驱动循环是线程池中的一个线程每个TcpServer对应一个事件驱动循环线程池每个线程池中有多个事件驱动线程EventLoopThread每个线程运行一个Eventloop事件循环每个EventLoop事件循环包含一个IO复用Poller, 一个计时器队列TimerQueue每个Poller监听多个Channel, 也就对应一个TcpConnection或者监
2020-08-12 23:34:45 1435
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人