内存管理篇-06Per-CPU页帧缓存

news2024/9/20 16:32:12

per-CPU缓存是对伙伴系统的完善,也是伙伴系统中的一部分。再回顾一下zone结构体的内容,这里的__percpu *pageset实际上就是Per-CPU的实现机制,所以这里的内存实际上最少有三部分,(1)free_area管理了大部分的公共伙伴系统内存;(2)lowmem_reserve预留了一部分;(3)然后就是__percpu *pagset这里对每个CPU都分配一部分管理起来:

1.per-CPU缓存的定义 

        是一种缓存机制,对伙伴系统的完善。由于伙伴系统管理的页面都是全局的,每个进程在申请页面的时候都需要加锁解锁等操作,极大的引入了开销。为了提高效率就引入页帧缓存,为每个cpu提供一个变量指针__percpu *pageset(定义在struct zone),这样每个cpu就不用去加锁解锁申请,直接使用本地物理页面。

        把单个物理页面的申请和释放做成缓存,每个cpu都有这个链表。给每个cpu本地定义一个页表,维护这样一个变量。因此,不需要去全局伙伴系统上去申请释放。

2.核心结构体和实现

        可以理解为struct zone 把内存分为了几大块,__percpu *pageset指针(每个CPU都有这么一个指针),指向了一片内存区域。这片区域不需要再各个CPU之间进行同步,struct list_head list[3], 指向了三种不同页表链表(可移动的,不可移动的,可回收的),并且三个链表都是的块大小都是4KB。

3.每个CPU分配缓存如何实现

        struct per_cpu_pageset __percpu *pageset;这里就是宏,在每个CPU定义这样一个变量,并且每个CPU自己申请和释放内存的时候,不会去从伙伴系统申请释放内存,而是从自己的缓存中。。

        在 Linux 内核中,__percpu 是一个特殊的类型修饰符,用于表示一个变量在每个 CPU 上都有一个独立的副本。struct per_cpu_pageset 是一个用于在每个 CPU 上维护一个页面集合的数据结构。这种机制允许每个 CPU 在本地访问页面集合,从而减少跨 CPU 的同步开销。在内核启动时,为每个 CPU 分配一个 struct per_cpu_pageset 的实例,并将其指针存储在一个全局数组中。通过调用 get_cpu_var() 函数来访问当前 CPU 的 struct per_cpu_pageset 实例。访问完之后,通常需要调用 put_cpu_var() 函数来释放对 struct per_cpu_pageset 的引用。

4.使用示例

#include <linux/percpu.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/mm.h>
#include <linux/mmzone.h>

#define NR_PERCPU_PAGES 16

struct per_cpu_pageset {
    spinlock_t lock;
    struct page *pages[NR_PERCPU_PAGES];
    unsigned long nr_pages;
};

static DEFINE_PER_CPU(struct per_cpu_pageset *, pageset);

static void init_per_cpu_pageset(void)
{
    int cpu;

    for_each_possible_cpu(cpu) {
        struct per_cpu_pageset *ps = alloc_percpu(struct per_cpu_pageset);
        if (!ps) {
            printk(KERN_ERR "Failed to allocate per-cpu pageset\n");
            continue;
        }

        ps->nr_pages = 0;
        spin_lock_init(&ps->lock);
        per_cpu(pageset, cpu) = ps;
    }
}

static void release_per_cpu_pageset(void)
{
    int cpu;

    for_each_possible_cpu(cpu) {
        free_percpu(per_cpu(pageset, cpu));
    }
}

static void add_page_to_set(struct page *page)
{
    int cpu = raw_smp_processor_id();
    struct per_cpu_pageset *ps = per_cpu(pageset, cpu);

    spin_lock(&ps->lock);

    // 检查是否还有空间添加页面
    if (ps->nr_pages < NR_PERCPU_PAGES) {
        ps->pages[ps->nr_pages++] = page;
    } else {
        printk(KERN_WARNING "Per-CPU pageset full on CPU %d\n", cpu);
    }

    spin_unlock(&ps->lock);
}

static void remove_page_from_set(struct page *page)
{
    int cpu = raw_smp_processor_id();
    struct per_cpu_pageset *ps = per_cpu(pageset, cpu);
    int i;

    spin_lock(&ps->lock);

    // 查找页面并移除
    for (i = 0; i < ps->nr_pages; i++) {
        if (ps->pages[i] == page) {
            ps->pages[i] = ps->pages[--ps->nr_pages];
            break;
        }
    }

    spin_unlock(&ps->lock);
}

static int __init init_module(void)
{
    init_per_cpu_pageset();
    return 0;
}

static void __exit cleanup_module(void)
{
    release_per_cpu_pageset();
}

module_init(init_module);
module_exit(cleanup_module);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模之Matlab快速入门--全

前言&#xff1a; 本文是之前学Matlab时候做的笔记&#xff0c;很适合快速入门数学建模中matlab和python是最常用的两个软件&#xff0c;现在本人更喜欢python去做数学建模 文章目录 界面介绍与操作快捷操作 数据类型数值型整型浮点型复型逻辑型字符型struct数组cell数组函数句…

区块链国赛第六套样题(关于运维)

任务1-2&#xff1a;区块链系统部署与运维 围绕食品安全溯源区块链平台部署与运维需求&#xff0c;进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范&#xff0c;完成系统日志、网络参数、节点服务等系统结构的维…

Jetson安装Archiconda3全过程

1. 下载Archiconda3 下载网址&#xff1a; 发布 Archiconda/build-tools --- Releases Archiconda/build-tools (github.com)​​​​​​ 2. 执行命令 bash ./Archiconda3-0.2.2-Linux-aarch64.sh 3. conda换源 conda config --add channels https://mirrors.tuna.tsing…

计算机网络-PIM-SM组播实验

一、概述 目前为止我们学习了组播转发网络中的PIM协议&#xff0c;PIM模型有两种&#xff1a; PIM-DM主要使用在网络规模较小&#xff0c;用户集中的组播网络中。 PIM-SM主要使用在网络规模较大&#xff0c;用户较为分散的组播网络中。PIM-SM基于组播模型又可以分为PIM-SM&…

5.Lab four —— Trap

首先切换traps分支 git checkout traps make clean RISC-V assembly 代码&#xff1a; #include "kernel/param.h" #include "kernel/types.h" #include "kernel/stat.h" #include "user/user.h"int g(int x) {return x3; }int f(…

AI预测体彩排3采取888=3策略+和值012路或胆码测试8月24日升级新模型预测第61弹

经过近60多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;已到达90%的命中率&#xff0c;这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大…

Linux——驱动——自动设备

自动创建设备节点是Linux设备驱动开发中的一个重要环节&#xff0c;它允许设备驱动程序在内核中注册后&#xff0c;自动在/dev目录下创建对应的设备文件&#xff0c;从而使得用户空间程序可以通过标准的文件操作接口&#xff08;如open、read、write等&#xff09;与硬件设备进…

Level3 — PART 4 机器学习算法 — 朴素贝叶斯

目录 贝叶斯定理 朴素贝叶斯模型&#xff08;Naive Bayes Model&#xff09; 估计 离散估计 极大似然估计 案例 朴素贝叶斯扩展 高斯贝叶斯分类器 原理 应用 源码分析 伯努利贝叶斯分类器 原理 源码分析 多项朴素贝叶斯分类器 半朴素贝叶斯分类器 模拟题 CDA…

Linux系统之jobs命令的基本使用

Linux系统之jobs命令的基本使用 一、jobs命令介绍二、jobs命令的使用帮助2.1 jobs命令的help帮助信息2.2 jobs命令的语法解释 三、jobs命令的基本使用3.1 运行一个后台任务3.2 列出后台所有的作业3.3 列出进程ID3.4 只列出进程ID3.5 终止后台任务3.6 只显示运行任务3.7 只显示停…

tcp 网络通信及抓包工具的使用

tcp网络通信 本地回环&#xff08;Loopback&#xff09;的概念 本地回环地址是一个特殊的IP地址&#xff0c;用于指向计算机本身的网络接口。在IPv4中&#xff0c;最常见的本地回环地址是127.0.0.1&#xff0c;而在IPv6中则是::1。这个地址用于测试网络软件&#xff0c;确保网…

【IoT】路由器/linux系统,如何使用shell查看系统硬件配置,传感器CPU温度,资源占用率等信息(以红米AX6000为例)

【IoT】路由器/linux系统&#xff0c;如何使用shell查看硬件配置&#xff0c;传感器CPU温度&#xff0c;系统资源占用率等信息&#xff08;以红米AX6000为例&#xff09; 文章目录 1、路由器拆机与测评&#xff08;Redmi AX6000&#xff09;2、通过telnet获得SSH3、linux系统信…

SpringBoot集成kafka接收消息

SpringBoot集成kafka接收消息 1、SpringBoot集成kafka接收消息2、Payload注解接收消息体内容3、Header注解接收消息头内容4、接收消息所有内容 1、SpringBoot集成kafka接收消息 生产者 package com.power.producer;import org.springframework.kafka.core.KafkaTemplate; imp…

【自动化】考试答题自动化完成答案,如何实现100%正确呢

一、科目仿真考试不能自动答题 我的答案是可以的&#xff0c;电脑程序可以模拟人的操作完成所有的答题并提交结束考试 二、分析页面内容 完成一个题目&#xff0c;包括判断题&#xff0c;对与错2选1答案&#xff0c;单选题ABCD4选1答案&#xff0c;多选题大家想一想 F12查看按…

基于机器学习的糖尿病数据分析与风险评估系统

B站视频及代码下载&#xff1a;基于机器学习的糖尿病数据分析与风险评估系统_哔哩哔哩_bilibili 1. 项目简介 糖尿病&#xff0c;作为一种在全球范围内广泛流行的慢性疾病&#xff0c;已经影响了数以百万计的人们的生活&#xff0c;给全球公共健康带来了严重的挑战。因此&#…

uni-app的示例项目--简单的登陆页面及列表页面

uni-app的示例项目--简单的登陆页面及列表页面 文章说明核心代码效果展示源码下载 文章说明 随着移动端使用占比升高&#xff0c;手机端的App、小程序也成了一些场景下的首选&#xff1b;采用uni-pp开发此类应用具有很多优势&#xff0c;它可以直接使用vue3进行开发&#xff0c…

集合论与位运算之间的转换

集合可以用二进制表示&#xff0c;二进制从低到高第 i 位为 1 表示 i 在集合中&#xff0c;为 0 表示 i 不在集合中。例如集合 {0,2,3} 可以用二进制数 1101(2)​ 表示&#xff1b;反过来&#xff0c;二进制数 1101(2)​ 就对应着集合 {0,2,3}。 例如集合 {0,2,3} 可以压缩成 …

干货|软件测试简历的编写以及注意事项

一、个人信息 1.年龄超过30岁的&#xff0c;就不体现年龄&#xff1b; 2.学历是本科的&#xff0c;以及专业是计算机的可以加上学历、专业2个标签&#xff0c;大专的则可以不体现&#xff1b; 3.英语过了四六级的可以加1个英语的标签&#xff1b; 4.如果你的户籍和面试城市…

Python入门级 序列全集 [ 继上篇 进阶版 持续更新中哞哞哞!!! ]例题较多

本文主要结合例题介绍了序列【常用函数、可迭代对象】&#xff0c;字典【函数、写法、定义、视图对象】&#xff0c;集合【常用函数】&#xff0c;运算符优先级。这几种数据集合在Python中也是蛮重要的&#xff0c;对于新手比较友好。 本文例题大多来自哔站up主鱼C-小甲鱼【Pyt…

系统编程 网络 http协议

http协议------应用层的协议 万维网&#xff1a;http解决万维网之间互联互通 计算机web端网络只能看到文字 1.如何在万维网中表示一个资源&#xff1f; url <协议>&#xff1a;//<主机>&#xff1a;<端口>/<路径> ------------------------------…

Adobe After Effects的插件--------CC Ball Action

CC Ball Action是粒子效果器,其将2D图层变为一个个由3D小球构成的图层。它是AE内置的3D插件。 使用条件 使用该插件的图层需是2D图层。 我们以一张图片素材为例: 给图片图层添加CC Ball Action效果控件,然后新建一个摄像机(利用摄像机旋转、平移、推拉工具,方便在各个角…