自定义博客皮肤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)
  • 收藏
  • 关注

原创 dlopen介绍和原理

动态库热加载指的是在程序运行时,动态地加载动态库,从而达到不停止程序的情况下,更新程序的功能。C++ 程序在运行时有两种方式加载动态连接库:隐式链接和显式链接。使用动态链接可以解决静态链接带来的可执行文件过大的问题(每次都要将静态库编译进可执行二进制文件)、解决版本不兼容问题、减少内存的使用(仅在必要时加载动态库,有点懒加载的味道)。dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程用以获取函数地址或者全局变量地址。使用dlclose()来卸载打开的库。

2024-06-22 22:42:54 374 1

原创 phmap 学习和思考

Closed hashing:也称为开放寻址(open addressing),是 hashmap 的一种实现方式,在这种方法中,所有元素都直接存储在 hashmap 的数组里。当发生hash碰撞时,按照某种方法在 hashmap 的底层数组中寻找另一个空槽位,这个过程称为探测。

2024-06-22 22:30:56 1297

原创 atomic包装自定义类型

在学习原子变量之初,学过很多它的操作,但是很多都是在内置类型(int、long等)上进行的学习和实验。这次由于工作需要,要使用atomic来包装自定义类型,因此打算好好探究一番,把它彻底搞懂。当要使用atomic包装自定义类型的时候首先肯定会产生疑问——C++是否支持这样使用?于是乎,去 cppreference 上搜了一下(C++17版本、其他的版本也支持),发现允许使用atomic包装平凡拷贝()的自定义类型。这时候又会有一个疑惑什么是平凡拷贝?如何确定自己定义的类型是不是平凡拷贝的?

2024-05-24 15:26:41 877

原创 硬件资源监控

top 程序提供了运行系统的动态实时视图。它可以显示系统摘要信息以及当前由 Linux 内核管理的进程或线程列表。显示的系统摘要信息的类型以及进程显示得信息的类型、顺序和大小都是用户可配置的,并且该配置可以在重新启动时持久化。该程序还提供了一个有限的交互界面,方便用户操作。关于 load average 项一共有三个数,分别表示1/5/15分钟CPU平均负载,分别为 8%、7%,2%。zombie表示系统中僵尸进程的数量。

2024-04-22 14:15:42 1087

原创 现代C++新特性——constexpr

在计算机科学中,字面量(literal)是在源代码中的 value 的文本表示。字面量和变量、常量是同一个级别的概念,常被用于初始化变量。字面量是编译期常量,效率极高。常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然字面量属于常量表达式,用常量表达式初始化的const 对象也是常量表达式。——C++ primer 5th(中文)59页。从上面的的这些概念来看常量表达式的出现将一些计算放在编译期进行,从而提高了程序的运行效率。

2024-04-22 14:03:14 1073

原创 网络编程——select、poll、epoll 的比较

查看某个端口是否被进程占用。

2024-04-21 15:37:25 586

原创 C++多线程系列——分析&手写C++线程池

在计算机编程中,线程池是一种为了让程序可以并发执行的软件设计模式,也叫作 replicated worker 或者 worker-crew model(为什么都带有worker呢?我觉得是因为可以线程池并不生产任务,只是执行任务,是卑微的打工人)。线程池中维护了多个等待 task 的线程,并且有一个保存待执行 task 的 task queue(复杂的线程池实现还会有 completed taskqueue),当 task 被线程池的使用者分配并加入到 task queue 时,等待的线程会执行这些任务。

2024-04-21 15:21:29 756

原创 25届腾讯 C++ 实习面经

一面自我介绍C++ 中 static 关键字的作用说一下自旋锁是什么以及优点和缺点(不让出 CPU 资源)程序崩溃该怎么排查(gdb)程序运行慢、CPU占用高该怎么排查(perf+火焰图)什么时候可以去实习手撕,树的层序遍历(从底向上)手撕,求数组中重复的数二面自我介绍std::bind、std::packaged_task、std::future 怎么用的原子变量、内存序、缓存一致性协议协程、线程、进程的联系与区别,协程的优势epoll、select的区别一百万亿个数据

2024-04-18 21:33:09 174

原创 C++多线程系列——std::future | std::promise

在 C++ 11 之前,想要从线程返回执行任务的结果,可以通过指针来完成。可以看到,要通过指针来传递结果,在操作上比较复杂需要涉及到mutex,且逻辑上没有那么舒服。因此 C++ 提供了类模板。

2024-04-18 21:23:21 801

原创 pytorch 加载模型权重文件时发现权重多了 module

最近在复现论文的时候发现,某些官方提供的权重文件的 key 会多一个 module 前缀,造成模型加载失败的问题。解决的方案有很多,比如遍历权重文件的每一个 item 手动去掉 "module."前缀。但是这样子比较麻烦。深究其原因发现是训练时使用多GPU训练导致的,因此我们在加载权重文件时,也是用官方提供的多 gpu 训练的包装器包装一下就好了。添加如下代码即可,最简单得解决这个问题。

2024-03-06 10:58:24 472

原创 C++多线程序列——理解 memory barrier

在了解 memory barrier 之前需要先了解 CPU 存储级别,缓存一致性协议,内存屏障这些概念。

2024-01-16 11:24:42 1548

原创 C++ 中的继承

在面向对象程序设计中,继承是将一个对象或类基于另一个对象(基于原型的继承)或类(基于类的继承)的机制,保留类似的实现。也定义为从现有类(如超类或基类)派生新类(子类) ,然后将它们形成类的层次结构。在大多数基于类的面向对象语言中,如 C++ ,一个通过继承创建的类(子类),获得了“父类”的所有属性和行为,除了: 构造函数,析构函数,重载操作符和基类的友元函数。继承允许程序员在现有类的基础上创建类,在维护相同行为(实现接口)的同时指定新的实现,重用代码,并通过公共类和接口独立地扩展原始软件。通过继承的对象或类

2024-01-10 16:56:26 349

原创 了解 io_uring

io_uring 是 Linux 内核的系统调用,用于磁盘的异步 IO 操作,它的出现是为了解决相同功能的同步的系统调用存在的性能问题。其是由 Meta 的 Jens Axboe开发的,目前仍然在开发和完善。

2024-01-10 16:43:54 890

原创 C++多线程系列——基本概念&使用

在 C++ 中,我们可以通过构造 std::mutex (mutual exclusion)的实例来创建互斥,调用成员函数 lock() 对其加锁,调用 unlock() 解锁。但是不推荐直接调用成员函数的做法,因为这样做,那我们就必须在该函数的每条路径上都调用 unlock(),包括异常导致退出的路径。取而代之,C++标准库提供了类模板 std::lock_guard,针对互斥类融合RAII手法:在构造的时候给互斥加锁,在析构时进行解锁,从而保证互斥总被正确解锁。

2024-01-08 22:52:39 1611

原创 对协程的理解

和协程关系比较密切的是 subroutine(它是特殊的 coroutine)。subroutine 其实就是一般的函数调用过程,其不可主动挂起、不可被恢复、不能保存中间状态,且控制流只能进入一次、退出一次,一旦退出相关的变量都会被释放。协程的本质思想是控制流的主动让出和恢复机制。在现代语言里,可以实现协程思想的方法很多,这些实现间并无高下之分,所区别的就是是否适合应用场景。理解这一点,我们对于各种协程的分类,如半对称/对称协程,有栈与无栈协程等具体实现就能提纲挈领,无需在实现细节上纠结。

2024-01-08 22:40:36 956

原创 安装 netmap

netmap是作为Linux的一个内核模块存在的,安装netmap需要我们拿到netmap的源代码(不需要获取所有的linux代码,只需要linux头文件就可以了)并结合Linux内核源代码进行编译。

2024-01-07 14:41:17 545

原创 TCP是流式的?

而且更觉的是 TCP 的有序性保证了,只要一直先 read 直到分隔符,然后再读取 len 个字节,然后再 read 直到分隔符以此循环,就可以很简单得实现 TCP 上的 HTTP 协议了,当然 HTTP 1.1 以上的版本因为存在 stream 的关系并不能如此简单得处理。上面的例子也演示了数据在对端将怎样被接收到。其实关于TCP是流式的,和在创建 socket 的时候用的宏的名称是 SOCK_STREAM 一直存在有疑问,为什么说它是流式的,该怎么解释呢?TCP 是基于无限长的连续流的概念建模的。

2024-01-07 11:20:42 382

原创 ubuntu 常用软件在线和离线安装

docker 19.03 以前的版本使用 gpu 都需要下载 nvidia-docker1 或者 nvidia-docker2 来启动容器,docker 19.03 及以后的版本,虽然不需要安装 nvidia-docker1 或者 nvidia-docker2,但是仍然需要安装 nvidia-container-toolkit,否则还是无法使用 gpu。两者的主要区别在于 nvidia-docker2 是一个单独的后端,而 nvidia-container-toolkit 是一个容器管理系统的工具。

2023-08-30 11:47:38 688

原创 解决项目依赖 ffmpeg 出现 relocation R_X86_64_PC32 against symbol `ff_pw_9‘的问题

依赖ffmpeg的问题

2023-03-01 20:03:02 518

原创 spring boot自动装配功能的实现

1. 在启动类上使用@EnableAutoConfiguration注解,激活spring boot的自动化配置@EnableAutoConfigurationpublic class AutoConfigBoot { public static void main(String[] args) { ConfigurableApplicationContext context = new SpringApplicationBuilder(AutoConfigBoot.class)

2022-01-23 13:07:22 497

原创 wiremock最基本的使用

下载wiremock的jar包进入wiremock的官网,下载wiremock的jar包。本地利用java -jar命令运行java -jar wiremock-jre8-standalone-2.32.0.jar出现以上字样即为运行成功。(不要关闭这个cmd窗口,否则会关闭这个服务)编写相关的java程序来这配置这个wiremock服务器简单说一下wiremock的原理:刚刚运行的jar包wiremock服务器,看命令行信息可以发现,该服务器运行在8080端口。然后此时你用浏览器去访问“

2022-01-22 13:56:42 1523

原创 centos7下载,安装和启动redis6.05

首先进入redis的官网:https://redis.io/。然后进入到:https://redis.io/download页面,滚轮往下滑,可以看到官方的安装教程:那么我们就跟着官方教程一步一步来吧!提示未找到命令,嗷,我是还没有这个命令呀!于是我安装一下wget:那我再来执行上面那条指令,然后通过“ll”命令查看可以发现已经下载好了:解压缩下载的redis-6.0.5.tar.gz的文件夹:进入redis-6.0.5文件夹:编译一下:发现报错了:这是因为redis6.0

2020-06-22 15:49:20 808

原创 趣玩策略模式(Java讲解)

策略模式(Strategy Pattern):定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。既然标题是 “趣玩” ,那么就要体现 “趣” 字和 “玩” 字。假设现在你是个开发游戏的小白,主创团队给了你一个项目,要求你开发一个玩家solo类型的游戏。大致思路如下:玩家每一回合可以选择一个角色(角色包括king国王,knight骑士,queen女王,troll穴居巨怪)进行游戏,游戏过程中,玩家可以切换武器(axe斧头,bowandarrow弓箭,sword宝剑,

2020-06-17 16:49:51 937

空空如也

空空如也

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

TA关注的人

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