内存管理

内存管理:分页,分段,段页结合

社会主义新天地 提交于 2020-01-04 14:33:37
进程如何使用内存 进程是操作系统资源分配的最小单元。操作系统分配给进程的内存空间中包含五种段:数据段、代码段、BSS、堆、栈。 数据段 :存放程序中的静态变量和已初始化且不为零的全局变量。 代码段 :存放可执行文件的操作指令,代码段是只读的,不可进行写操作。这部分的区域在运行前已知其大小。 BSS段 ( Block Started By Symbol):存放未初始化的全局变量,在变量使用前由运行时初始化为零。 堆 :存放进程运行中被动态分配的内存,其大小不固定。 栈 :存放程序中的临时的局部变量和函数的参数值。 内存区域中以上五个段的组织形式: 逻辑地址、相对地址与物理地址 逻辑地址 : 与当前数据在内存中的物理分配地址无关的访问地址,在执行对内存的访问之前必须转化为物理地址。 相对地址 : 特殊的逻辑地址,相对于某些已知点的存储单元。 物理地址 :数据在主存中的实际位置 内存管理技术 几种内存管理技术整理 技术 简要说明 优点 缺点 固定分区 主存被分为很多大小固定的分区,进程可以装载到大于等于自身大小的分区。 实现简单 1. 有内部碎片 2. 活动进程的数目是固定的 动态分区 分区是被动态创建的,进程可以装载到正好等于自身大小的分区。 没有内部碎片,内存使用更完全 有外部碎片,需要压缩外部碎片 简单分页 主存被分为很多大小相同的帧,进程被分为很多与帧大小相同的页。要装入一个进程

《30天自制操作系统》笔记(07)——内存管理

我的梦境 提交于 2020-01-04 14:31:39
《30天自制操作系统》笔记(07)——内存管理 进度回顾 上一篇 中处理掉了绝大部分与CPU配置相关的东西。本篇介绍内存管理的 思路 和 算法 。 现在想想,从软件工程师的角度看,CPU也只是一个软件而已:它的功能就是加载指令、执行指令和响应中断,而响应中断也是在加载指令、执行指令。就像火车沿着一条环形铁轨前进;当中断发生时,就好像铁轨岔口处变轨了,火车就顺着另一条轨迹走了;走完之后又绕回来重新开始。决定CPU是否变轨的,就是CPU里的特定寄存器。 这是题外话,就此为止。 什么是内存管理 假设内存大小是128MB,应用程序A暂时需要100KB,画面控制需要1.2MB……。 像这样,操作系统有时要 分配 一定大小的内存,用完后又要 收回 。因此,必须管理好哪些内存空闲可用,哪些正在被占用。这就是内存管理。 内存管理的两个任务,一是内存分配,一是内存释放。 如何获取内存容量 检查内存容量的方法 要管理内存,首先得知道操作系统所在的这个计算机内存有多大。检查内存容量的方法很简单,就是从要检查的起始位置到最后位置依次写入一个数值(例如0xaa55aa55),然后按位反转,检查是否正确地完成了反转(变成0x55aa55aa);然后再次反转,检查是否正确地完成了反转。如果反转结果都是正确的,说明这个地址的内存是存在的;否则就说明内存的最大地址就到此为止了。其代码如下。 1 unsigned

Spark调优指南

情到浓时终转凉″ 提交于 2020-01-03 08:13:03
Spark相关问题 Spark 比 MR 快的原因? 1) Spark 的计算结果可以放入内存,支持基于内存的迭代, MR 不支持。 2) Spark 有 DAG 有向无环图,可以实现 pipeline 的计算模式。 3) 资源调度模式: Spark 粗粒度资源调度, MR 是细粒度资源调度。 资源复用: Spark 中的 task 可以复用同一批 Executor 的资源。 MR 里面每一个 map task 对应一个 jvm ,不能复用资源。 Spark 中主要进程的作用? Driver 进程:负责任务的分发和结果的回收。 Executor 进程:负责具体任务的执行。 Master 进程: Spark 资源管理的主进程,负责资源调度。 Worker 进程: Spark 资源管理的从进程, woker 节点主要运行 Executor Spark调优 1. 资源调优 1) .搭建Spark集群的时候要给Spark集群足够的资源(core,memory) 在 spark安装包的conf下spark-env.sh SPARK_WORKER_CORES SPARK_WORKER_MEMORY SPARK_WORKER_INSTANCE 2) .在提交Application的时候给Application分配更多的资源。 提交命令选项:(在提交 Application的时候使用选项) -

【Objective-C学习记录】第四天

天大地大妈咪最大 提交于 2020-01-03 07:21:43
初学iOS,对OC机制理解可能还不深入,需要后期大量学习,在此记录只为回顾每天的知识点。 OC内存管理:   -alloc:分配内存空间,可以理解为C语言中的malloc   -retain:引用计数。比如实例化一个对象时,给该对象的引用计数器加1   -release:引用计数。与retain配对,给对象的引用计数器减1   引用计数是苹果早期使用的一种内存管理技术,与C++的手动管理内存一样被人诟病。忘了释放内存会造成内存泄漏,提前释放又可能导致其他引用该对象的指针变成空指针从而引起程序崩溃。所以后来提出了自动管理的技术ARC,这样就不用手动管理内存的分配和释放,带来的不利之处是导致性能降低,因为该技术不考虑任何逻辑,在对象实例化时增加技术,释放时减少技术,即使一些不必这样操作的也会如此,所以会降低一定的性能。   -ARC   -autorelease:自动释放。这里的自动释放并不是说该内存空间会自动在销毁时释放,可以说应该叫延迟释放,比如这一帧可能不释放,下一帧就释放了。这个主要是用来避免频繁的申请和释放内存空间。 Property结构   许多OOP中都有setter和getter,也就是设置和获取成员变量的值,如果要在OC中实现,就得写这一串又臭又长的东西:   -(void) setName : (NSString *)name   {     _name =

LINUX虚拟地址空间总结

冷暖自知 提交于 2019-12-30 23:11:29
目录 1.虚拟内存空间解决了什么问题? 2.LINUX虚拟内存空间结构 3.页表 1.虚拟内存空间解决了什么问题? 闲谈:在研究虚拟地址空间,看到了一篇博客,说:在看到一项技术时,如果直接去看他的概念、用法、而忽视了他对比以前的技术有什么提升,解决了了以前技术中的哪些问题,这样是很不负责的。 正题:在计算机技术发展的早期,通常程序是直接访问物理地址的,只要程序需要的内存大小不超过物理内存空间大小就不会出错,我们就不用考虑内存管理这个麻烦的事。但现在我们能看到,我们周围的大多数计算机都是多进程运行。这时候问题就来了,假设现在物理内存有128M,1号进程需要10M进程,2号进程需要100M进程,3号进程需要20M进程,这时候我们可同时运行1,2号进程,1号进程占用0-10M内存地址,2号进程占用11-100的内存地址。这时候,如果还想运行3号进程,如果直接在物理内存上运行时,就不能实现了。于是乎,为了解决这个问题,产生了虚拟内存技术。暂时将不用的数据存储在硬盘中了。但这个方法也有一些缺点 物理内存不隔离:所有程序直接访问物理内存,如果有一些恶意代码,会非常容易干扰正常运行的其他代码。 内存使用效率低下:如果我们要像让程序1、2、3、同时运行,那么唯一的方法就是使用虚拟内存技术将一些程序暂时不用的数据写到磁盘上,在需要的时候再从磁盘读回内存。这里程序3要运行

C#内存管理与垃圾回收

核能气质少年 提交于 2019-12-29 02:32:45
垃圾回收还得从根说起,就像生儿育女一样。 根 :根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null。根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为定义的变量就存在线程栈上,类型对象指针存在托管堆中,因为实例化一个对象要额外分配两个字段“类型对象指针”和“同步块索引”。 类型对象指针的作用 。实例化一个对象并没有为其方法分配内存,类型的静态字段分配内存,而实例要向调用属于类型的一些东西,就必须通过类型对象指针。如对象的实例是共用类型的方法,实例只需要通过类型对象指针调用类型的方法,更多关于方法的调用请看我的 这篇博客 。 同步块索引的作用 。1:用于lock,使对象在同一时刻只能一个线程访问;2:用于获取对象的hashCode;3:在垃圾回收时标志某个对象是否是垃圾。关于 lock 最经典的一个例子就是单例了,大家的实现都是实例化一个object对象,然后锁住它,然后在判断是否要实例要实现单例的那个对象。我们为什么要实例化一个object,而不是直接lock(typeof(object)),那是因为这样会把object这个类型给锁住,锁住期间,任何使用线程使用lock(typeof(object))就必须等待,object还是可以正常使用。lock能起到单线程访问的原因是:它里面有一个空的for死循环

C#下内存管理--垃圾收集

左心房为你撑大大i 提交于 2019-12-29 02:32:15
章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介 对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止没有任何一种编程语言对内存管理处理的非常完美,每种语言都在兼顾性能 效率,语法语义易用性等方面折中中有所侧重。例如较之于C#,JAVA等语言C++号称不需要垃圾收集,因为C++本身产生的垃圾很少,诚然这是C++的 优势,这也就是为什么在内存受限或者效率优先的环境下优先考虑C++,但它的缺点也是明显的--程序员必须自己控制内存管理,很容易产生内存泄漏,这同时 也造就了C++很难掌握。感谢摩尔定律吧,它促使了垃圾收集这个概念的出现,但较之C++直接操纵内存释放,再牛逼的垃圾收集算法也无法抹去那一层性能上 的损失。 在讨论之前我们先明确一点:内存中数据按所处位置不同可以分为栈内存和堆内存,栈的主要作用是追踪函数调用之间的数据传递(栈上所存储 的数据类型通常是int,char,long,指针等内置值类型和struct。注意一点在多线程环境下,每个线程都有自己的栈。)所以栈的内存管理通常 由操作系统负责。而我们所说的内存管理,大都讨论的是堆上内存管理(分配在堆上的类型一般是自定义引用类型:类,接口,字符串,对象实例,C#中委托 等)。关于这一点详情请参照Under the hood of NET

内存管理2

北慕城南 提交于 2019-12-28 21:24:25
 可能产生外部碎片的是段式和可变分区 可能参数内部碎片的是页式段页式 固定分区 在虚拟存储方案中 常用的页面调入策略有两种请求调页和预调页 移动技术可以解决外部碎片不能解决内部碎片 页面置换策略中先进先出页面置换算法(FIFO)总是选择最先换入的页面调出 最近不常用页面置换算法(LFU)是根据页面的被调用次数来选择的 这种方法总数选择被访问次数最少的页面调出 理想页面置换算法(OPT)总数选用以后不再需要或最长时间以后才会用到的页面调出 最近最少使用页面置换算法(LRU)总是选用最长时间内来访问过的页面调出 页式存储管理方案中 将内存逻辑地址分为页号和地址两个部分 一个字节八位 三个字节24位所以地址长度为24位由于页面地址占10位所以页号占用14位 2^14=16384即进程最多有16384个页面 在某页式存储管理方案中 页面大小2kb=2^11 进程地址空间2^29=512MB 页号就占29-11=18 2^18个 固定分配局部地区置换的分配方案是基于进程的类型 为每一进程分配固定的页数的内存空间 在整个运行期间 都不再改变 采用该策略时 如果进程在运行中出现缺页 则只能从该进程的N个页面选择一个换出 然后再进入一页 以保证分配给该进程的内存空间不变 可变分区进程运行中 其内存页面可以动态增长或者减少 为每一个进程分配一定数目的内存页面 全部置换是运行的过程当其页面不够时

linux 段页式内存管理

三世轮回 提交于 2019-12-28 13:21:36
http://blog.chinaunix.net/uid-24227137-id-3723898.html 页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的外零头,提高内存的利用率从;或者说,分页是由于系统管理的需要,而不是用户的需求。短是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需求。 进程是如何使用内存的 对于任意一个普通的进程都会涉及到5种不同的数据段, 代码段:存放代码 数据段:存放程序静态分配的变量和全局变量 BSS:未初始化的全局变量 堆:用于存放进程运行中被动态分配的内存段,大小不固定。Malloc分配内存时,新分配的内存的添加到堆上(堆扩张),free释放内存时称为堆缩减。 栈:存放局部变量,函数调用时传入的参数和返回的参数都保存在栈中。 如图所示:数据段、bss、堆段通常是被连续存储的,内存位置上是连续的。而代码和栈往往会被独立存放。栈向下生长,堆向上生长。 进程内存空间 Linux中采用虚拟内存管理技术,用户看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用虚拟地址使得用户不能直接访问物理内存,进程间也各自互不干涉,起到保护的作用;另一方面,用户程序可使用比实际物理内存更大的地址空间。4G进程空间分为两个部分,1-3G为用户空间,4G为内核空间,用户通常情况不能访问内核空间

内存溢出和泄露

元气小坏坏 提交于 2019-12-28 13:20:31
一、内存溢出和内存泄露 一种通俗的说法。 1、内存溢出:你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,出现溢出。 2、内存泄漏:你用new申请了一块内存,后来很长时间都不再使用了(按理应该释放),但是因为一直被某个或某些实例所持有导致 GC 不能回收,也就是该被释放的对象没有释放。 下面具体介绍。 1.1 内存溢出 java.lang.OutOfMemoryError,是指程序在申请内存时,没有足够的内存空间供其使用,出现OutOfMemoryError。 产生原因 产生该错误的原因主要包括: JVM内存过小。 程序不严密,产生了过多的垃圾。 程序体现 一般情况下,在程序上的体现为: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据。 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收。 代码中存在死循环或循环产生过多重复的对象实体。 使用的第三方软件中的BUG。 启动参数内存值设定的过小。 错误提示 此错误常见的错误提示: tomcat:java.lang.OutOfMemoryError: PermGen space tomcat:java.lang.OutOfMemoryError: Java heap space weblogic:Root cause of ServletException java.lang