自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 问答 (2)
  • 收藏
  • 关注

原创 【C++】share_ptr详解

分析:根据对象生成顺序,先初始化基类 enable_shared_from_this ,再初始化派生类 Frame 对象本身,这时 Frame 对象已经生成,但 _M_weak_this 成员还未被初始化,最后应通过 shared_ptr<T> sp(new T()) 等方式调用 shared_ptr 构造函数(内部会调用 _M_weak_assign 成员函数来初始化 _M_weak_this 成员)。share_ptr 内部中的引用计数是线程安全的,但是引用的资源不是线程安全的。

2024-03-26 10:22:24 4356

原创 C++ vector详解

本文主要分两大部分:第一部分为vector的底层实现原理以及相关机制,第二部分是vector内置常用操作。

2024-03-07 22:37:54 983 1

原创 C++中的this指针

而一个 this 指针并不是对象本身的一部分,不会影响对象“sizeof”的结果,this 的作用域在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数,也就是说,即使我们没有写上 this 指针,编译器在编译的时候也是会加上 this 的。类中成员函数最终会被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以在编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数或者成员变量。那么this到底是什么呢?

2024-03-05 21:54:42 383

原创 C++对象内存模型布局详解

C++封装带来的布局成本多大?由空类组成的继承层次中,每个类对象的大小是多大?在C++中有两种数据成员(class data members):static 和 nonstatic,以及三种类成员函数(class member function):static、nonstatic 和 virtual。

2024-03-05 21:15:22 1210

原创 计算机网络之IP篇

首先这是个 IPv4 地址,IPv4 地址有 32 位,一个字节有 8 位,共 4 个字节。其中 127 开头的都属于回环地址,也是 IPv4 的特殊地址,没什么道理,就是人为规定的。而 127.0.0.1 是众多回环地址的一个。之所以不是 127.0.0.2 ,而是 127.0.0.1 ,是因为源码里就是这个定义的,也没什么道理。

2023-12-04 15:38:54 3106 1

原创 计算机网络TCP篇③问答篇

我们可以自定义一个消息结构,由包头和数据组成,其中包头,包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大,比如这个消息结构体,首先 4 个字节大小的变量来表示数据的大小,真正的数据则在后面。当数据方接收到包头的大小后,就解析包头的内容,于是就可以直到数据的长度,然后接下来就是继续读取数据,直到读满数据的长度,就可以组装成一个完整的用户消息来处理了。tcp_timestamps 选项开启后,PAWS 机制会自动开启,它的作用是防止 TCP 包中的序列号发生绕回。

2023-12-03 23:42:50 1604 1

原创 计算机网络TCP篇②

举个🌰,假设发送端发了 6 个数据,编号的顺序是 Seq1 ~ Seq6,但是 Seq2、Seq3 都丢失了,那么接收方在收到 Seq4,Seq4,Seq6 时,都是回复 ACK2 给发送方,但是发送方并不清楚这连续的 ACK2 是接收方收到哪个报文而回复的,那是选择重传 Seq2 一个报文,还是重传 Seq2 之后已发送的所有报文呢?即使在往返时间较长的情况下,它也不会降低网络通信的效率,那么有了窗口,就可以指定窗口的大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。

2023-12-02 20:23:44 1446 1

原创 计算机网络TCP篇①

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。能够确保接收端接受的网络包是无损坏、无间隔、非冗余和按序的。面向连接:一定是【一对一】才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的。可靠的:无论网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够达到接收端。字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统【分组】成多个 TCP 报文,如果接收方的程序如果不知道【消息的边界】,是无法读出一个有效的用户消息的。

2023-12-02 14:54:35 1818 2

原创 计算机网络HTTP篇

首先我们要保证自己电脑的安全,不要被病毒侵入,而且也不要点击任何证书非法的网站,这样 HTTPS 数据就不会被中间人截取到了,当然还可以通过 HTTPS 双向认证的方式来避免这种问题,一般我们的 HTTPS 都是单向认证,客户端只会验证了服务端的身份,但是服务端不会验证客户端的身份,如果服务端检测到了客户端是不可信任的,服务端就拒绝通信,客户端如果发现服务端也是不可信任的,也终止通信。这个随机数的作用就是为后续作为生成【会话密钥】的条件,所谓的会话密钥就是数据传输时,所使用的对称加密密钥。

2023-12-01 11:36:54 1840 2

原创 操作系统之网络系统篇

这样,每次调用 epoll_wait() 函数时,都是直接从内核事件表中取得用户注册的事件,而无需反复从用户空间将这些注册事件读取到内核区中,节省了复制的系统开销。可惜的是,在 Linux 下的异步 IO 是不完善的,aio 系列函数是由 POSIX 定义的异步操作接口,不是真正的操作系统级别支持的,而是用户空间模拟出来的异步,并且仅仅支持基于本地文件的 aio 异步操作,网络编程中的 socket 是不支持的,这也使得基于 Linux 的高性能网络程序都是使用 Reactor 方案。

2023-11-29 23:23:59 919 1

原创 键盘敲入一个字母,操作系统发生了什么?

的功能就是从键盘控制器的寄存器的缓冲区读取扫描码,再根据扫描码找到用户在键盘输入的字符,如果输入的字符是显示字符,那就会把扫描码翻译成对应显示字符的 ASCII 码,比如用户在键盘输入的是字母 A,是显示字符,于是就会把扫描码翻译成 A 字符的 ASCII 码。我们的电脑设备可以接非常多的输入输出设备,比如鼠标键盘网卡硬盘打印机等,每个设备的用法和功能都不相同,那操作系统是如何把这些输入输出设备统一管理的呢?这样做是为了减少对设备的频繁操作,那 CPU 是如何与设备的控制寄存器和数据缓冲区进行通信的?

2023-11-28 22:19:31 1302

原创 操作系统文件管理

是不会的,因为进程在执行 write (使用缓冲)系统调用的时候,实际上是将文件数据写到了内核的 page cache ,它是文件系统中用于缓存文件数据的缓冲,所以即使进程崩溃了,文件数据还是被保留在内核中的 page cache ,我们读数据的时候,也是从内核的 page cache 读取,因此还是依然读的进程崩溃前写入的数据。非阻塞 I/O 好比,你去了饭堂,问阿姨菜做好了没有,阿姨告诉你没,你就离开了,过几十分钟,你又来饭堂问阿姨,阿姨说做好了,于是阿姨帮你把菜打到你的饭盒里,这个过程你是得等待的。

2023-11-28 21:52:24 971

原创 操作系统进程与线程篇

对于互斥锁加锁失败而阻塞的现象,是由操作系统内核实现的。消息队列是保存在内核中的消息链表,在发送数据时,会被拆分成一个个独立的单元,也就是消息体,消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的存储块,不像是无格式的字节流数据。一个进程切换到另一个进程运行,称为进程的上下文切换,进程是由内核管理和调度的,所以进程的切换只能发生在内核态,所以进程的上下文切换不仅包含了虚拟内存,栈,全局变量等用户空间的资源,还包括了内核堆栈,寄存器等内核空间的资源。

2023-11-28 19:41:11 1052

原创 操作系统内存管理篇

如果使用了 NUMA 架构的服务器,如果系统出现还有一般内存的时候,却发现系统频繁触发【直接内存回收】,影响了系统性能,那么大概率是因为 zone_reclaim_mode 没有设置为 0 ,导致当本地内存不足的时候,只选择回收本地内存的方式,而不去使用其他 Node 的空闲内存,虽然访问远端 Node 的内存比访问本地内存要耗时很多,但是相比内存回收的危害而言,访问远端 Node 的内存带来的性能影响还是比较小的。所以如果内存交换的时候,交换的是一个占内存空间占用很大的程序,这样整个机器都会显得卡顿。

2023-11-27 22:57:46 1131 1

原创 MySQL锁篇

这就奇怪了,上文不是说锁住的区域不都是(1006,+无穷] 的 next-key lock 吗?那么当在 age = 39 这条记录的二级索引上加了范围为(22,39)的间隙锁后,其他事务是无法插入一个 age = 22,id = 12 的新记录,因为当其他事务插入一条 age = 22,id = 12 的新记录时,在二级索引定位到插入的位置,而该位置的下一条是 id = 20,age = 39 的记录,正好该记录的二级索引上有间隙锁,所以这条插入语句会被阻塞,无法插入成功,这样就可以避免幻读现象的发生。

2023-11-26 18:10:06 1232 1

原创 MySQL事务篇

事务 B 在第一次读汤圆的数字记录,在找到记录后,它会先看这条记录的【trx_id】,此时发现 【trx_id】为 50,比事务 B 的Read View 中的【min_trx_id】值(51)还小,这就说明修改这条记录的事务早就在事务 B 启动之前提交过了,所以该版本的记录对事务 B 可见的,也就是事务 B 可以获取到这条记录。最后,当事务 A 提交事务后,由于隔离级别是【可重复读】,所以事务 B 再次读取记录时,还是基于启动事务时创建的 Read View 来判断当前版本的记录是否可见。

2023-11-24 21:00:39 1036 2

原创 MySQL索引篇

我们在这里将上图除 id 节点之外的任一节点设置为二级索引,那么通过二级索引进行查找,会先检索二级索引中的 B + Tree 的索引值,找到对应的叶子节点,然后获取主键值,然后再通过主键索引中的 B + Tree 才能查找到数据,这个操作也叫做回表,也就说要查找两个 B + Tree 才能找到数据。页目录就是由多个槽组成的,槽相当于分组记录的索引。将 5 与根节点的索引数据(1,10,20)比较,5 在 1 和 10 之间,所以按照 B + Tree 的搜索逻辑,找到第二层的索引数据(1,4,7)。

2023-11-23 21:01:00 1165 1

原创 MySQL基础结构篇

目录一、执行一条SQL语句后发生了什么?二、MySQL的数据是如何存放的?2.1、MySQL中表空间文件的结构2.2、InnoDB中的行格式三、字段长度规定3.1、一行记录长度最大值3.2、行溢出后怎么办?四、InnoDB 缓冲池中的 Buffer Pool4.1、Buffer Pool 是什么?4.2、Buffer Pool 缓存是什么?4.3、如何管理 Buffer Pool ?4.4、管理脏页4.5、如何提高缓存命中率Buffer Pool 污染

2023-11-22 23:04:09 93

原创 高并发内存池

内存池(Memory Pool) 是一种动态内存分配与管理技术。通常情况下,程序员习惯直接使用 new、delete、malloc、free 等API申请分配和释放内存,这样导致的后果是:当程序长时间运行时,由于所申请内存块的大小不定,频繁使用时会造成大量的内存碎片从而降低程序和操作系统的性能。

2023-09-15 00:35:01 187

原创 仿modou库one thread one loop式并发服务器

前述:这篇文章讲的不是很详细,只贴上了大概的实现思想和部分实现源码。后续会逐渐更新。源码:https://gitee.com/songbijian/modou-tcpserver通过咱们实现的⾼并发服务器组件,可以简洁快速的完成⼀个⾼性能的服务器搭建。并且,通过组件内提供的不同应⽤层协议⽀持,也可以快速完成⼀个⾼性能应⽤服务器的搭建(当前 ,为了便于项⽬的演⽰,项⽬中提供HTTP协议组件的⽀持)。在这⾥,要明确的是咱们要实现的是⼀个⾼并发服务器组件,因此当前的项⽬中并不包含实际的业务内容。

2023-09-14 22:03:30 183 1

原创 剑指offer链表题题解汇总

如果有更好的方法,欢迎指教!JZ52 两个链表的第一个公共结点(JZ22 链表中倒数最后k个结点(JZ76 删除链表中重复的结点(JZ25 合并两个排序的链表(JZ23 链表中环的入口结点(JZ6 从尾到头打印链表(JZ35 复杂链表的复制(JZ18 删除链表的节点(JZ24 反转链表(

2023-09-04 21:22:03 193 3

原创 C++设计模式(23种)汇总及代码实现

它是继承复用的基石,只有当衍生类可以替换掉基类,软件单位功能不受到影响的时候,基类才能真正被复用,而衍生类也能够在积累的基础上增加新的行为。提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示。它结合了两个独立接口的功能,将一个类的接口转换成客户期望的另一个接口,让原本不兼容的类或者函数可以协同运作,是两个不兼容的接口之间的桥梁。3.当进行深拷贝的时候,需要编写较为复杂的代码,而且当对象之间存在多重嵌套时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现复杂。

2023-09-03 22:55:22 5132 5

原创 史上最全C/C++面试、C++面经八股文,一文带你彻底搞懂C/C++面试、C++面经!

目录1.讲一讲封装、继承、多态是什么?2.多态的实现原理(实现方式)是什么?以及多态的优点(特点)?3.final关键字的作用是什么?4.虚函数是怎么实现的?它存放在哪里在内存的哪个区?什么时候生成的5.智能指针的本质是什么,它们的实现原理是什么?6.匿名函数的本质是什么?他的优点是什么?7.右值引用是什么,为什么要引入右值引用?8.左值引用和指针的区别?9.指针是什么?10.weak_ptr真的不计数?是否有计数方式,在哪分配的空间。11.malloc的内存分配的方式,有什么缺点?

2023-08-26 09:09:16 113544 82

空空如也

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

TA关注的人

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