自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 boost共享内存使用(3)managed_shared_memory共享内存分配器

Boost.Interprocess提供了一些基本的类来创建共享内存对象和文件映射,并将这些可映射的类映射到进程的地址空间中。然而,管理这些内存段对于非平凡的任务来说并不容易。一个映射区域是一个固定长度的内存缓冲区,动态创建和销毁任何类型的对象需要大量的工作,因为这将需要编写一个内存管理算法来分配该段的部分。许多情况下,我们还希望将名称与在共享内存中创建的对象关联起来,以便所有进程都可以使用名称找到该对象。

2024-04-06 21:12:05 1392

原创 boost共享内存使用(1)认识shared_memory_object和mapped_region

shared_memory_object类是boost库中用于创建和管理共享内存对象的类。它提供了一种在多个进程之间共享数据的方法,允许这些进程共享同一块内存区域。主要作用包括:创建共享内存对象:可以使用shared_memory_object类来创建一个新的共享内存对象。通过指定名称、大小和访问权限等参数,可以创建一个新的共享内存区域。打开现有的共享内存对象:如果共享内存对象已经存在,可以使用shared_memory_object类来打开它。通过指定名称和访问权限等参数,可以打开现有的共享内存区域。

2024-04-06 17:37:55 1089

原创 拿到一个python包,setup.cfg文件如何使用

在Python项目中,setup.cfg文件通常用于配置项目的元数据和依赖项。它是一种类似于INI文件的格式,包含了项目的相关信息,如名称、版本、作者等。同时,setup.cfg文件也可以用来定义项目的依赖项。[metadata][options]requestsnumpypandas在上面的示例中,metadata部分包含了项目的名称和版本信息。options部分定义了项目的依赖项,其中install_requires字段指定了项目所需的依赖包。

2024-03-16 11:33:30 1989

原创 ubuntu个人系统软件安装配置备忘

【代码】ubuntu个人系统软件安装配置备忘。

2024-03-02 22:34:09 549

原创 编译链接实战(25)ThreadSanitizer检测线程安全

ThreadSanitizer(又称为TSan)是一个用于C/C++的数据竞争检测器。在并发系统中,数据竞争是最常见且最难调试的错误类型之一。当两个线程并发访问同一个变量,并且至少有一个访问是写操作时,就会发生数据竞争。C++11标准正式将数据竞争定义为未定义行为。更多例子见https://github.com/google/sanitizers/wiki/ThreadSanitizerPopularDataRaces。

2024-03-02 22:15:38 627

原创 编译链接实战(25)gcc ASAN、MSAN检测内存越界、泄露、使用未初始化内存等内存相关错误

fsanitize=address是一个编译器选项,用于启用AddressSanitizer(地址清理器),这是一种快速的内存错误检测工具。它可以检测出程序中的两种常见错误:越界访问(out-of-bounds accesses)和使用后释放(use-after-free)错误。当你在编译程序时使用这个选项,编译器会插入额外的代码来检查每次内存访问是否合法,以便发现潜在的内存错误。

2024-03-02 16:20:59 389

转载 编译链接实战(24)禁用临时对象消除优化-fno-elide-constructors

后来经过查找发现是因为g++编译器实现省略创建一个只是为了初始化另一个同类型对象的临时对象。指定这个参数(-fno-elide-constructors)将关闭这种优化,强制g++在所有情况下调用拷贝构造函数。在fun函数中会返回一个class A的对象,那么编译器会在栈上构造一个临时对象,构造临时对象的方法则是调用拷贝构造函数。3.如果函数返回值是类对象,函数执行完成返回调用时。那么加上这个参数重新编译试试,运行结果如下。1.当用类一个对象去初始化另一个对象时。道理很简单,我写了个很简单的例子。

2024-03-02 10:52:27 105

原创 编译链接实战(22)C/C++代码覆盖率统计报告生成

gcov是一个测试代码覆盖率的工具,它是 gcc 自带的查看代码覆盖率的工具。使用效果如下图所示:程序运行完成后,可以查看每个文件的代码覆盖率情况,上面报告中展示了每个文件的行覆盖率,函数覆盖率和分支覆盖率。打开一个文件的覆盖率报告,页面对开始有文件的基本信息描述,以 FreeRTOS 的 task.c 为例,它的有效代码行数为 921 行,共 24 个函数(几千行的文件其实也没多少嘛~)蓝色表示运行被覆盖的代码,前面的数字表示代码执行次数。红色表示未执行代码。

2024-03-02 00:06:27 1619

转载 内核解读之内存管理(13)逆向映射

数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希望能对逆向映射有更加深入的理解。

2024-02-29 23:59:36 446

转载 内核解读之内存管理(8)什么是page cache

文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。由于读写硬盘的速度比读写内存要慢很多(DDR4 内存读写速度是机械硬盘500倍,是固态硬盘的200倍),所以为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用 页缓存(Page Cache) 机制来对文件中的数据进行缓存,即将文件中的数据缓存到page中,这些page就叫page cache。

2024-02-24 22:22:17 1515

原创 内核解读之内存管理(6)address_space建立文件索引结点inode和页page、虚拟地址空间vma的映射

file结构体和inode结构体中都有一个address_space结构体指针,实际上,file->f_mapping是从对应inode->i_mapping而来,inode->i_mapping->a_ops是由对应的文件系统类型在生成这个inode时赋予的。它是代表某个地址空间吗?实际上不是的,它是用于建立文件结点(struct inode)到内存页面(struct page)的映射,其实就是每个file都有这么一个结构,将文件系统中这个file对应的数据与这个file对应的内存绑定到一起;

2024-02-24 14:16:33 658

转载 Linux文件系统原理分析(2)inode索引节点

假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。

2024-02-18 17:06:31 349

原创 mmap映射文件使用示例

mmap 零拷贝技术可以应用于很多场景,其中一个典型的应用场景是网络文件传输。假设我们需要将一个大文件传输到远程服务器上。在传统的方式下,我们可能需要将文件内容读入内存,然后再将数据从内存复制到网络协议栈中,最终发送到远程服务器。这个过程中,涉及到了多次数据拷贝操作,增加了 CPU 的开销,降低了传输效率。而使用 mmap 零拷贝技术,则可以将文件映射到内存中,然后直接将内存中的数据传输到网络协议栈中,避免了数据在内核和应用程序之间的复制,从而提高了传输效率。

2024-02-18 15:29:16 1140

原创 嵌入式架构师成长之路--架构设计

而我之所以推崇多进程的原因就是,多进程能从物理上隔绝了这种“方便”的通讯方式,导致在想实现一个模块交互时,会多思考下这个交互是必要的吗,如果是必要的,则会进一步思考接口定义是否简单明了(因为进程间的通讯相对会麻烦些,开发人员会本能减少交互,明确接口的想法去仔细考虑接口,协议的定义,否则折腾的是自己了),这如同人生,如果一直顺风顺水,人们可能不会想太多,思考太多,而如果道路上有些坎坷,则会有另一种感悟吧。而如果采用多进程的模型,好吧,你的服务进程挂了,你自己找原因吧,没什么可争辩的了。

2024-02-18 15:08:14 996

转载 内核解读之文件系统(3)文件IO原理剖析(read/write、mmap)

转发自:https://zhuanlan.zhihu.com/p/442771856。

2024-02-18 14:10:33 194 1

原创 计算机科学导论(4)DMA传输原理

DMA(Direct Memory Access)直接内存访问是一种允许某些硬件子系统在不通过中央处理单元(CPU)的情况下,直接从内存读取或向内存写入数据的技术。这种方式可以显著提高数据传输的效率,减轻CPU的负担,使CPU能够同时处理其他计算任务。DMA广泛应用于需要高速数据传输的场景,如硬盘驱动器、固态驱动器、网络卡、声卡等外围设备与内存之间的数据传输。总之,DMA是一种有效提高数据传输效率、减轻CPU负担的关键技术,对于现代计算机系统的高性能运行至关重要。

2024-02-07 00:56:08 1125

原创 计算机科学导论(5)一文读懂RAM、ROM、SRAM、DRAM、SDRAM等内存概念

SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机访问存储器)是一种动态随机访问存储器(DRAM),它与传统的DRAM相比,最大的特点在于“同步”二字。RAM的特点是易失性的,也就是说,当电源关闭时,存储在RAM中的数据会丢失。RAM(Random Access Memory,随机访问存储器)和ROM(Read-Only Memory,只读存储器)是计算机系统中两种基本的存储技术,它们在功能和用途上有显著的不同。

2024-02-06 19:39:07 1512

原创 计算机科学导论(2)计算机如何存储音频

这一过程涉及到声音的采集、模拟到数字的转换(A/D转换)、编码和最终存储。:量化是指将采样点的幅度值转换为有限的数字范围内的一个值。这个过程涉及到位深度(Bit Depth)的概念,它决定了可以表示的幅度级别的数量。最后,经过编码和压缩的音频数据可以存储在各种数字存储介质上,如硬盘、固态驱动器(SSD)、光盘或云存储服务中。量化的过程会损失一定的精度,量化的精度等于相邻两个整数所表示的实数的差值(标准),如果两个实数之间的差距小于这个差值,他们便会被量化为同一个整数。顾名思义,振幅表示振动的幅度。

2024-02-03 22:40:57 587

原创 计算机科学导论(0)冯诺依曼体系结构

冯诺依曼体系结构(Von Neumann architecture),也称为普林斯顿体系结构(Princeton architecture),是一种计算机架构理论,由匈牙利数学家和物理学家约翰·冯·诺依曼(John von Neumann)在1945年提出。这一体系结构是现代计算机设计的基础,其核心思想是将程序指令和数据存储在同一个读写内存中,使计算机能够按照存储的指令顺序自动执行操作。存储器是用来存放数据和程序的。算术逻辑单元主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中。

2024-02-03 14:31:30 468

转载 面向对象设计与分析(40)敏捷开发流程之Scrum:3大工件、3个角色、5个会议、12原则

Scrum是一个用于开发和维护复杂产品的框架,是一个增量的、迭代的开发过程,目的是让开发人员像打橄榄球一样迅猛并充满激情,通过团队合作,提高工作效率。通过团队间的有效交互,为企业创造价值。

2024-01-28 19:23:40 684

转载 面向对象设计与分析40讲(39)软件开发管理工具kanban

Kanban是一种流行的框架,用于实施和软件开发。它需要实时沟通的能力和完全透明的工作。工作内容在Kanban Board上直观地表示,允许团队成员随时查看每项工作的状态。Kanban在当今的敏捷和DevOps软件团队中非常重要,但Kanban的工作方法可以追溯到几十年前。在1940年代后期,丰田开始根据超市用来存放货架的相同模型优化其工程流程。让超市库存的产品刚好能满足消费者的需求,这种做法优化了超市和消费者之间的物流。

2024-01-28 19:10:09 79

原创 面向对象设计与分析40讲(38)软件生命周期模型之原型模型

软件设计人员根据前期的需求分析,进行软件系统框架的搭建,根据用户的业务需求,开发初始的原型系统,原型系统应具备基本的业务需要,针对用户的基本业务,原型系统上都要体现出来,在搭建原型系统时,还要考虑后续原型系统功能的拓展性,为后续的软件功能更改做好准备。基本的思想是——在限定的时间内,用最经济的方法开发出一个可实际运行的系统模型,用户在运行使用整个原型的基础上,通过对其评价,提出改进意见,对原型进行修改,评价过程反复进行,使原型逐步完善,直到完全满足用户的需求为止。这有助于减少开发周期,提高开发效率。

2024-01-28 16:55:12 414

原创 面向对象设计与分析40讲(34)软件生命周期模型

软件生命周期模型是指在软件开发过程中,按照一定的阶段和活动划分,描述了软件从概念到废弃的全过程。它是一种组织和管理软件开发活动的框架,用于指导开发团队在不同阶段进行需求分析、设计、编码、测试和维护等工作。常见的软件生命周期模型包括以下几种:瀑布模型:瀑布模型是最经典的软件生命周期模型之一。它将软件开发过程划分为线性的阶段,包括需求分析、设计、编码、测试和维护等。每个阶段依次完成,前一个阶段完成后才能进入下一个阶段。原型模型:原型模型注重通过创建和演示可用的软件原型来验证需求和设计。它采用快速迭代的方式,通过

2024-01-28 15:11:38 312

原创 面向对象设计与分析40讲(37)软件生命周期模型之螺旋模型

螺旋模型中,发布的第一个模型甚至可能是没有任何产出的,可能仅仅是纸上谈兵的一个目标,但是随着一次次的交付,每一个版本都会朝着固定的目标迈进,最终得到一个更加完善的版本。成本高:由于螺旋模型的复杂性,以及迭代周期中需要进行的多个活动和任务,它往往需要更多的人力、物力和时间投入,导致整个开发过程的成本增加。灵活性和可定制性:螺旋模型允许根据项目的特点和需求进行定制,可以根据具体情况选择合适的活动和任务,并调整迭代周期的长度和数量。难以预测:由于螺旋模型的不确定性和复杂性,开发进度和成本难以准确预测。

2024-01-28 00:09:29 516

原创 Ubuntu(x86、arm)22.04配置清华源

地址:https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/上面有个下拉列表,根据自己的ubuntu版本进行切换。

2024-01-24 10:05:18 2062

原创 grpcui安装使用

官网地址:https://github.com/fullstorydev/grpcui。

2024-01-23 14:14:20 432

转载 编译链接实战(21)链接过程的符号冲突问题

在解析引用的过程中,最常发生的问题就是符号重定义。当链接器将目标文件或静态库同时链接到最终的二进制文件时,是不能出现重复符号的,否则会导致链接失败,即对于静态链接,重复符号是零容忍的。但对于动态链接,链接器却采取了容忍的策略。在Linux下编译动态库的时候,所有的符号默认都是导出的,也就是动态库中的函数名,类名等,在外部都是可见的。当程序引用多个动态库时,由于各个动态库可能属于不同的团队来开发,不同团队使用相同的第三方库的可能性也是有的(例如openssl,libcurl,cjson等),

2024-01-21 20:31:08 143

转载 编译链接实战(20)链接究竟做了哪些事

为了更好地理解计算机程序的编译和链接的过程, 我们先简单回顾下计算机程序开发的历史。计算机的程序开发并非从一开始就有着这么复杂的自动化编译、 链接过程。原始的链接概念远在高级程序语言发明之前就已经存在了, 在最开始的时候, 程序员(当时程序员的概念应该跟现在相差很大了) 先把一个程序在纸上写好, 当然当时没有很高级的语言, 用的都是机器语言, 甚至连汇编语言都没有。当程序须要被运行时, 程序员人工将他写的程序写入到存储设备上, 最原始的存储设备之一就是纸带, 即在纸带上打相应的孔。

2024-01-21 14:06:25 97

原创 面向对象设计与分析40讲(36)软件开发过程模型之增量模型

增量模型强调将整个项目划分为多个增量或阶段,并在每个增量中逐步构建和交付系统的功能。开发和测试:在每个增量中,开发团队按照预定的优先级顺序进行功能开发和测试。集成和验证:在每个增量完成开发和测试后,将其集成到已有的系统中,并进行验证和测试以确保新功能与现有系统的兼容性和稳定性。迭代开发:在每个增量的评审和反馈后,开发团队可以根据客户的需求和反馈进行调整和修改,并继续下一个增量的开发和交付。反馈和调整:每个增量的交付和评审提供了反馈机制,使开发团队能够及时调整和改进系统,以满足客户的需求和期望。

2024-01-07 20:20:55 449

原创 面向对象设计与分析40讲(35)软件生命周期模型之瀑布模型

瀑布模型是一种软件开发过程模型,它将软件开发过程划分为一系列阶段,并且每个阶段必须按照顺序完成,前一个阶段完成后才能进入下一个阶段,形如瀑布流水,最终得到软件产品。这些阶段通常包括需求分析、设计、编码、测试和维护等。在瀑布模型中,每个阶段都有明确的输入和输出,而且每个阶段的输出成为下一个阶段的输入。

2024-01-06 01:06:03 1010

原创 面向对象设计与分析40讲(17)双重检查锁定(double-checked locking)范式

双重检查锁定(也称为“双重检查锁定优化”)是一种用于减少获取锁的开销的软件设计模式。它通过在获取锁之前测试锁定条件(即“锁提示”)来实现。只有在锁定条件检查表明需要锁定时才会进行锁定操作。即假设A、B两个线程同时运行与A、B点,B的release操作对线程A可见。同时p = new Singleton()的读写操作不会被重排到B点之后。

2023-12-24 22:53:23 563

原创 面向对象设计与分析40讲(16)静态工厂方法模式

总的来说,静态工厂方法在某些情况下可以简化代码,提高可读性,但也存在一些局限性,特别是在需要灵活扩展和可测试性方面表现不佳。在实际应用中,需要根据具体的场景和需求来选择是否使用静态工厂方法。前面我们介绍了简单工厂模式,在创建对象前,我们需要先创建工厂,然后再通过工厂去创建产品。静态工厂方法还可以直接集成到类中,简称self create。

2023-12-24 22:12:48 407

原创 面向对象设计与分析40讲(15)简单工厂方法模式

简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对象实例。产品抽象类(Product Interface):定义了被创建产品的接口具体产品类(Concrete Products):实现了产品接口的具体类,由工厂类根据客户需要创建并返回给客户端。

2023-12-23 23:14:59 623

原创 面向对象设计与分析40讲(28)单例模式的奇异递归模板CRTP实现

首先Singleton的构造是protected的,因为Singleton本身只是个帮助类,并没有单独实例化的需要,但是子类需要实例化,所以需要protected子类才可以访问。在这里基类的析构函数可以不需要 virtual ,因为子类在应用中只会用 Derived 类型,保证了析构时和构造时的类型一致。该模式的思想是,通过模板类的静态成员变量来确保一个类只有一个实例,并且可以通过静态函数来获取该实例。奇异递归模板是指父类是个模板类,模板类型是子类类型,即父类通过模板参数可以知道子类的类型。

2023-12-17 23:40:54 741

原创 面向对象设计与分析40讲(27)奇异递归模板确实奇异

CRTP 的基本思想是将派生类作为模板参数传递给基类,使得基类可以通过继承关系获取派生类的类型信息,并以此来实现一些静态多态的特性。但是在 CRTP 中,模板类的参数已经确定了其派生类的类型,因此在编译期间就已经确定了转换的正确性。来进行运行时类型检查,以确保转换的正确性。因为在普通的继承中,一个基类指针指向的对象可能是派生类的对象,也可能是其他类的对象,我们需要在运行时进行类型检查,以确保转换的正确性。然而,CRTP 也有一些限制,如需要在派生类中显式地调用基类的函数,对继承关系有一定的限制等。

2023-12-17 16:38:07 408

原创 机械硬盘和固态硬盘速度测试

利用ubuntu自带的disk磁盘管理软件对手头的三个硬盘做压力测试,第一个是致态的1T固态硬盘,速度1.8GB/S。ST机械硬盘,速度只有300多MB/S.三星固态硬盘,速度1.4GB/s。

2023-12-17 14:35:36 526

原创 面向对象设计与分析40讲(13)单例模式懒汉模式和饿汉模式--全局资源入口点

C++规定,non-local static 对象的初始化发生在main函数执行之前,也即main函数之前的单线程启动阶段,所以不存在线程安全问题。但C++没有规定多个non-local static 对象的初始化顺序,尤其是来自多个编译单元的non-local static对象,他们的初始化顺序是随机的。C++11规定,在一个线程开始local static 对象的初始化后到完成初始化前,其他线程执行到这个local static对象的初始化语句就会等待,直到该local static 对象初始化完成。

2023-12-17 14:01:56 933

原创 面向对象设计与分析40讲(26)C++ PIMPL 模式详解

在使用 Pimpl 模式时,我们只需要在头文件中包含一个指向实现类的指针,而不需要包含实现类的定义。这种方式的实现原理是,由于头文件中只包含了实现类的前向声明,因此编译器在编译头文件时并不需要知道实现类的具体定义。Pimpl是C++中一种设计模式,全称为Pointer to Implementation,它可以用于隐藏类的实现细节,从而实现封装和减少编译依赖的效果。这样一来,外部代码只需要包含“接口”类的头文件,而不需要访问实现的详细信息,从而实现了信息隐藏的效果。这种方式的实现背后涉及到了一些编译原理。

2023-12-16 20:05:14 894

原创 面向对象设计与分析40讲(24)上下文context在软件设计中的应用--依赖注入的典型应用

而实际上,考虑到代码可测性,一个重要的概念就是,依赖是可以被替换的,而单例模式就是难以替换,因此将依赖封装到context里去,就是一种实现技巧。它在不同的领域中具有不同的含义和用法,但都起到了关键的作用,提供了必要的背景和条件,以便进行适当的决策和操作。在 gRPC 的 C++ 中,ServerContext 类提供了许多有用的信息和功能,可以在服务器端访问和控制 RPC 请求。这是一个非常简单的示例,实际上,在实际开发中,上下文(Context)可能包含更多的属性和方法,以支持特定的场景和需求。

2023-12-16 01:35:02 996

原创 面向对象设计与分析40讲(22)罪恶的单例模式?

虽然单例可能仍然具有有效的用例,比如管理对共享资源的访问或提供集中化配置,但重要的是要考虑上述的缺点,并探索替代的设计模式,比如依赖注入、工厂模式,或者使用能够简化对象创建和生命周期管理的框架。如果希望引入新的功能或行为,就需要修改原有的单例类,可能导致代码的复杂性增加。代码库中的任何部分都可以访问和修改单例实例,可能导致潜在的依赖和耦合问题。依赖注入:单例可能会阻碍依赖注入,因为它们创建自己的实例而不依赖于外部传入的依赖项。的一种,它限制了一个类的实例化只能为一个实例,并提供对该实例的。

2023-12-12 00:11:00 560

AOA Linux实现 ,含TCP转发

AOA Linux实现 ,含TCP转发

2022-03-17

HI3519AV100最新SDK smaple

海思最新SDK 程序 版本V2.0.1.0 最新

2019-03-29

v4l2读取摄像头

v4l2读取摄像头,能在linux下编译,生成yuv文件,可以指定文件帧数

2018-01-30

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

TA关注的人

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