天道酬勤,学无止境

TCP Buffer 是否在进程内存的地址空间?(Is TCP Buffer In Address Space Of Process Memory?)

问题

我被告知增加 TCP 缓冲区大小以便更快地处理消息。 我的问题是,无论我为 TCP 消息使用什么缓冲区(ByteBuffer、DirectByteBuffer 等),每当 CPU 接收到来自 NIC 的中断来处理读取套接字数据的网络请求时,操作系统是否在内存中的地址空间之外维护任何缓冲区?请求进程(ig 正在侦听该套接字的进程)

或者

无论 CPU 以何种方式接收网络数据,它都将始终仅写入进程地址空间的缓冲区中,并且不会为此通信维护地址空间之外的缓冲区(包括 netstat 命令的“Recv-Q”和“Send-Q”) ?

回答1

Linux 网络栈接收数据的过程有点复杂。 我写了一份 Linux 网络堆栈的综合指南,解释了从设备驱动程序到用户程序的套接字接收队列你需要知道的一切。

内核中有很多地方维护缓冲区:

  1. 数据包到达后由 NIC 写入的 DMA 环。
  2. 对 DMA 环上的数据包的引用用于处理数据包。
  3. 最后,如果接收队列尚未满,则将分组数据添加到进程的接收队列中。
  4. 从套接字读取将从进程的接收队列中提取数据包。
  5. 如果发生数据包嗅探,数据包数据将被复制并发送到由数据包嗅探代码添加的任何过滤器。

上面链接的博客文章中描述了如何移动、计算和删除数据(在需要时)的完整过程。

现在,如果你想更快地处理消息,我假设你的意思是你想减少你的数据包处理延迟,对吗? 如果是这样,您应该考虑使用 SO_BUSYPOLL,它可以帮助减少数据包处理延迟。

增加接收缓冲区只会增加可以排队等待用户态套接字的数据包数量。 为了提高数据包处理能力,您需要仔细监控和调整网络堆栈的每个组件。 您可能需要使用 RPS 之类的东西来增加处理数据包的 CPU 数量。

您还需要监控网络堆栈的每个组件,以确保可用缓冲区和 CPU 处理能力足以处理您的数据包工作负载。

回答2

见:http://linux.die.net/man/3/setsockopt

选项是 SO_SNDBUF 和 SO_RCVBUF。 如果直接使用C-API,调用的是setsockopt本身。 如果您使用某种框架,请查看如何设置套接字选项。 这确实是一个内核端缓冲区,而不是您的进程持有的缓冲区。 它确定内核可以为您准备好从读取/接收调用中获取多少字节。 它还影响TCP的流量控制机制。

回答3

您被告知增加套接字发送或接收缓冲区大小。 这些与套接字相关联,位于内核的 TCP 部分。 请参阅setsockopt()SO_RCVBUFSO_SNDBUF

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 简述 Linux I/O 原理及零拷贝(下) — 网络 I/O
    简述这已经是 Linux I/O 系列的第二篇文章。之前我们讨论了“磁盘 I/O 及磁盘 I/O 中的部分零拷贝技术” 本篇开始讨论“Linux 网络 I/O 的结构”以及大家关心的零拷贝技术。socket 发送和接收的过程socket 是 Linux 内核对 TCP/UDP 的抽象,在这里我们只讨论大家最关心的 TCP。TCP 如何发送数据图-1图-2程序调用了 write/send,进入内核空间。内核根据发送数据创建 sk_buff 链表,sk_buff 中最多会包含 MSS 字节。相当于用 sk_buff 把数据切割了。这个 sk_buff 形成的链表,就是常说的 socket 发送缓冲区。*另外 ,有关MSS 的具体内容我们需要另外写一篇文章讨论,这里我们只要理解为网卡的限制即可检查堵塞窗口和接收窗口,判断接收方是否可以接收新数据。创建数据包(packet,或者叫 TCP 分段 TCP segment);添加 TCP 头,进行 TCP 校验。执行 IP 路由选择,添加 IP 头,进行 IP 校验。通过 QDisc(排队规则)队列将数据包缓存起来,用来控制网络收发的速度。经过排队,数据包被发送到驱动,被放入 Ring Buffer(Tx.ring)输出队列。网卡驱动调用 DMA engine 将数据从系统内存中拷贝到它自己的内存中。NIC 会向数据包中增加帧间隙(Inter
  • 转载_linux内核分析(某位大牛的文章)
    启动 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x7C00,并开始执行此处的代码.这就是对内核初始化过程的一个最简单的描述。 最初,Linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将自己装入到绝对地址0x90000,再将其后的2k字节装入到地址0x90200处,最后将核心的其余部分装入到0x10000。 当系统装入时,会显示Loading...信息。装入完成后,控制转向另一个实模式下的汇编语言代码boot/Setup.S。Setup部分首先设置一些系统的硬件设备,然后将核心从0x10000处移至0x1000处。这时系统转入保护模式,开始执行位于0x1000处的代码。 接下来是内核的解压缩。0x1000处的代码来自于文件Boot/head.S,它用来初始化寄存器和调用decompress_kernel( )程序。decompress_kernel( )程序由Boot/inflate.c, Boot/unzip.c 和Boot/misc.c组成。解压缩后的数据被装入到了0x100000处,这也是Linux不能在内存小于2M的环境下运行的主要原因。
  • Java网络课程概述
    文章目录 Java网络课程概述课程大纲网络概述OSI网络模型TCP/IP协议族模型数据包帧数据包段消息 数据传输流程Socket编程`TCP三次握手,四次挥手` JavaIO读写原理内存缓冲区和进程缓冲区 Java中主要的I/O模型IO操作阻塞/非阻塞阻塞IO非阻塞IO 同步/非同步(异步)回调同步阻塞IO模型(Blocking IO )同步非阻塞IO(non-Blocking IO)IO多路复用(IO Mutlipleting)lg:select/pool/epoll 异步IO(Asynchronurse IO)Java中支持的是BIO/NIO/AIO模型对比BIONIOAIO BIO模型编程NIO模型编程channel(通道)channel主要实现类 Buffer基本用法底层实现capacityLimitpositionmark读写实现过程中指针的变化Buffer类型Buffer的创建向Buffer写数据filp()方法从buffer读数据 Selector(复用器)selector的使用 SelectableChannelSelectionKeyNIO代码实现编程流程 问题问题一:客户端为什么主动connect连接问题二:客户端断开连接之后,服务端一致循环接口有可读事件,且为空问题三:为什么写没有注册到复用器上问题四:SelectionKey在被轮询后需要remove()
  • linux C/C++服务器后台开发面试题总结(网络编程篇)
    1. TCP头大小,包含字段?三次握手,四次断开描述过程,都有些什么状态。状态变迁图。TCP/IP收发缓冲区(2次) 头部大小是20字节,包含数据如下: 三次握手: 四次释放: 状态变迁图: 收发缓冲区: 2. 使用udp和tcp进程网络传输,为什么tcp能保证包是发送顺序,而 udp无法保证? 因为TCP发送的数据包是按序号发送,有确认机制和丢失重传机制,而udp是不可靠的发送机制,发送的对应端口的数据包不是按顺序发送的。 3. epoll哪些触发模式,有啥区别?(必须非常详尽的解释水平触发和边缘触发的区别,以及边缘触发在编程中要做哪些更多的确认) epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式。LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。所以在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值。 也就是说在LT模式的情况下一定要确认收发的数据包的buffer是不是足够大如果收发数据包大小大于buffer的大小的时候就可能会出现数据丢失的情况。 4. tcp与udp的区别(必问)为什么TCP要叫做数据流? 1)
  • NodeJS有难度的面试题(能答对几个)
    1、Node模块机制 1.1 请介绍一下node里的模块是什么 Node中,每个文件模块都是一个对象,它的定义如下: 1 2 3 4 5 6 7 8 9 10 11 12 function Module(id, parent) { this.id = id; this.exports = {}; this.parent = parent; this.filename = null; this.loaded = false; this.children = []; } module.exports = Module; var module = new Module(filename, parent); 所有的模块都是 Module 的实例。可以看到,当前模块(module.js)也是 Module 的一个实例。 1.2 请介绍一下require的模块加载机制 这道题基本上就可以了解到面试者对Node模块机制的了解程度基本上面试提到 1、先计算模块路径 2、如果模块在缓存里面,取出缓存 3、加载模块 4、的输出模块的exports属性即可 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 // require 其实内部调用 Module
  • postgreSQL学习笔记
    POSTGRESQL 1. 安装 yum install postgresql-server.x86_64 默认安装上的postgresql的数据目录在/var/lib/pgsql/data下 service postgresql initdb su – postgres pg_ctl start/pg_ctl stop(如果系统有其他版本的pg需要修改环境变量,不然可能默认使用的是老版本) psql(如果系统有其他版本的pg需要修改psql的环境变量,不然可能默认使用的是老版本) 1.1 配置: 1.1.1 环境变量 vim /etc/profile 将可执行文件和共享库的路径写在文件末 注:centos7直接执行 export PATH=/usr/pgsql-11/bin:$PATH export LD_LIBRARY_PATH=/usr/pgsql-11/lib:$LD_LIBRARY_PATH 注:实测centos7直接执行上面命令或在~/.bash_profle配置不起作用,只有在/etc/profile配置才有效。 1.1.2 postgresql.conf文件中的相关配置 #listen_addresses='localhost' 默认本机,也就是127.0.0.1 #port=5432 监听的端口 日志: 1.logging_collector=on 日志开关 2
  • sar命令详解
    sar命令 原文地址https://blog.csdn.net/liyongbing1122/article/details/89517282 目录 sar命令 语法格式 1.查看CPU使用情况 sar -u 2.将统计结果保存到文件 sar -o & sar -f 3.查看平均负载 sar -q 4.查看内存使用情况 sar -r 5.查看系统swap分区统计情况 sar -W 6.查看IO和传递速率 sar -b 7.查看磁盘使用情况 sar -d 8. 统计网络信息 sar -n 8.1 网络接口信息 sar -n DEV 8.2 网络设备通信失败信息 sar -n EDVE 8.3统计socket连接信息 sar -n SOCK 8.4 TCP连接的统计 sar -n TCP 使用总结 语法格式 sar [ 选项 ] [ <时间间隔> [ <次数> ] ] sar -h 显示: -A:所有报告的总和 -b:显示I/O和传递速率的统计信息 -B:显示换页状态 -d:输出每一块磁盘的使用信息 -e:设置显示报告的结束时间 -f:从制定的文件读取报告 -i:设置状态信息刷新的间隔时间 -P:报告每个CPU的状态 -R:显示内存状态 –u:输出cpu使用情况和统计信息 –v:显示索引节点、文件和其他内核表的状态 -w:显示交换分区的状态 -x:显示给定进程的装 -r
  • 常用Linux网络/内存/磁盘分析工具
    Centos查看网卡、CPU、内存等使用率 # watch more /proc/net/dev 性能分析和监控工具 uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 sar -n TCP,ETCP 1 top 0x01:网络IO 1、sar -n DEV 1 3 监控网卡IO 2、ethtool 网卡名 查看网卡的最大速率等参数信息 3、netstat -nat | awk ‘FNR>2{print $NF}’ | sort | uniq -c 查看系统TIME_WAIT状态连接数 4、查看DND信息dig命令 dig baidu.com # 输出host的cname记录与A记录,可以看到ip地址和使用的DNS服务器信息,添加` +short`可以简化输出 dig -x 204.152.184.167 +short # 用 -x的选项查找IP地址的主机名 dig @ns1.google.com www.google.com 指定查询的DNS server tcpdump tcpdump -D # 显示可以抓取的所有网络接口 # 抓取9100端口,网卡xgbe0的TCP网络包信息,保存到aaa.pcap tcpdump tcp port 9100 -i
  • 套接字connect()vs bind()(socket connect() vs bind())
    问题 connect()和bind()系统都调用将套接字文件描述符“关联”到一个地址(通常是ip /端口组合)。 他们的原型是: int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 和 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 2个通话之间的确切区别是什么? 什么时候应该使用connect()和何时bind() ? 具体来说,在一些示例服务器客户端代码中,发现客户端正在使用connect()而服务器正在使用bind()调用。 原因对我来说还不是很清楚。 回答1 为了更好地理解,让我们找出确切的绑定和连接出现在哪里, 如Sourav所阐明的,在定位两个呼叫之后, bind()将套接字与其本地地址相关联(这就是服务器端绑定的原因,以便客户端可以使用该地址连接到服务器。)connect()用于连接到远程[server]地址,这就是客户端的原因,使用connect [读取为:连接到服务器]。 由于特定的角色和相应的实现,我们不能互换使用它们(即使我们在同一台计算机上有客户端/服务器)。 我将进一步建议将这些调用与TCP / IP握手相关联。 因此,谁将在此处发送SYN,它将是connect()。
  • Socket技术详解
    Socket原理 1、什么是Socket 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据   socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。   我的理解就是Socket就是该模式的一个实现:即socket是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。   Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 2、网络中进程如何通信 既然Socket主要是用来解决网络通信的,那么我们就来理解网络中进程是如何通信的。 2.1、本地进程间通信 a、消息传递(管道、消息队列、FIFO)   b、同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)?【不是很明白】   c、共享内存(匿名的和具名的,eg:channel)   d、远程过程调用(RPC) 2.2、网络中进程如何通信 我们要理解网络中进程如何通信,得解决两个问题:   a、我们要如何标识一台主机,即怎样确定我们将要通信的进程是在那一台主机上运行。   b
  • 网络编程期末复习
    网络编程期末复习 第一章 理解网络编程和套接字第二章第三章 地址族与数据序列第五章 基于TCP的服务器端/客户端第六章 基于UDP的服务器端/客户端第七章 优雅地断开套接字连接第九章 套接字的多种可选项第十章 多进程服务器端第十一章 进程间通信第十二章 I/O复用第十三章 多种I/O函数第十四章 多播与广播 第一章 理解网络编程和套接字 (1)套接字在网络编程中的作用是什么?为什么叫套接字? 答:网络编程就是编写程序使两台连网的计算机相互交换数据。在我们不需要考虑物理连接的情况下,我们只需要考录如何编写数据传输软件。操作系统提供了名为“套接字”的部件, 套接字是网络数据传输用的软件设备。 我们把插头插到插座上就能从电网获得电力供给,同样,为了与远程计算机进行数据传输,需要连接到因特网,而编程中的“套接字”就是用来连接该网络的工具。 (2)在服务器端创建套接字后,会以此调用listen函数和accept函数。请比较并说明二者作用。 答:listen函数将套接字转为可接受连接状态,accept函数受理连接请求,并且如果在没有连接请求的情况下调用该函数,则不会返回。直到有连接请求为止。二者存在逻辑上的先后关系。 (3)Linux中,对套接字数据进行I/O时可以直接使用文件I/O相关函数;而在Windows中则不可以。原因为何? 答:在Linux世界中,socket也被认为是文件的一种
  • 毕设学习过程 —— NIO、Netty
    1、NIO概述 什么是NIO NIO 被称为 New I/O ,相对于 Java 之前的 I/O 类库是新增(java 1.4) NIO 又被称为 Non blocking I/O 这是因为老的 I/O 类库是阻塞 I/O , New I/O 类库的目标就是要让 Java 支持非阻塞 I/O NIO 是同步 非阻塞 IO模型 NIO 的网络 IO 在 Linux 底层是通过 epoll 实现,在 Windows 的底层通过 IOCP 实现。【注:输入输出完成端口(Input/Output Completion Port,IOCP), 是支持多个同时发生的异步I/O操作的应用程序编程接口】 同步与阻塞 IO操作的两个对象和两个阶段 两个对象: 内核 Kernel 与用户进程 Process 两个阶段: 等待数据准备(Wait for data ready):read 等待数据到来,write 等待系统层的socket 写缓冲可用数据在内核拷贝和用户进程空间拷贝:read 从内核拷贝到用户进程,write 从用户进程拷贝到内核 NIO所谓非阻塞,是在第一个阶段 等待数据准备时,是非阻塞的。在需要维护大量的socket连接时(比如10w个),任意时刻只有少数socket是有数据(ready for read or write)的,这个时候的非阻塞能带来极大的性能提升。 NIO所谓的同步
  • 网络编程—使用C语言实现发送TCP数据包,以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port;(原理和常见错误分析)
    任务要求: 1.以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port; 2.头部参数自行设定,数据字段为“This is my homework of network of network,I am happy!”; 3.成功发送后在屏幕上输出“send OK”。 需求分析 本系统要求使用C语言作为基本开发语言,并且开发工具为绿色软件,程序运行不需要安装和避免写系统和注册表。需要完成的需求如下: 1.本程序需完成发送一个TCP数据包给目的主机,应用层将需要传送的信息传送给 TCP层,TCP传输实体根据程序运行时输入的源IP地址、源端口号、目的IP地址、目的端口号加上TCP报头,形成TCP数据包,在TCP数据包上增加IP头部,形成IP包。2.运行程序时输入:SendTCP source_ip source_port dest_ip dest_port,然后根据提示输入要发送的数据,回车即可。3.程序的输出:Send OK!4.测试数据 SendTCP 172.27.91.240 200 172.27.91.123 100 ,其中源IP地址、源端口号、目的IP地址、目的端口号可以任意指定。 系统设计 系统总体架构 本系统的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整个系统由初始化原始套接字
  • 手把手教Linux驱动8-Linux IO模型
    对于一个应用程序即一个操作系统进程来说,它既有内核空间(与其他进程共享),也有用户空间(进程私有),它们都是处于虚拟地址空间中。用户进程是无法访问内核空间的,它只能访问用户空间,通过用户空间去内核空间复制数据,然后进行处理。 什么是IO? IO模型中,先讨论下什么是IO? 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Direct I/O、数据库I/O等,只要具有输入输出类型的交互系统都可以认为是I/O系统,也可以说I/O是整个操作系统数据交换与人机交互的通道,这个概念与选用的开发语言没有关系,是一个通用的概念。 在如今的系统中I/O却拥有很重要的位置,现在系统都有可能处理大量文件,大量数据库操作,而这些操作都依赖于系统的I/O性能,也就造成了现在系统的瓶颈往往都是由于I/O性能造成的。因此,为了解决磁盘I/O性能慢的问题,系统架构中添加了缓存来提高响应速度;或者有些高端服务器从硬件级入手,使用了固态硬盘(SSD)来替换传统机械硬盘;一个系统的优化空间,往往都在低效率的I/O环节上,很少看到一个系统CPU、内存的性能是其整个系统的瓶颈。那么数据被Input到哪,Output到哪呢?Input(输入)数据到内存中,Output(输出)数据到IO设备(磁盘
  • nginx的优化
    nginx优化大概内容: nginx运行工作进程个数,一般设置cpu的核心或者核心数,最大是8 事件处理模型epoll事件模型 连接超时时间 Fastcgi调优 开启gzip压缩 开启缓存 防盗链upsteam 打开文件数默认是1024,可以大一点(ulimit -a 可以查看当前系统的所有限制值) 分布解析:Nginx运行CPU亲和力比如4核配置 worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000 比如8核配置 worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000; worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。Nginx最多可以打开文件数worker_rlimit_nofile 65535;这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。注:文件资源限制的配置可以在/etc/security/limits.conf设置
  • Linux内核参数解释
    第1章 内核参数说明 1.1 内核参数列表 kernel.acct acct功能用于系统记录进程信息,正常结束的进程都会在该文件尾添加对应的信息。异常结束是指重启或其它致命的系统问题,不能够记录永不停止的进程。该设置需要配置三个值,分别是: 1.如果文件系统可用空间低于这个百分比值,则停止记录进程信息。 2.如果文件系统可用空间高于这个百分比值,则开始记录进程信息。 3.检查上面两个值的频率(以秒为单位)。 kernel.auto_msgmni 系统自动设置同时运行的消息队列个数。 0:不自动 1:自动 kernel.blk_iopoll kernel.cad_pid 接收Ctrl-alt-del操作的INT信号的进程的PID kernel.cap_last_cap 系统capabilities最高支持的权限等级。 详见:http://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html kernel.compat-log kernel.core_pattern 设置core文件保存位置或文件名,只有文件名时,则保存在应用程序运行的目录下 kernel.core_pipe_limit 定义了可以有多少个并发的崩溃程序可以通过管道模式传递给指定的core信息收集程序。如果超过了指定数,则后续的程序将不会处理,只在内核日志中做记录
  • 操作系统面试题
    文章目录 Linux架构Linux优化总结版一般定位问题的方法如何迅速分析内存的性能瓶颈如何迅速磁盘io的性能瓶颈如何迅速cpu的性能瓶颈网路性能可以使用的工具 什么是系统调用什么是系统函数stdin,stdout 和STDOUT_FILENO,STDIN_FILENO管道和重定向shell是什么中断软中断与硬中断 kernal调度CPU上下文切换上下文切换调优 CPU的优化负载的优化平均负载案例分析 平均使用率的优化CPU 上下文切换优化无法通过top查看到的cpu大量占用的情况系统中出现大量不可中断进程和僵尸进程怎么办? 内存段页式内存概念虚拟内存分页和页表 页表存在哪里页表项都有哪些位分页寻址的过程进程调用mmap,内核做了哪些呢?虚拟内存的好处分页寻址的问题以及TLB的引出 让页表更小换入换出懒加载页(缺页中断)写时复制页缓存与文件的io进程/线程和虚拟内存的关系常用内存管理命令内存回收与分配NUMA 与 Swap内存管理算法(空闲列表,Buddy和Slab)内存优化缓存优化当 Swap 使用升高时,要如何定位和分析呢?套路:如何“快准狠”找到系统内存的问题? 进程,线程线程fork和exec的区别引入线程的原因Linux进程的5种状态都是啥以及怎样转换锁的实现的底层数据结构的并发性信号量 死锁以及避免进程和线程的区别进程与线程的对应关系进程打开的文件资源有哪些什么是PCB
  • 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记
    文章目录 第1章 线程安全的对象生命期管理1.1 当析构函数遇到多线程1.1.1 线程安全的定义1.1.3 线程安全实例 1.2 对象的创建很简单1.3 销毁很难1.4 线程安全的Observer有多难1.6 神器 shared_ptr/weak_ptr1.7 C++ 内存问题及其对策1.8 应用到Observer上1.9 shared_ptr的线程安全1.10 shared_ptr技术与陷阱意外延长对象的生命期函数参数析构动作在创建时被捕获析构所在的线程现成的 RAII handle 1.11 对象池1.11.1 enable_shared_from_this使用场景 1.11.2 弱回调 第2章 线程同步精要2.1 互斥器(mutex)2.1.1 只使用非递归的mutex2.1.2 死锁 2.2 条件变量2.3 不要用读写锁和信号量读写锁信号量 2.5 线程安全的Singleton实现2.6 sleep函数不是同步原语2.8 借 shared_ptr 实现 copy-on-write适用场景缺点 第3章 多线程服务器的适用场景与常用编程模型ReactorProactor3.1 进程和线程3.2 单线程服务器的常用编程模型3.3 多线程服务器的常用编程模型3.3.1 one loop per thread3.3.2 线程池3.3.3 推荐模式 3.4
  • 基础知识积累
    Python 开发1:浅拷贝与深拷贝的实现方式、区别首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别,直接赋值:其实就是对象的引用(别名)。浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。2:你知道几种设计模式 单例模式以及应用场景:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式  工厂模式:提供一个创建对象的接口,不像客户端暴露创建对象的过程,而是使用一个公共的接口来创建对象。  策略模式:把一个个策略,也就是算法封装成一个一个类,任意的替换3:编码和解码你了解过么所谓编码就是把要传递的信息按照一定的规则进行组织,所谓解码就是把收到的信息按照一定的规则进行解析,并且这个规则必须是编码者和解码者事先都知道或约定好的。4:列表推导list comprehension和生成器的优劣列表推导式是将所有的值一次性加载到内存中,生成器是将列表推导式的[]改成(),不会将所有的值一次性加载到内存中,延迟计算,一次返回一个结果,它不会一次生成所有的结果,这对大数据量处理,非常有用5:什么是装饰器
  • Linux 常见Kernel优化
    kernel常见优化linux内核参数其实一般不改也没关系,一般公司的业务服务器很少会突破默认的kernel限制,但是对于一些特殊应用如nginx之类业务入口或者高并发服务器,如果出现性能问题导致故障,其实挺难查的,所以记录一下日常遇到过的一些优化方案。tcp_retries2控制内核向已经建立连接的远程主机重新发送数据的次数,低值可以更早的检测到与远程主机失效的连接,因此服务器可以更快的释放该连接,可以修改为5,默认为15,大约再13-30min,改为5大概在3-6min. 假设应用没有设置TCP重传次数,就会走kernel的默认配置,比如中间件的监听等,就会导致一旦服务端挂了,客户端没有快速将资源回收,在一般场景下可能会导致应用的阻塞tcp_max_syn_backlog对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字,生产一般2048就够了。可以关注netstat的syn_wait字段, 这里是半连接上限tcp_fin_timeout对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。tcp_syncookies开启syn cookies,如果SYN队列满了会启用cookie处理。1表示tcp_tw_reuse表示是否允许将处于TIME