嵌入式知识点总结 操作系统 专题提升(五)-内存

news2025/2/12 6:07:33

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。

目录

1.在1G内存的计算机能否malloc(1.2G)?为什么?

2.malloc能申请多大的空间?

3.内存管理有哪几种方式?

4.什么虚拟内存?

5.解释下内存碎片,内碎片,外碎片?

6.解释下虚拟地址,逻辑地址,线性地址,物理地址?

7.虚拟内存置换方法是怎么样的?

8.给你一个类,里面有static,virtual之类的,来说一说这个类的内存分布?

9.假设临界区资源释放,如何保证只让一个线程获得临界区资源而不是都获得?

10.操作系统中的缺页中断是什么?

11.OS缺页置换算法如何实现的?

12.系统调用是什么,你用过哪些系统调用,和库函数有什么区别?

13.为什么要有page cache,操作系统怎么设计的page cache?


1.在1G内存的计算机能否malloc(1.2G)?为什么?

在一台拥有1GB内存的计算机上,调用 malloc(1.2G) 是不可能成功的,因为操作系统会检查可用的内存空间。在这种情况下,系统只能分配最多1GB的内存,超出了这个限制,malloc 会返回 NULL,表示分配失败。

这里的原因有几个方面:

物理内存限制:计算机的物理内存只有1GB,操作系统无法为单一进程分配超过这个值的内存。虽然现代操作系统(如Linux、Windows)支持虚拟内存,但虚拟内存并不是无限的。

操作系统的内存管理:即使系统使用虚拟内存,操作系统通常会设置一定的内存限制来避免进程超出可用内存范围,尤其是对于单个进程的内存分配。所以即使你有足够的交换空间(swap space),系统仍会限制进程分配过多内存。

虚拟内存:如果系统启用了虚拟内存,并且交换空间足够大,操作系统可能会允许你申请超过物理内存的内存量。但是,这会导致频繁的磁盘交换,严重影响性能,且并不意味着所有的内存都会被实际分配给进程。

malloc能够申请的空间大小与物理内存的大小没有直接关系,仅与程序的虚拟地址空间相关。
程序运行时,堆空间只是程序向操作系统申请划出来的一大块虚拟地址空间。应用程序通过malloc申请空间,得到的是在虚拟地址空间中的地址,之后程序运行所提供的物理内存是由操作系统完成的。
本题要申请空间的大小为 1.2G=230x1.2 Byte ,1.2G=(1024*1024*1024)*1.2Byte转换为十六进制约为 4CCCCCCC,这个数值已经超过了 int 类型的表示范围,但还在 unsigned 的表示范围。幸运的是malloc 函数要求的参数为 unsigned 。见下面的示例代码。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *p;
    const unsigned k = 1024 * 1024 * 1024 * 1.2; // 计算内存大小,1.2GB
    printf("%u\n", k); // 输出计算的内存大小
    p = (char *)malloc(k); // 申请内存
    if (p != NULL)
        printf("ok\n");
    else
        printf("error\n");
    
    free(p); // 释放内存
    return 0;
}

该程序计算 1.2GB 的内存大小并尝试进行内存分配。

在1GB内存的计算机上,通常因为系统的物理内存限制(除非系统配置了非常大的交换空间),malloc 很可能会失败,返回 NULL,然后打印 error

如果系统有足够的内存(或者有足够的交换空间),程序将成功分配内存,并打印 ok

现代操作系统使用虚拟内存机制,允许程序使用比物理内存更大的地址空间。

虚拟内存通过将部分数据存储在磁盘(如交换分区或页面文件)上来扩展可用内存。

因此,即使物理内存不足,malloc(1.2G) 也可能成功,因为操作系统会将部分数据交换到磁盘。

2.malloc能申请多大的空间?

malloc 可以申请多大的空间,取决于多个因素,包括操作系统的内存管理、硬件架构、操作系统的限制和系统配置。下面是一些影响 malloc 可分配内存大小的关键因素:

32位系统:在32位操作系统中,单个进程的虚拟地址空间通常限制为4GB(理论上是 2^32 字节)。在这种系统上,malloc 申请的最大内存会受到该限制的影响。实际上,由于操作系统和硬件的配置,通常只有2GB或者更少的地址空间可以供进程使用(剩余的内存地址用于操作系统自身),并且受限于内存碎片和内存管理策略。

64位系统:在64位操作系统中,虚拟地址空间大大增加,理论上支持的内存可以高达2^64 字节,极其庞大。实际上,操作系统和硬件会有一些实际限制(如硬件支持的最大内存、操作系统的配置等)。在64位系统中,malloc 能够申请的空间大大增加,可能达到数TB甚至更多。

Linux:Linux 操作系统中的 malloc 申请内存的最大限制通常受到物理内存、交换空间以及进程最大虚拟内存空间的限制。在64位 Linux 系统上,malloc 的最大内存限制可以非常大(通常由操作系统内核和硬件支持来决定),但也取决于系统配置(如 ulimit 设置、内存映射、虚拟内存设置等)。malloc 的实际限制也可能受到内存碎片化和系统资源的影响。

Windows:Windows 操作系统也支持大内存分配,但其最大分配空间受到物理内存、虚拟内存(例如页面文件的大小)以及系统架构的影响。在32位 Windows 上,单个进程的最大地址空间限制通常为2GB(对于某些配置为3GB),而在64位 Windows 上,理论上支持极大的虚拟内存空间,但仍受硬件和操作系统配置限制。

3.内存管理有哪几种方式?

1. 连续内存分配(Contiguous Allocation)

概念:所有的进程都在物理内存中占据一个连续的内存区域。

特点:简单高效,但容易造成内存碎片。

类型

单一连续分配:一个进程只占用一个连续的内存区域,适用于短小的程序。

固定分区分配:内存被分为若干个固定大小的区块,进程被分配到适合大小的区块中。

动态分区分配:内存区块大小根据需要动态分配,不固定,但会随着时间推移出现碎片。

优缺点

优点:容易实现,访问效率高。

缺点:随着时间的推移,内存碎片问题严重,可能导致无法找到足够的连续内存。

2. 非连续内存分配(Non-contiguous Allocation)

概念:进程在内存中的分配不要求是连续的,而是通过地址映射和分页技术来管理。

实现方式

分页(Paging):将内存和进程的地址空间都分为固定大小的块(页),进程的每个页可以在物理内存中的任何位置,不需要连续。

分段(Segmentation):将进程划分为多个逻辑段(如代码段、数据段、堆栈段等),每个段在内存中可以独立分配,段的大小不固定。

优缺点

优点:消除内存碎片问题,灵活性更高。

缺点:需要复杂的内存映射和地址转换,可能引入管理开销。

3. 虚拟内存管理(Virtual Memory Management)

概念:虚拟内存通过将硬盘的一部分作为扩展内存(交换空间或页面文件),允许程序使用比物理内存更多的内存。

实现方式

页面交换(Paging):将内存分为固定大小的页面,操作系统根据需要将内存页交换到硬盘中,进程运行时只需加载当前需要的页面。

分段交换:将整个段(如代码段)交换到硬盘中,适合较大块的内存管理。

优缺点

优点:程序能够使用比物理内存更多的内存,支持多任务操作。

缺点:访问硬盘时速度较慢,可能引发“交换抖动”(Thrashing),即频繁从硬盘交换数据,导致性能下降。

4. 内存池管理(Memory Pooling)

概念:内存池将内存预先分配好并组织为一个内存池,进程或线程从池中申请内存。这种方式常用于需要频繁分配和释放内存的场景。

特点:避免频繁的内存分配和释放,提升效率。

优缺点

优点:提高内存分配效率,避免碎片化。

缺点:可能造成内存的浪费,尤其是当内存池的大小过大或过小时。

5. 伙伴系统(Buddy System)

概念:内存被划分为大小为2的幂次方的块,每个块有一个伙伴,合并和分裂操作通过伙伴来管理,保证内存分配和回收时没有碎片。

特点:内存分配时每次分配2的幂次方大小的内存块,减少内存碎片。

实现:当一个内存块释放时,操作系统会查找其“伙伴”是否空闲,若空闲,则合并成一个更大的内存块。

4.什么虚拟内存?

虚拟内存是一种让程序认为它拥有连续的大内存的技术,实际上程序使用的内存可能分布在不同的物理位置,甚至不完全在内存中。

简单来说,虚拟内存让程序可以使用比实际物理内存更多的内存。操作系统通过将不常用的数据暂时存储到硬盘上的交换空间(swap space)来实现,只有当需要时再将它们加载回内存。

  • 让程序可以使用更多内存,比实际物理内存大。
  • 增强多任务处理能力,让多个程序能并行运行。

5.解释下内存碎片,内碎片,外碎片?

内碎片是分配的内存比需要的内存多,造成空间浪费。

外碎片是内存中有很多小块空闲空间,但这些小块不连续,无法被大内存块使用。

6.解释下虚拟地址,逻辑地址,线性地址,物理地址?

虚拟地址:程序看到的地址,由操作系统管理,跟物理内存无关。

逻辑地址:程序生成的地址(有时和虚拟地址一样),在分段管理中使用。

线性地址:在分页系统中,经过段映射后的地址,还需要分页才能得到物理地址。

物理地址:实际的内存地址,硬件操作的地址,直接对应内存中的位置。

7.虚拟内存置换方法是怎么样的?

虚拟内存的置换方法主要是通过选择合适的页面来腾出内存空间,常见的置换算法有:

FIFO:先来先服务,简单,但可能不够高效。

LRU:选取最久未使用的页面,效果较好。

LFU:选取最少使用的页面,适合访问频率较低的场景。

OPT:理论上最佳,但不可实现。

Random:随机置换,简单但不高效。

实际操作系统会根据不同情况选择适合的置换算法,以平衡性能和效率。

8.给你一个类,里面有static,virtual之类的,来说一说这个类的内存分布?

实例数据:存储在堆或栈中,每个对象有一份副本。

静态成员:类的所有实例共享,存储在数据段中。

虚函数表(Vtable):存储在只读数据区,类中每个对象有一个指向虚函数表的指针(Vptr)。

9.假设临界区资源释放,如何保证只让一个线程获得临界区资源而不是都获得?

要保证 临界区 资源的 互斥访问,通常需要使用同步机制,确保在同一时间只有一个线程能访问临界区。最常见的方法是使用 互斥锁(mutex)信号量(semaphore)

互斥锁(Mutex):在进入临界区时,线程会先尝试获取锁,如果锁已经被其他线程占用,当前线程将被阻塞,直到锁被释放。这样,多个线程就不会同时进入临界区。

信号量(Semaphore):信号量控制临界区的资源数量,确保不超过一定数量的线程同时进入临界区。二值信号量通常用于实现互斥锁。

10.操作系统中的缺页中断是什么?

缺页中断是虚拟内存管理中的一个重要概念。当程序访问一个当前不在物理内存中的页面时,会触发缺页中断。操作系统通过捕获这个中断并进行处理,加载所需的页面到内存中,从而让程序继续执行。

触发条件:程序访问的虚拟地址在物理内存中没有对应的页面。

处理过程

  1. 触发缺页中断。
  2. 操作系统暂停程序,查看页面是否在磁盘中的交换空间(Swap Space)或其他地方。
  3. 如果页面在硬盘中,将其加载到内存中。
  4. 更新页表,将虚拟地址映射到新的物理地址。
  5. 继续执行程序。

11.OS缺页置换算法如何实现的?

缺页置换算法是在缺页中断发生时,操作系统决定哪些页面需要被换出,并选择一个合适的页面进行替换。常见的缺页置换算法有:

LRU(Least Recently Used):选择最久未使用的页面进行置换。操作系统可以通过维护一个队列或时间戳来跟踪页面的使用情况,选择最近最少使用的页面换出。

FIFO(First In, First Out):最早加载到内存的页面优先被置换。操作系统维护一个队列,新的页面在队列尾部,最老的页面在队列头部,队列头部的页面会被置换。

OPT(Optimal):理论上最优的算法,选择未来最长时间不会被使用的页面进行置换。缺点是不可实现,因为操作系统无法预测未来的访问模式。

随机置换:操作系统随机选择一个页面进行置换,简单但不一定高效。

12.系统调用是什么,你用过哪些系统调用,和库函数有什么区别?

系统调用(System Call):系统调用是应用程序与操作系统内核之间的接口。当应用程序需要操作系统提供的服务(如文件操作、进程管理、内存分配等)时,会通过系统调用与操作系统交互。常见的系统调用包括 read(), write(), fork(), exec() 等。

库函数(Library Function):库函数是由程序库提供的预定义函数,它们封装了常见的操作(如数学计算、字符串处理等)。库函数通常是用户空间的代码,直接调用库函数不会进入操作系统内核。

13.为什么要有page cache,操作系统怎么设计的page cache?

Page Cache 是操作系统用来提高磁盘I/O性能的一种机制。它将磁盘文件内容缓存到内存中,避免每次访问文件时都需要从磁盘读取,提高了文件访问的速度。

原因

磁盘访问速度远远低于内存,频繁的磁盘I/O会极大影响性能。

文件内容往往会被多次访问,缓存可以减少重复读取磁盘的开销。

设计

操作系统会在内存中为文件数据保留一个缓存区,这个区域叫做页面缓存(Page Cache)。

当程序访问文件时,操作系统首先检查是否文件的数据已存在于缓存中。如果存在,直接从内存返回数据;如果不存在,操作系统会从磁盘读取数据并缓存到内存中。

采用 LRU 或其他替换算法来管理缓存中的数据,保证高效地使用有限的内存空间。

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

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

相关文章

动手学深度学习---深层神经网络

目录 一、神经网络1.1、模型训练1.2、损失函数1.2.1、分类&#xff1a;hinge loss/合页损失/支持向量机损失1.2.2、分类&#xff1a;交叉熵损失(softmax分类器)1.2.2.1 二分类交叉熵损失1.2.2.2 多分类交叉熵损失 1.2.3、回归&#xff1a;误差平方和&#xff08;SSE&#xff09…

java基础6(黑马)

一、static 1.static修饰成员变量 static&#xff1a;叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量按照有无static&#xff0c;分两种。 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机中只有一份&#xff0c;会被类的全部对象共享。…

Transformer 详解:了解 GPT、BERT 和 T5 背后的模型

目录 什么是 Transformer? Transformer如何工作? Transformer 为何有用? 常见问题解答:机器学习中的 Transformer 在技​​术领域,突破通常来自于修复损坏的东西。制造第一架飞机的人研究过鸟类。莱特兄弟观察了秃鹫如何在气流中保持平衡,意识到稳定性比动力更重要。…

【Prometheus】MySQL主从搭建,以及如何通过prometheus监控MySQL运行状态

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

百问网imx6ullpro调试记录(linux+qt)

调试记录 文章目录 调试记录进展1.开发板相关1.1百问网乌班图密码 1.2 换设备开发环境搭建串口调试网络互通nfs文件系统挂载 1.3网络问题1.4系统启动1.5进程操作 2.QT2.1tslib1.获取源码2.安装依赖文件3.编译 2.2qt移植1.获取qt源码2.配置编译器3.编译 2.3拷贝到开发板1.拷贝2.…

人脸识别与人脸检测技术

人脸识别技术,作为一种基于人的脸部特征信息进行身份识别的生物识别技术,近年来在人工智能和计算机视觉技术的推动下取得了显著进展。它利用摄像机或摄像头采集含有人脸的图像或视频流,自动在图像中检测和跟踪人脸,进而对检测到的人脸进行一系列计算和分别判断。这一技术不…

ansible使用学习

一、查询手册 1、官网 ansible官网地址&#xff1a;https://docs.ansible.com 模块查看路径&#xff1a;https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin 2、命令 ansible-doc -s command二、相关脚本 1、服务…

基于 PyTorch 的树叶分类任务:从数据准备到模型训练与测试

基于 PyTorch 的树叶分类任务&#xff1a;从数据准备到模型训练与测试 1. 引言 在计算机视觉领域&#xff0c;图像分类是一个经典的任务。本文将详细介绍如何使用 PyTorch 实现一个树叶分类任务。我们将从数据准备开始&#xff0c;逐步构建模型、训练模型&#xff0c;并在测试…

【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)

ps.源码放在最后面 设计FIR数字滤波器可以看这里&#xff1a;利用MATLAB配合ARM-DSP库设计FIR数字滤波器&#xff08;保姆级教程&#xff09; 设计IIR滤波器 MATLAB配置 设计步骤 首先在命令行窗口输入"filterDesigner"&#xff0c;接着就会跳出以下界面&#xf…

如何在本地部署deepseek?

1、打开ollama官网&#xff0c;点download&#xff08;下载需要翻墙 https://ollama.com/ 2、双击下载好的OllamaSetup.exe&#xff0c;一直点下一步即可。 3、winR 输入cmd&#xff0c;打开命令提示符&#xff0c;输入ollama。有以下提示即安装完成。 4、可以根据 nvidia-…

AJAX项目——数据管理平台

黑马程序员视频地址&#xff1a; 黑马程序员——数据管理平台 前言 功能&#xff1a; 1.登录和权限判断 2.查看文章内容列表&#xff08;筛选&#xff0c;分页&#xff09; 3.编辑文章&#xff08;数据回显&#xff09; 4.删除文章 5.发布文章&#xff08;图片上传&#xff0…

MarsCode AI插件在IntelliJ IDEA中使用

文章目录 前言一、MarsCode是什么&#xff1f;二、下载三、使用1、登录2、操作界面3、生成代码4、解释代码5、注释代码6、生成单测7、智能修复8、代码补全 总结 前言 随着 AI 技术浪潮席卷而来&#xff0c;各类 AI 工具呈爆发式涌现&#xff0c;深度融入我们的日常与职场&…

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站&#xff0c;www.mnxz.fun&#xff08;当然现在没啥流量&#xff09; 为例&#xff0c;详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…

C# OpenCV机器视觉:SoftNMS非极大值抑制

嘿&#xff0c;你知道吗&#xff1f;阿强最近可忙啦&#xff01;他正在处理一个超级棘手的问题呢&#xff0c;就好像在一个混乱的战场里&#xff0c;到处都是乱糟糟的候选框&#xff0c;这些候选框就像一群调皮的小精灵&#xff0c;有的重叠在一起&#xff0c;让阿强头疼不已。…

生信云服务器:让生物信息学分析更高效、更简单【附带西柚云优惠码】

随着生物信息学的快速发展&#xff0c;基因组测序、单细胞分析等复杂任务逐渐成为研究者们的日常工作。然而&#xff0c;个人电脑在处理这些任务时往往面临性能瓶颈&#xff0c;如内存不足、运算速度慢等问题&#xff0c;导致分析任务频繁失败或崩溃。为了解决这一难题&#xf…

【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面

【清晰教程】本地部署DeepSeek-r1模型-CSDN博客 目录 安装Docker 配置&检查 Open WebUI 部署Open WebUI 安装Docker 完成本地DeepSeek-r1的部署后【清晰教程】本地部署DeepSeek-r1模型-CSDN博客&#xff0c;通过Docker为本地DeepSeek-r1部署WebUI界面。 访问Docker官…

Flink-序列化

一、概述 几乎每个Flink作业都必须在其运算符之间交换数据&#xff0c;由于这些记录不仅可以发送到同一JVM中的另一个实例&#xff0c;还可以发送到单独的进程&#xff0c;因此需要先将记录序列化为字节。类似地&#xff0c;Flink的堆外状态后端基于本地嵌入式RocksDB实例&…

快速部署 DeepSeek R1 模型

1. DeepSeek R1 模型的介绍 DeepSeek R1 模型是专为自然语言处理&#xff08;NLP&#xff09;和其他复杂任务设计的先进大规模深度学习模型 &#xff0c;其高效的架构设计是一大亮点&#xff0c;能够更高效地提取特征&#xff0c;减少冗余计算。这意味着在处理海量数据时&…

数据库系统概念第六版记录 四

1.sql组成 SQL 是最有影响力的商用市场化的关系查询语言。SQL 语言包括几个部分: 数据定义语言(DDL) &#xff0c;它提供了定义关系模式、删除关系以及修改关系模式的命令。 数据操纵语言(DML) &#xff0c;它包括查询语言&#xff0c;以及往数据库中插入元组、从数据库中删…

DeepSeek在FPGA/IC开发中的创新应用与未来潜力

随着人工智能技术的飞速发展&#xff0c;以DeepSeek为代表的大语言模型&#xff08;LLM&#xff09;正在逐步渗透到传统硬件开发领域。在FPGA&#xff08;现场可编程门阵列&#xff09;和IC&#xff08;集成电路&#xff09;开发这一技术密集型行业中&#xff0c;DeepSeek凭借其…