自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

加油加油

加油加油

  • 博客(281)
  • 收藏
  • 关注

原创 explicit关键字

主要用于或者,为了增强类型安全性和防止意外的类型转换,防止他们被编译器隐式地用于类型转换。

2023-10-03 22:53:19 317

原创 Mysql 数据类型、运算符

数据类型的选择不是越大越好,因为我们业务层一般都是在内存上工作的,效率以及速度是比较快的,但是我们的数据库涉及磁盘的IO操作磁盘的IO操作相对来说是要慢很多的,所以我们在定义表结构的时候每一个字段的数据类型还是比较重要的。选择合适的类型,不仅会降低表占用磁盘空间,间接减少了磁盘IO的次数,提高了表的访问效率,而且索引的效率也和数据的类型息息相关。

2023-09-24 22:20:27 314

原创 git版本回退

指针通常指向当前分支上的最新提交,因此如果你运行。命令显示提交历史,其中最新的提交位于最上方。提交的详细信息,包括差异(diff)。将新的提交推送到远程仓库。,你应该在列表的顶部看到。及其前五个“祖先”提交。

2023-09-20 14:04:00 421

原创 如何使用gdb调试coredump文件

coredump是由于程序异常或者bug在运行时异常退出或者终止,进行运行时突然崩溃得一瞬间得快照,生成一个core文件,这个core文件记录了程序在运行过程时得内存,寄存器状态,内存指针和函数堆栈信息等等。2. f 0 :选择要查看的第几行;1. bt:查看调用堆栈情况;3. 找到错误 修复代码。

2023-09-19 00:32:24 445

原创 git pull

在解决冲突时,有时可能需要其他开发者的帮助,特别是当你不确定如何正确地解决某个冲突时。不要害怕询问有关该更改的背景或理由的问题。这有助于团队之间的通信,并确保冲突得到正确的解决。是 Git 版本控制系统中的一个命令,用于从远程存储库更新本地工作目录。从远程获取更新时,有可能会遇到冲突。这通常发生在你和其他开发者同时修改了同一个文件的同一个部分。试图合并更改时,Git可能不知道应该保留哪一个版本,因此它会引发一个冲突,并要求你手动解决。是一个常用命令,用于保持本地工作目录与远程存储库同步。

2023-09-11 22:16:58 945

原创 new/delete, malloc/free 内存泄漏如何检测

区别:首先new/delete是运算符,malloc/free是库函数。 malloc/free只开辟内存不初始化;new/delete及开辟内存也初始化。 抛出异常的方式:new/delete开辟失败使用抛出bad_alloc;malloc/free通过返回值判断。 malloc和new区别:malloc是c语言中一个库幻术函数,按字节为数据分配内存,返回类型是 ‘ void * ’。因为他不知道分配的内存会被用于什么类型的对象。 new是运算符,需要传入类型,new相当于运算符的重载函数

2023-09-10 21:11:25 275

原创 muduo 32 muduo各个类功能总结

处理accept,监听新用户连接,新用户连接响应以后,拿到和客户端通信的clientfd,打包成Channel,然后根据muduo库的轮询算法,找一个subloop,将Channel给到subloop,扔给subloop之前,需要将subloop唤醒一下(wakeupfd : 每loop都有一个wakeupfd ,他那个Linux的系统调用eventfd创建的,一个带有线程notify,即带有通知机制的fd),mainloop可以向subloop随便写。该项目自己重构的muduo库只支持epoll。

2023-09-10 20:21:59 184

原创 简单、高效的通信机制eventfd

eventfd`是Linux内核为用户空间程序提供的一个轻量级事件通知机制。它主要用于代替更为复杂、重量级的通知方式,如管道(pipe)等,从而为跨线程或进程间通信提供了一个简单、高效的方式。initval:计时器初始值 flags:设置下面是`eventfd`的基本原理和工作机制:1. 创建:使用`eventfd`系统调用创建一个`eventfd`对象时,内核会返回一个文件描述符。这个文件描述符可以用来进行读写操作。2. 计数器:与每个`eventfd`相关联的是一个64位的无符号整数作为。

2023-09-04 15:20:03 137

原创 1.硬件结构

CPU Cache 作为内存与 CPU 之间的缓存层,CPU访问数据先从 CPU Cache 中找,如果缓存命中直接返回数据。如果 CPU Cache 里面没有,要从内存中每一读取一块的数据放到 CPU Cache 中。内存映射到 CPU Cache :把内存地址拆分成 [索引+组标记+偏移量]的方式。

2023-09-01 22:51:44 232

原创 进程、线程、内存管理

当物理内存不足时,操作系统可以将不常用的内存页面移到磁盘上的交换区或页面文件中,从而释放物理内存供其他进程使用。:虚拟内存为每个进程提供了它自己的地址空间,使其看起来好像它独占了全部的物理内存。这样,每个进程都不能直接访问其他进程的内存,从而实现了。根据中断号从系统调用表的查找表来找到与该号码关联的具体函数,内核开始执行这个函数。不一定,如果是阻塞IO且IO未就绪,就是他在阻塞等待了,那么线程会切换;线程是系统调用的最小单位,线程切换性能好,并发性能好。),从而提高了内存的利用率和系统的吞吐量。

2023-08-31 20:43:35 1361 2

原创 4.22 TCP 四次挥手,可以变成三次吗?

当发送没有携带数据的 ACK,它的网络效率也是很低的,因为它也有 40 个字节的 IP 头 和 TCP 头,但却没有携带数据报文。为了解决 ACK 传输效率低问题,所以就衍生出了TCP 延迟确认。当有响应数据要发送时,ACK 会随着响应数据一起立刻发送给对方当没有响应数据要发送时,ACK 将会延迟一段时间,以等待是否有响应数据可以一起发送如果在延迟等待发送 ACK 期间,对方的第二个数据报文又到达了,这时就会立刻发送 ACK。

2023-08-27 17:01:16 853

原创 4.21 用了 TCP 协议,数据一定不会丢吗?

此时目的机器的网卡会通知DMA将数据包信息放到RingBuffer中,再触发一个硬中断给CPU,CPU触发软中断让ksoftirqd去RingBuffer收包,于是一个数据包就这样顺着物理层,数据链路层,网络层,传输层,最后从内核空间拷贝到用户空间里的聊天软件里。建立TCP连接的两端,发送端在发出数据后会等待接收端回复ack包,ack包的目的是为了告诉对方自己确实收到了数据,但如果中间链路层发生了丢包,那发送端会迟迟收不到确认ack,于是就会进行重传。,告诉发送端,"球球了,顶不住了,别发了"。

2023-08-27 16:40:08 182

原创 4.19 & 20

服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,服务端会回 RST 报文。是可以的,客户端是可以自己连自己的形成连接(TCP自连接),也可以两个客户端同时向对方发出请求建立连接(TCP同时打开),这两个情况都有个共同点,就是没有服务端参与,也就是没有listen,就能建立连接。执行 listen 方法时,会创建半连接队列和全连接队列,三次握手的过程中会在这两个队列中暂存连接信息。客户端没有执行listen,因为半连接队列和全连接队列都是在执行

2023-08-26 22:50:30 372

原创 4.18 TCP 和 UDP 可以使用同一个端口吗?

因为「监听」这个动作是在 TCP 服务端网络编程中才具有的,而 UDP 服务端网络编程中是没有「监听」这个动作的。TCP 和 UDP 服务端网络相似的一个地方,就是会调用 bind 绑定端口。

2023-08-26 22:22:12 1024

原创 4.17 如何基于 UDP 协议实现可靠传输?

其实就是接收窗口的对头阻塞问题,接收方收到的数据必须是在接收窗口范围内,如果收到超过窗口范围的数据就丢弃数据,当接收窗口收到有序数据时,接收窗口才能往前滑动,然后那些已经接收并且被确认的「有序」数据就可以被应用层读取。当接收窗口收到的数据不是有序的,比如收到第 33~40 字节的数据,由于第 32 字节数据没有收到, 接收窗口无法向前滑动,那么即使先收到第 33~40 字节的数据,这些数据也无法被应用层读取的。

2023-08-26 22:05:10 650

原创 4.16 TCP 协议有什么缺陷?

如果序列号较低的 TCP 段在网络传输中丢失了,即使序列号较高的 TCP 段已经被接收了,应用层也无法从内核中读取到这部分数据。TCP 是在内核实现的,所以 TLS 是无法对 TCP 头部加密的,这意味着 TCP 的序列号都是明文传输,所以就存安全的问题。基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。),才能进行HTTP数据传输,这在一定程序上增加了数据传输的延迟。实现,如果要想升级 TCP 协议,那么只能升级内核。

2023-08-26 21:37:49 1146

原创 4.15 TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?

HTTP 的 Keep-Alive 也叫 HTTP 长连接,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。TCP 的 Keepalive 也叫 TCP 保活机制,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。

2023-08-26 09:54:53 1231

原创 4.14 HTTPS 中 TLS 和 TCP 能同时握手吗?

常规的TCP传输协议通信需要先建立TCP三次握手后才可以传输数据,前两次握手是不可携带数据的,第三次握手可以携带数据,因为这个时候客户端进入ESTABLISHED,表明客户端一方已经完成了TCP连接建立。TCP Fast Open 是为了绕过 TCP 三次握手发送数据,这个功能可以减少 TCP 连接建立的时延。要使用 TCP Fast Open 功能,客户端和服务端都要同时支持才会生效。开启了TCP Fast Open功能,想要绕过TCP三次握手发送数据,还是需要事先建立一次三次握手。

2023-08-26 09:43:20 1467

原创 4.14 tcp_tw_reuse 为什么默认是关闭的?

开启 tcp_tw_reuse 参数可以快速复用处于 TIME_WAIT 状态的 TCP 连接时,相当于缩短了 TIME_WAIT 状态的持续时间。

2023-08-26 00:14:34 1581

原创 4.12 TCP 连接,一端断电和进程崩溃有什么区别?

TCP 保活机制需要通过 socket 接口设置 选项才能够生效 定义一个时间段,如果在这个时间段内(保活时间7200s,俩小时),没有任何连接相关的活动,启动TCP保活机制开始每隔一个时间段(75秒)发送一个探测报文,如果连续几个(9次)探测报文都没有得到响应,则认为TCP连接已经死亡。没开TCP keepalive的情况下,客户端宕机,服务端无法感知到客户端状态服务端的 TCP 连接将会一直处于 ESTABLISHED 连接状态,直到客户端重启。在没有使用 TCP 保活机制且双方不传输数

2023-08-25 23:20:46 1308

原创 4.10&11

如果FIN报文比数据包先道道客户端,此时FIN是一个乱序报文,此时客户端的TCP连接并不会从FIN_WAIT_2状态转到TIME_WAIT状态。,因为处于 TIME_WAIT 状态的连接收到 SYN 后,会判断 SYN 的「序列号和时间戳」是否合法,然后根据判断结果的不同做不同的处理。收到合法的SYN后,就会重用此四元组连接,跳过2MSL转变为SYN_RECV状态,接着就能进行建立连接过程。收到非法的SYN后,处于 TIME_WAIT 状态的连接收到「非法的 SYN 」后,就会。乱序FIN会放到乱序队列,

2023-08-25 22:54:35 265

原创 4.9 已建立连接的TCP,收到SYN会发生什么?

客户端连接已被关闭,此时客户内核回RST报文,服释放连接;

2023-08-25 22:32:55 1100

原创 4.8 SYN什么时候被丢弃

tcp_timestamps 选项开启之后, PAWS 机制会自动开启,它的作用是防止 TCP 包中的序列号发生绕回。每个TCP包都会有自己唯一的SEQ,出现TCP数据包重传的时候会复用SEQ号,这样接收方能通过SEQ号来判断数据包的唯一性,但是SEQ号是有限的,一共32bit,seq号是递增的,满了就从0开始。seq号溢出后就无法通过seq号标识数据包的唯一性,某个数据包延迟或因重发而延迟时,可能导致连接传递的数据被破坏。

2023-08-25 21:45:13 230

原创 4.7 为什么 TCP 每次建立连接时,初始化序列号都要不一样呢?

客户端和服务端的初始化序列号都是根据计数器底层的随机数,随机生成的,能很大程度上避免历史报文被下一个相同的四元组的连接接收,然后有引入时间戳机制,从而完全避免历史报文被连接接收的问题。增加时间戳的大小,由32 bit扩大到64bit将一个与时钟频率无关的值作为时间戳,时钟频率可以增加但时间戳的增速不变。

2023-08-25 15:00:54 92

原创 4.6 TCP面向字节流

我们可以自定义一个消息结构,由包头和数据组成,其中包头包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大。

2023-08-25 11:37:40 1055

原创 muduo 31 timer定时器模块

其原因是因为set容器是一个有序队列,以<排序,就是说整个队列中,Timer的到期时间时从小到大排列的,正是因为这样,才能做到节省系统资源的目的。在muduo的定时器系统中,一共由四个类:Timestamp,Timer,TimeId,TimerQueue组成。1、EventLoop调用方法,加入一个定时器事件,传入定时器回调函数,超时时间和间隔时间(为0.0则为一次性定时器),addTimer方法根据这些属性构造新得定时器。内部实现的插入方法获取此定时器的超时时间,如果比先前的时间小就说明第一个触发。

2023-08-25 00:36:39 146

原创 4.5 TCP优化

主动方优化,关闭连接的方式通常有两种,分别是 RST 报文关闭和 FIN 报文关闭。

2023-08-24 19:10:36 846

原创 4.4TCP半连接队列和全连接队列

半连接队列,也称 SYN 队列;全连接队列,也称 accept 队列;服务器接收到客户端SYN的时候,内核会将该连接放入半连接队列,并向客户端发送ACK+SYN,接着客户端会返回ACK,服务端收到第三次握手的ACK后内核会把连接从半连接队列中移除,然后创建新的完全的连接并将其添加到accept队列,等待进程调用accept函数时把连接取出来。不管是半连接队列还是全连接队列,都有最大长度限制,超过限制时,内核会直接丢弃,或返回 RST 包。

2023-08-23 21:02:31 524

原创 Git学习

可以使用ssh地址和https地址,建议用ssh,因为使用https每次修改后都需要输入用户名和密码,很烦。一直回车,然后把.pub结尾的文件,从文件开头,一直复制到主机名前,填入github的SSH中。Git Pull 把最新的代码拉下来,并且合并到当前。Git Fetch 把最新的代码拉下来。Committed已提交。Modified修改。

2023-08-23 10:10:10 1009

原创 muduo 30 使用Apache Benchmark 压测分析

Apache Benchmark,通常称为 "ab",是一个用于测试 Web 服务器性能的工具。它是由 Apache HTTP 服务器项目提供的一个命令行工具。"ab" 工具可以你可以使用 "ab" 工具来评估一个 Web 服务器在不同负载情况下的性能表现。这对于测试服务器的并发处理能力响应时间吞吐量等指标非常有用。"ab" 工具提供了许多参数来配置测试,例如请求的总数、并发用户数、请求超时时间等。使用Apache Benchmark 对http服务器进行压测分析,测试网络库的并发处理能力。

2023-08-14 14:47:48 194

原创 muduo 29 异步日志

因为没有log消息要记录时,后端线程很可能阻塞等待log消息,当有缓冲满时,及时唤醒后端将已满缓冲数据写到磁盘上,能有效改善新能;否则,短时间内产生大量log消息,可能造成数据堆积,甚至丢失,而后端线程一直休眠(直到3秒超时唤醒)。

2023-08-13 00:26:27 1568

原创 C++20协程

如果线程有创建几个执行体,给他们指定各自的执行入口,申请一些内存给他们用作执行栈,那么线程就可以按需调度这几个执行体了,为了实现这几个执行体的切换,线程也需要记录他们的控制信息(id、栈的位置、执行入口地址、执行现场)线程可以选择一个执行体来执行,此时CPU中指令指针就会指向这个执行体的执行入口,栈基和栈指针寄存器也会指向线程给它分配的执行栈。要切换执行体时, 需要保存当前执行体的执行现场,然后切换到另外一个执行体,通过一样的方式也可以恢复到之前的执行体,这样就可以从上次中断的地方继续执行。

2023-08-09 19:11:51 428

原创 Linux常用命令

Linux下面用于打印的字符,回写。创建新文件 vi test.c。改变文件或者目录权限。

2023-08-08 23:51:19 130

原创 试图将更改推送到 GitHub,但是远程仓库已经包含了您本地没有的工作(可能是其他人提交的修改)

把本地的修改推送到网络上。

2023-08-07 23:56:55 1396

原创 Git从远程仓库中删除文件,并上传新文件

目录删除:拉取远程分支的更新:​编辑首先查看git状态:​编辑删除文件并提交版本库:提交:上传新文件:首先查看git状态: 提交到暂存区: 提交到版本库:上传: ​编辑

2023-08-07 16:47:09 741

原创 WebSocket

WebSocket在服务器和客户端之间提供低延迟、全双工和长期运行的连接。全双工:通信的两个参与方可以同时发送和接收数据,不需要等待对方的响应或传输完成。通过建立全双工的持久连接,客户端和服务器之间就能实现高效实时性更强的通信。WebSocket的出现就是为了解决实时通信的问题。

2023-08-07 10:07:09 2053

原创 Tcp的粘包和半包问题及解决方案

①:发送方每次写入数据<内核缓冲区大小;导致多个小的数据包一次性放到一个缓冲区中一起发送了,接收端接收到数据就对导致粘包。Tcp接收数据的三个队列并不是实时的,有可能会延时,可能会导致读到多个消息,粘包了。(比如规定每10个字节表示一个消息,但是客户端发送的一个消息里只有1个字节那么剩下的字节就是浪费的,需要补空或者补0)缺点:数据内容长度有限制,需要提前知道可能的最长的消息的字节数。缺点:数据内容本身出现分隔符时,需要转义,所以需要扫描内容。②:发送方数据大小大于MTU,必须拆包。

2023-08-03 23:33:45 1255

原创 CMake动态库生成及使用

现有hello.h 和 hello.cpp文件,生成动态库:-c:生成.o文件;-fPIC:生成与位置无关的代码(动态库)生成动态库libhello.so。

2023-07-31 16:58:03 1431

原创 单机,集群和分布式概念

1.受限于硬件资源,单机所能承受的用户并发量太少;2.一个系统有多个模块,任意模块的修改都会导致整个项目代码重新编译、部署;3.系统中,有些模块是CPU密集型,有些模块是I/O密集型,造成各个模块对于硬件资源的需求是不一样的。

2023-07-31 00:39:33 1177

原创 面经记录冲

C/C++网络操作系统数据库手撕

2023-07-26 01:05:33 77

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除