操作系统概念-内存管理

2024-09-06 02:32

本文主要是介绍操作系统概念-内存管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1请说明内部碎片和外部碎片的区别:

答:内部碎片(internalfragment),通常是指将内存以固定大小的块进行分配,采用这种方案,进程所分配的内存可能比所需的大,

多出来的未被使用的内存叫做内部碎片。

外部碎片(externalfragment),通常是指随着进程移进移出内存,内存的空闲空间被分割成小片段,当所有的总的可用内存之和可以满足分配请求,但是却不连续,就出现了外部碎片问题。

页式虚拟存储系统存在内部碎片,段式虚拟存储系统存在外部碎片(需解释此处)

相关知识点:1分页

分页(paging)允许进程的物理地址空间是非连续的,

基本实现方法是将物理内存分成固定大小的帧(frame),把逻辑内存分成固定的页(page),且页的大小等于帧。


如果逻辑地址空间共有2^m,每页的大小是2^nbyteor word), 则逻辑地址的高

m-n位表示页码,低n位表示页内的偏移量。

分页技术不会产生外部碎片,但是有内部碎片,现在,页的大小一般为4-8KB


注意用户进程一般情况是不能访问非它所占用的内存的,它无法访问其页表所规定的之外的内存,那么这是怎么做到的呢?

每个进程都有自己的页表。通常有一位与页表中的每一个条目相关联,有效-无效位,当该位有效,表示相关的页在此进程的逻辑地址空间内,也就是说该页被分配了帧。如果无效位,就表示该页不在此进程的逻辑地址空间内,由此可以捕捉到非法的地址。

由于操作系统管理物理内存,它必须知道内存中所有帧的分配情况,由此,操作系统维持着一个帧表,每个条目对应一个帧。表示该帧是否被占用,如果占用,被哪个进程的哪个页占用。










页码在TLB中被查找到的百分率成为命中率,假如查找TLB20ns,访问内存100ns,如果hit,则需要时间100ns,如果没有hit,则需要时间20+100+100= 220ns, assume 命中率80%,则有效内存访问时间0.8* 120 + 0.2 *220 = 140ns.






2考虑下列生成二进制的过程,编译器被用来生成单个单元的目标代码,链接器被用来将多个目标单元合并成一个程序二进制,链接器如何改变指令和数据到内存地址的绑定?需要什么信息从编译器传递给链接器,以协助完成链接器的内存绑定:

答:不会。以后再答


3如果有内存块100KB500KB200KB300KB,和600KB,(按顺序),首次适应算法,最佳适应算法,最差适应算法各自将怎样放置大小分别为212KB417KB,112KB426KB的进程,哪一种算法的内存利用率高:

答:

first-fit:

212KB-> 500KB

417kb-> 600KB

112kb-> 288KB(500KB- 212KB = 288KB)

426kb-> wait

best-fit:

212KB-> 300KB

417KB-> 500KB

112KB-> 200KB

426KB-> 600KB

worst-fit:

212KB-> 600KB

417KB-> 500KB

112KB-> 388KB(600KB- 212KB = 388KB)

426Kb-> wait:

best-fitis best way in allocating memory.


相关知识:以上三种方法都属于动态存储分配问题

1首次适应算法:分配第一个连续的足够大的内存块,查找可以从头开始,也可以从上次首适应结束时开始,一旦找到足够大的内存块,就停止查找。

2最佳适应:分配最小的连续的足够大的内存块。

3最差适应:分配最大的连续的足够大的内存块。

模拟结果显示,首次和最佳均好于最差适应,但是首次和最佳差不多。




4假设一个将页表放在内存中的分页系统:

a如果一次内存访问需要200ns,访问一页内存要用多长时间。

b如果加入TLB,并且75%的页表引用发生在TLB,内存的有效访问时间是多少,(假设在TLB中查找页表项的占用零时间,如果页表项在其中。)

答:a: 200ns + 200ns = 400ns

b0.75*200ns + 0.25 * 400ns = 250ns.


5为什么时常将分页和分段在同一个方案里面结合使用:

答:将分段和分页结合,获取分页和分段的好处,又一定程度避免单独分页和分段的坏处。

相关知识点:

在页式存储系统中,一个存在的问题是,页表的条目太大,且供用户使用的逻辑地址是连续的,导致大型程序缺乏逻辑结构。用户希望他们的程序是由若干段构成的。当一个进程被调用时,它的各个段被调用内存并且构造段表。

段式管理的内存分配和释放:

1当进程要求调入某一段时,内存中有足够的空闲区满足条件,采用和动态内存管理方法(前面有提到)分配内容(注意此时产生外部碎片)。

2内存中没有足够的空闲区满足该段的内存要求。就置换出一段时间内不会被CPU访问的段。


分段式的好处

段的逻辑独立性使其易于编译、管理、修改和保护,也便于多道程序共享。

段长可以根据需要动态改变,允许自由调度,以便有效利用主存空间。

方便编程,分段共享,分段保护,动态链接,动态增长



因为段的长度不固定,段式虚拟存储器也有一些缺点:

主存空间分配比较麻烦。

容易在段间留下许多碎片,造成存储空间利用率降低。

由于段长不一定是2的整数次幂,因而不能简单地像分页方式那样用虚拟地址和实存地址的最低若干二进制位作为段内地址,并与段号进行直接拼接,必须用加法操作通过段起址与段内地址的求和运算得到物理地址。因此,段式存储管理比页式存储管理方式需要更多的硬件支持。

一个C编译器可能会创建如下段:

1代码2全局变量34每个线程采用的栈5标准的C库函数。

编译时链接的库可能被分配不同的段,加载程序装入这些段,并分配段号。

逻辑地址:

<segment-number,offset>.


6试说明为什么使用分段比使用纯分页更容易共享一个可重入模块:

答:在纯分页的系统中,所谓共享就是将多个进程的页表项指向相同的帧,这很困难,首先1页与帧的对应操作对用户进程其实是透明的。2被共享的部分不一定刚好是一个完整的页面大小,这样就包含了本不该包含的信息,不利于保密

在分段的系统中,多个进程的段表的相应表项都指向可重用模块的统一物理副本。因为段表中有存储段的长度,所以可以防止越界。多道程序设计,要防止一个进程读取数据时,另一个进程修改共享模块的数据和代码。


7某系统采用分页存储管理方式,拥有逻辑空间32页,每页2K,拥有物理内存1M

1写出逻辑地址的格式

2若不考虑访问权限,进程的页表项有多少项,每项至少有多少位?

3如果物理空间减少一半,页表结构应做怎么样的调整。

1<page-number, offset> page-number = 5 offset = 11

232 ,每项至少有9

3如果物理空间减少一半,页表项数目不变,逻辑地址

<page_number,offset> page_number = 5 offset = 11

每项至少是8位。










8请描述段页式管理系统:

为了实现段页式管理,系统必须为每个作业或进程建立一张段表以管理内存分配与释放、缺段处理、存储保护相地址变换等。另外,由于一个段又被划分成了若干页,每个段又必须建立一张页表以把段中的虚页变换成内存中的实际页面。显然,与页式管理时相同,页表中也要有相应的实现缺页中断处理和页面保护等功能的表项。另外,由于在段页式管理中,页表不再是属于进程而是属于某个段,因此,段表中应有专项指出该段所对应页表的页表始址和页表长度。

在段页式管理系统中,要对内存中指令或数据进行一次存取的话,至少需要访问三次以上的内存:

第一次是由段表地址寄存器得段表始址后访问段表,由此取出对应段的页表在内存中的地址。第二次则是访问页表得到所要访问的物理地址。第三次才能访问真正需要访问的物理单元。这将使CPU的执行指令速度大大降低。为了提高地址转换速度,设置相关的寄存器保存当前最常用的段号->页表,页表->页号等。

这篇关于操作系统概念-内存管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140747

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)