深入浅出处理器(下)_内存管理(映射)

专题1—深入浅出处理器

处理器(下)_内存管理(映射)

1.内存管理单元(MMU)

内存管理单元简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访问权限的检查保护每个进程所用的内存不被其他进程破坏。操作系统系统内存管理单元实现虚拟内存和内存保护。
重点就在于地址映射:页表的结构与建立、映射的过程。

2.问题:下面程序输出结果是否完全相同?

int g_v = 1;

int main(void)
{
    printf("g_v = %d\n", g_v);
    printf("&g_v = %p\n", &g_v);
    Pause(1);

    return 0;
}

按照正常逻辑分析,理论上上不同进程在内存中的不同位置执行,因此,全局变量地址不同。
实验结果:

运行后地址相同,和我们预期的不同,原因在于我们基于操作系统所使用的地址都是虚拟地址。

经常被以往的事实:
应用程序开发时,面对的内存为虚拟内存,虚拟内存模式下使用的内存为虚拟地址,个一个进程拥有自己独立的虚拟地址空间。虚拟内存于实际物理内存无关,时一个假想的足够大的内存空间。
所以,内存需求为1G的应用程序也可以运行在实际内存为256M的计算机上。

3.3虚拟内存的意义

虚拟内存的意义在于,能够支持多个打内存需求量的进程同时运行于较小的物理内存中。

4虚拟内存的机制

A.虚拟内存需要重新映射到物理内存。
B.虚拟地址映射到物理内存中的实际地址。
C.每次只有进程的少量代码在物理内存中运行
D.大部分进程代码位于存储区中

3.5页式内存管理

页时一个内存单位,指一定数量的内存,通常一页的大小时4K
虚拟内存管理和物理内存以页为单位进行管理
进程的活动页被载入内存时,记录页地址的映射关系

页式内存管理分为两个部分:(p, d)
P 指的是地址高位,页编号
d 指的是地址地位,页内偏移量



3.6如何提升电脑性能,why?
A.更换主频更高的处理器(同系列):当主频更高时上述流程中的查询速度和换入换出的速度都将提高,自然提升了电脑的读写速度,从而提高新能。
B.增加物理内存大小:增加物理内存则减少了上述流程的换入和换出次数。
C.更换SSD固态硬盘:增加了内存读写的速度。

原文地址:http://blog.51cto.com/11134889/2070658

时间: 2024-11-03 01:40:23

深入浅出处理器(下)_内存管理(映射)的相关文章

ARC下的内存管理

1.ARC下单对象内存管理 局部变量释放对象随之被释放 int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [[Person alloc] init]; } // 执行到这一行局部变量p释放 // 由于没有强指针指向对象, 所以对象也释放 return 0; } 清空指针对象随之被释放 int main(int argc, const char * argv[]) { @autoreleasepool

iOS: ARC & MRC下string内存管理策略探究

ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作没我们想的那么简单,下面就让我们一起看看NSString和NSMutableString在MRC下执行retain,copy,mutableCopy,以及ARC下不同的修饰__weak, __strong修饰赋值究竟发生了什么. 一.验证代码如下: - (void)testStringAddress { i

STL容器存储的内容动态分配情况下的内存管理

主要分两种情况:存储的内容是指针:存储的内容是实际对象. 看下面两段代码, typedef pair<VirObjTYPE, std::list<CheckID>*> VirObj_CheckID_pair; class LangChecker { public:     LangChecker();     ~LangChecker();         void Register(VirObjTYPE type, CheckID id); private:     std::m

LDD读书笔记_内存管理

本部分不仅仅是LDD的介绍部分, 还包括了对linux的内存模型的总结. 一句话总结 伙伴系统是基石, slab基于伙伴系统, kmalloc基于slab. 要点 ?伙伴系统是对连续大内存而言, 得到的内存的单位从1个page到211 page, 解决外部碎片问题. ?Slab分配器是针对小内存而言, 从32B到128KB, 解决的是内部碎片问题, kmalloc是基于slab分配器的. ?如果物理内存加上需要映射的IO空间内存的大小加起来超过896M, 则有必要开启highmen的功能. Ag

glibc下的内存管理

在解码过程中我们也遇到了类似的问题,第一次解码的音频比较大60s,耗了3G的内存,reset之后内存并没有退还给操作系统,第二次即使解一个10s的音频 几周前我曾提到,我被项目组分配去做了一些探究linux下内存管理机制的活儿.因为我们的产品遇到了一些与之相关的“诡异”问题.这些问题以及相关情况可以概括如下: 先介绍一下相关的背景.由于我们是3D软件,所以用户经常会有“导入/导出”各种geometry的需求.而一个存储这些数据的文件,可能含有不止一个geometry,而且每个geometry中也

内存管理---映射

Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此Linux的虚拟地址空间也为0-4G.Linux内核将这4G字节的空间分为两部分.将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为"内核空间".而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF)供各个进程使用,称为"用户空间".因为每个进程可以通过系统调用进入内核,因此Linux内核由系统内的所有进程共享.于是,从具体进程的角度来看,每个进程

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

  内存泄漏 : 应当废弃的对象在超出生命周期后继续存在 内存管理 : 遵守配对原则,有alloc/new/copy/mutableCopy就要有相对应的release或autorelease 原因 : Oc对象是在堆里面的(动态分配),堆里面的内存由我们程序员来管理 : 对象操作 Objective –c 对应方法 生成并持有对象 alloc/new/copy/mutableCopy等 持有对象 retain 方法 释放对象 release方法 废弃对象 dealloc方法(系统自动调) 内存

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

一.内存管理的?式 大家都去过图书馆,而图书馆里的书是可以借出的.我们来设想这样一个场景,大家都去借书,但是从来没有人去还书,那么最后,这个图书馆会因为无书可借而倒闭,每个人都没法再使用图书馆.计算机也是这样,当程序运行结束时,操作系统将回收其占用的资源.但是,只要程序运行就会占用资源,如果不进行清理已经不用的资源,资源最终将被耗尽,程序将崩溃. 学会内存管理我们就明白什么时候由你释放对象,什么时候你不能释放.C语言中通过malloc.calloc.realloc和free搭配对内存进行管理.但

iOS开发_内存管理

1.ObjC中对象是存储在堆中的,系统并不会自动释放堆中的内存,但是基本类型是由系统自己管理的,放在栈上. 2.要开发一个程序并不难,但是优秀的程序则更测重于内存管理,它们往往占用内存更少,运行更加流畅. 3.野指针就是指针所指向的内存地址已经被系统回收,而指针没有被置为空;内存泄露就是该被回收的对象没有被回收,导致内存被占用,也就是内存泄露. 4.在ObjC中给空对象发送消息是不会引起错误的. 5.属性参数: retain:先release,再retain,用于非字符串对象 copy:先rel