自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 git原理及使用

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。用于修改或更新上一次提交的命令。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

2025-10-24 05:40:41 964

原创 页交换原理

概念大小作用管理结构Slot4KB存储一个页面swap_map[]Cluster连续slot组,优化分配Slot是物理存储单元Cluster是逻辑管理单元通过cluster提高局部性、减少碎片、支持并发类似文件系统中的"块"和"簇"的关系特性位置磁盘/文件第一页内核内存数量每个swap设备一个每个活动swap一个生命周期持久化swapon到swapoff作用设备标识和配置运行时管理关系源数据从header初始化。

2025-10-16 06:31:08 610

原创 内存映射补充

文件页缓存是 Linux 内核用内存缓存磁盘文件数据的一种机制,用来加快文件读写,减少磁盘 I/O。它是进程文件访问和底层块设备之间的重要中间层。操作文件页缓存用户空间是否 copymmap+ 缺页访问直接映射同一物理页页表指向页缓存无拷贝(零拷贝)read页缓存中取数据复制到用户buf有拷贝write从用户buf拷贝到页缓存页缓存标记脏页有拷贝。

2025-09-19 05:45:58 681

原创 巨型页实战

匿名 HugeTLB 映射直接用。不需要文件系统(hugetlbfs但依赖预留的池子。基于 hugetlbfs 的映射通过。更灵活,适合文件共享场景。普通页 (4KB):延迟分配,缺页异常时才分配。显式巨型页 (HugeTLB)mmap阶段立即分配,且必须一次性分配整个大页。透明巨型页 (THP):最初按 4KB 分配,后台尝试合并成大页。应用程序调用 mmap()│├── 普通页 (4KB)│ mmap: 只建立 VMA(不分配物理页)│ ↓。

2025-09-17 05:33:27 615

原创 不连续页分配器补充

用户态用malloc()(底层 brk/mmap),本质是修改虚拟内存布局,缺页时通过 **伙伴系统 **分配物理页;内核态直接用kmalloc()(小块)、vmalloc()(大块,物理不连续)。内核线程没有独立的页表,它们不会切换到某个“内核专用页表”。调度到内核线程时,Linux 内核会让它们 借用上一个进程的页表(通过active_mm),只使用其中的内核地址映射部分。由于所有进程的内核区页表一致,内核线程就能安全运行。

2025-09-08 06:49:43 1108

原创 slab分配器补充

字段解释第一部分:对象统计nameslab 缓存的名字(例如 , , 等)。active_objs当前正在使用(已分配)的对象数量。num_objs当前 cache 中的对象总数(包括已分配和未分配的)。objsize每个对象的大小(字节数)。objperslab每个 slab 中能容纳的对象数量。(slab = 若干页的内存块,里面被切分成 个对象)。pagesperslab每个 slab 占用的物理页数。第二部分:tunables(可调参数)这些字段和 (CPU

2025-09-08 06:48:40 987

原创 伙伴分配器补充

可移动页 (MIGRATE_MOVABLE)用户进程的匿名页 (匿名内存)、文件缓存页(page cache)等。它们被 swap-out 或从文件重新读入后,可以放到别的物理页。所以这些页是“可移动的”。不可移动页 (MIGRATE_UNMOVABLE)内核数据结构、页表、一些 slab 分配的对象。这些数据与内核内部指针直接绑定,没法整体迁移到其他物理页。可回收页 (MIGRATE_RECLAIMABLE)比如 slab 中的 dentry cache、inode cache。

2025-09-01 09:06:04 903

原创 物理内存组织结构

目前多处理器系统主要有两种体系结构。(1)):指内存被划分成多个内存节点的多处理器系统,访问一个内存节点花费的时间取决于处理器和内存节点的距离。每个处理器有一个本地内存节点,处理器访问本地内存节点的速度比访问其他内存节点的速度快。(2)):即一致内存访问(Uniform Memory Access,),所有处理器访问内存花费的时间是相同的。每个处理器的地位是平等的,仅在内核初始化的时候不平等:“0号处理器作为引导处理器负责初始化内核,其他处理器等待内核初始化完成。

2025-08-21 09:03:45 318

原创 内存映射原理(mmap)

VMA 是抽象描述,页表才是真正的映射。延迟分配物理内存:按需分配,访问才分配(缺页中断)。文件映射与页缓存绑定:多个进程可共享缓存。COW 保证 MAP_PRIVATE 的写时隔离。设备映射需要特殊处理(页不在页缓存)。mmap和DMA结合使用(后续补充)

2025-08-18 11:40:55 483

原创 内核地址空间布局

参考资料用户进程的虚拟地址空间由mm_struct描述。但内核虚拟地址空间的管理方式则完全不同——它没有一个统一的结构体像mm_struct那样去描述整个内核空间。以下是Linux在ARM64处理器架构下的UL<<UL<<1UL1<<UL??PAGE_ALIGN4UL1<<30structpageUL1<<1PCI_IO_END<<内核镜像。

2025-08-11 16:49:13 843

原创 用户虚拟地址空间布局

因为目前应用程序没有那么大的内存需求,所以ARM64处理器完全的64位虚拟地址。虚拟地址的最大宽度一般是48位(ARMv8.2+支持52位ARM64架构内核/用户虚拟地址空间划分如下图(假设虚拟地址的宽度是48位):在编译ARM64架构的Linux内核时,可以虚拟地址(1)如果选择页长度4KB,默认的虚拟地址宽度是39位。(2)如果选择页长度16KB,默认的虚拟地址宽度是47位。(3)如果选择页长度64KB,默认的虚拟地址宽度是42位。(4)可以选择48位虚拟地址。通过或者查询页大小。

2025-08-11 16:48:28 848

原创 SMP调度机制

目前多处理器系统有三种体系结构。(1)):指内存被划分成多个内存节点的多处理器系统,访问一个内存节点花费的时间取决于处理器和内存节点的距离。每个处理器有一个本地内存节点,处理器访问本地内存节点的速度比访问其他内存节点的速度快。(2)):即一致内存访问(Uniform Memory Access,),所有处理器访问内存花费的时间是相同的。每个处理器的地位是平等的,仅在内核初始化的时候不平等:“0号处理器作为引导处理器负责初始化内核,其他处理器等待内核初始化完成。

2025-08-11 16:47:14 821

原创 进程间通信组件实现

AIO(Asynchronous I/O)和NIO(Non-blocking I/O)是两种高性能I/O模型,主要用于解决高并发场景下的I/O效率问题。数据流通道,允许相关进程(通常有父子关系)进行通信。在 Linux 内核中,设备模块是驱动硬件的核心组件,它们通过标准化的接口与内核交互。管道(Pipe)是 Linux 中最经典的进程间通信(IPC)机制之一,它提供了一种。因为大量网络IO,使用AIO的话会有大量的内核->用户空间的调用,命名管道,可用于任意进程间通信。,实现一个进程间通信组件。

2025-07-21 05:27:24 657

原创 调度器调度原理

linux调度器的实现基于两个函数:周期性调度器函数和主调度器函数。这些函数根据现有进程的优先级分配CPU时间。

2025-07-21 05:25:34 650

原创 用户态文件系统fuse

FUSE(Filesystem in Userspace)是一种让非特权用户在用户空间实现文件系统的机制。文件系统的逻辑实现不在内核态运行,而是在用户态运行,通过与内核中的 FUSE 模块通信实现文件操作的响应。

2025-07-03 09:07:31 1019

原创 调度器之任务分组

我们先看以下两种场景。(1)执行(选项表示同时执行 10 条命令),编译 Linux 内核,同时运行视频播放器,如果给每个进程平均分配 CPU 时间,会导致视频播放很卡。(2)用户 1 启动 100 个进程,用户 2 启动 1 个进程,如果给每个进程平均分配 CPU 时 间,用户 2 的进程只能得到不到 1%的 CPU 时间,用户 2 的体验很差。怎么解决呢?把进程分组。

2025-07-03 09:06:22 944

原创 调度器之调度类、运行队列

就是按照某种调度的算法设计,从进程的就绪队列当中选取进程分配CPU,主要是协调对CPU等相关资源的使用。。

2025-07-03 09:05:47 895

原创 进程调度策略和进程优先级

Linux 的和是操作系统为保证系统响应性、公平性和高性能所设计的关键机制。

2025-05-30 09:44:12 340

原创 进程生命周期

Linux是多任务操作系统,系统中的每个进程能够分时复用CPU时间片,通过有效的进程调度策略实现多任务并行执行。进程在被CPU调度运行,等待CPU资源分配以及等待外部事件时会处于不同的状态。

2025-05-30 09:43:14 429

原创 内核进程基础

操作系统作为硬件的使用层,提供使用硬件资源的能力;进程作为操作系统的使用层,提供使用操作系统抽象出的资源层的能力。进程:是指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。程序是指令、数据及其组织形式的描述,进程才是程序(指令和数据)的真正运行实例。Linux内核把进程叫做(任务),进程的虚拟地址空间可分为和,所有进程内核虚拟地址空间(内核页表全局唯一),每个进程有的用户虚拟地址空间。进程有两种特殊的形式:没有用户虚拟地址空间的进程叫;共享用户虚拟地址空间的进程叫。

2025-05-30 09:42:30 344

原创 RCU(Read-Copy Update)

为什么需要RCU?在Linux内核中,虽然已经有多种互斥机制(如、原子操作、等),但这些机制在某些场景下可能会成为性能瓶颈。是一种特殊的同步机制,主要用于解决读多写少的场景下的性能问题。RCU对于读多写少场景,性能比等都要高。它的设计目标是最大限度地减少读操作的开销,同时保证数据的一致性。为什么需要RCU?传统互斥机制的问题锁的开销:传统的锁机制(如)在读写冲突时会导致性能下降,尤其是在读多写少的场景中。读操作需要加锁,即使没有写操作,也会引入额外的开销。

2025-05-30 09:37:20 1042

原创 内存屏障技术

程序在执行时,指令一般不按照源程序顺序执行,原因是为提高程序执行性能,会对它进行优化,主要为两种:编译器优化和CPU执行优化,可能会导致内存访问乱序。内存屏障(Memory Barrier)是一种保证内存访问顺序的方法,用来解决下面这些内存访问乱序问题。1)编译器编译代码时可能汇编指令,使编译出来的程序在处理器上运行更快,但是有时候优化的结果可能不符合程序员的意图,导致程序运行过程中出现问题。2)现代的处理器采用(每个流水线阶段能同时执行多条指令)和,能够在一个时钟周期并行执行多条指令。

2025-05-30 09:34:27 472

原创 每处理器变量和每处理器计数器

void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch) // batch即阈值s64 count;// 禁止内核抢占// 读取当前CPU的计数器值并计算新值if (count >= batch || count <= -batch) { // 当前CPU计数值超过阈值的情况// 将当前CPU的累计值加到全局count// 重置当前CPU的计数值} else {参考资料。

2025-05-30 09:33:08 669

原创 内核抢占、进程和中断互斥

内核抢占是指当进程在内核模式下运行的时候可以被其他进程抢占,编译内核时打开配置宏则允许内核抢占。抢占是指当进程在内核模式下运行的时候可以被其他进程抢占,如果优先级更高的进程处于就绪状态,强行剥夺当前进程的处理器使用权。

2025-05-30 09:27:57 311

原创 内核读写锁

内核自旋锁spinlock_t的一个不足就是没有区分读者和写着,即使多个读者之间也会进行竞争。内核实际是,从自旋锁衍生而来,是对自旋锁的改进,区分读者和写者,允许多个读者同时进入临界区,读者和写者互斥,写者和写者互斥。如果读者占有读锁,写者申请写锁的时候自旋等待。如果写者占有写锁,读者申请读锁的时候自旋等待。

2025-03-31 16:49:06 449

原创 内核自旋锁

自旋锁用于处理器之间的互斥,适合保护很短的临界区,并且。申请自旋锁的时候,如果自旋锁被其他处理器占有,本处理器(也称为内核的自旋锁是(queuedspinlock,也称为"FIFO ticket spinlock",票号锁),算法类似于银行柜台的排队叫号。(1)锁拥有,服务号是当前占有锁的进程的排队号。(2)每个进程申请锁的时候,首先申请一个排队号,然后轮询锁的服务号是否等于自己的排队号,如果等于,表示自己占有锁,可以进入临界区,否则继续轮询。

2025-03-31 16:48:20 358

原创 内核原子变量

原子变量用来实现对整数的互斥访问,通常用来实现。例如,我们写一行代码把变量a加1,编译器会把代码编译成3条汇编指令。(1)把变量a从内存加载到寄存器。(2)把寄存器的值加1。(3)把寄存器的值写回内存。在单处理器系统中,如果进程1和进程2都执行把变量a加1的操作,可能出现下面的执行顺序:预期结果是进程1和进程2执行完以后变量a的值加,但是因为在进程1把变量a的新值写回内存之前,进程调度器调度进程2,进程2从内存读取变量a的旧值,导致进程1和进程2执行完以后变量a的值实际只增加了1。

2025-03-31 16:46:54 366

原创 内核实时互斥量

内核mutex存在优先级反转的问题。什么是优先级反转?考虑一种情况,系统上有两个进程运行:进程A优先级高,进程C优先级低。假定进程C已经获取了一个互斥量,正在所保护的临界区中运行,且在短时间内不打算退出。但在进程C进入临界区之后不久,进程A也试图获取该互斥量。由于进程C已经获取到该互斥量,因而进程A必须等待。这导致高优先级的进程A等待低优先级的进程C。如果有第3个进程B,优先级介于进程A和进程C之间,情况会更加糟糕。假定进程C仍然持有锁,进程A在等待。现在进程B开始运行。

2025-03-31 16:46:11 500

原创 内核互斥量

本文主要基于linux 4.12介绍内核的互斥量机制,会和信号量进行比较。最后简单介绍用户空间使用的posix互斥量。

2025-03-31 16:41:02 668

原创 内核读写信号量

内核中的读写信号量提供了一个高效的同步机制,允许多个读者同时访问共享资源,但写者需要独占访问。用户空间中的读写锁提供了类似的功能,通过POSIX线程库可以实现读写锁,用于同步多线程访问共享资源。

2025-03-31 16:36:37 422

原创 内核信号量

信号量(Semaphore)是一种用于同步和互斥的机制,能够控制对共享资源的访问,广泛应用于多线程和多进程编程中。应用程序中使用的信号量是基于内核信号量实现的。

2025-03-31 16:32:14 435

原创 内核定时器3-用户空间定时器

虽然用户空间定时器和内核定时器在实现上各自独立,但用户空间定时器通常依赖于内核定时器提供的基础设施。

2025-02-03 17:28:59 1099

原创 内核定时器2-高分辨率定时器

高分辨率定时器与低分辨率定时器相比,有如下两个根本性的不同。(1) 高分辨率定时器使用对定时器进行管理。(2) 定时器独立于周期时钟。即,精度可以达到纳秒级别。内核2.6.16版本开始,支持高分辨率定时器。在该版本中,低分辨率定时器的经典实现的基础部分已经替换为新的实现,该实现。由于低分辨率定时器的实现基于高分辨率机制,即使不启用高分辨率定时器,内核中也会联编(一部分)对高分辨率定时器的支持。当然,这种情况下系统只能够提供低分辨率定时功能。

2025-02-03 17:26:30 644

原创 内核定时器1-普通定时器

jiffies是内核中用于表示时间的一个全局变量,通常用于衡量系统自启动以来的时间流逝。它的作用类似于一个时钟计数器,在每个时钟中断时递增。具体来说,jiffies 用于表示经过的“滴答数”,每一滴答对应一个固定的时间间隔。jiffies是一个全局变量,类型通常为,它记录的是自系统启动以来的时钟滴答数。每个硬件时钟中断(或称为时钟滴答)都会增加jiffies的值。内核定时器、调度等功能依赖于jiffies来计算时间。jiffies定义代码如下。对于 64 位系统,jiffies_64。

2025-02-03 17:24:20 1433

原创 软中断介绍

软中断(Soft Interrupt)是一种由操作系统设计并执行的软件机制,它不是由硬件直接触发,而是由软件显式调用或触发的一种中断类型。软中断主要用于处理延迟执行的任务或轻量级异步任务,以减少对实时性的影响。因为它们的运作方式与上文描述的中断类似,但完全是用软件实现的,所以称为软中断(software interrupt)或softIRQ。通常软中断的优先级低于硬件中断,但高于普通进程调度。

2025-01-11 06:53:56 1679 1

原创 开启_禁止中断

软件可以禁止中断,,但是不可屏蔽中断(NMI,Non Maskable Interrupt)例外。禁止中断在需要临界区保护的场景下非常重要,避免中断打断正在执行的代码。禁止中断的接口如下。(2)local_irq_save(flags):首先把中断状态保存在参数flags中,然后禁止中断。这两个接口只能,不能禁止其他处理器的中断。禁止中断以后,处理器不再响应中断请求。开启中断的接口如下。(2)local irq_restore(flags):恢复本处理器的中断状态。

2025-01-11 06:53:04 926

原创 处理器间中断

处理器间中断(Inter-Processor Interrupt)是一种特殊的中断,在多处理器系统中,一 个处理器可以向其他处理器发送中断。要求目标处理器执行某件事情。处理器间中断是多核系统中用于处理核间通信的一种重要机制。

2025-01-11 06:52:05 851 1

原创 中断处理流程

对于中断控制器的每个中断源,向中断域添加硬件中断号到Linux中断号的映射时,内核分配一个Linux中断号和一个中断描述符irq_desc。

2024-12-23 06:11:03 998

原创 中断控制器及中断域

不同种类的中断控制器的访问方法存在差异,为了屏蔽差异,内核定义了中断控制器描述符irq_chip,每种中断控制器自定义各种操作函数。

2024-12-23 06:09:52 1229

原创 资源分配及设备总线

这种映射机制通过将设备的物理地址映射到内核地址空间,让内核能够直接访问设备的寄存器,从而进行数据交换。

2024-12-11 05:47:58 741

空空如也

空空如也

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

TA关注的人

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