操作系统之内存管理(二)

1 前面已经有了分段的概念,那么为什么 有分页的出现呢?

这是为了提高内存分区导致的内存效率问题,在程序转载到内存的时候,我们知道程序是分段载入的,通过内存分区来装载不同的段。那么如果有下面问题,我现在需要请求的空间为160k,而我的总空闲空间是大于160k的,但是没有一个空闲分区大于160k,那么按照分区的管理,就无法利用这总共的内存区域,而内存中的空闲区域也就变成了内存碎片,为了解决这个问题,引出了分页机制!其实就是将内存分成更小的块来进行管理,每块为4k

2 有了分页机制之后,我们的内存分配单元就变成以页为分配单位了,并且同一个段的不同页是可以不连续的,如下图:

回答上图的问题,最大的内存浪费不超过4k,因为每个页的空间大小是4k,最多浪费是无限接近于4k,这个值比起原来的160k已经改善很多了

3, 现在来回答最后一个问题,有了分页机制之后,每执行一条指令,如何得到它的物理地址,也就是说如何从逻辑地址变为物理地址。与分段类似,这里引出了页表, 每个页表保存着页号和页框号(页表保存在PCB中),除以4k相当于右移12位,每次执行通过硬件(内存管理单元)得到物理地址,就能保证正确的执行!

时间: 2024-10-02 07:44:46

操作系统之内存管理(二)的相关文章

操作系统概念学习笔记 16 内存管理(二) 段页

操作系统概念学习笔记 16 内存管理 (二) 分页(paging) 分页(paging)内存管理方案允许进程的物理地址空间可以使非连续的.分页避免了将不同大小的内存块匹配到交换空间上(前面叙述的内存管理方案都有这个问题,当位于内存中的代码和数据需要换出时,必须现在备份存储上找到空间,这是问题就产生了.备份存储也有前面所述的与内存相关的碎片问题,只不过访问更慢). 传统上,分页支持一直是由硬件来处理的.最近的设计是通过将硬件和操作系统相配合来实现分页. 基本方法 实现分页的基本方法设计将物理内存分

操作系统之内存管理(一)

物理内存与虚拟内存 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在Linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(SwapSpace). 作为物理内存的扩展,Linux会在物理内存不足时,使用交换分区的

操作系统:内存管理(概念)

对于计算机系统而言,操作系统充当着基石的作用,它是连接计算机底层硬件与上层应用软件的桥梁,控制其他程序的运行,并且管理系统相关资源,同时提供配套的系统软件支持.对于专业的程序员而言,掌握一定的操作系统知识比不可少,因为不管面对的是底层嵌入式开发,还是上层的云计算开发,都需要使用到一定的操作系统相关知识. 内存管理有哪几种方式 分段和分页的区别是什么 什么是虚拟内存 什么是内存碎片什么是内碎片什么是外碎片 虚拟地址逻辑地址线性地址物理地址有什么区别 Cache替换算法有哪些 内存管理有哪几种方式

OC内存管理(二)

一:autorelease 1> autorelease原理:将我们创建的对象放到一个对象释放池中(是一个栈区)当池子释放时,会将池子中的对象都做一次release操作(自动释放池存放在一个池子中,就近原则,符合先进后出) 2>自动释放池的创建方式 (1)ios 5.0以前的创建方式 NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; ````````````````` [pool  release];//[pool drain]

操作系统之内存管理

1.内存中都存储什么? 操作系统和进程,特别是多道程序设计时,要将主存继续细分: 2.内存管理需要做那些事情? 重定位:实现重定位进程就不需要记录以前自己在主存中的位置,以此实现进程换入/换出(进程的页或段换入主存时可以定位到在主存中的物理位置),也就是在进程运行时计算逻辑地址对应的物理位置. 保护:保护进程不受其他进程无意或有意的干涉.比如进程A和进程B,如果A没有授予B权限,那B就不能访问A,其次,每次执行进程时要确定访问的是该进程的东西. 共享:进程不能单打独斗,有时候需要和其他进程一起完

操作系统之内存管理(一)

1 操作系统想要管理内存,首先得利用内存.那么如何利用内存呢,在我们程序要执行的时候,我们需要将程序装载到内存中,pc指向开始地址,并且让cpu取址执行,于是我们就利用上了内存. 2那么我们首先考虑一下如何将程序装载到内存中,操作系统会找寻一段空闲的区域,让我们的程序装载进去,而在我们编写的程序中,如call 40,40是一个相对地址,相对于这个程序的偏移量,但是装载到空闲内存的时候,我们又是如何得知,这个40变为多少了呢?这就引出了重定向的概念.如下图,我们希望到内存的时候,call 40变为

操作系统之内存管理1

1. 2.内存管理需要达到的目的? 1)地址保护:多道程序之间互不干扰,一个进程不能随便访问另外一个进程的地址空间. 2)地址独立:程序发出的地址与具体机器的物理主存地址是独立的. 3.为什么提出了虚拟内存? 在计算机中,一个程序要运行,必须加载到物理主存中,但是物理主存的容量是非常有限的,因此我们要把一个程序全部加载到主存,我们的每一个程序大小就要限制.另外,即使我们编写的每一个程序的大小都小于物理主存的容量,但主存能够存放的程序数量也是有限的.这将大大限制多道编程的发展,所以我们发明了虚拟内

Objective-C学习笔记_内存管理(二)

一.属性的内部实现原理 assign的属性内部实现 setter方法: // setter方法 @property (nonatomic, assign) NSString *name; - (void)setName:(NSString *)name { _name = name; } getter方法: // getter方法 - (NSString *)name { return _name; } 观察下面代码会出现什么问题? NSString *name = [[NSString all

JVM内存管理(二)

JVM内存管理 JVM在执行java程序的过程中,会把内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁. 程序计数器 程序计数器:当前线程所执行字节码的行号指示器. 由于JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器只会执行一条线程中的指令.为了线程切换后能够恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各线程之间计数器