《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),再重试,避免拥塞。


相关文章
|
14天前
|
安全 Linux 虚拟化
网络名称空间在Linux虚拟化技术中的位置
网络名称空间(Network Namespaces)是Linux内核特性之一,提供了隔离网络环境的能力,使得每个网络名称空间都拥有独立的网络设备、IP地址、路由表、端口号范围以及iptables规则等。这一特性在Linux虚拟化技术中占据了核心位置🌟,它不仅为构建轻量级虚拟化解决方案(如容器📦)提供了基础支持,也在传统的虚拟机技术中发挥作用,实现资源隔离和网络虚拟化。
网络名称空间在Linux虚拟化技术中的位置
|
14天前
|
网络协议 安全 Linux
Linux网络名称空间之独立网络资源管理
Linux网络名称空间是一种强大的虚拟化技术🛠️,它允许用户创建隔离的网络环境🌐,每个环境拥有独立的网络资源和配置。这项技术对于云计算☁️、容器化应用📦和网络安全🔒等领域至关重要。本文将详细介绍在Linux网络名称空间中可以拥有的独立网络资源,并指出应用开发人员在使用时应注意的重点。
|
14天前
|
安全 网络协议 Linux
Linux网络名称空间概述
Linux网络名称空间是操作系统级别的一种虚拟化技术🔄,它允许创建隔离的网络环境🌐,使得每个环境拥有自己独立的网络资源,如IP地址📍、路由表🗺️、防火墙规则🔥等。这种技术是Linux内核功能的一部分,为不同的用户空间进程提供了一种创建和使用独立网络协议栈的方式。本文旨在全方面、多维度解释Linux网络名称空间的概念、必要性和作用。
Linux网络名称空间概述
|
16天前
|
存储 C++ 容器
C++STL(标准模板库)处理学习应用案例
【4月更文挑战第8天】使用C++ STL,通过`std:vector`存储整数数组 `{5, 3, 1, 4, 2}`,然后利用`std::sort`进行排序,输出排序后序列:`std:vector<int> numbers; numbers = {5, 3, 1, 4, 2}; std:sort(numbers.begin(), numbers.end()); for (int number : numbers) { std::cout << number << " "; }`
18 2
|
22天前
|
Linux
Linux中centos桌面消失网络图标
Linux中centos桌面消失网络图标
13 0
|
12天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
35 6
|
3天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
19小时前
|
安全 Ubuntu Linux
Linux 网络操作命令Telnet
Linux 网络操作命令Telnet
4 0
Linux 网络操作命令Telnet
|
1天前
|
Ubuntu Linux
Linux(22) Linux设置网络优先级顺序
Linux(22) Linux设置网络优先级顺序
2 0
|
9天前
|
数据采集 API 数据安全/隐私保护
畅游网络:构建C++网络爬虫的指南
本文介绍如何使用C++和cpprestsdk库构建高效网络爬虫,以抓取知乎热点信息。通过亿牛云爬虫代理服务解决IP限制问题,利用多线程提升数据采集速度。示例代码展示如何配置代理、发送HTTP请求及处理响应,实现多线程抓取。注意替换有效代理服务器参数,并处理异常。
畅游网络:构建C++网络爬虫的指南

热门文章

最新文章