- 博客(140)
- 收藏
- 关注
原创 关于智能指针
定义对象的时候,用强智能指针;引用对象的地方,使用弱智能指针。只是观察作用,观察资源还可不可用,但是却不能用。不能把智能指针new在堆上。在使用时必须进行提升。
2024-02-01 20:07:43
457
原创 3.2.6 手把手实现分布式锁
锁是一种资源,需要存储;同时要保证可用性,避免锁失效 ->一个进程多线程中的锁资源存储在进程中。加锁解锁行为是网络通信,需要锁超时->进程是资源的容器,线程是执行的单元。2.哪些锁是自己加锁自己释放锁?哪些是自己加锁,可能由别的线程释放锁?行为:加锁,解锁-》网络交互-》锁超时功能,由锁存储的所在节点来实现。加锁对象和解锁对象必须为同一个 -》除了因为网络异常而造成锁超时情况。重入锁和非重入锁:允许同一个线程多次持有锁。条件的判断是一个临界资源,需要互斥锁保护。怎么获知持有锁对象的释放锁行为?
2024-01-27 22:24:05
440
原创 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
448
原创 3.2.4 手写死锁检测组件
其实要检测是否发生死锁,我们还要从锁上下手,我们要对锁的前后时机进行掌控,比如说现在是谁持有锁,谁想占用锁?而需要通过hook,让上锁,解锁操作调用我们自己的函数,这样,我们就能根据线程和锁记录一些关键信息,从而构建一个有向图,之后判断这个有向图是否成环就能知道是否发生了死锁。定义了五个线程,每个线程都持有一把互斥锁,线程一首先将r1上锁,之后sleep(1)等待线程二将r2上锁,依次,线程五将r5上锁后,等待r1被释放,然而线程1还在等待r2的释放,无法将r1释放,依次。至此,我们就可以完成死锁的检测。
2024-01-23 19:22:12
440
1
原创 桥接模式和NAT模式的区别
NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCPserver提供的,无法进行手工改动,因此虚拟系统也就无法和本局域网中的其它真实主机进行通讯。用桥接的话只要你在局域网内有合法的地址,比如你的ADSL猫是带路由功能的,假设在单位,那就要网管给你合法IP才行(如今公司都是mac和ip绑定的)。在桥接模式下,你必须手工为虚拟系统配置IP地址、子网掩码,并且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。桥接模式:虚机和物理主机可通信,可与外网通信。
2024-01-04 09:40:44
2801
1
原创 ubuntu18.04安装MySQL
(18.04/20.04不会提示输入密码,默认是没有密码)或者用lsof查看数据库默认端口3306。1.安装mysql服务器端。启动/停止/重启mysql。2.安装mysql客户端。3.安装mysql模块。
2024-01-03 16:59:32
775
原创 4.2.2 MySQL索引原理以及SQL优化
不要使用索引场景:没有where/group by/order by中使用,区分度不高的列,经常修改的列,表数据量少。准备 将SQL语句发送给服务器进行解析,编译和优化 生成一个执行计划并缓存。索引的代价:占用空间,维护的代价。数据结构:B+树索引、hash索引、全文索引(根据关键字索引全局)索引的使用场景:where、group by、order by。列属性:主键索引、唯一索引、普通索引、前缀索引。物理存储:聚集索引、辅助索引(二级索引)列的个数:单列索引、组合索引。索引的目的:提升搜索效率。
2023-10-31 14:27:32
143
原创 4.2.1 SQL语句、索引、视图、存储过程
范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦;但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低;drop 快 删除整张表结构和表数据,包括索引、约束、触发器等 不能进行回滚。2.查询缓存 kv存储,命中直接返回,否则继续执行 8.0已经删除。范式二:确保表中的每列都和主键相关,而不能只与主键的某一部分相关。范式三:确保每列都和主键直接相关,而不是间接相关,减少数据冗余。5.执行器 根据执行计划,从存储引擎获取数据,并返回客户端。
2023-10-31 07:30:01
404
原创 Zookeeper分布式协调服务
Zookeeper是在分布式环境中应用非常广泛,它的优秀功能很多,比如分布式环境中全局命名服务,服务注册中心,全局分布式锁等。2.znode节点只存储简单的byte字节数组,如果存储对象,需要自己转换对象生成字节数组。临时性节点 rpc节点超时未发送心跳消息 zk会自动删除临时性节点。1.设置监听watcher只能是一次性的,每次触发后需要重复设置。永久性节点 rpc节点超时未发送心跳 zk不会删除这个节点。watch机制,当有些节点挂掉后,主动通知客户端。zk的数据是怎么组织的 -znode节点。
2023-10-30 16:42:06
189
原创 4.5.1 Nginx反向代理与系统参数配置conf原理
listen在master进程,connection在work进程。nginx ->进程 -> server。
2023-10-30 07:53:33
106
原创 2.3.1 协程设计原理与汇编实现
同步的编程方式,异步的性能。同步编程时,我们需要等待io就绪。但是在协程这里,我们使用一种机制,当io需要等待时,就切到下一个io,之后当之前的io就绪时,再切换回来继续处理就绪事件。5.协程的scheduler如何定义。b.不同体系机构,汇编代码不一样。7.如何与posix api兼容。4.协程的struct如何定义。9.协程的性能如何测试?1.为什么要有协程?汇编实现切换的优缺点。6.调度策略如何实现。
2023-10-26 18:09:08
368
原创 3.1.1手写线程池与性能分析
使用场景:如果一个锁持有临界资源的时间 (O(n))大于重新访问锁的时间,就用互斥锁。2.io密集型(网络io,磁盘io)两倍的核心数个。区别在于一个线程在执行临界资源,其他线程在干什么。某类任务特别耗时,严重影响该线程处理其他任务。自旋锁其他线程发现锁被占用时,一直循环等待。1.线程池是是什么,组成结构,为什么。互斥锁其他线程发现锁被占用时去做别的。线程池是管理维持固定数量的池式结构。消费者线程 取出任务,执行任务。3.线程池在开源框架中的应用。队列 存储任务 调度线程池。2.线程池实现 核心代码。
2023-10-22 20:20:52
147
原创 1.2.1 创建型设计模式
观察者模式:定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。策略模式:定义一系列算法,把他们一个个封装起来,并且使他们可相互替换。比喻:整洁的房间,好动猫,怎么保证房间的整洁?继承:无需修改原有类的情况下通过继承实现对功能的扩展。稳定点:一对多的依赖关系,一变化多跟着变化。前提:具体需求既有稳定点,又有变化点。设计模式是怎么来的?
2023-10-19 09:25:47
298
原创 怎样免费在公司访问家中的树莓派
我的树莓派之前装过ssh,所以插上电就能用了。其实过程很简单,只需要在树莓派中下载一个。最近拿起了大学时买的树莓派,刚好看到了一篇文章写到。这时,我们就可以在其他电脑通过ssh登录树莓派了。然后在cpolar网站状态中可以看到映射关系。
2023-09-01 21:13:23
273
原创 C++中的异常
异常会向外传播,直到找到第一个匹配的catch处理(catch实际上是匹配过程,catch按顺序执行,他会执行第一个能匹配到的捕获)若当前匹配的catch处理不了,可以修改/携带信息,可以继续向上抛出。当我们想自定义异常输出信息时,需要继承自exception类。用noexcept修饰后,不能再抛出异常了,否则程序会崩溃。抛出异常后,throw后面的语句不会被执行。一种使用规范,异常通常由调用者捕获处理。
2023-08-23 06:47:55
171
原创 关于柔性数组
struct sdshdr16 *p = malloc(sizeof(sdshdr16) + 柔性数组大小)其实在malloc分配后,会在前面有16字节存放长度,free时先向前偏移16字节,找到长度,在释放。柔性数组放在最后其实就是一个语法糖,告诉编译器,这块内存要动态分配。既然柔性数组的大小是运行时确定的,那free怎么知道要释放多大呢?而普通指针需要malloc和free两次。malloc(buf的大小)柔性数组只需要分配一次,1.方便内存分配释放。
2023-08-20 08:01:10
222
原创 C++中function,bind,lambda
作为find_if的第三个参数,bind1st的作用,首先,将70绑定到二元函数对象(greater)的第一个参数上,其次,将二元函数对象(greater)转为一元函数对象(因为70已知了),传入到find_if的第三个参数中。这里,我们常规的做法通常是:通过一个函数获取集合的最大,最小值,然后保存住,最后在需要的时候访问这两个值,然后打印它们。sort最后一个参数传入的greater或less都被称为函数对象,顾名思义,表现像函数的对象,因为他们的调用都是在后面加上"()"。似乎也没有什么神奇的地方。
2023-08-20 07:37:31
255
原创 关于模板更多的内容...
关于特化和部分特化(偏特化),其实就是看是否还有可推导的内容,特化实际上是为了应对特殊的场景。按照我们开始说的"&&在模板中并不是右值引用的意思,只是说明要传一个引用"n是左值,所以要对应左值引用,当T被推导为int&后,形参就变成了。,所以三个&,引用折叠,最后函数形参就变为了左值引用。在模板中并不是右值引用的意思,只是说明要传一个引用。推导为int&类型,而int& b必须得有初始化值。123是右值,T被推导为int后,形参就变成了。比如下面这个模板比较函数。(部分特化也叫偏特化)这样,就不会报错了。
2023-08-19 11:56:15
202
原创 关于nlohmann::json的简单使用
nlohmann::json的使用非常简单,只需要包含.hpp文件即可,这是它的官网https://github.com/nlohmann/json。
2023-06-30 18:47:23
658
原创 CMake中的find_package(xxx REQUIRED)在windows平台怎么解
下载的源代码不能一次性编过是最让人头疼的问题,这种开源代码通常都是迭代了很多版本,各种配置信息如果不在文档中说明,全靠自己去摸索确实会让人头大,所以,我尽可能的把我遇到的问题分享出来,供大家参考,而不要在这种环境问题上就栽了大跟头。或者如果你觉得写这样的文件太麻烦,不如生成工程后再手动配置三方库头文件和库文件,那你可以先创建一个空文件,把cmake骗过去,之后再自己手动配置。或者如文章中提到的,如果你觉得写这样的文件太麻烦,还不如手动配,那就可以先放置一个空文件,把CMake骗过去,先保证工程能够生成。
2023-06-18 10:59:49
1788
原创 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
2241
5
原创 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
775
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人