images/logo.jpg

枕石的个人博客

内存管理:堆

本文参考OSDev Wiki上关于“堆”的介绍及实现,原文地址:https://wiki.osdev.org/Heap

堆内存

Heap(堆)

堆是应用程序和内核都离不开的重要组成部分。通常,它位于更高层次的内存管理机制之下,而高层机制负责处理更大粒度的内存块。在大多数操作系统中,内存是按页(page)或其他较大的块进行分配的。在 X86 和 X64 架构中,一页通常是 4KB,但也可能更大。然而,对于较小的分配需求,如果直接占用整页会造成大量浪费。例如,只需要 24 字节却分配整整 4KB 页,将导致严重的内存浪费。因此,大多数应用程序和内核都会实现第二层内存管理:在以 4KB(或更大)为单位分配得到的内存块基础上,根据需求将这些一组页面或单独页面拆分成更小的部分进行分配。

内存管理:概述与介绍(译文)

本文译自 OSDev Wiki 上的一篇文章,原文链接为 Memory management - Overview and Introduction

内存管理是任何操作系统内核中的关键组成部分。为程序提供一种快速、可重复地分配和释放内存的机制是内核的一项主要职责。针对物理内存的分配存在多种实现方法,包括位图法、伙伴分配算法,以及基于树结构或队列/栈的内存管理方式。

内存管理:Brendan's Memory Management Guide(译文)

本文译自 OSDev Wiki 上的一篇文章,原文链接为 Brendan’s Memory Management Guide

概述

内存管理是所有操作系统开发者迟早都需要处理的问题。这个主题非常广泛;起初看起来似乎很简单,但往往会演变成比最初预想的更复杂的内容。这就容易导致人们在操作系统规模较小时做出一些看似合理(并且最初运行良好)的设计决策,但这些决策在系统变大后可能会成为严重的问题。

Linux实时调度策略:SCHED_FIFO、SCHED_RR和SCHED_DEADLINE设置示例

一、前言

Linux 支持多种任务调度策略(Scheduling Policy),其中:

  • 普通任务(SCHED_NORMAL) 是普通分时调度;
  • 实时任务(SCHED_FIFO、SCHED_RR、SCHED_DEADLINE) 适用于对响应延迟、执行周期有严格要求的系统(如工业控制、音视频处理等)。

二、实时调度策略简介

调度策略类型优先级范围时间片机制特点典型应用
SCHED_FIFO实时调度1–99无时间片高优先级任务永不主动让出 CPU,直到阻塞或结束电机控制、传感器采样
SCHED_RR实时调度1–99有时间片(默认 100ms)多个相同优先级任务轮流执行多任务实时控制
SCHED_DEADLINE实时调度无优先级通过 runtime/deadline/period 控制执行预算最严格的周期性任务调度视频渲染、实时信号处理

三、三种调度策略设置代码示例

SCHED_FIFO 测试程序

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/prctl.h>
#include <pthread.h>
#include <sched.h>

int main() {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(0, &mask);
    if (sched_setaffinity(0, sizeof(mask), &mask) != 0)
        perror("sched_setaffinity");

    // 设置实时调度
    struct sched_param param = { .sched_priority = 80 };
    if (sched_setscheduler(0, SCHED_FIFO, &param) != 0)
        perror("sched_setscheduler");

    printf("Running under SCHED_FIFO with priority %d on CPU 0\n", param.sched_priority);
    while (1) {
        for (volatile int i = 0; i < 100000000; i++);
        printf(".");
        fflush(stdout);
        usleep(500000); // 防止完全占满CPU
    }
}

编译与运行:

Linux内核中的内存分配

在用户空间,当我们谈论内存分配时,malloc() 几乎是唯一的答案。但当我们潜入Linux内核的深海,会发现内存管理的世界远比想象中复杂和精妙。内核代码对性能、稳定性和硬件交互有着极致的要求,因此它提供了一套多样化的工具箱来应对不同的内存需求。今天,我们将聚焦于内核中最核心的四种内存分配机制:kmallocalloc_pagesvmallocdma_alloc_coherent。理解它们的区别和底层原理,是每一位内核开发者和系统工程师的必修课。

详解C语言中的宏定义与使用

在C语言中,宏(Macro)是预处理器的一项强大功能。它允许我们在编译之前对源代码进行文本替换,这为定义常量、创建类函数结构以及实现代码的条件编译提供了极大的灵活性。本文将深入探讨C语言中宏的定义、使用技巧以及一些高级应用。