《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★

简介: 《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★

4.9 多线程与fork


fork()一般不能在多线程中调用,因为Linux的fork只克隆当前线程的thread of ctrl,不克隆其他线程。即,fork之后子进程只有一个线程,其他线程都消失了。



7.2文件传输


如果客户端故意只发起连接,不接收数据,那么要么服务器进程的文件描述符耗尽,要么占用很多服务器内存,因为每个连接会建立缓冲区。解决方法是:


1、限制服务器的最大并发连接数


2、用timing wheel踢掉空闲连接https://blog.csdn.net/Solstice/article/details/6395098


3、关于muduo时间轮的实现


muduo举的例子,使用了boost库的circular_buffer:


/boost_1_68_0/boost/circular_buffer/*.*


/boost_1_68_0/boost/circular_buffer.hpp


https://github.com/chenshuo/muduo/blob/master/examples/idleconnection/echo.h


如果想摆脱boost库的依赖,需要自己写circular_buffer,参考:


Ring Buffer (circular Buffer)环形缓冲区简介


https://github.com/AlexStocks/muduo/blob/master/muduo/other/circular_buffer.h


https://github.com/kimg-bo/kimgbo/blob/master/example/idleconnection/echo.h


linux网络编程二十二:高性能定时器之时间轮



7.4Buffer类的设计与使用https://blog.csdn.net/Solstice/article/details/6329080


/// A buffer class modeled after org.jboss.netty.buffer.ChannelBuffer

///

/// @code

/// +-------------------+------------------+------------------+

/// | prependable bytes |  readable bytes  |  writable bytes  |

/// |                   |     (CONTENT)    |                  |

/// +-------------------+------------------+------------------+

/// |                   |                  |                  |

/// 0      <=      readerIndex   <=   writerIndex    <=     size

/// @endcode



7.4.1在现实生活中,IO复用总是和非阻塞IO一起使用,因为:


基础知识:


(1)IO阻塞与否体现在read/write/accept/connect等IO函数的使用方式;有阻塞和非阻塞线程两种方式。


(2)IO复用体现在select/poll/epoll_wait等函数。这些函数会阻塞当前线程。


实际原因:


(1)没有人会真的使用轮询来检查某个非阻塞IO操作是否完成,这样太浪费CPU;


(2)IO复用一般不能和阻塞IO使用,因为阻塞IO的read/write/accept/connect函数都会阻塞当前线程。这样线程就无法处理其他的IO事件了。


(3)非阻塞IO的核心思想是避免阻塞在read/write/accept/connect等IO系统调用上,IO线程只能阻塞在IO复用函数上,如select/poll/epoll_wait等。


(4)更详细的知识,可以参考《UNP》第16章,非阻塞IO。



★为什么 non-blocking 网络编程中应用层 buffer 是必须的?


https://blog.csdn.net/libaineu2004/article/details/80555051



★C10K的问题:


《高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少》

《高性能网络编程(二):上一个10年,著名的C10K并发连接问题》

《高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了》

《高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索》

《高性能网络编程经典:《The C10K problem(英文)》[附件下载]》


8.8TcpConnection发送数据


1、muduo采用epoll的LT模式(ET模式要求用户一次性把数据读完,而LT则不需要,可以先读50字节再在下一次io循环时读剩余部分),只在需要时才关注writable事件,否则会造成busy loop;


2、send函数,io线程和非io线程的区别


image.png


截图是从muduo书P318来的,书上写非io线程。我的理解是:


muduo net的线程叫io线程,one loop per thread + threadpool;参加书P174;


用户自己开的业务线程就叫非io线程,然后在业务线程调用send函数。


举例一个应用场景就是,客户端发起请求,服务器需要从redis或mysql取数据,然后send回客户端。考虑到从MySQL取数据比较耗时,不能在io线程去处理业务(否则会造成busy loop),我就另起了非io线程。所以需要在非io线程send。


说白了就是一句话,服务器这样: conn丢给了非io线程, 阻塞访问mysql, 得到响应了,调用conn->send。


非io线程建议使用线程池来实现。



8.12TcpClient

客户端连接断开后初次重试的延迟应该有随机性,比如说服务端奔溃,它所有的客户连接同时断开,然后0.5s之后再次发起连接,这样既可能造成SYN丢包,也可能给服务器带来短期大负载,影响其服务质量。因此每个客户端应该等待一段随机的时间(0.5~2s),再重试,避免拥塞。


相关文章
|
1月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
91 0
|
10天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
32 2
|
1月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
86 1
Linux C/C++之IO多路复用(aio)
|
1月前
|
Ubuntu 网络安全 图形学
Ubuntu学习笔记(二):ubuntu20.04解决右上角网络图标激活失败或者消失,无法连接有线问题。
在Ubuntu 20.04系统中解决网络图标消失和无法连接有线网络问题的方法,其中第三种方法通过检查并确保Windows防火墙中相关服务开启后成功恢复了网络连接。
515 0
Ubuntu学习笔记(二):ubuntu20.04解决右上角网络图标激活失败或者消失,无法连接有线问题。
|
22天前
|
域名解析 网络协议 安全
|
28天前
|
运维 监控 网络协议
|
23天前
|
存储 Ubuntu Linux
2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 上集
在本节实验中,我们学习了 Linux 系统登录认证的过程,文件的意义,并通过做实验的方式对 Linux 系统 passwd 文件提权方法有了深入的理解。祝你在接下来的技巧课程中学习愉快,学有所获~和文件是 Linux 系统登录认证的关键文件,如果系统运维人员对shadow或shadow文件的内容或权限配置有误,则可以被利用来进行系统提权。上一章中,我们已经学习了文件的提权方法, 在本章节中,我们将学习如何利用来完成系统提权。在本节实验中,我们学习了。
|
1月前
|
Ubuntu Linux 虚拟化
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
309 3
|
1月前
|
网络协议 安全 Ubuntu
Linux中网络连接问题
【10月更文挑战第3天】
33 1
下一篇
无影云桌面