第四章-存储器管理

存储部件

主存:保存进程运行时的程序及数据
寄存器:速度最快,价格昂贵且容量不大,一般以字为单位
高速缓存:
(1)速度比内存快,集成在CPU
(2)存放内存的部份拷贝,放置常用数据以提高速度
(3)不能被程序直接更改,由硬件自己处理对内存数据的拷贝
磁盘缓存:内存的一部分,将频繁使用的磁盘数据预读在磁盘缓存,减少磁盘读写时间

存储器管理

重点是内存管理,可直接影响存储器的利用率和系统性能
(1)存储器资源的分配与回收
(2)地址变换(逻辑与物理地址的对应关系维护)
(3)存储共享和保护
(4)虚拟存储的调度算法

程序的装入和链接
多道环境下,程序的运行须先创进程,闯进丞则须先将程序和数据装入内存
编译->链接->装入

  • 地址的概念
    ☞逻辑地址(相对地址,虚地址):程序经过编译形成的目标代码,不能在内存中读取信息
    ☞物理地址(绝对地址,实地址):内存中存储单元的地址,可被直接寻址
  • 装入中的地址处理
    (1)绝对装入方式:逻辑地址==物理地址
    (2)静态可重定位装入方式:执行前映射,重定位后物理地址不改变
    优点:不需硬件支持,可装入有限的多道程序
    缺点:一个程序需占用连续的内存空间且装入后无法移动,不易实现共享
    (3)动态运行时(重定位)装入方式:依靠重定位寄存器(硬件),地址转换在程序真正要执行时进行
    被记录的基地址不一定固定,可能根据内存使用情况变化更新

重定位:把目标程序中的指令和数据的逻辑地址变为内存中物理地址的过程

  • 进程在内存中的位置记录
    (1)整体连续在内存中的:记录基地址
    (2)离散装入不同内存位置的:记录多个偏移用的基地址

不同程序的连接装入方式(内存使用时机)

  • 静态链接:装入运行前将目标模块及所需库函数链接成整体且不在拆分
  • 装入时动态链接:装入内存时边装入边链接
    在这里插入图片描述在这里插入图片描述
  • 执行时动态链接:在需要某些目标块时才进行的链接
    在这里插入图片描述

连续分配存储管理方式

单一连续分配(最简单,用于单用户单任务):将内存分为系统区与用户区
利:易于管理;弊:易浪费内存空间
固定分区分配(多道程序系统和分时系统):将内存分为多个区域,操作系统占一个,每个应用进程各占一个。几个分区便只允许几个程序多道并发

  • 分区大小划分
    (1)大小相同:使用多个相同程序并发,缺乏灵活性
    (2)大小不等:多个小,适量中,少量大,根据程序大小分配

  • 所需数据结构
    (1)建立记录相关信息的分区表,表项为|起始位置|大小|状态|
    (2)分区表中表项值随内存的分配与释放而动态改变

  • 内存分配过程
    (1)分区表被分为空闲分区表和占用分区表
    (2)空闲分区表根据算法将表项进行排序
    (3)检索空闲分区表,将满足要求且尚未分配的分区派给程序;若未找到合适分区则拒绝程序请求

  • 固定分配不足的原因
    (1)内碎片(一个分区内的剩余空间)造成浪费
    (2)分区总数固定,限制了并发程序执行的程序数目

动态分区分配:装入程序是根据程序需要动态分配内存空间
☞优点:并发进程数无固定限制,不产生内碎片
☞缺点:有外碎片

  • 所需数据结构
    (1)空闲分区表 (2)空闲分区链(有前后向指针)

  • 分区分配算法
    【首次适应算法FF】
    (1)以地址递增的方式为空闲分区排序
    (2)分配时从链首检索满足要求的空闲分区
    (3)从分区中分出作业所需大小,余下空间仍留在空闲链表中
    ☞优点:优先利用内存低址部分,保留了大部分高址空闲区
    ☞缺点:随着低址部分的不断划分会产生较多小碎片;每次查找都从低址开始会逐渐增加查找开销
    【循环首次适应算法】
    (1)按地址将空闲分区排序
    (2)从上次找到的空闲分区的下一分区开始查找,直到找到满足要求的分区(需设置起始查询指针并采用循环查找方式)
    (3)分出所需大小
    ☞优点:分区分布均匀,减少查找开销
    ☞缺点:缺少大的空闲分区
    【最佳适应算法】
    (1)将空闲分区按容量从小到大排序
    (2)从链首开始检索,找到第一个满足的就分配
    (3)分出所需大小
    ☞缺点:会产生较多难以利用的外碎片
    【最差适应算法】
    ☞基本不留小空闲分区,但可能缺乏较大空闲分区
    【快速适应算法】
    (1)根据进程常用空间进行大小划分,相同大小的串成链
    (2)进程需要时从最接近需求的链中摘取一个分区进行分配
    ☞能快速找到合适分区,但须管理较多链表信息(空间换时间)

分页存储管理方式

更细粒度的处理空间,就按少粗放管理或开销问题。内利使用率高,浪费少(不是绝对没有碎片)
页面
内存划分为大小为单元k的物理块,作业按大小为k划分为页面
☞物理划分块的大小=逻辑划分页的大小

  • 太大:最后一页的内碎片增大

  • 太小:提高了利用率(页面碎片总空间减小),但进程的页面数量过多,页表过长,增加了空间使用

页表:页号到物理块号的地址映射

地址处理

  • 逻辑地址组成:页号+页内地址(偏移量)
  • 偏移量=log2(页面大小)
  • 页号位数=log2(页数)
  • 业内地址位数=log2(页面大小)=页号位数*页面大小
  • 块内偏移=页内偏移

地址变换机构

设置一个页表寄存器PTR,记录页表首地址和页表长度,便于快速定位

  • 进程A的地址变换
    (1)运行时,将PCB中页表信息写入PTR
    (2)根据分页原理,在执行指令时得到页号和内部偏移量
    (3)CPU访问PTR找出页表
    (4)查找页表数据找出对应物理块,完成地址映射,在内存中找到该指令
    检索前会判断是否发生越界错误

访问内存的有效时间EAT
☞ 进程发出访问请求后,经过地址变换找到对应的物理地址单元并取出数据所花费的总时间
设访问一次内存的时间为t,则EAT=2t
(1)访问内存中页表
(2)访问物理块

  • 高速缓冲寄存器(快表)
    为减少第一步访问内存时间,具有“并行查询能力”,存放正在执行进程的页表数据项
    设a为查询命中率,t’为查询一次快表所需时间:EAT=at’+(1-a)(t+t’)+t=2t+t’-at
  • 不足
    容易造成共享和非共享数据共处一页,不方便设置权限

分段存储管理方式

将作业分成若干段,各段可离散放入内存,段内仍连续存放。方便用户和使用上的要求

- 特点:

  • 基本特点
    (1)每段有自己的名字,都从0编址,可分别编写和编译。装入内存时,每段赋予一个段号
    (2)每段占据一块连续内存
    (3)各段大小不等,由编译程序决定

  • 段表与地址变换机构
    ☞段表记录每段实际存放的物理地址(内存首地址和段长)
    相对地址:段号+段内地址

分段与分页的主要区别
在这里插入图片描述

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值