自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++中使用try-catch为什么会有额外的性能开销

try-catch的性能开销主要来自栈展开、异常处理表的维护和运行时检查。虽然异常处理提供了强大的错误处理能力,但在性能敏感的代码中应谨慎使用,避免滥用异常。对于常见的错误处理,使用返回值或错误码可能是更高效的选择。

2025-03-13 17:17:41 285

原创 c++智能指针

C++ 中的智能指针是一种管理动态内存的工具,能够自动释放内存,避免内存泄漏和悬空指针等问题。C++ 标准库提供了几种智能指针类型,主要包括 、 和 。下面我们将结合代码详细介绍这些智能指针及其适用场景。 是一种独占所有权的智能指针,意味着同一时间只能有一个 指向某个对象。当 被销毁时,它所指向的对象也会被自动删除。适用场景 当你需要一个对象在某个作用域内独占资源时。当你需要确保资源在离开作用域时自动释放时。 是一种共享所有权的智能指针。多个 可以指向同一个对象,并且使用引用计数来管理

2025-03-13 11:02:20 566

原创 kmalloc、vmalloc的区别

kmalloc适合小块、物理连续的内存分配,性能高。vmalloc适合大块、虚拟连续的内存分配,性能较低。

2025-03-11 12:08:56 318

原创 用户态和内核态

特性用户态内核态权限受限权限,只能访问部分资源最高权限,可访问所有资源运行环境运行用户程序运行操作系统内核代码资源访问只能访问用户空间内存可访问整个系统内存和硬件资源安全性程序崩溃不会影响系统内核崩溃会导致系统崩溃切换机制通过系统调用、中断或异常进入内核态完成任务后返回用户态性能影响运行效率较高,但受限于权限运行效率较低,频繁切换导致性能开销典型场景运行应用程序(如浏览器、编辑器)执行操作系统核心功能(如进程调度)用户态:运行应用程序,权限受限,安全性高。内核态。

2025-03-11 11:46:59 871

原创 Linux内核信号处理

信号处理是Linux内核中一个重要的机制,涉及用户态和内核态的交互。通过。

2025-03-11 11:31:29 928 1

原创 中断睡眠(Interruptible Sleep)和不可中断睡眠(Uninterruptible Sleep)

进程在等待某些条件时进入可中断睡眠状态,此时进程可以被信号或事件唤醒。

2025-03-11 11:20:08 733

原创 Android性能优化-进程冻结查杀

在Android系统中,和是两种重要的资源管理机制,分别通过Framework层、Native层和Linux内核的协同工作来实现。下面我们将结合代码,从Framework层到Linux内核,详细介绍这两种机制的实现,并分析它们的区别、系统收益以及为什么能获得这些收益。

2025-03-10 10:15:31 859

原创 详细介绍Linux内核中的cgroup机制

是 Linux 内核中控制组(cgroup)的第二代实现,旨在解决 cgroup v1 的复杂性和局限性。cgroup v2 提供了更统一、更简洁的资源管理模型,支持更精细的资源控制,并逐渐成为 Linux 容器化技术(如 Docker、Kubernetes)的默认资源管理机制。随着 Linux 内核的不断发展,cgroup v2 的功能和性能将进一步增强,成为资源管理的标准解决方案。cgroup v2 采用树形层级结构,每个 cgroup 可以包含子 cgroup,形成一个层次化的资源管理模型。

2025-03-04 11:01:28 807

原创 常见的进程间通信方式

通信方式底层原理特点管道内核缓冲区,单向通信简单,适合有亲缘关系的进程消息队列内核维护的消息链表支持异步通信,消息有边界共享内存多个进程共享同一块内存高效,需要同步机制信号量计数器,用于资源同步主要用于同步,不传输数据信号内核或进程发送的异步通知用于进程控制,不可靠套接字网络或本地通信,基于文件系统或网络协议功能强大,适合本地和网络通信文件通过文件系统读写数据简单,效率低内存映射文件文件映射到内存,直接访问高效,适合大文件RPC。

2025-03-04 10:34:04 924

原创 NUMA架构介绍

NUMA 架构通过将内存分布到多个节点,解决了多处理器系统中的内存访问瓶颈问题,提升了系统的扩展性和性能。其优势主要体现在内存访问延迟的优化、带宽的提升和扩展性的增强。尽管 NUMA 架构在编程和负载均衡方面存在挑战,但在高性能计算、大型数据库和虚拟化环境中,NUMA 架构表现出色。通过操作系统、应用程序和硬件的协同优化,可以充分发挥 NUMA 架构的优势。缓存:高速存储器,用于加速 CPU 对数据的访问。RAM:主内存,用于临时存储运行中的程序和数据。ROM:只读存储器,用于存储固件和永久性数据。

2025-03-04 10:26:26 573

原创 CPU运行一个程序的步骤

CPU运行一个程序的步骤可以概括为取指-解码-执行周期(Fetch-Decode-Execute Cycle)。这个过程是CPU执行指令的核心机制,程序的运行就是通过不断重复这一周期来完成的。以下是详细的步骤分析:在程序运行之前,操作系统需要将程序从磁盘加载到内存中:程序加载:操作系统将程序的代码和数据从磁盘读取到内存的特定区域。初始化程序计数器(PC):操作系统将程序的入口地址(通常是第一条指令的地址)加载到CPU的程序计数器(PC)中。CPU通过不断重复以下步骤来执行程序:读取指令地址:CPU从程序计数

2025-03-03 16:19:15 635

原创 CPU调度的上下文切换(2)

上下文切换是指CPU从一个任务切换到另一个任务时,保存当前任务的状态并加载下一个任务的状态的过程。保存当前任务状态:将当前任务的寄存器、程序计数器、堆栈指针等状态信息保存到内存中。加载下一个任务状态:从内存中加载下一个任务的寄存器、程序计数器、堆栈指针等状态信息。切换到下一个任务:CPU开始执行下一个任务的指令。时间片用完:在分时系统中,当一个任务的时间片用完时,操作系统会调度另一个任务运行。任务阻塞:当一个任务因等待I/O操作或其他资源而阻塞时,操作系统会调度另一个任务运行。高优先级任务就绪。

2025-03-02 12:37:50 805

原创 面试常见问题

静态局部变量:在函数内部声明,生命周期贯穿整个程序,但作用域仅限于函数内部。静态成员变量:属于类本身,所有实例共享,需要在类外定义和初始化。静态成员函数:属于类本身,只能访问静态成员变量和静态成员函数。静态全局变量:作用域仅限于定义它的文件。静态函数:作用域仅限于定义它的文件。类型存储位置生命周期作用域静态局部变量全局/静态存储区程序运行期间函数内部静态成员变量全局/静态存储区程序运行期间类作用域静态全局变量全局/静态存储区程序运行期间文件作用域非静态全局变量。

2025-03-02 12:00:50 886

原创 原子操作和锁的区别

原子操作是指一个不可分割的操作,要么全部执行成功,要么全部不执行,不会出现中间状态。

2025-02-26 11:10:13 1032

原创 Perfetto 和 Systrace 的差异

Perfetto 在数据源支持、配置灵活性、分析功能、工具生态、跨平台能力、文件性能、功耗和内存分析等方面全面领先于 Systrace。对于需要深入分析复杂性能问题的开发者来说,Perfetto 是更强大、更现代化的选择。而 Systrace 则适合快速、简单的性能分析场景。随着 Android 生态的发展,Perfetto 正在逐渐取代 Systrace 成为主流的性能分析工具。

2025-02-25 17:05:22 427

原创 常见锁类型介绍

Mutex:适用于锁持有时间较长的场景,确保独占访问。RW Lock:适用于读多写少的场景,提高读操作的并发性。Futex:适用于需要高效同步的场景,减少系统调用开销。自旋锁:适用于锁持有时间非常短的场景,减少线程切换开销。

2025-02-25 16:53:32 504

原创 task_struct、task_group 和 sched_domain的关系

是描述单个任务(进程或线程)的核心结构体,调度器通过它来管理任务的调度行为。:指向调度类(如 用于 CFS)。:,用于 CFS 调度实体。:调度策略(如 、)。:任务的动态优先级。:任务可以运行的 CPU 数量。:任务允许运行的 CPU 掩码。描述任务的调度属性(如优先级、调度策略)。维护任务的调度实体(如 ),用于调度器计算任务的运行时间。记录任务的 CPU 亲和性(),限制任务可以运行的 CPU。任务加入调度队列: 当任务变为可运行状态时,调度器会将其加入运行队列。 调度决策: 调度器

2025-02-25 15:30:29 835

原创 指令预取-提高指令缓存的命中率

指令预取是一种重要的性能优化技术,通过提前加载未来可能使用的指令,减少了缓存未命中和内存访问延迟。硬件指令预取由CPU自动完成,而软件指令预取需要程序员显式插入预取指令。通过结合代码分析和优化,可以显著提高程序的性能。

2025-02-25 11:06:11 570

原创 CPU迁核的代价和收益

CPU迁核(Core Migration)是指将正在运行的线程或进程从一个CPU核心迁移到另一个核心的过程。这一过程在现代多核CPU中由操作系统调度器管理,目的是实现负载均衡、温度管理或节能。迁核的代价、性能收益以及对缓存的影响,与CPU架构和代码执行密切相关。以下结合CPU架构和代码行为进行详细分析。迁核的代价主要体现在以下几个方面:架构背景:CPU核心的上下文(Context)包括寄存器状态、程序计数器(PC)、栈指针(SP)等。迁核时,操作系统需要保存当前核心的上下文,并在目标核心上恢复。 C

2025-02-25 10:39:53 680

原创 进程的内存分段以及CPU与内存的交互

缓存命中率是指CPU访问数据时,数据在缓存中的比例。

2025-02-25 10:37:37 604

原创 CPU核心的上下文切换

调度器从就绪队列中选择优先级最高的任务。

2025-02-25 09:49:16 828

原创 编译时和运行时分别做了哪些动作

代码段(Text Segment):存放可执行指令,编译器将源代码编译为机器码并确定其位置。数据段(Data Segment):存放全局变量和静态变量,编译器分配内存并确定初始值。BSS段(Block Started by Symbol):存放未初始化的全局变量和静态变量,编译器分配内存但不初始化。堆(Heap):动态分配内存,通过、、等函数在运行时分配,大小不固定。栈(Stack):存放局部变量和函数调用信息,由编译器自动管理,遵循LIFO原则。内存映射段(Memory Mapping Segment):

2025-02-24 11:46:07 331

原创 CPU调度域

是Linux内核调度器中用于描述CPU调度域的核心数据结构。描述CPU的拓扑结构:将系统中的CPU划分为多个层次。负载均衡:在调度域内进行任务迁移,确保负载均衡。任务分配:根据调度域的拓扑结构和负载情况,选择合适的CPU运行任务。调度域的初始化、负载均衡和任务分配是Linux内核调度器的核心机制,它们共同确保了多核系统的高效运行。

2025-02-23 11:17:47 728

原创 Linux内核CPU调度之任务入队和选核

在Linux内核中,任务入队的触发条件包括任务被唤醒、新任务创建、任务迁移和负载均衡。在多核系统中,选择目标CPU的过程涉及到负载均衡和任务亲和性的考虑。调度器会根据任务的调度类和调度策略选择一个合适的CPU,并将任务放入该CPU的就绪队列。函数是任务入队的核心函数,它负责将任务放入就绪队列,并根据调度策略进行相应的处理。以上代码和分析基于Linux内核的CFS调度器,实际的调度机制可能会因内核版本和配置的不同而有所差异。

2025-02-22 23:37:16 617

原创 Linux内核调度优先级问题定位方法

接口。是 Linux 内核中用于设置进程调度策略和优先级的接口。它允许用户或程序动态调整进程的调度策略(如实时调度或普通调度)及其优先级。

2025-02-20 11:50:43 340

原创 实现linux内核到用户态的Socket通信

套接字是网络编程的核心工具,支持多种协议和通信模式。通过套接字,可以实现:网络通信(如TCP、UDP)。本地进程间通信(如Unix域套接字)。内核与用户态之间的通信(如Netlink套接字)。

2025-02-13 10:44:03 705

原创 结构体成员变量的顺序对内存大小的影响

调整结构体成员变量的顺序可以显著影响字节对齐和内存占用。通过合理排列成员变量的顺序,可以减少填充字节,优化内存使用效率。在实际编程中,尤其是在内存敏感的场景下,应充分考虑结构体的对齐和布局。

2025-02-11 21:04:01 319

原创 Android JIT和AOT

JIT 与 AOT 的共存:自 Android 7.0 起,混合模式结合两者优势,JIT 负责运行时优化,AOT 负责持久化编译,兼顾效率与存储。编译优化核心开发阶段:通过 Gradle 配置、缓存机制和工具链优化缩短构建时间。运行时:依赖 ART 的混合编译策略和编译器优化提升执行性能。

2025-02-11 15:56:42 952

原创 java为什么可以跨平台,跨平台的收益和损失

Java 能够跨平台的核心在于其和的设计,而是提升 Java 运行效率的关键技术。

2025-02-11 15:45:50 954

原创 Android中jni层,native层,hal层到底是什么

层级职责位置开发语言典型场景JNIJava 与 C/C++ 交互的桥梁Java 层 ↔ Native 层Java 调用本地加密算法Native高性能计算、底层操作JNI 层 ↔ Linux 内核C/C++音视频编解码、OpenGL 渲染HAL硬件抽象,统一硬件接口Native 层 ↔ 硬件驱动C/C++ 或 HIDL访问传感器、摄像头、蓝牙等硬件。

2025-02-11 09:46:49 906

原创 Linux内核调度-任务迁移

通过模块化的调度类设计(如 CFS、RT)和负载均衡机制,Linux 内核实现了高效的任务迁移策略,确保多核系统的资源利用率、实时性和公平性。任务被唤醒时,内核可能根据缓存局部性(Cache Affinity)或 NUMA 架构优化,将其迁移到更合适的核心。当某个 CPU 核心的负载显著高于其他核心时,调度器通过负载均衡机制将任务迁移到空闲核心。当 CPU 被关闭(如节能或故障恢复)或重新启用时,内核需要将任务从离线核心迁移到在线核心。当 CPU 被关闭时,内核需将其上的任务迁移到其他核心。

2025-02-10 15:32:06 469

原创 linux内核优先级设置的触发方式和流程

转换优先级(Nice → static_prio,用户优先级 → rt_priority)重新入队任务(enqueue_task) → 触发重新调度(resched_curr)当优先级或调度策略变更时,任务会被移出队列并重新插入,确保调度器按新优先级排序。),Linux 内核实现了对不同优先级任务的高效管理,兼顾实时性和公平性。:只能修改自己进程的 Nice 值(范围受限),无法设置实时优先级。:普通进程的动态优先级基于静态优先级和调度策略计算。:重新入队任务,确保调度器按新优先级排序。

2025-02-10 14:25:31 901

原创 Linux内核CPU调度流程分析

Linux 内核调度器的工作流程是一个复杂的多阶段过程,涉及任务状态管理、优先级计算、调度策略选择及上下文切换。以下是结合内核源码(以。

2025-02-10 12:13:42 891

原创 android framework层怎么调用jni层接口

在Android Framework层调用JNI层接口的流程如下:在Java类中声明Native方法。生成JNI头文件。在C/C++中实现Native方法。编译Native代码为共享库。在Java代码中加载Native库。调用Native方法。通过JNI,Android Framework层可以与底层系统(如Linux内核)进行交互,实现高性能的功能开发。

2025-02-06 22:55:35 687

原创 Linux内核驱动开发

1、写好的驱动程序,编译成.ko文件。2、在开发板上 insmod xx.ko,加载驱动。3、加载驱动后就会进入驱动的入口函数,调用module_init(入口函数名)。在卸载驱动的时候会调用module_exit(出口函数名)。4、在入口函数中注册杂项设备或字符设备(比如调用misc_register(),函数入参是一个字符设备结构体的地址),就能在内核中生成设备节点。

2025-02-06 15:45:39 338

空空如也

空空如也

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

TA关注的人

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