- 博客(329)
- 收藏
- 关注
原创 pstree 命令结果分析指南
pstree命令以树状结构显示系统中的进程关系,是理解进程间父子关系和系统运行状态的重要工具。以下是如何分析pstree。
2025-05-30 19:30:08
904
原创 linux kernel调度触发机制
Linux 内核的调度触发机制是一个复杂而高效的系统,其核心思想是通过事件驱动的方式动态调整任务的运行顺序。调度触发的场景主要包括任务主动放弃 CPU、时间片耗尽、优先级变化以及中断处理等。内核通过schedule()函数和标志实现了灵活的调度逻辑,同时支持多种调度策略和抢占机制,以满足不同应用场景的需求。Linux 调度触发机制通过事件驱动(中断、唤醒)和策略驱动低延迟响应(快速抢占高优先级任务)。高吞吐量(合理分配CPU时间)。公平性(CFS 的vruntime机制)。
2025-05-11 19:37:19
891
原创 sched_fair 调度:负载权重、虚拟运行时间与最小虚拟时间
是三个核心概念,共同决定了任务的调度优先级和 CPU 时间的公平分配。下面详细解析它们的含义、计算方式及相互关系。
2025-05-10 16:15:24
560
原创 现代多核调度器的本质 调度三重奏
三个关键机制的协同作用。这三者共同决定了多核系统中任务如何分配、迁移和执行,以实现高性能、低延迟和公平性。三者协同工作,使得 Linux、Windows 等系统能够高效处理从嵌入式设备到数据中心的多样化负载。:确保所有 CPU 核心的负载均衡,避免某些核心过载而其他核心闲置。:从当前 CPU 的运行队列中选择下一个要执行的任务。)或迁移时,选择最优的 CPU 核心。现代多核调度器的核心设计围绕。(Linux CFS 的。
2025-04-27 23:44:08
1022
原创 per-task affinity 是什么?
Per-Task Affinity 是 Linux 调度器提供的。是 Linux 调度器提供的一种机制,允许将。,从而优化性能、减少缓存失效或实现资源隔离。位图,标记允许运行的 CPU 核心。,确保任务只在合法 CPU 上运行。选择运行队列时,调度器会检查。任务的最终可用 CPU =的协作关系,避免配置冲突。
2025-04-26 22:37:33
706
原创 Linux 内核中 cgroup 子系统 cpuset 是什么?
cpuset是 Linux 内核中的一个子系统,用于将一组进程(或任务)绑定到特定的和(NUMA 节点)上运行。它通过限制进程的 CPU 和内存资源的使用范围,优化系统性能(如减少缓存失效、提高 NUMA 本地性)或实现资源隔离(如容器场景)。将进程限制在指定的 CPU 核心(或超线程)上运行,避免跨核心的上下文切换,提高缓存利用率。在 NUMA 架构中,将进程的内存分配限制在指定的 NUMA 节点,减少跨节点访问内存的延迟。允许或禁止进程在绑定 CPU 核心之间迁移。在 cgroup 的。
2025-04-22 20:00:25
520
原创 CFS 的调度类型:普通调度 vs 组调度
(Group Scheduling)是两种互补的任务组织方式,主要区别在于资源分配的层次结构和公平性控制的范围。通过组调度,CFS实现了从单任务公平到多级资源控制的扩展,成为现代Linux系统资源管理的基石。在Linux的完全公平调度器(CFS)中,
2025-04-20 16:24:47
425
原创 Linux内核常见的调度策略
在 Linux 内核中,调度策略决定了任务如何被分配 CPU 时间以及任务之间的优先级关系。以下是五种常见的调度策略:STOP、DL(Deadline)、RT(Real-Time)、CFS(Completely Fair Scheduler) 和 IDLE 的详细介绍。这五种调度策略覆盖了从最高优先级(STOP)到最低优先级(IDLE)的全部范围,满足了从硬实时任务到普通用户任务的不同需求:通过选择合适的调度策略,Linux 内核能够在多任务环境下实现高效的资源分配和任务管理。
2025-04-13 21:17:40
889
原创 CFS 调度器两种调度类型普通调度 和 组调度
在 Linux 的和。这两种调度类型分别适用于不同的场景,并通过三个关键维度(权重、抢占优先级、最大配额)来影响程序对 CPU 资源的使用。
2025-04-12 23:24:59
924
原创 现代处理器的调度策略,调度优先级,亲和性是什么意思?
调度策略决定了任务的调度方式(如是否抢占、是否有时间片等)。调度优先级决定了任务的执行顺序(高优先级任务优先执行)。亲和性决定了任务运行在哪一个或哪几个 CPU 核心上(优化缓存命中率和内存访问效率)。通过合理配置这三个维度,可以实现高效的多处理器调度,满足实时性、公平性和性能优化的需求。
2025-04-12 20:33:17
831
原创 如何理解内存序 memory order ?
为开发者提供了一种灵活控制原子操作内存顺序的方式,开发者可以根据具体的应用场景和性能需求,选择合适的内存顺序,在保证程序正确性的同时,尽可能地提高程序的性能。
2025-04-05 12:40:04
428
原创 如何理解缓存一致性?
缓存一致性是指在多处理器系统或分布式系统中,确保各个处理器核心或节点的缓存数据与主内存以及其他缓存中的数据保持一致的机制和过程。此时,数据仅存在于当前 CPU 的缓存中,与内存中的数据不一致。:缓存行中的数据仅存在于当前 CPU 的缓存中,且与内存中的数据一致。:当一个 CPU 修改一个共享的数据时,其他 CPU 的缓存行状态变为 Invalidated。:当一个 CPU 读取一个已被其他 CPU 缓存的数据时,状态变为 Shared。:缓存行中的数据存在于多个 CPU 的缓存中,且与内存中的数据一致。
2025-04-04 22:52:36
821
原创 Mimalloc论文解析:小内存管理的极致追求与实践启示
mimalloc 的内存分配器,它在有效平衡这些需求的同时,展现出显著优于现有分配器的性能优势,并专为需要内存分配器作为引用计数后端的语言进行了优化。
2025-03-22 18:37:05
1069
原创 什么是 Cache Line?
例如,如果程序访问了某个内存地址,后续可能还会访问相邻的地址,这些数据已经预先加载到了同一个 Cache Line 中。例如,在 64 字节 Cache Line 的情况下,如果一个 8 字节的数据跨越了 Cache Line 边界(如从第 60 字节开始),则需要加载两个 Cache Line 才能完成访问。为了充分利用 CPU 缓存,数据在内存中的存储位置通常需要与 Cache Line 对齐。在多核系统中,Cache Line 的行为会对性能产生重要影响,尤其是在多线程编程中。
2025-03-20 19:38:09
1084
原创 采用内存局部性分配有什么好处?
局部性分配通过提高缓存命中率、减少内存碎片、优化访问模式、提升多线程性能、支持延迟释放和简化内存管理,显著提升了内存分配器的性能和效率。而大名鼎鼎的 mimalloc 分片空闲列表的设计,看、就充分利用了局部性分配的优势,在多种基准测试中表现优异。
2025-03-09 22:40:07
928
原创 cpu 多级缓存L1、L2、L3 与主存关系
多级缓存(L1、L2、L3)和主存构成了现代 CPU 的内存层次结构,通过减少内存访问延迟和提高数据访问速度来优化性能。缓存的设计和性能对 CPU 的整体性能有重大影响,程序设计和内存分配可以通过优化缓存使用来进一步提升性能。
2025-03-09 20:57:04
2073
原创 C++ 11 中的并发多线程模式
并发:并发指的是计算机上的多个任务在同一时间段内完成。比如:我们在电脑上启动浏览器看 优快云 博客,同时又启动了音乐播放器播放音乐,用微信QQ 与好友聊天等等,这些看着是同时发生的,但是对于计算机的 CPU 来讲,却是一会运行这个程序,一会又运行另外一个程序,只不过切换的很快,对我们来讲,这是同时发生的。并行:并行指的是计算机上同一时刻同时运行多个程序。如果我们的电脑是多核 CPU,那前面的例子,多个程序是可以实现同一时刻运行多个的。c 语言中引入了 pthread 来实现多线程,但是并不好用;
2024-08-11 20:11:44
763
原创 C++ 学习系列 -- std::function 与 std::bind
std::function 是 c++ 11 的新特性 ,包含在头文件<functional>中,为了更方便的调用函数而引入。std::function 是一个函数包装器(function wrapper),可以包装任何可调用实体,包括如下几种:普通函数、函数指针、成员函数、静态函数、lambda 表达式 与 仿函数对象。std::function 对象实例可以拷贝与移动,可以使用指定的调用特征来调用目标元素。
2024-01-20 17:27:51
2506
原创 C++ 学习系列 -- tuple 原理
在 tuple出现之前,c++ 中的容器,序列容器:vector、deque、list ,关联容器:set、map 等,所存储的元素类型都是单一的(map 的 所有的 key 类型是相同的, 所有的 value 类型是相同的 )。如果我们有这样一个需求,需要一个容器或者说用着类似于容器的一个东西,可以存储不同类型的元素,上面的容器是无法满足我们的需求的。考虑到如此,c++ 为我们提供了 pair 类,但是美中不足的是,pair 只能存储两个元素,若是存储两个以上的元素呢?pair 就帮不了我们了。
2024-01-07 14:20:41
1296
原创 C++ 学习系列 -- C++ 中的多态行为
虚继承的目的是为了表明某个类的基类是可以被这个类的所有派生类共享,这个基类也被称作虚基类(Virtual Base Class),上述代码中的 class AA 就是 class BB 与 class CC 的虚基类。不管虚基类在派生类中出现多少次,最终在派生类中都只有一份虚基类的成员变量与成员函数。
2023-12-24 10:59:04
415
原创 C++ 学习系列 -- 模板 template
C++ 为什么引入模板?我的理解是:C++ 引入模板的概念,是为了复用重复的代码,当某些代码除了操作的数据类型不同以外,其他逻辑全都相同,此时就适合采用模板的方式。定义模板类或者模板函数时,只是定义了一个代码的架子,使用时需要配合上实际的数据类型,数据类型可以是基本数据类型也可以是用户自定义的类型。官方一点的说法:所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板。
2023-12-16 00:03:31
350
原创 C++ 学习系列 -- conversion function
在 c++ 编码中,我们可能遇到要将类 A 转为 类 B 的情况,此时就可以定义类 A 的转换函数将其按照一定规则转换为 类 B;转换函数无返回值,是一个已定义的类,包括c++基本类型 int、double 等,也包括事先定义过的类。这里介绍一下隐式转换的知识点:所谓隐式转换,由编译器私下进行的类型转换,该转换不需要使用者干预。当一个值拷贝给另外一个兼容类型的值时, 往往会发生自动转换。
2023-12-12 23:13:50
199
原创 C++ 中的内存分配 -- new 与 delete
函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指针,指向新分配的内存块的初始位置。如果内存分配失败(内存不足),则函数返回NULL。free 函数原型为:void free (void* ptr),用于将 malloc 分配的内存释放掉。那么在执行 new 与 delete 两个 expression 时,内部发生了什么呢?malloc 与 free 是 C语言中用于分配与释放内存的两个函数,两者配对使用。
2023-11-11 18:44:52
214
原创 C++ 中的仿函数 functor
***/作为拥有一个输入参数的仿函数常用基类,该类主要回答了两个问题:1. 该仿函数类的输入参数是什么类型:argument_type2. 该仿函数类的返回参数是什么类型: result_type。
2023-10-29 17:56:10
695
原创 C++ 学习系列 -- 标准库常用得 algorithm function
c++ 标准库中提供了许多操作数据结构:vector、list、deque、map、set 等函数,学习并了解这些常用函数对于我们理解 c++ 的一些设计模式有着重要的作用。
2023-10-28 23:34:14
349
原创 C++ 学习系列 -- std::list
list 是 c++ 中的序列式容器,其实现是双向链表,每个元素都有两个指针,分别指向前一个节点与后一个节点链表与数组都是计算机常用的内存数据结构,与数组连续内存空间不一样的地方在于,链表的空间是不连续的,链表是将一块块不连续的内存串联起来使用。正是由于链表的内存不连续这一特点,所以不能像数组一样,可以根据位置随机的访问每个元素,而链表我们压根不知道每个元素的实际位置到底在哪块内存区域。查找某个元素需要遍历整个链表,直到找到目标元素位置,时间复杂度是 O(n);
2023-10-06 18:29:22
3585
原创 C++ -- 学习系列 无序关联式容器 unordered_set 与 unordered_map(未完待续)
一 HaseTable 是什么?二 HashTable 底层原理与使用?三 无序关联式容器的底层原理1. set1.1 unordered_set1.2 unordered_multiset2. map2.1 unordered_map2.2 unoredred_multimap四 无序关联式容器的使用1. set1.1 unordered_set1.2 unordered_m
2023-10-05 22:13:08
151
原创 C++ -- 学习系列 关联式容器 set 与 map
c++ 中有两种容器类型:关联式容器与序列式容器(顺序容器)关联式中的容器是按照关键字来存储与访问的,序列式容器(顺序容器)则是元素在容器中的相对位置来存储与访问的。c++ 中的关联式容器主要是 set 与 map.
2023-10-04 00:39:57
260
原创 C++ 学习系列 -- std::stack 与 std::queue
两者均是 c++ 中的序列化容器,区别在于:std::stack 元素是先进后出std::queue 元素是先进先出。
2023-10-01 18:09:39
477
原创 C++ -- 学习系列 std::deque 的原理与使用
std::deque 是 c++ 一种序列式容器,其与 vector 类似,其底层内存都是连续的,不同的地方在于, vector 是一端开口,在一端放入数据与扩充空间,而 deque 是双端均开口,都可以放入数据与扩充空间。
2023-09-30 15:19:42
2249
1
原创 C++ 学习系列 -- std::vector (未完待续)
vector 是c++ 中一种序列化容器,与前面说的 array 类似,其内存分配是连续的,但是与 array 不同的地方在于,vector 在运行时是可以动态扩容的,此外 vector 提供了许多方便的操作,比如:插入、删除、查找、排序等。
2023-09-23 17:53:25
341
原创 C++ -- 学习系列 std::array 容器
array 容器是11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全,且效率并没有因此变差。与数组一样,其底层存储空间是连续的。array 和其它容器不同,array 容器的大小是的,无法动态的扩展或收缩,这也就意味着,在使用该容器的过程无法借由增加或移除元素而改变其大小,它只允许访问或者替换存储的元素。
2023-09-17 15:29:42
758
原创 C++ -- 学习系列 static 关键字的使用
全局变量特点:全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过 extern 全局变量名的声明,就可以使用全局变量。静态全局变量特点:全局静态变量是显式用 static 修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用 extern 声明也不能使用。在函数中定义的静态变量仅仅初始化一次,且变量会存储到静态存储区,因此即便离开函数作用域也不会消失。
2023-09-10 15:37:18
396
原创 C++ 学习系列 -- 智能指针 make_shared 与 make_unique
c++ 11 中 引入了智能指针 shared_ptr,以及一个模板函数 make_shared 来生成一个制定类型的 shared_ptr。
2023-09-03 00:00:18
2822
原创 C++ 学习系列 -- 运行时常量 const 与 编译期常量 constexpr 介绍
C++ 中引入了 const 关键字,被 const 关键字修饰的变量其值不能修改,是只读的。
2023-08-31 23:21:17
507
原创 C++ 学习系列 -- string 实现
string是C++标准库的重要部分,主要用于字符串处理。这里我们自己实现一个简单版本的 string.
2023-08-20 18:37:30
282
原创 c++ 学习系列 -- 智能指针
C++ 程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。但使用普通指针,容易造成内存泄露(忘记释放)、二次释放、程序发生异常时内存泄露等问题等。另外,使用普通指针容易产生 野指针、悬空指针 等问题。所以 C++11 就引入了智能指针来管理内存。
2023-08-13 00:04:34
274
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人