内存管理

Android内存管理

感情迁移 提交于 2020-02-10 13:32:00
这两个方法是网上拷别人的,分别用来得到可用内存和内存总数,这样我们就可用得到了已用内存数。 private long getAvailMemory(Context context) { // 获取android当前可用内存大小 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); MemoryInfo mi = new MemoryInfo(); am.getMemoryInfo(mi); // mi.availMem; 当前系统的可用内存 // return Formatter.formatFileSize(context, mi.availMem); // 将获取的内存大小规格化 return mi.availMem/(1024*1024); } private long getTotalMemory(Context context) { String str1 = "/proc/meminfo"; // 系统内存信息文件 String str2; String[] arrayOfString; long initial_memory = 0; try { FileReader localFileReader = new FileReader(str1

第七章 内存管理

风流意气都作罢 提交于 2020-02-10 09:00:14
在单道程序设计系统中,内存被划分成两个部分:一部分供操作系统使用(驻留监控程序、内核),一部分供当前正在执行的程序使用。在多道程序设计系统中,必须在内存中进一步细分出“用户”部分,以满足多个进程的要求。细分的任务由操作系统动态完成,这称为内存管理。 有效的内存管理在多道程序设计系统中是至关重要的。如果只有少量进程在内存中,所有进程大部分时间都用来等待IO,这种情况下,处理器也处于空闲状态。因此,必须有效地分配内存来保证有适当数目的就绪进程可以占用这些可用的处理时间。 一、内存管理的需求 1 重定位 在多道程序设计系统中,可用的内存空间通常被多个进程共享。 通常情况下,程序员并不能事先知道在某个程序执行期间会有其他哪些程序驻留在内存中。此外还希望通过提供一个巨大的就绪进程池,能够把活动进程换入或换出内存,以便使处理器的利用率最大。 一旦程序被换出磁盘,当下一次被换入时,需要把进程重定位到内存的不同区域。因此,我们事先不知道程序将会被放置到哪个区域,并且我们必须允许程序通过交换技术在内存中移动。 操作系统需要知道进程控制信息和执行栈的位置,以及该进程开始执行程序的入口点。 2 保护 每个进程都应该受到保护,以免被其他进程有意无意地干涉。因此,该进程以外的其他进程中的程序不能未经授权地访问(进程读操作或写操作)该进程的内存单元。 通常,用户进程不能访问操作系统的任何部分

操作系统7:内存管理

瘦欲@ 提交于 2020-02-09 23:13:42
内存管理 基本概念 内存管理主要分为连续区管理和非连续区管理 注意汇编语言也需要翻译下 ,但不是编译,因为它基本上就是一对一的翻译了下,比编译任务简单的多 base表示该进程的最小的地址位置,limit表示最大的 由存储管理单元在地址送往地址总线之前进行逻辑地址到物理地址的转换 : 两种方法可以实现运行时不将所有代码装入内存: 动态连接提供系统级的支持,操作系统升级时,动态链接库可以直接升级,不需要重新编译应用程序 存储管理的基本内存就是逻辑地址和物理地址之间的映射 交换 后备存储空间一般是一个单独划出的存储空间,要提供直接访问机制 来源: https://zhidao.baidu.com/question/72920995.html 内存交换(对换)的基本思想是,把处于等待状态(或在 CPU 调度原则下被剥夺运行权利) 的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出;把准备好竞争 CPU 运行的程序从辅存移到内存,这一过程又称为换入。   有关交换需要注意以下几个问题:   1、交换需要备份存储,通常是快速磁盘。它必须足够大,并且提供对这些内存映像的直接访问。   2、为了有效使用 CPU ,需要每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间。转移时间与所交换的内存空间成正比。   3、如果换出进程,必须确保该进程是完全处于空闲状态。   4

复习打卡--0819元类和内存管理

大憨熊 提交于 2020-02-09 04:18:54
一、元类 python2中所有类是基于instance创建的,称为旧式类;注明继承object时,称为新式类; python3中默认均为基于object,无区别; object为所有类的基类,所有的类的继承顶层父类都是object; type为所有类的元类,print(type(类名)),输出type,所有类的类型都是type。所有的类都是type创建出来的; # 使用type动态地创建类 def func1(self): print(self.name) dict1={"name":"lala","age":18,"func":func1()} my=type("Myclass",bases=(object,),dict=dict1) # 第一个参数为:类名,第二个参数为继承的类,第三个参数为类的属性和方法 print(my) # 返回类名Myclass m1=my() print(type(m1)) # 返回类名Myclass m1.func() 二、内存管理 1对象引用 变量:通过变量指针指向具体对象的内存空间,取对象的值; 对象:类型已知,每个对象都包含头部信息(类型标识符和引用计数器); a=10 a这个变量指向10这个对象,10这个对象中包含类型标识符:int和引用计数器:1 b=a b引用a,b实际引用的也是10这个对象,此时,10的引用计数器为:2

C语言内存管理思想

自闭症网瘾萝莉.ら 提交于 2020-02-08 19:23:35
内存的属性 1、大小 2、在哪里 int a;就告诉内存大小为4字节 全局变量与局部变量放置 的位置也不同 ————————————0xffff ffff 内核空间 应用程序不许访问 ———————————————— 栈空间 (局部变量) —————————————— 运行时的堆空间 (malloc申请的空间) ———————————— 代码段(一般比较低)===》只读数据段(text) 全局数据空间(初始化DATA,未初始化bss) ———————————— 0x0 栈空间 运行时,函数内部使用的变量,函数一旦返回就释放,生存周期是函数内 只读空间 如果对空间进行写操作会出现段错误 只读数据段和代码段构成只读空间(TEXT) 数据段 加了static的局部变量会放到全局数据空间 未初始化的全局变量在bss 初始化的在DATA都属于全局数据空间 局部变量的都会存在栈空间 堆空间 由程序员决定或者某些特殊条件才释放的空间 运行时,可以自由、自我管理的分配和释放的空间,生存周期由程序员来决定 分配:malloc()一旦成功,返回分配好的地址给我们,对于新地址的读法,由程序员决定,可以4个4分读,可以先读100个再读100个。输入参数指定分配大小,单位是B char *p; p=malloc(100); if(p==NULL) (用来检测是否申请成功) { error } 释放:free

Go内存管理

走远了吗. 提交于 2020-02-07 06:59:31
1.前言 编写过C语言程序的肯定知道通过malloc()方法动态申请内存,其中内存分配器使用的是glibc提供的ptmalloc2。 除了glibc,业界比较出名的内存分配器有Google的tcmalloc和Facebook的jemalloc。 二者在避免内存碎片和性能上均比glic有比较大的优势,在多线程环境中效果更明显。 Golang中也实现了内存分配器,原理与tcmalloc类似,简单的说就是维护一块大的全局内存,每个线程(Golang中为P)维护一块小的私有内存,私有内存不足再从全局申请。 另外,内存分配与GC(垃圾回收)关系密切,所以了解GC前有必要了解内存分配的原理。 2.内存分配概览 3.基础概念 3.1预分配内存 为了方便自主管理内存,做法便是先向系统申请一块内存,然后将内存切割成小块,通过一定的内存分配算法管理内存。以64位系统为例,Golang程序启动时会向系统申请的内存,预申请的内存划 分为spans、bitmap、arena三部分。其中arena即为所谓的堆区,应用中需要的内存从这里分配。其中spans和bitmap是为了管理arena区而存在的。 arena的大小为512G,为了方便管理把arena区域划分成一个个的page,每个page为8KB,一共有512GB/8KB个page; spans区域存放span的指针,每个指针对应一个page

【操作系统】第五章虚存技术

匆匆过客 提交于 2020-02-07 05:02:34
5.1虚拟内存的起因 理想中的存储器: 更大,更快,更便宜的非易性存储器 硬盘的速度远远的慢于内存的执行。 磁带比硬盘的存储容量更加的庞大。 现有的物理内存掉电之后数据还是会丢失的。 以上设计了三种技术: 1)手动覆盖技术:只把指令和数据保存在内存中 2)自动交换技术:将程序导出内存到硬盘上 3)虚拟内存技术(前两种是虚拟内存还没出现的情况下诞生的):以更小的力度把数据导出导入到内存中来,充分的利用了内存空间的手段 5.2覆盖技术 一、覆盖技术的基础 目标: 是在较小的可用内存中运行较大(相对而言的)的程序。常用与多道程序系统,与分区存储管理配合使用。 原理: 把程序按照其自身的逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。 必要部分(常用功能)的代码和数据常驻内存; 可选部分(不常用内存)在其他程序模块中实现,平时存放在外存中,在需要用到时才装入内存; 不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖,既这些模块共有一个分区。 二、应用例子 例子一: 1)bc是对等的,相互之间不会调用,所以分在一个区;A调用b的时候,c是不会执行的,所以只需要将b放在内存中即可。 2)def也是对等的,相互之间也不会调用,所以也分在一个区;当C调用e的时候,df通用是不会被调用的,所以也只需要将e放在内存中即可。 例子二:

操作系统:虚拟内存

一个人想着一个人 提交于 2020-02-07 00:12:28
覆盖技术 目标 在较小的可用内存中运行较大的程序。常用于多道程序系统,与分区存储管理配合使用。 原理 把程序按照其自身的逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。 必要部分(常用功能)的代码和数据常驻内存。---固定区:调入后就不再调出(除非运行结束)。 可选部分(不常用功能)存放在外存中,在需要用到时才装入内存。 ---覆盖区:需要用到时调入内存,用不到时调出内存。 缺点 由程序员声明覆盖结果,费时费力,增加了编程的难度。 覆盖模块,从外存装入内存,实际上是以时间换空间。 交换技术 目标 多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的资源。 原理 可将暂时不运行的程序送到外存,从而获得空间内存空间。 操作系统把一个进程的整个地址空间的内存保存到外存中(换出),而将外存中的某个进程的地址空间读入到内存中(换入)。换入换出的内容的大小为整个程序的地址空间。 交换时机的确定:只有当内存空间不够或有不够的危险时换出。 换出的进程存放在什么位置:文件区(离散分配方式) + 对换区(连续分配方式)---被换出的进程存放在对换区。 覆盖与交换的区别 覆盖在同一个进程或程序中,交换是在不同进程之间作业的。 交换发生在内存中程序与管理程序或操作系统之间,覆盖发生在运行程序的内部。 虚拟内存技术 目标 像覆盖技术那样

Linux内存管理(上)

天大地大妈咪最大 提交于 2020-02-04 04:00:08
摘要 : 本章首先以应用程序开发者的角度审视 Linux 的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存地使用方法。力求从外自内、水到渠成地引导网友分析 Linux 地内存管理与使用。在本章最后我们给出一个内存映射地实例,帮助网友们理解内核内存管理与用户内存管理之间地关系,希望大家最终能驾驭 Linux 内存管理。 前言 内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无论市面上或是网上都充斥着大量涉及内存管理的教材和资料。因此我们这里所要写的 Linux 内存管理采取必重就轻的策略,从理论层面就不去板门弄斧,贻笑大方了。我们最想做的和可能做到的是以开发者的角度谈谈对内存管理的理解,最终目的是把我们在内核开发中使用内存的经验和对 Linux 内存管理的认识与大家共享。 当然这其中我们也会设计一些诸如段页等内存管理的基本理论,但我们目的不是为了强调理论,而是为了指导理解开发中的实践,所以仅仅点到为止,不做深究。 遵循“理论来源于实践”的“教条”,我们先不必一下子就钻入内核里去看系统内存到底是如何管理,那样往往会让你陷入似懂非懂的窘境(我当年就犯了这个错误!)。所以最好的方式是先从外部(用户编程范畴)来观察进程如何使用内存,等到对大家内存使用有了较直观的认识后,再深入到内核中去学习内存如何被管理等理论知识。最后再通过一个实例编程将所讲内容融会贯通。