- 博客(309)
- 资源 (1)
- 收藏
- 关注
原创 动态库/静态库文件中检查是否存在指定的函数实现
动态库/静态库文件中检查是否存在指定的函数实现1. 使用 `nm` 工具2. 使用 `objdump` 工具3. 使用 `readelf` 工具(仅适用于ELF格式)
2024-04-09 18:51:48 822
原创 linux进程退出之exit与_exit
调用_exit()函数会使程序立即退出,不会进行任何清理操作。用户调用_exit函数,本质上是调用exit_group系统调用。
2024-03-30 17:45:39 870
原创 设计模式:桥接模式
桥接模式适用于需要将抽象和实现分离、有多个维度的变化、需要建立稳定关联关系和实现多态性的场景。它可以提高系统的灵活性、可扩展性和可维护性。
2024-01-07 00:38:22 1281 1
原创 设置模式:适配器模式
适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者一组方法的集合。适配器模式将现有接口转化为客户类所期望的接口,实现了对现有类的复用。
2024-01-06 12:00:48 1223
原创 设计模式:原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有的对象来创建新对象,而无需从头开始编写代码。在这个模式中,我们可以使用已经存在的对象作为“原型”,并通过克隆该原型对象创建一个新的对象,而不是从头开始构建一个新对象。该模式的核心思想是将对象的创建过程与使用过程分离,通过复制已有对象来减少对象的创建过程,从而提高系统的性能和效率。
2024-01-03 13:09:27 862 1
原创 设计模式:简单工厂模式、工厂方法模式、抽象工厂模式
简单工厂模式适用于创建对象较少且变化不频繁的情况,工厂方法模式适用于创建对象较多且需要灵活扩展的情况,而抽象工厂模式适用于创建一组相关对象的情况。所有的工厂模式都强调一点:两个类A和B之间的关系应该仅仅是A创建B或是A使用B,而不能两种关系都有。将对象的创建和使用分离,也使得系统更加符合单一职责原则,有利于对功能的复用和系统的维护。此外,将对象的创建和使用分离还有一个好处:防止用来实例化一个类的数据和代码在多个类中到处都是,可以将有关创建的知识搬移到一个工厂类中。
2024-01-02 22:18:12 1189
原创 设计模式:单例模式(使用c++分别实现饿汉式单例、带双重检查锁定机制的懒汉式单例以及IoDH技术的单例)
设计模式:单例模式(使用c++分别实现饿汉式单例、带双重检查锁定机制的懒汉式单例以及IoDH技术的单例)
2023-12-25 00:29:35 651
原创 UML类图与类关系
1. 类图2. 类关系2.1. 关联关系2.1.1. 双向关联2.1.2. 单向关联2.1.3. 自关联2.1.4. 多重性关联2.1.5. 聚合关系2.1.6. 组合关系2.2. 依赖关系2.3. 依赖关系,也称继承关系2.4. 接口与实现关系
2023-12-24 20:20:08 428
原创 ARM 内存屏障指令
如果是针对数据访问的屏障,可以使用 DMB 指令,根据共享性选择相应的屏障类型。需要注意的是,WFE 指令只是将处理器置于等待状态,具体的事件触发和事件处理需要根据具体的应用和系统设计来完成。isb 指令会等待之前的所有指令完成,并清空指令流水线中的缓存,刷新指令预取队列(instruction prefetch queue),以确保执行的指令是最新的版本,可确保后续指令按照正确的顺序执行。根据具体的需求和场景,选择适当的内存屏障指令以确保正确的内存访问顺序和同步。
2023-08-06 18:39:54 1762
原创 linux gcc __attribute__
_attribute__ 是 GCC 编译器提供的一种特殊语法,它可以用于设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
2023-08-06 15:27:52 610
原创 asm:常用语法
1、循环 1.1、使用条件跳转指令实现循环 1.2、使用LOOP指令实现循环 2、字符串 2.1、指定字符串的长度 2.2、字符串指令 2.3、重复前缀 3、数组 4、递归 5、宏 6、文件操作 7、内存管理
2023-08-01 12:57:54 759
原创 Linux内核:系统调用大全(持续更新中)
1. sys_brk()是用于更改进程的堆空间大小。2. dup2用于创建一个新的文件描述符,这个新的文件描述符与指定的旧文件描述符指向同一个文件.
2023-08-01 12:43:03 334
原创 asm:常见指令大全
常见指令大全算数指令INC 指令DEC 指令ADD 指令SUB指令MUL指令IMUL指令DIV指令IDIV指令逻辑指令AND指令OR指令XOR 指令TEST指令NOT指令跳转指令条件跳转指令无条件跳转指令
2023-07-26 12:39:42 926
原创 asm: 指示符
ORG 指示符equ 指示符%define 指示符数据指示符RES'X'系列指示符RESBRESWRESDRESQRESTRESWD'X'系列指示符DBDWDDDQDTTIMES 指示符.text 指示符.data 指示符.bss 指示符.global/.extern 指示符.align 指示符
2023-07-16 11:40:17 309
原创 80x86系列CPU的寄存器大全(带注释)
8086 CPU是一款由英特尔公司推出的16位微处理器,它具有14个寄存器,其中8个通用寄存器、4个段寄存器和2个指针寄存器。80386 CPU是一款由英特尔推出的32位微处理器,相比于8086 CPU,它拥有更多的寄存器。
2023-07-04 19:15:21 1259
原创 Linux内核源码分析-进程调度(六)-PELT(per-entity load tracking)
什么叫负载?per-entity load tracking如何记录负载信息runnable_avg_yN_invdecay_loadstruct sched_avg调度实体se初始化函数是init_entity_runnable_average计算当前负载贡献计算公式代码实现accumulate_sumdecay_load__accumulate_pelt_segments调度实体更新负载贡献就绪队列更新负载贡献per-entity load tracking有什么好处呢?
2023-06-09 00:20:25 1663 2
原创 Linux内核源码分析-进程调度(五)-组调度
系统启动后默认有一个root_task_group,管理系统中最顶层CFS就绪队列cfs_rq(即cpu rq对应的CFS就绪队列)。cfs组进程调度:pick_next_task_fair; 组进程抢占:task_tick_fair调度组的时间分配
2023-05-24 20:58:05 4613 7
原创 Linux内核源码分析-进程调度(四)-进程周期性调度和如何选择下一个运行进程
周期性调度是指Linux周期性地检查当前任务是否耗尽当前进程的时间片,并检查是否应该抢占当前进程。判断一下curr比起红黑树最左边的是否已经运行满一个时间片(这个时间片是指curr进程自身在一个调度周期内可以运行的时间片),满了就回就绪队列等待下一次运行,这样每一个进程都会尽快运行,且权重小的进程更容易被抢占。 if (delta > ideal_runtime)resched_curr(rq_of(cfs_rq)); // 设置抢占flag
2023-05-16 23:59:03 599 4
原创 Linux内核源码分析-进程调度(二)-常用数据结构
但是,每一个调度类并不是直接管理task_struct,管理的是调度实体,从而引入调度实体的概念。CFS调度器的就绪队列,简称cfs就绪队列,管理就绪态的struct sched_entity调度实体,后续可以通过pick_next_task接口从cfs就绪队列中选择最适合运行的调度实体(虚拟时间最小的调度实体)。// 每个CPU都有一个全局的运行队列,它是per-cpu类型,即每个cpu上都会有一个struct rq结构体。rq中包含cfs就绪队列、rt就绪队列、dl就绪队列。
2023-04-26 01:11:57 1082
原创 Linux内核源码分析-进程调度(一)-调度器初识
调度器的主要工作就是选择就绪的进程来执行。目前Linux支持的调度器有五种:stop scheduler、Deadline scheduler、RT scheduler、CFS scheduler、Idle scheduler。从Linux2.6.23开始,Linux引入scheduling class的概念,目的是为了将调度器模块化。这样提高了扩展性,添加一个新的调度器也变得简单起来。调度器的抽象基类为struct sched_class;
2023-04-23 08:34:28 1321
原创 linux信号:SIGINT、SIGKILL、SIGSTOP、SIGCONT
linux信号:SIGINT、SIGKILL、SIGSTOP、SIGCONT
2022-12-13 00:46:19 5257
原创 leetcode192.统计词频
写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。为了简单起见,你可以假设:words.txt只包括小写字母和 ' '。每个单词只由小写字母组成。单词间由一个或多个空格字符分隔。...
2022-08-06 22:34:10 206
原创 leetcode1.两数之和
给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。............
2022-08-03 09:42:43 199
原创 linux:cc与gcc
我们在makefile中总是能看到cc和gcc,其实两者从本质来讲是两个完全不一样的东西,cc是unix系统下的概念(ccompiler),而gcc是linux下的概念(GNUcompilercollection)。但是我们在linux系统中的makefile中能看到大量使用cc,是因为linux为了兼容unix,unix下开发的项目可以直接在linux下进行编译链接,所以使用了软链接,cc->gcc。...
2022-07-17 22:31:16 509
原创 linux:文件操作(open、write/read、lseek、close)
linux:文件操作(open、write/read、lseek、close)
2022-06-28 13:02:57 394
原创 c++11:std::forward,完美转发
目录1、不完美转发2、完美转发2.1、引用折叠2.2、std::forward1、不完美转发所谓完美转发,是指在函数模板中,完全按照模板的参数的类型,将参数传递给函数模板中调用的另一个函数。比如:template <typename T>void IamForwording(T t){ IrunCodeActually(t);}上面的例子中,IamForwarding是一个转发函数模板。而函数IrunCodeActually则是真正执行代码的目
2022-05-15 18:26:38 4794
原创 c++11:std::move,移动语义
功能 将一个左值强制转化为右值引用。需要注意的是,被转化的左值,其生命周期并没有随着左右值得转化而改变(例如,std::move转化后的左值变量lvalue不能被立即析构)/*================================================================* Copyright (C) 2022 baichao All rights reserved.** 文件名称:moveable.cpp* 创 建 者:baichao*..
2022-05-14 21:08:55 339
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人