内存管理

内存管理

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-28 15:44:00
内存管理 内存基本知识 什么是内存,有何作用 内存:存放数据 程序执行前需要先放到内存中才能被CPU处理--缓和CPU与硬盘之间的速度矛盾 内存地址,内存单元 进程运行的基本原理 指令的工作原理 操作码+若干参数 逻辑地址vs物理地址 程序经过编译、链接后生成的指令中指明的地址是逻辑地址(相对地址)相对于进程的起始地址而言 如何实现地址转换 装入的三种方式 绝对装入:在编译时,如果知道程序将放到内存中的那个位置,编译程序将产生绝对地址的目标代码 装入程序按照装入模块中的地址,将程序和数据装入内存 绝对装入只适用于单道程序环境 灵活性差 静态重定位:又称可重定位装入。编译、链接后的装入模块地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。 可根据内存的当前情况,将装入模块装入到内存的适当位置 装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的) 静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业 运行期间就不能再移动 动态重定位:又称动态运行时装入。编译、连接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。 装入内存后的地址依然是逻辑地址

基本功2-对象与内存管理

江枫思渺然 提交于 2019-11-28 13:26:29
下面这篇文章是李刚老师的突破程序员基本功16课的读书心得 对象与内存管理 ​ Java中的变量分为成员变量和局部变量: ​ 局部变量的生存周期分短暂,被存储在栈内存中 ​ 局部变量分为以下几种: 方法的形式参数:随着方法的结束而消失 方法内的局部变量:随着方法的结束而消失 代码块中的局部变量:初始化完成后开始生效,随着代码块的结束而消失 1、实例变量和类变量 ​ 实例变量:定义成员变量之前没有使用static修饰的变量,也叫做非静态变量 ​ 类变量:定义成员变量时使用static修饰的变量,也称为静态变量 ​ 对于上面的静态:也就是static关键字的作用:就是将实例变量变成类变量,static只能修饰在类里定义的成员部分,如果使用了static修饰,这些成员属于类本身,如果没有使用static修饰,这些成员属于类的实例。 ​ 实例变量和类变量的区别:在下面简单说明: 内存空间不同 对于实例变量,每创建一个该类的实例,JVM就会分配一块内存空间 对于类变量,只需要一块内存空间即可。 初始化时机不同 对于实例变量,每次创建Java对象都会为实例变量分配内存空间,并对实例变量执行初始化。程序可以在3个地方对实例变量进行初始化: 定义实例变量是指定初始化值 非静态初始化代码块中指定初始化值 构造器中对实例变量指定初始化值 以下例子是实例变量的代码例子 public class Dog {

Learn The Architecture Memory Management 译文

瘦欲@ 提交于 2019-11-28 08:53:30
1、概述   本文档介绍了ARMv8-A架构内存管理的关键——内存地址转换,包括虚拟地址(VA)到物理地址(PA)的转换、地址转换表格式以及TLBs(Translation Lookaside Buffers)管理。   对于任何进行底层bootloader或者驱动代码开发的人员来说,这部分内容都是非常实用的,尤其是对进行MMU(Memory Management Unit)编码的人员。   本文档可以帮助你解到VA如何转换成PA的、识别不同的地址空间、地址转换时地址空间是如何映射的以及TLB相关的操作。 2、什么是内存管理?   内存管理描述了如何访问系统内存。每次操作系统或者应用程序尝试访问内存时,都是硬件负责进行内存管理的,对于应用程序而言,内存管理是一种动态分配内存区域的方式。 2.1、为什么需要内存管理?   因为操作系统和应用程序需要大量的内存来运行,同时,应用程序往往运行在虚拟地址空间,需要实际映射到物理地址空间。 3、虚拟地址和物理地址   使用虚拟地址的一个好处是,操作系统可以控制应用程序的内存布局,操作系统决定虚拟地址是否可见、是否允许访问。这种机制允许操作系统采取沙箱机制管理(即应用程序之间的隔离)应用程序,同时实现了对硬件的抽象。   还有一个好处是,物理内存上不连续的内存区域,在虚拟内存地址空间中可以是连续的。   对于应用程序开发人员而言

三、内存管理

大城市里の小女人 提交于 2019-11-28 08:52:45
1、calloc 表头文件  #include <stdlib.h> 定义函数  void *calloc(size_t nmemb,size_t size); 函数说明  calloc()用来配置nmemb 个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb* size);不过,在利用calloc()配置内存时会将内存内容初始化为0。 返回值   若配置成功则返回一指针,失败则返回NULL。 2、free 表头文件  #include <stdlib.h> 定义函数  void free(void *ptr); 函数说明  参数ptr 为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr 所指的内存空间便会被收回。假若参数ptr所指的内存空间已被收回或是未知的内存地址,则调用free()可能会有无法预期的情况发生。 若参数ptr 为NULL,则free()不会有任何作用。 3、getpagesize 表头文件  #include<unistd.h> 定义函数  size_t getpagesize(void); 函数说明  返回一分页的大小,单位为字节(byte)。此为系统的分页大小,不一定会和硬件分页大小相同。 返回值   内存分页大小。 4

操作系统

六眼飞鱼酱① 提交于 2019-11-28 08:15:25
文章目录 什么是操作系统 系统调度(分进程和线程) 进程的上下文切换 进程通信 管道 共享内存 信号量 消息队列 socket 死锁 内存管理 什么是内存 相对地址 绝对地址 逻辑地址 物理地址 线性地址 为什么要内存管理 虚拟内存 什么是缓存 缓存替换算法 内存管理方式 什么是操作系统 操作系统是管理和控制计算机硬件与软件资源的计算机程序。 操作系统主要有五大功能:处理机管理(CPU)、进程管理、内存管理、设备管理和文件系统管理。 系统调度(分进程和线程) 引起进程调度的原因有以下几类: (1)正在执行的进程执行完毕。 (2)执行中的进程自己调用阻塞原语将自己阻塞起来进入睡眠状态。 (3)执行中的进程调用了 P 原语操作,从而因资源不足而阻塞;或调用 V 原语操作激活了等待资源的进程队列。 (4)在分时系统中,当一进程用完一个时间片。 (5)就绪队列中某进程的优先级变得高于当前执行进程的优先级,也将引起进程调度。 进程的上下文切换 将CPU硬件状态从一个进程换到另一个进程的过程称为上下文切换,其实就是运行环境的切换。 进程运行时,其硬件状态保存在CPU上的寄存器中。寄存器有:程序计数器、程序状态寄存器、栈指针、通用寄存器、其他控制寄存器的值 进程不运行时,这些寄存器的值保存在进程控制块中;当操作系统要运行一个新的进程时,将进程控制块中相关值送到对应的寄存器中。 进程的内存布局

Linux内核源码目录结构分析

故事扮演 提交于 2019-11-28 07:33:41
/arch 不同CPU架构下的核心代码。其中的每一个子目录都代表Linux支持的CPU架构 /block 块设备通用函数 /crypto 常见的加密算法的C语言实现代码,譬如crc32、md5、sha1等 /Documentation 说明文档,对每个目录的具体作用进行说明 /drivers 内核中所有设备的驱动程序,其中的每一个子目录对应一种设备驱动 /firmware 固件代码 /fs Linux支持的文件系统代码,及各种类型的文件的操作代码。每个子目录都代表Linux支持的一种文件系统类型 /include 内核编译通用的头文件 /init 内核初始化的核心代码 /ipc 内核中进程间的通信代码 /kernel 内核的核心代码,此目录下实现了大多数Linux系统的内核函数。与处理器架构相关的内核代码在/kernel/$ARCH/kernel /lib 内核共用的函数库,与处理器架构相关的库在/kernel/$ARCH/lib /mm 内存管理代码,譬如页式存储管理内存的分配和释放等。与具体处理器架构相关的内存管理代码位于/arch/$ARCH/mm目录下 /net 网络通信相关代码 /samples 示例代码 /scripts 用于内核配置的脚本文件,用于实现内核配置的图形界面 /security 安全性相关的代码 /tools Linux中的常用工具 /usr

你是否真的了解全局解析锁(GIL)

杀马特。学长 韩版系。学妹 提交于 2019-11-28 06:15:31
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。 Github: https://github.com/hylinux1024 微信公众号:终身开发者(angrycode) 0x00 什么是全局解析锁(GIL) A global interpreter lock (GIL) is a mechanism used in computer-language interpreters to synchronize the execution of threads so that only one native thread can execute at a time. -- 引用自wikipedia 从上面的定义可以看出, GIL 是计算机语言解析器用于同步线程执行的一种 同步锁机制 。很多编程语言都有 GIL ,例如 Python 、 Ruby 。 0x01 为什么会有GIL Python 作为一种面向对象的动态类型编程语言,开发者编写的代码是通过解析器顺序解析执行的。 大多数人目前使用的 Python 解析器是 CPython 提供的,而 CPython 的解析器是 使用引用计数来进行内存管理 ,为了对多线程安全的支持,引用了 global intepreter

Linux基础命令:vmstat

依然范特西╮ 提交于 2019-11-28 01:37:01
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat 工具提供了一种低开销的系统性能观察方式。因为 vmstat 本身就是低开销工具,在非常高负荷的服务器上,你需要查看并监控系统的健康情况,在控制窗口还是能够使用vmstat 输出结果。在学习vmstat命令前,我们先了解一下Linux系统中关于物理内存和虚拟内存相关信息。 物理内存和虚拟内存区别: 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。 作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

【操作系统】 内存管理

假如想象 提交于 2019-11-28 01:05:27
内存管理概念 内存管理的功能有: 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,提高编程效率。 地址转换。在多道程序环境下,程序中逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供存储变换功能,把逻辑地址转换成相应的物理地址。 内存空间的扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。 存储保护。保证各道作业在各自的存储空间内运行,互不干扰。 创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤: 编译。由编译程序将用户源代码编译成若干目标模块。 链接。由链接程序将编译后形成的一组目标代码及所需的库函数链接在一起,形成一个完整的装入模块。 装入。由装入程序将装入模块装入内存运行。 程序的链接有以下三种方式: 静态链接。在程序运行前,先将各自目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。 装入时动态链接。将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。 运行时动态链接。对某些目标模块的链接,是在程序执行中需要该模块时才进行的。其优点是便于修改和更新,便于实现对目标模块的共享。 内存的装入模块在装入内存时,同样有以下三种方式: 绝对装入 。在编译时,若知道某个程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址

[转]探索 Android 内存优化方法

喜夏-厌秋 提交于 2019-11-27 21:58:25
前言 这篇文章的内容是我回顾和再学习 Android 内存优化的过程中整理出来的,整理的目的是让我自己对 Android 内存优化相关知识的认识更全面一些,分享的目的是希望大家也能从这些知识中得到一些启发。 Android 应用运行在 ART 环境上,ART 是基于 JVM 优化而来的,ART 优化的目标就是为了让 Android 应用能更高效地在 Android 平台运行。 不严谨地说,Android 应用就是一个在 Android 平台运行良好的 Java 程序,承载着 Android 应用的 ActivityThread 同样有 main 方法。 因此只有了解了 Java 的内存管理机制,才能更好地理解 Android 的内存管理机制,如果你对这一块还不熟悉的话,可以看我的上一篇文章 《 Java 内存管理机制 》。 本文的内容可分为下面两部分,大家可以根据自己的需要选择性地阅读。 第一部分 讲的是 Android 内存管理机制相关的一些知识,包括 Dalvik 虚拟机和 ART 环境等。 第二部分 讲的是内存问题的解决与优化方法,包括 Memory Profiler、LeakCanary 工具的使用方法。 1. 为什么要做内存优化? 内存优化能让应用挂得少、活得好和活得久 。 挂得少 “挂”指的是 Crash,假如一个满分的应用是 100 分,那么一个会 Crash