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