首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏初见Linux

    3.内存管理

    1)物理地址:就是内存的地址,是以字节为单位,对内存单元的编址。 2)逻辑地址:用户源程序经过编译或汇编后形成的目标指令代码的编址。 3)地址空间:地址的编址范围。 (3)动态重定位 它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址。动态重定位需要软件和硬件相互配合完成。 可变式分区3.png 分区分配表:记录已分配分区信息。 空闲分区表:记录空闲分区信息。 3.分区分配算法 (1)首次适应算法 ? 四、分段管理 1.概念 为每一个段分配一个连续的内存分区,段与段之间可以不连续,段在内存中的位置通过段表来描述。 段表.png 在配置了段表后,执行中的进程可通过查找段表,找到每个段所对应的内存区。可见,段表用于实现从逻辑段到物理内存区的映射, ? 分段管理1.png 3.地址变换 ?

    93120发布于 2020-08-05
  • 来自专栏linux驱动个人学习

    Linux-3.14.12内存管理笔记【构建内存管理框架(3)】

    start_pfn, end_pfn, zones_size, zholes_size); } 该函数中,其中init_zone_allows_reclaim()用于计算评估内存管理区是否可回收以及合适的 node_start_pfn); /* Return the spanned pages */ return zone_end_pfn - zone_start_pfn; } 其主要是统计node管理节点的内存跨度 ,该跨度不包括movable管理区的,里面调用的adjust_zone_range_for_zone_movable()则是用于剔除movable管理区的部分。 再往下的mminit_verify_pageflags_layout()函数主要用于内存初始化调测使用的,由于未开启CONFIG_DEBUG_MEMORY_INIT配置项,此函数为空。 而setup_nr_node_ids()是用于设置内存节点总数的,此处如果最大节点数MAX_NUMNODES不超过1,则是空函数。

    1.1K30发布于 2019-10-08
  • 来自专栏计算机学习

    xv6(3) 内存管理部分

    内存管理部分 内存管理这部分我没有集中在一起叙述,本节只是讲述物理内存如何组织管理,页表的内核部分如何创建的,与地址转换的在启动理论那一块儿说了,虚拟地址空间的用户部分在进程那儿叙述,堆内存管理也在进程那一块儿讲述 废话不多说来看本节内容: 我之前看了另外一个小型操作系统,我觉得那里面对内存管理层次抽象分的很清楚,每个操作系统都有相通性,这里拿出来说说: 物理内存管理,主要就是物理页的分配与回收 虚拟内存管理,主要就是虚拟页的分配与回收 物理内存与虚拟内存建立映射,那就是页表了 xv6 因其功能少,物理内存与虚拟内存的特殊关系,虚拟内存管理这一块很弱,可能水平还是不够,我想了半天都没能把这一块儿很好地抽象出来,不过物理内存管理和建立映射这一块儿还是很明显的 ,主要也就是从这几个方面来看 物理内存管理 对于物理内存和虚拟内存我们都是以页为单位进行管理,像要管理这种一页一页的,一块一块的对象,最常用的就是两种方法: 空闲链表法,将空闲页/块给串起来,分配就是删除一个结点 关于物理内存管理还要注意一点,这些所有函数都是使用的虚拟地址,管理物理内存不是说就要使用物理地址,自从分页机制开启之后,使用的一直就是线性地址或者说虚拟地址。

    86710编辑于 2023-12-05
  • 来自专栏日常技术分享

    ios内存管理-内存管理范围

    要了解ios内存管理范围,首先我也应该了解一下内存的几大区域 ? 2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域 堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 好了现在来说一下ios内存管理的范围 只有oc对象才需要内存管理,非OC对象(如:char、int、folat)则不需要管理内存 原因: OC对象是放在堆里,一般由程序员分配释放,若程序员不释放,程序结束时由 OS回收 非OC对象是放在栈里,栈系统会自动管理

    1.9K20发布于 2018-09-13
  • 来自专栏linux驱动个人学习

    Linux-3.14.12内存管理笔记【伙伴管理算法(3)】

    前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理。 伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义: 【file:/include/linux/mmzone.h】 假设连续的物理内存,各页面块左右的页面,要么是等同大小,要么就是整数倍,而且还是偶数,形同伙伴。 其管理起来如图: ? 伙伴管理算法的释放过程是,满足条件的两个页面块称之为伙伴:两个页面块的大小相同且两者的物理地址连续。 而伙伴管理算法的申请过程则相反,如果申请指定大小的页面在其页面块链表中不存在,则会往高阶的页面块链表进行查找,如果依旧没找到,则继续往高阶进行查找,直到找到为止,否则就是申请失败了。

    1.3K20发布于 2019-10-15
  • 来自专栏逆向技术

    Win3内存管理之私有内存跟共享内存的申请与释放

        一丶内存简介私有内存申请   通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存. 私有内存的意思就是这块内存申请只在本进程的物理页当中. 共享内存就是这个物理页 A B两个进程都可以使用. 但是我们知道物理内存是一个页.所以申请一个页即可. DWORD flAllocationType, 申请内存的类型. 是这样的.我们申请内存在物理页. 给这个指定进程申请内存. new malloc的区别. 请注意.真正申请内存的其实是API. 而new malloc 是申请堆内存. ; 3.取消关联 BOOL UnmapViewOfFile( LPCVOID lpBaseAddress // starting address); 虚拟地址 关闭物理页映射则使用CloseHandle

    2K20发布于 2018-09-28
  • 来自专栏人人都是极客

    内存管理专栏 | 之内存管理架构

    一、内存管理架构 二、虚拟地址空间布局架构 三、物理内存体系架构 四、内存结构 五、内存模型 六、虚拟地址和物理地址的转换 七、内存映射原理分析 一、内存管理架构 内存管理子系统架构可以分为:用户空间、 内核空间及硬件部分3个层面,具体结构如下所示:1、用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源。 3、硬件:处理器包含一个内存管理单元(Memory Management Uint,MMU)的部件,负责把虚拟地址转换为物理地址。 内存管理子系统支持3内存模型:1)平坦内存(Flat Memory):内存的物理地址空间是连续的,没有空洞。 这个替代过程正在进行中,4.4的内核仍然是有3内存模型可以选择。

    2.3K21编辑于 2022-09-02
  • 来自专栏Android开发实战

    Android内存管理(八)内存管理小结

    Android内存管理体系已经讲解了 内存管理基础 Android内存管理机制 具体相关内容可参考如下链接 Android内存管理(一)官方文档介绍 Android内存管理(二)操作系统基础 Android内存管理(三)内存管理基础 Android内存管理(四)Linux的内存管理机制 Android的内存管理机制 Android对Linux系统的内存管理机制进行的优化 Android内存管理 3)服务进程(Service process) 尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。 3)在系统内存紧张的情况下,能释放掉大部分不重要的资源,来为Android系统提供可用的内存。 4)能够很合理的在特殊生命周期中,保存或者还原重要数据,以至于系统能够正确的重要恢复该应用。 3内存泄露 内存泄露是指本来该被GC回收后还给系统的内存,并没有被GC回收。多数是因为不合理的对象引用造成的。

    2.3K20发布于 2020-09-23
  • 来自专栏Android开发实战

    Android内存管理(三)内存管理基础

    数据(Data):存储该程序的全局变量和静态变量 代码(Code):存储该程序的指令 主要的内存管理技术 Base and limit registers(基址寄存器和界限寄存器) Virtual memory 那么每个来自用户进程的内存访问都将首先针对这两个寄存器进行一次检查: ? 操作系统内核可以访问所有内存位置,因为它需要管理整个内存。 Virtual memory(虚拟内存) 虚拟内存(VM)是OS为内存管理提供的基本抽象。 虚拟地址到物理地址的转换由存储器管理单元(MMU - Memory Management Unit)处理。 分页是一种内存管理技术,它允许进程的物理内存不连续。它通过在称为页面(Page)的相同大小的块中分配内存来消除碎片问题,是目前比较优秀的内存管理技术。

    2.3K20发布于 2020-09-23
  • 来自专栏C/C++爱好者

    内存管理

    内存管理:: 1.C/C++内存分布 int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar 3.堆用于程序运行时动态内存分配,堆是向上增长的 4.数据段,存储全局数据和静态数据 5.代码段,存储可执行的代码或只读常量 2.C语言中动态内存管理方式:malloc/calloc/realloc/free (详见博客[C语言]动态内存管理与柔性数组) 3.C++中动态内存管理 C语言内存管理方式在C++中可以继续使用,但有些地方却无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式,通过new 和delete操作符进行动态内存管理。 但是如果碰上异常时,就算注意释放了,还是可能会出问题,需要智能指针管理才有保证。 2.采用RAII思想或者智能指针来管理资源。 3.有些公司内部规范使用内部实现的私有内存管理库。

    1.4K10编辑于 2023-04-30
  • 来自专栏程序员

    内存管理

    为了实现这一性能,必须将多个进程保存在内存中,也就是说内存共享。 通常,将指令与数据捆绑到内存地址可以在编译时进行,也可以在加载时进行,还可以在执行时进行。 在编译时绑定地址,那么生成的就是绝对代码。 执行程序的时候绑定地址,这样进程能从一个内存段移动到另一个内存段。采用这样的方案需要特殊的硬件(通常是MMU)。除了一些嵌入式芯片没有MMU,绝大多数CPU都是有MMU的。 运行时从虚拟地址到物理地址的映射是由称为内存管理单元(MMU)的硬件来完成的。有许多方法都可以实现这种映射。 一种简单地MMU方案来实现这个映射是基于基地址寄存器方案的。 动态加载 为了获得更好的内存空间利用率,可以使用动态加载。这个做法就是在子程序被调用的时候才被加载到内存中。所有的子程序都被以可重定位的形式保存在磁盘上。主程序是装入内存的,何时需要子程序就何时调用。 交换技术 还有一种方法就是交换技术,进程可以暂时的从内存中交换出来到备份存储上,当他需要继续执行的时候,再把它调回内存。 上面的方法都是为了提高内存利用率。

    1.1K10发布于 2019-07-10
  • 来自专栏用户画像

    内存管理

    一、管理方式 1、连续分配 (1)单一连续分配:分配到内存固定区域,只适合单任务系统。 (2)固定分区分配:分配到内存中不同的固定区域,分区可以相等,也可以不等 (3)动态分区分配: 基本概念:按照程序的需要进行动态的划分 分配算法: ①首次适应:地址从小到大为序,分配第一个符合条件的分区 (3)段页式:基本分段和基本分页的结合,会有内部碎片。 3、虚拟内存: (1)引入原因:在逻辑上扩充内存 (2)组成部分: ①页表机制:通过查表获取相关信息 ②中断机构:要访问页不在内存时产生产生缺页中断 ③地址变换结构:把逻辑地址变化成物理地址 ④内存和外存 :需要一定容量的内存和外设的支持 (3)置换算法 ①OPT:选择以后不用的页面 ②FIFO:选择最先装入的页面 ③LRU:选择最近最久未用的页面 ④CLOCK:选择最近未使用的页面 ⑤改进型CLOCK:

    1.1K50发布于 2018-08-27
  • 来自专栏移动开发面面观

    Java学习笔记——内存管理Java内存管理

    Java内存管理 简介 Java虚拟机的内存管理分为以下几个运行时数据区: 方法区 堆 虚拟机栈 本地方法栈 程序计数器 其中,方法区和堆是所有线程共享的数据区,而其他的是线程隔离的数据区。 堆 Java堆,又称GC堆,是GC的管理的主要区域。在虚拟机启动时创建。主要作用是存放对象实例,几乎所有的对象实例都会存放在Java堆中。Java堆可以处于物理不连续的内存空间中,只要逻辑连续即可。 直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError 显然,本机直接内存的分配不会受到Java 堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括RAM 及SWAP 区或者分页文件)的大小及处理器寻址空间的限制。 服务器管理员配置虚拟机参数时,一般会根据实际内存设置-Xmx等参数信息,但经常会忽略掉直接内存,使得各个内存区域的总和大于物理内存限制(包括物理上的和操作系统级的限制),从而导致动态扩展时出现OutOfMemoryError

    2.2K30发布于 2018-07-03
  • 来自专栏李才哥

    内存管理

    DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>02_内存管理</title> </head> <body -- 问题: JS引擎如何管理内存? 1. 内存生命周期 1). 分配需要的内存 2). 使用分配到的内存 3). 不需要时将其释放/归还 2. 释放内存 * 为执行函数分配的栈空间内存: 函数执行完自动释放 * 存储对象的堆空间内存: 当内存没有引用指向时, 对象成为垃圾对象, 垃圾回收器后面就会回收释放此内存 --> <script function fn () { var a = 3 var b = {} } fn() // ? </script> </body> </html>

    80100发布于 2020-03-28
  • 来自专栏阿伟的个人博客

    内存管理

    虚拟内存 其为每个进程都提供了一个独立的‘互不干扰的空间。 1)将内存看做缓存,内存中存储此时正在运行的数据,其他数据存到磁盘,当需要使用时再换入内存内存不够时将不用的换出到磁盘。 2)为每个进程提供了一致的地址空间,便于管理3)保护每个进程空间不被破坏。 分段存储管理 分段机制下虚拟地址由两部分组成段选择子和段偏移量。 如下图所示,若要查找段3偏移量为200的虚拟地址,我们可以计算出其物理地址为 段三基地址5000 + 段偏移量200 = 5200 ? 分页存储管理 Linux使用的时分页的方式。 OS将物理内存分为一块一块大小相同的页(一般为4K)。之前提到的OS可以将长时间不用的那些页面换出到磁盘上,需要时再换进内存,如此可以提高物理内存的利用率,这部分换出、换入的最小单位为1页。 对于页目录表而言其所管理内存最多不超过1024页,因此10位的页目录号是刚好的,此外对于每一页中存1024条页表数据,因此10位页目录表偏移量也正好。在加上12位的页偏移量正好32位。

    1.3K20发布于 2020-08-19
  • 来自专栏c/c++&&linux

    【C语言】内存管理&&内存管理函数&&文件管理&&文件管理函数

    ptr2指向内存的数据的,则返回小于0的数字 否则返回大于0的数字 memcmp比较是以字节为单位比较的 举个例子 3.动态内存管理 3.1 为什么存在动态内存分配? 2种申请内存的方式: 一次开辟一个变量的空间 一次开辟一个数组的空间 int main() { int a = 10;//存放一个值 int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//存放一组值 return 0; } 但是他们都存在一个问题:空间一旦申请好,大小就是固定的,不能改变 所以C语言给了我们一种权利,能够动态申请和管理内存空间 3.2 动态内存函数的介绍 取决于编译器 那么怎么使用这个函数呢,我们举个例子; malloc需要包含的头文件是stdlib.h 如果申请失败就会这样: 如果返回了NULL指针,则不能使用了 ​​​​​​ 从这个图可以看出 动态内存管理都是在堆区进行的 ,那么就可以很方便的使用calloc函数来完成任务 3.2.3 realloc realloc函数的出现让动态内存管理更加灵活 realloc函数可以做到对动态开辟内存大小的调整 函数原型如下: void

    1.1K21编辑于 2024-06-04
  • 来自专栏Golang语言社区

    Go 语言内存管理(一):系统内存管理

    作者:达菲格 来源:简书 介绍 要搞明白 Go 语言的内存管理,就必须先理解操作系统以及机器硬件是如何管理内存的。 操作系统内存管理 其实现在计算机内存管理的方式都是一步步演变来的,最开始是非常简单的,后来为了满足各种需求而增加了各种各样的机制,越来越复杂。这里我们只介绍和开发者息息相关的几个机制。 3、程序开发成本高:你的程序要使用多少内存内存地址是多少,这些都不能搞错,对于人来说,开发正确的程序很费脑子。 如果内存访问到第 3 步成功结束了,我们就说页命中了;反之就是未命中,或者说缺页,表示它开始执行第 4 步了。 Go 语言的内存管理是参考 tcmalloc 实现的,它其实就是利用好了 OS 管理内存的这些特点,来最大化内存分配性能的。

    3K54发布于 2019-05-08
  • 来自专栏Golang语言社区

    Go 语言内存管理(二):Go 内存管理

    Go 的内存是自动管理的,我们可以随意定义变量直接使用,不需要考虑变量背后的内存申请和释放的问题。 Golang 内存管理 Golang 的内存管理本质上就是一个内存池,只不过内部做了很多的优化。比如自动伸缩内存池大小,合理的切割内存块等等。 以上图为例,这样的方式空间利用率是 (1+2+8) / 16 * 100% = 68.75% ,而如果按照原始的管理方式,利用率是 (1+2+8) / (8 * 3) = 45.83% 。 3内存碎片的问题,Go 是自己在用户态管理的,在 OS 层面看是没有碎片的,使得操作系统层面对碎片的管理压力也会降低。 4、mcache 的存在使得内存分配不需要加锁。 附 内存碎片 内存碎片是系统在内存管理过程中,会不可避免的出现一块块无法被使用的内存空间,这是内存管理的产物。

    8.4K105发布于 2019-05-08
  • 来自专栏雨尘分享

    5.Block的内存管理 内存管理内存管理block的循环引用

    内存管理 ---- 无论当前环境是ARC还是MRC,只要block没有访问外部变量,block始终在全局区 MRC情况下 block如果访问外部变量,block在栈里 不能对block使用retain,

    1.2K40发布于 2018-06-01
  • 来自专栏嵌入式与Linux那些事

    内存管理内存布局介绍

    32位的系统可访问的地址空间为4GB,用户空间为1GB ~ 3GB,内核空间为3GB ~ 4GB。 为什么要划分为用户空间和内核空间呢? 一般处理器会把运行模式分为好几个,比如x86分为rang0 ~ rang3级别。ARMv7架构中,又分为好几个模式,比如svc模式是给内核用的,usr模式是给用户态使用的。 低端内存会做一比一映射到3GB ~ 3GB+760M。 接下来看下3GB用户空间的划分方式,一个进程要运行起来,必然要有自己的代码段和数据段,这部分在加载的时候就会被映射到虚拟地址。 mmap空间:1GB到3GB这部分是给mmap空间使用的,mmap可以用来映射文件也可以映射匿名页面。通常用户态分配大段内存的时候,Linux通常会使用mmap来完成分配。

    1.8K10编辑于 2024-07-04
领券