自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(136)
  • 收藏
  • 关注

原创 继承多态笔试题实战分析

【代码】继承多态笔试题实战分析。

2024-02-06 20:29:29 384

原创 关于继承和多态

【代码】关于继承和多态。

2024-02-06 16:11:22 358

原创 使用vs查看虚函数的内存布局

可以看到虚函数表的结构。

2024-02-04 16:49:03 368

原创 关于智能指针

定义对象的时候,用强智能指针;引用对象的地方,使用弱智能指针。只是观察作用,观察资源还可不可用,但是却不能用。不能把智能指针new在堆上。在使用时必须进行提升。

2024-02-01 20:07:43 393

原创 3.2.6 手把手实现分布式锁

锁是一种资源,需要存储;同时要保证可用性,避免锁失效 ->一个进程多线程中的锁资源存储在进程中。加锁解锁行为是网络通信,需要锁超时->进程是资源的容器,线程是执行的单元。2.哪些锁是自己加锁自己释放锁?哪些是自己加锁,可能由别的线程释放锁?行为:加锁,解锁-》网络交互-》锁超时功能,由锁存储的所在节点来实现。加锁对象和解锁对象必须为同一个 -》除了因为网络异常而造成锁超时情况。重入锁和非重入锁:允许同一个线程多次持有锁。条件的判断是一个临界资源,需要互斥锁保护。怎么获知持有锁对象的释放锁行为?

2024-01-27 22:24:05 400

原创 3.2.5 手写内存泄漏检测组件

1.内存泄漏(a.是否有内存泄漏 b.在哪里有内存泄漏)2.try-catch调用malloc 没有调用free#include <stdio.h>#include <stdlib.h>int main(){ void *p1 = malloc(5); void *p2 = malloc(10); void *p3 = malloc(15); free(p1); free(p3); return 0;}上面这个程

2024-01-27 10:11:03 381

原创 3.2.4 手写死锁检测组件

其实要检测是否发生死锁,我们还要从锁上下手,我们要对锁的前后时机进行掌控,比如说现在是谁持有锁,谁想占用锁?而需要通过hook,让上锁,解锁操作调用我们自己的函数,这样,我们就能根据线程和锁记录一些关键信息,从而构建一个有向图,之后判断这个有向图是否成环就能知道是否发生了死锁。定义了五个线程,每个线程都持有一把互斥锁,线程一首先将r1上锁,之后sleep(1)等待线程二将r2上锁,依次,线程五将r5上锁后,等待r1被释放,然而线程1还在等待r2的释放,无法将r1释放,依次。至此,我们就可以完成死锁的检测。

2024-01-23 19:22:12 385

原创 字符串相乘

【代码】字符串相乘。

2024-01-12 15:17:03 376

原创 c语言点分十进制IP转整型

【代码】c语言点分十进制IP转整型。

2024-01-05 14:14:37 400

原创 桥接模式和NAT模式的区别

NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCPserver提供的,无法进行手工改动,因此虚拟系统也就无法和本局域网中的其它真实主机进行通讯。用桥接的话只要你在局域网内有合法的地址,比如你的ADSL猫是带路由功能的,假设在单位,那就要网管给你合法IP才行(如今公司都是mac和ip绑定的)。在桥接模式下,你必须手工为虚拟系统配置IP地址、子网掩码,并且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。桥接模式:虚机和物理主机可通信,可与外网通信。

2024-01-04 09:40:44 790 1

原创 ubuntu18.04安装MySQL

(18.04/20.04不会提示输入密码,默认是没有密码)或者用lsof查看数据库默认端口3306。1.安装mysql服务器端。启动/停止/重启mysql。2.安装mysql客户端。3.安装mysql模块。

2024-01-03 16:59:32 545

原创 关于C++的一些小知识点

【代码】关于C++的一些小知识点。

2023-12-14 16:10:11 392

原创 4.2.2 MySQL索引原理以及SQL优化

不要使用索引场景:没有where/group by/order by中使用,区分度不高的列,经常修改的列,表数据量少。准备 将SQL语句发送给服务器进行解析,编译和优化 生成一个执行计划并缓存。索引的代价:占用空间,维护的代价。数据结构:B+树索引、hash索引、全文索引(根据关键字索引全局)索引的使用场景:where、group by、order by。列属性:主键索引、唯一索引、普通索引、前缀索引。物理存储:聚集索引、辅助索引(二级索引)列的个数:单列索引、组合索引。索引的目的:提升搜索效率。

2023-10-31 14:27:32 107

原创 4.2.1 SQL语句、索引、视图、存储过程

范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦;但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低;drop 快 删除整张表结构和表数据,包括索引、约束、触发器等 不能进行回滚。2.查询缓存 kv存储,命中直接返回,否则继续执行 8.0已经删除。范式二:确保表中的每列都和主键相关,而不能只与主键的某一部分相关。范式三:确保每列都和主键直接相关,而不是间接相关,减少数据冗余。5.执行器 根据执行计划,从存储引擎获取数据,并返回客户端。

2023-10-31 07:30:01 374

原创 Zookeeper分布式协调服务

Zookeeper是在分布式环境中应用非常广泛,它的优秀功能很多,比如分布式环境中全局命名服务,服务注册中心,全局分布式锁等。2.znode节点只存储简单的byte字节数组,如果存储对象,需要自己转换对象生成字节数组。临时性节点 rpc节点超时未发送心跳消息 zk会自动删除临时性节点。1.设置监听watcher只能是一次性的,每次触发后需要重复设置。永久性节点 rpc节点超时未发送心跳 zk不会删除这个节点。watch机制,当有些节点挂掉后,主动通知客户端。zk的数据是怎么组织的 -znode节点。

2023-10-30 16:42:06 147

原创 4.5.1 Nginx反向代理与系统参数配置conf原理

listen在master进程,connection在work进程。nginx ->进程 -> server。

2023-10-30 07:53:33 62

原创 2.3.1 协程设计原理与汇编实现

同步的编程方式,异步的性能。同步编程时,我们需要等待io就绪。但是在协程这里,我们使用一种机制,当io需要等待时,就切到下一个io,之后当之前的io就绪时,再切换回来继续处理就绪事件。5.协程的scheduler如何定义。b.不同体系机构,汇编代码不一样。7.如何与posix api兼容。4.协程的struct如何定义。9.协程的性能如何测试?1.为什么要有协程?汇编实现切换的优缺点。6.调度策略如何实现。

2023-10-26 18:09:08 305

原创 3.1.2 内存池的实现与场景分析

1.避免频繁分配/释放内存(产生大量的内存碎片)

2023-10-26 16:12:51 59

原创 3.1.1手写线程池与性能分析

使用场景:如果一个锁持有临界资源的时间 (O(n))大于重新访问锁的时间,就用互斥锁。2.io密集型(网络io,磁盘io)两倍的核心数个。区别在于一个线程在执行临界资源,其他线程在干什么。某类任务特别耗时,严重影响该线程处理其他任务。自旋锁其他线程发现锁被占用时,一直循环等待。1.线程池是是什么,组成结构,为什么。互斥锁其他线程发现锁被占用时去做别的。线程池是管理维持固定数量的池式结构。消费者线程 取出任务,执行任务。3.线程池在开源框架中的应用。队列 存储任务 调度线程池。2.线程池实现 核心代码。

2023-10-22 20:20:52 99

原创 1.2.1 创建型设计模式

观察者模式:定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。策略模式:定义一系列算法,把他们一个个封装起来,并且使他们可相互替换。比喻:整洁的房间,好动猫,怎么保证房间的整洁?继承:无需修改原有类的情况下通过继承实现对功能的扩展。稳定点:一对多的依赖关系,一变化多跟着变化。前提:具体需求既有稳定点,又有变化点。设计模式是怎么来的?

2023-10-19 09:25:47 268

原创 介绍几种使用工具

观测文件变化,json解析,选项解析

2023-09-02 08:44:18 353

原创 怎样免费在公司访问家中的树莓派

我的树莓派之前装过ssh,所以插上电就能用了。其实过程很简单,只需要在树莓派中下载一个。最近拿起了大学时买的树莓派,刚好看到了一篇文章写到。这时,我们就可以在其他电脑通过ssh登录树莓派了。然后在cpolar网站状态中可以看到映射关系。

2023-09-01 21:13:23 236

原创 函数参数传双指针

如果我们想在一个函数中new一个对象,给外面的指针,可以定义形如。

2023-09-01 19:28:53 93

原创 std::cout输出double精度问题

【代码】std::cout输出double精度问题。

2023-08-31 18:49:54 443

原创 C++中的异常

异常会向外传播,直到找到第一个匹配的catch处理(catch实际上是匹配过程,catch按顺序执行,他会执行第一个能匹配到的捕获)若当前匹配的catch处理不了,可以修改/携带信息,可以继续向上抛出。当我们想自定义异常输出信息时,需要继承自exception类。用noexcept修饰后,不能再抛出异常了,否则程序会崩溃。抛出异常后,throw后面的语句不会被执行。一种使用规范,异常通常由调用者捕获处理。

2023-08-23 06:47:55 151

原创 容器中的emplace

【代码】emplace。

2023-08-21 20:29:18 41

原创 关于柔性数组

struct sdshdr16 *p = malloc(sizeof(sdshdr16) + 柔性数组大小)其实在malloc分配后,会在前面有16字节存放长度,free时先向前偏移16字节,找到长度,在释放。柔性数组放在最后其实就是一个语法糖,告诉编译器,这块内存要动态分配。既然柔性数组的大小是运行时确定的,那free怎么知道要释放多大呢?而普通指针需要malloc和free两次。malloc(buf的大小)柔性数组只需要分配一次,1.方便内存分配释放。

2023-08-20 08:01:10 181

原创 C++中function,bind,lambda

作为find_if的第三个参数,bind1st的作用,首先,将70绑定到二元函数对象(greater)的第一个参数上,其次,将二元函数对象(greater)转为一元函数对象(因为70已知了),传入到find_if的第三个参数中。这里,我们常规的做法通常是:通过一个函数获取集合的最大,最小值,然后保存住,最后在需要的时候访问这两个值,然后打印它们。sort最后一个参数传入的greater或less都被称为函数对象,顾名思义,表现像函数的对象,因为他们的调用都是在后面加上"()"。似乎也没有什么神奇的地方。

2023-08-20 07:37:31 211

原创 关于模板更多的内容...

关于特化和部分特化(偏特化),其实就是看是否还有可推导的内容,特化实际上是为了应对特殊的场景。按照我们开始说的"&&在模板中并不是右值引用的意思,只是说明要传一个引用"n是左值,所以要对应左值引用,当T被推导为int&后,形参就变成了。,所以三个&,引用折叠,最后函数形参就变为了左值引用。在模板中并不是右值引用的意思,只是说明要传一个引用。推导为int&类型,而int& b必须得有初始化值。123是右值,T被推导为int后,形参就变成了。比如下面这个模板比较函数。(部分特化也叫偏特化)这样,就不会报错了。

2023-08-19 11:56:15 188

原创 lock_guard和unique_lock

【代码】lock_guard和unique_lock。

2023-08-05 16:03:52 67

原创 vs生成obj目录和源文件目录保持一致

配置属性->c/c+±>输出文件->对象文件名=%(RootDir)%(Directory)

2023-07-22 17:58:26 255

原创 关于nlohmann::json的简单使用

nlohmann::json的使用非常简单,只需要包含.hpp文件即可,这是它的官网https://github.com/nlohmann/json。

2023-06-30 18:47:23 500

原创 CMake中的find_package(xxx REQUIRED)在windows平台怎么解

下载的源代码不能一次性编过是最让人头疼的问题,这种开源代码通常都是迭代了很多版本,各种配置信息如果不在文档中说明,全靠自己去摸索确实会让人头大,所以,我尽可能的把我遇到的问题分享出来,供大家参考,而不要在这种环境问题上就栽了大跟头。或者如果你觉得写这样的文件太麻烦,不如生成工程后再手动配置三方库头文件和库文件,那你可以先创建一个空文件,把cmake骗过去,之后再自己手动配置。或者如文章中提到的,如果你觉得写这样的文件太麻烦,还不如手动配,那就可以先放置一个空文件,把CMake骗过去,先保证工程能够生成。

2023-06-18 10:59:49 703

原创 DDS、FastDDS、OpenDDS扫盲

Fast DDS是一个基于DDS标准的快速、高性能的实现。它提供了C++和Java等语言的API,为开发者提供了丰富的功能和工具。由Eclipse Foundation推动,Fast DDS是一个活跃的开源项目,得到了广泛的社区支持和贡献。OpenDDS遵循OMG定义的DDS标准,并提供了C++和Java等语言的API。选择适合实时系统的数据通信解决方案时,DDS、Fast DDS和OpenDDS是值得考虑的选择。Fast DDS和OpenDDS作为开源实现,提供了高性能、灵活性和丰富的功能。

2023-06-17 17:40:34 1465 5

原创 智能指针练习

【代码】智能指针练习。

2023-05-14 09:11:43 60 1

原创 2.2.3 Posix API与网络协议栈

FIN包一般是携带包,比如携带在最后一次发送数据包的标志位上,如果一直没有发送数据,则会单独发送FIN包。两端同时调用close()?进入CLOSING状态(下图的同时关闭状态)五元组(sip, dip, sport, dport, proto)上面的是建立连接抓取的包,下面的是服务端主动断开连接发送的网络包。大量close_wait状态?没有及时调用close();SYN_SENT如何转为SYN_RECV?如何通过网络数据包,查找半链接队列的节点。端口65535个,如何做百万级别的连接。

2023-04-30 16:24:43 724

原创 2.2.2 redis,memcached,nginx网络组件

对于写操作,用户能做的只有将数据写到内核缓存区,至于数据怎么到达对端,到达与否,用户无须干预,这是协议栈做的事情。对于服务端而言,当recv返回0时,说明对端关闭,实际上是在内核缓存区读到了一个EOF,自然读操作结束。reactor使用epoll来检测IO,而具体的IO操作还需要对应的系统调用来做!比如MySQL,使用select接收连接,每条连接一个线程,阻塞只会阻塞这条连接的线程。的话,对于阻塞IO,每个连接都需要一个线程,对于非阻塞IO,需要我们在应用层使用。是不是IO多路复用一定要搭配非阻塞IO?

2023-04-29 07:54:28 591

原创 2.1.3 http服务器的实现

从最初的reactor到现在的HTTP协议的解析与封装,其实都是一个思想,每一个链接所对应的资源或上下文都单独管理,比如一个链接对应一个结构体,这里面包含它的读写缓存,sockfd,如果考虑HTTP协议的话还可以加上对应的协议头的key-value形式的存储,之后,凡是涉及这个sockfd相关的资源,都可以在这个结构里面找到,这样一来就将业务和网络底层隔离开来,我们只需要关注读写buffer里面的内容。更进一步,当有多个链接时,如何更合理的管理这些链接(结构),链表的形式?

2023-04-26 21:37:17 72

原创 2.2.1服务器百万并发实现

接上节课,上节课中,我们使用了epoll实现了同时监听多个文件描述符,是对IO的管理,也提到了reactor是对事件的管理,那具体来说是怎样的呢?reactor是事件驱动模型,也就是EPOLLIN/EPOLLOUT,同时,我们应该维护一种结构,对于每个fd,都应该有这样一种记录该fd相关的结构。对事件管理的方式,这样一来,我们可以将网络与业务分离,业务人员只需要在回调函数中读写相应的。(目前虚拟机网络没有调试好,导致网络通信有些问题,后续再写百万并发部分,先挖个坑)再往后,为了提高处理能力,我们可以将。

2023-04-22 19:16:32 412

原创 集群和分布式

再之,系统中有些模块属于CPU密集型,有些模块属于I/O密集型,各模块对硬件资源的需求不一样,所以在进行服务器选型时只能综合各模块,可能会导致资源的浪费或过剩。下面再来看看分布式模式,一个工程拆分了很多模块,每一个模块独立部署运行在一个服务器主机上,所有服务器协同工作共同提供服务,每一台服务器称作分布式的一个节点,根据节点的并发要求,对一个节点可以再做节点模块集群部署。将模块部署到不同的主机,这样修改单独的模块,不影响其他主机模块的运行,并且对于单机性能瓶颈的问题,也可以通过增加节点集群的方式提高性能。

2023-04-20 23:02:06 271

空空如也

空空如也

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

TA关注的人

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