操作系统概念-内存管理

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

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Linux中查看操作系统及其版本信息的多种方法

《Linux中查看操作系统及其版本信息的多种方法》在服务器运维或者部署系统中,经常需要确认服务器的系统版本、cpu信息等,在Linux系统中,有多种方法可以查看操作系统及其版本信息,以下是一些常用的方... 目录1. lsb_pythonrelease 命令2. /etc/os-release 文件3. h

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版