- 博客(52)
- 收藏
- 关注
原创 介绍rpc
客户端调用远程方法时,就像调用本地方法一样,将参数传递给远程方法,远程方法执行后将结果返回给客户端。RPC在分布式系统中有广泛的应用场景,如微服务架构中的服务调用、分布式计算和数据分析中的远程调用等。服务端执行远程方法:服务端接收到请求后,通过服务端代理(skeleton)进行反序列化,根据接口定义执行远程方法,并将结果序列化为网络传输格式返回给客户端。服务端存根(Server Stub):服务端上的代理程序,负责接收客户端的请求,进行反序列化,并根据接口定义执行远程方法,再将结果返回给客户端。
2024-07-31 16:53:17
315
原创 空指针和野指针的区别
区别归纳 空指针 野指针 定义 指针变量没有被赋予具体的内存地址 指针变量指向一个无效的内存地址 值 确定的,通常为NULL或nullptr 不确定的,指向无效内存 安全性 相对安全,可以安全检查和比较 极其不安全,解引用可能导致严重问题 用途 表示指针不指向任何有效内存 不应存在,是编程错误的结果 避免方法 初始化指针为NULL或nullptr 初始化指针,并在释放内存后将其置为NULL 如何避免野指针
2024-07-31 10:11:38
331
原创 TCP连接中重复使用了两个相同的端口怎么办
如果确实需要多个进程或服务使用相同的端口号,可以考虑使用SO_REUSEADDR或SO_REUSEPORT选项。但是,请注意这两个选项的使用场景和限制。在需要处理大量并发连接的情况下,可以使用负载均衡器来将连接请求分发到多个后端服务器。这样,即使多个服务器使用相同的端口号,也不会引起冲突。首先,应该检查系统的配置和应用程序的设置,确保没有错误地将多个服务或进程配置为使用相同的端口号。如果可能的话,尽量为每个服务或进程分配一个唯一的端口号。这有助于避免潜在的冲突和混淆。
2024-07-31 09:38:37
328
原创 数组与链表的区别
对于想要快速访问数据,不经常有插入和删除元素的时候,选择数组对于需要经常的插入和删除元素,而对访问元素时的效率没有很高要求的话,选择链表。
2024-07-29 23:21:33
235
原创 切片问题以及传指针或引用之所以可以避免数据复制
当传递大型数据结构(如数组、大型对象等)时,如果直接传递这些数据的副本,将会消耗大量的内存来存储这些副本。而通过传递指针或引用,实际上只传递了数据的内存地址或别名,而不是数据本身,从而避免了不必要的内存消耗。如果传递的是数据的副本,那么函数外部的数据将不会受到影响。而通过传递指针或引用,我们可以直接修改原始数据,并将这些修改反映到函数外部。在c++中,如果通过值传递派生类对象给接受基类类型参数的函数,会发生"切片",即只传递派生类对象中基类部分的一个副本。完全丢失了派生类的特定信息和多态性。
2024-07-25 20:10:52
72
原创 指针和引用
传递 &a 和 &b,把形式参数声明为对应的指针类型。调用函数时,*p 和 *q 分别为变量 a 和 b 的别名,因此可以通过 *p 和 *q 改变变量 a 和 b 的值。p 指向了 i,那么 *p 就是 i 的别名。
2024-07-24 11:22:28
75
原创 union的特性和大小端
意味着在同一时刻,union 只能存储其成员 中的一个值。当你修改了union中的一个成员,那么其它成员的值也会被改变,因为它们实际上都是指向同一块内存区域的不同解释。union的大小至少等于其最大成员的大小。编译器会确保 union 有足够的空间来存储其最大成员,但也可能为对齐而增加额外的填充字节。2.小端:将数据的最低有效字节存储在内存的最低地址处,而将数据的最高有效字节存储在内存的最高地址处。1.大端:将数据的最高有效字节存储在内存的最低地址处,而将最低有效字节存储在内存的最高地址处。
2024-07-23 17:06:25
316
原创 c++分配内存后怎么置0
对于C++中的类对象,当你使用new操作符时,如果类有默认构造函数,并且该构造函数将对象成员初始化为0或某个特定值,那么通过new分配的对象将被自动初始化。对于STL容器(如std::vector)或数组,你可以使用std::fill来将元素初始化为0。但请注意,对于动态分配的原始数组,你需要先包含头文件,并且使用数组的指针和大小作为参数。如果你正在使用C++11或更高版本,并且你正在处理的是STL容器(如std::vector),你可以直接在初始化时使用初始化列表来填充0。
2024-07-22 22:14:33
390
原创 如何在Linux中打开core文件
除了GDB之外,还可以使用其他工具来查看core文件的内容,如crash(基于GDB的交互式核心转储分析工具)、lldb(现代化的调试器)、objdump(用于分析目标文件的工具)和readelf(用于分析ELF格式二进制文件的工具)等。若要启用core文件生成,可以在当前shell会话中使用ulimit -c unlimited命令,或者将ulimit -c unlimited添加到用户的shell配置文件中(如.bash_profile、.bashrc等),以便每次登录时都启用core文件生成。
2024-07-22 20:04:10
553
原创 粘包问题、mmap和分片上传
而 mmap 的处理就更加简单粗暴,它直接把页缓存的一部分映射到用户态内存, 这样用户在用户态当中的操作就直接对应页缓存的操作。这样的情况下,服务端没办法区分到底是哪些部分是文件名而哪些 部分是文件内容。3、调用recv的时 候,需要传入一个整型的长度参数,但是遗憾的是,这个长度参数是描述的是最大的长度, 而实际recv的长度可能并没有达到最大的长度——因为TCP是一种流式协议,它只能负责每 个报文可靠有序地发送和接收,但是并不能保证传输到网络缓冲区当中的就是完整的一个小 火车(即数据到达有延迟)。
2024-07-22 19:42:24
598
原创 可用内存为什么可以超过实际内存
当子进程的某个可以写入的页被第一次写入的时候,内核会意识到对应的物理页是属于父进程的,此时会为子进程分配一个新的物理页,如果要分配的物理页不在主存储器中,此时会出发一个异常名为缺页异常,当异常处理完成以后,子进程会被分配一个新的物理页,并且物理页内容会是原来页的拷贝。正在执行的进程会在执行的过程中逐渐消耗它的时间片,当时间片耗尽时,如果该进程仍然处于运行状态,那么它就会被就绪队列中的下一个进程抢占。,当一个调度周期开始的时候,调度器回味就绪队列当中的每个进程分配时间片,每个进程能够获取的。
2024-07-16 22:52:18
461
原创 c++单例模式
(线程不安全):在第一次使用时实例化对象。基本的懒汉式实现并不支持多线程环境,因为在多线程环境下可能会创建多个实例。饿汉式单例模式由于其实现简单且线程安全(实例在程序启动时被创建),是实际应用中较为常见的选择。:主要是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。常见的有懒汉式和饿汉式。:在程序启动时即创建实例,因此不存在多线程访问时创建多个实例的问题。
2024-07-15 22:17:22
191
原创 生成日志系统和监控
背景:已知某后台服务将日志存放在本地硬盘的日志文件中,该服务也支持代码热更新,并在完成热更新后输出一条日志。我们需要对服务日志进行监控,以确保文件热更新后的错误能被第一时间发现。我们提供 Python 程序模拟(https://pastebin.com/pZH8wruC,密码pWXRFeSpwU)上述行为,该程序会不断生成日志,并输出到日志文件 1.log 中,日志格式参考源码。
2024-07-10 22:02:50
345
原创 间接访问或修改基类的私有成员
3、保护成员:基类可以将某些成员声明为保护的(protected)。这样,派生类可以直接访问这些保护乘员,但外部代码不能访问它们。1、公共访问器(getter 和 setter 方法):基类可以为私有成员提供公共的getter 和setter方法。这样,派生类可以通过这些公共方法来访问或修改基类的私有成员。虽然这不能直接访问基类的私有成员,但它允许派生类以不同的方式实现相同的功能。2、友元函数/类:在c++中,你可以使用友元函数或友元类来访问类的私有成员,包括基类的私有成员。
2024-07-01 14:13:29
165
原创 拷贝构造函数 和 赋值运算符函数
语句时, pt1 对象已经存在,而 pt2 对象还不存在,所以也是这句创建了 pt2 对象,既然涉及 到对象的创建,就必然需要调用构造函数,而这里会调用的就是复制构造函数,又称为。该语句时, pt1 与 pt2 都存在,所以不存在对象的构造,这要与 Point pt2 = pt1;语句区分开,这是不同的。在这里,当 = 作用于对象时,其实是把它当成一个函数来看待的。从上面的定义来看, pc1 与 pc2 对象的数据成员 _brand 都会指向同一个堆空间的字符串,这种只拷贝 指针的地址的方式,我们称为。
2024-07-01 12:31:19
294
原创 定义和声明
目的与功能:定义的主要目的是创建一个对象(如变量、函数或类型),并为该对象分配内存空间。在C语言中,定义通常还涉及到为变量指定初始值或为函数提供实现。出现位置:定义通常出现在源文件中。次数限制:对于同一个对象,定义只能进行一次。多次定义同一个对象会引发重复定义的错误。示例int a = 10;这行代码定义了一个整型变量a,并为其分配了内存空间,同时指定了初始值为10。这行代码定义了一个名为add的函数,该函数有两个整型参数x和y,并有一个整型返回值。定义。
2024-07-01 12:27:22
237
原创 c++中保护一个变量免受另一个变量的影响以及检测一个变量是否在其生命周期内的某个点被修改
4、互斥锁(多线程环境):如果你的代码在多线程环境中运行,并且两个变量可能在不同的线程中被同时访问和修改,那么你需要使用互斥锁(如std::mutex)来确保在任何时候只有一个线程可以访问和修改这些变量。这可以防止数据竞争和不一致的状态。通常通过封装、作用域规则、访问控制(如public、protected、private)、互斥锁(在多线程环境中)等方式来实现。通过在对象的构造函数中获取资源并在析构函数中释放资源,你可以确保资源在使用期间得到正确的管理,并防止资源泄漏或意外访问。
2024-07-01 12:21:37
218
原创 TCP/IP协议族
这是因为TCP和UDP是OSI模型中传输层的两种不同协议,它们分别使用不同的协议号来区分。TCP使用协议号6,而UDP使用协议号17。操作系统在接收到数据包时,会根据数据包的协议号来将其路由到相应的协议栈(TCP或UDP)进行处理。因此,从协议设计的角度来看,TCP和UDP使用同一个端口在技术上是不被推荐的。这些协议共同定义了数据在互联网中的传输方式,确保了数据在源端和目的端之间的可靠传输。如IP协议(互联网协议)。3.拥塞控制:当网络拥塞时,TCP会减少数据的发送量,以减轻网络负担并防止数据包的丢失。
2024-06-30 22:46:30
392
原创 IO多路复用模型
来实现这种并行的等待;当监听的多个文件描述符中至少存在一个文件描述符就绪的时候,操作系统就可以唤醒进程,随后进程就可以遍历就绪的文件描述符,再执行读取操作(这个读取操作就不会引发阻塞了)。1、在epoll_ctl()函数中,为每个文件描述符都指定了回调函数,基于回调函数把就绪时间放到就绪队列中,因此把时间复杂度从o(n)降到了O(1)。3、在某些情况下,如果知道应用程序只会使用很少量的文件描述符,并且你不需要处理大量的并发连接,那么使用select 或poll 也是可以接受的。
2024-06-30 21:38:56
332
原创 c++多态
首先调用派生类的析构函数,然后按照基类在继承列表中的顺序(如果有多个基类)或按照基类声明的顺序(如果有单个基类)调用基类的析构函数。一、如果基类的析构函数不是虚函数,那么通过基类指针或引用调用析构函数时只会调用基类的析构函数,而不会调用派生类的析构函数。构造函数的作用是创建对象,完成数据的初始化,而虚函数机制被激活的条件之一就是要先创建对象,有了对象才能表现出动态多态。覆盖:发生在基类和派生类之间,基类和派生类中同时定义相同的虚函数,覆盖的是虚函数表的入口地址,并不是覆盖函数本身。
2024-06-28 18:28:54
197
原创 怎么描述shareed_ptr与unique_ptr的共享与独占
多个 shared_ptr 可以指向同一个对象,每个 shared_ptr 拥有一个引用计数。std::unique_ptr 适用于需要独占对象所有权的情况,它提供了更严格的内存管理语义,并可以防止复制导致的所有权问题。在大多数情况下,如果可能的话,使用 unique_ptr 而不是 shared_ptr 是一个更好的选择,因为它可以减少潜在的内存管理问题。std::shared_ptr 和 std::unique_ptr 是 C++11 引入的智能指针类型,它们用于自动管理动态分配的内存,防止内存泄漏。
2024-06-23 23:19:19
351
原创 Git基本操作命令
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。git clonegit pushgit addgit commitgit pullworkspace:工作区staging area:暂存区/缓存区local repository:版本库或本地仓库remote repository:远程仓库提交与修改命令说明git add添加文件到暂存区git status查看仓库当前的状态,显示有变更的文件。gitdiff比较文件的不同,即暂存区和工作区的差异。gitcommit。
2024-04-29 16:39:23
712
原创 Ubuntu20.04修改docker镜像存储位置并进行数据迁移
然后重启docker服务,就可以更新docker默认的镜像容器保存位置,特别注意,如果新的保存位置里拷贝了原来容器保存位置里的所有内容,那么镜像数据等也就迁移过来了。注:这里不需要新建一个/data/docker目录,再进行复制,如果原来就存在、data/docker的话,复制的结果会变成/data/docker/docker。3.将原来的docker文件夹拷贝到新的地方(比如更大的磁盘上,假设是/data分区)其中,apr表示用户当前所在的用户组,user表示用户账户名称。
2024-04-18 21:23:26
518
1
原创 【Ubuntu】安装企业微信(Wine)
企业微信是腾讯微信团队打造的企业通讯与办公工具,具有与微信一致的沟通体验,丰富的OA应用,和连接微信生态的能力,可帮助企业连接内部、连接生态伙伴、连接消费者。专业协作、安全管理、人即服务。企业微信(wine)包下载地址:http://archive.ubuntukylin.com/software/pool/partner/wxwork_1.0_amd64.deb。【Ubuntu】安装企业微信(Wine)2)下载企业微信(wine)包。1)下载Wine环境包。
2024-04-09 17:13:54
1060
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人