精华内容
下载资源
问答
  • 2018-12-27 11:20:11

    所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
    例如我们定义一个float型数组:float score[100];   
    但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道你想利用的空间大小,但是如果因为某种特殊原因空间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

    我们用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:
       1、不需要预先分配存储空间;
       2、分配的空间可以根据程序的需要扩大或缩小。
    要实现根据程序的需要动态分配存储空间,就必须用到malloc函数.

    malloc函数的原型为:void *malloc (unsigned int size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。

    更多相关内容
  • 下面小编就为大家带来一篇android 获取手机内存及SD卡内存可用空间的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 计算机操作系统 实验报告 实验二 实验题目存储器管理 系别计算机科学技术 系 班级 姓名 学号2 一实验目的 深入理解动态分区存储管理方式下的内存空间的分配回收 二实验内容 编写程序完成动态分区存储管理方式下...
  • 今天小编就为大家分享一篇python检测空间储存剩余大小和指定文件夹内存占用的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 虚拟内存与物理内存的联系与区别

    万次阅读 多人点赞 2018-08-30 11:55:36
    操作系统有虚拟内存与物理内存的概念。在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且...

    操作系统有虚拟内存与物理内存的概念。在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理内存,就可能会出现很多问题:

    • 因为我的物理内存时有限的,当有多个进程要执行的时候,都要给4G内存,很显然你内存小一点,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内存的操作是很没效率的
    • 由于指令都是直接访问物理内存的,那么我这个进程就可以修改其他进程的数据,甚至会修改内核地址空间的数据,这是我们不想看到的
    • 因为内存时随机分配的,所以程序运行的地址也是不正确的。

    于是针对上面会出现的各种问题,虚拟内存就出来了。

    在之前一篇文章中进程分配资源介绍过一个进程运行时都会得到4G的虚拟内存。这个虚拟内存你可以认为,每个进程都认为自己拥有4G的空间,这只是每个进程认为的,但是实际上,在虚拟内存对应的物理内存上,可能只对应的一点点的物理内存,实际用了多少内存,就会对应多少物理内存。

    进程得到的这4G虚拟内存是一个连续的地址空间(这也只是进程认为),而实际上,它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。

    进程开始要访问一个地址,它可能会经历下面的过程

    1. 每次我要访问地址空间上的某一个地址,都需要把地址翻译为实际物理内存地址
    2. 所有进程共享这整一块物理内存,每个进程只把自己目前需要的虚拟地址空间映射到物理内存上
    3. 进程需要知道哪些地址空间上的数据在物理内存上,哪些不在(可能这部分存储在磁盘上),还有在物理内存上的哪里,这就需要通过页表来记录
    4. 页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)
    5. 当进程访问某个虚拟地址的时候,就会先去看页表,如果发现对应的数据不在物理内存上,就会发生缺页异常
    6. 缺页异常的处理过程,操作系统立即阻塞该进程,并将硬盘里对应的页换入内存,然后使该进程就绪,如果内存已经满了,没有空地方了,那就找一个页覆盖,至于具体覆盖的哪个页,就需要看操作系统的页面置换算法是怎么设计的了。

     

    关于虚拟内存与物理内存的联系,下面这张图可以帮助我们巩固。

    页表的工作原理如下图

    1. 我们的cpu想访问虚拟地址所在的虚拟页(VP3),根据页表,找出页表中第三条的值.判断有效位。 如果有效位为1,DRMA缓存命中,根据物理页号,找到物理页当中的内容,返回
    2. 若有效位为0,参数缺页异常,调用内核缺页异常处理程序。内核通过页面置换算法选择一个页面作为被覆盖的页面,将该页的内容刷新到磁盘空间当中。然后把VP3映射的磁盘文件缓存到该物理页上面。然后页表中第三条,有效位变成1,第二部分存储上了可以对应物理内存页的地址的内容。
    3. 缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1。
    4. 将找到的内容映射到告诉缓存当中,CPU从告诉缓存中获取该值,结束。

     

    再来总结一下虚拟内存是怎么工作的

    当每个进程创建的时候,内核会为进程分配4G的虚拟内存,当进程还没有开始运行时,这只是一个内存布局。实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射)。这个时候数据和代码还是在磁盘上的。当运行到对应的程序时,进程去寻找页表,发现页表中地址没有存放在物理内存上,而是在磁盘上,于是发生缺页异常,于是将磁盘上的数据拷贝到物理内存中。

    另外在进程运行过程中,要通过malloc来动态分配内存时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。

    可以认为虚拟空间都被映射到了磁盘空间中(事实上也是按需要映射到磁盘空间上,通过mmap,mmap是用来建立虚拟空间和磁盘空间的映射关系的)

     

    利用虚拟内存机制的优点 

    1. 既然每个进程的内存空间都是一致而且固定的(32位平台下都是4G),所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际内存地址,这交给内核来完成映射关系
    2. 当不同的进程使用同一段代码时,比如库文件的代码,在物理内存中可以只存储一份这样的代码,不同进程只要将自己的虚拟内存映射过去就好了,这样可以节省物理内存
    3. 在程序需要分配连续空间的时候,只需要在虚拟内存分配连续空间,而不需要物理内存时连续的,实际上,往往物理内存都是断断续续的内存碎片。这样就可以有效地利用我们的物理内存

     

    展开全文
  • 第六章 文件管理 在现代计算机系统中,要用到大量的程序和数据,由于内存容量有限,且不能长期保存,故而平时总是把他们以文件的形式存放在外存中,需要时调入内存...6.5 文件存储空间的管理 6.6 文件共享文件保护 6.

    第六章 文件管理

    在现代计算机系统中,要用到大量的程序和数据,由于内存容量有限,且不能长期保存,故而平时总是把他们以文件的形式存放在外存中,需要时调入内存。

    但用户不能够胜任管理文件的工作,于是在OS中又增加了文件管理功能,构成一个文件系统,负责管理在外存上的文件,把文件的存取、共享和保护等手段提供给用户,方便了用户,保证了文件的安全,提高系统资源的利用率。

    • 6.1 文件何文件系统
    • 6.2 文件的逻辑结构
    • 6.3 外存分配方式
    • 6.4 目录管理
    • 6.5 文件存储空间的管理
    • 6.6 文件共享与文件保护
    • 6.7 数据一致性控制

    6.1 文件和文件系统

    • 一、文件、记录和数据项
    • 二、文件类型和文件系统模型
    • 三、文件操作

    一、文件、记录和数据项

    图片1

    图片2

    图片3

    二、文件类型和文件系统模型

    图片4

    图片5

    图片6

    三、文件操作

    • 用户通过文件系统所提供的系统调用实施对文件的操作。最基本的文件操作有:创建文件、删除文件、读文件、写文件、截断文件何设置文件的读/写位置。
    • 但对于一个实际的OS,为了方便用户使用文件而提供了更多地对文件的操作,如打开和关闭一个文件及改变文件名等操作。

    图片7

    6.2 文件的逻辑结构

    • 一、文件逻辑结构的类型
    • 二、顺序文件
    • 三、索引文件
    • 四、索引顺序文件
    • 五、直接文件何哈希文件

    文件的结构

    图片8

    一、文件逻辑结构的类型

    可以分为两大类:

    • 有结构文件:
      指由一个以上的记录构成的文件,又把它称为记录式文件;根据记录的长度可分为定长记录文件;不定长记录文件。
    • 无结构文件:
      指由字符流构成的文件,故又称为是流式文件。

    图片9

    图片10

    二、顺序文件

    逻辑记录的排序

    • 串结构:
      各记录之间的顺序与关键字无关。通常由时间来决定。
    • 顺序结构:
      文件中的所有记录按关键字排列。可以按关键字的长短或英文字母书写排序。顺序结构的检索效率更高。

    三、索引文件

    图片11

    四、索引顺序文件

    图片12

    6.3 外存分配方式

    图片13

    • 一、连续分配
    • 二、链接分配
    • 三、索引分配

    一、连续分配

    图片14

    图片15

    二、链接分配

    图片16

    图片17

    图片18

    6.5 文件存储空间的管理

    图片19

    图片20

    图片21

    图片22

    图片23

    图片24

    图片25

    图片26

    图片27

    图片28

    图片29

    图片30

    图片31

    展开全文
  • 空间内存、堆空间内存和方法区内存 ​ 在学习Java的过程中,我们知道,我们编译出的class文件,需要加载到内存中才可以运行。...在栈内存空间中,存储的是方法以及局部变量。当方法被执行时,栈内存空间中就会为其

    栈空间内存、堆空间内存和方法区内存

    ​ 在学习Java的过程中,我们知道,我们编译出的class文件,需要加载到内存中才可以运行。在Java中,有三个很重要的内存空间:栈内存空间、堆内存空间以及方法区内存空间。今天,我就来谈一下我对于这三个内存空间的一些理解吧。


    ​ 首先,我们先来讲一下,什么是栈内存空间、堆内存空间、方法区内存空间。

    • 栈内存空间:

    ​ 栈是一种数据结构,特点是后进先出,意思是最后进入的数据会最先被读取。在栈内存空间中,存储的是方法以及局部变量。当方法被执行时,栈内存空间中就会为其分配内存,此时方法就会进入栈空间执行,称为压栈。当方法执行结束后,就会释放空间,称为弹栈,此时方法就会退出栈内存空间。方法一定是压栈和弹栈!

    • 堆内存空间

    ​ 堆内存空间是一块比栈内存空间大得多的空间,主要用于储存java程序中产生的对象。比如在程序中遇到new关键字,就会产生一个对象实例,这个对象实例会被存储在堆内存空间中。

    • 方法区内存空间

    ​ 方法区内存空间中保存的是代码片段、常量以及static修饰的变量。在jdk1.7以前,方法区内存空间中还存在一个常量池来储存常量(其中包含了String),在jdk1.8以后,常量池从方法区中移除,在堆区增加了元数据空间。


    实例

    • 代码
    public class Test
    {
    	public static void main(String[] args)
    	{
    		Test res = new Test();
    		res.test();
    	}
    	
    	public void test()
    	{
    		int a = 10;
    		System.out.println(a);
    	}
    }
    
    • 内存区示意图

    栈内存空间中所有方法执行结束后,都会弹栈,释放内存。

    展开全文
  • 今天小编就带大家走进机身内存和运行内存的世界,并对运行内存和机身内存区别做一个大致的了解。什么是运行内存在一部手机常见的存储部件中,RAM存储器,也就是运行内存,它的作用相当于电脑的内存条,不仅能存储...
  • Android 获取内存/存储空间大小

    千次阅读 2020-11-22 12:23:29
    Android 内存可用空间/总空间大小获取 public class memInfo { // 获得可用的内存 public static long getMemUnused(Context mContext) { long memUnused; // 得到ActivityManager ActivityManager ...
  • Win7系统优化虚拟内存增加储存空间方法.docx
  • -- 硬盘(虚拟内存)(掉电不丢失) 操作系统在内存管理方面需要重点完成的目标: 抽象:逻辑地址空间 保护:独立地址空间 共享:访问相同内存 虚拟化:获得更多的地址空间 物理地址空间: 硬件支持的地址空间,...
  • 关于内存地址与内存空间的理解

    千次阅读 2020-04-07 16:01:32
    也就是说一个内存地址代表一个字节(8bit)的存储空间。 例如,32位的CPU理论最多支持4GB的内存空间,CPU只能寻址2的32次方(4GB). 区分: 4位16进制表示的内存地址和用8位16进制表示的内存地址,其实都是代表一个8bit...
  • Android获取储存信息以及内存信息可以用adb命令查看。 adb查看系统内存信息以及储存信息: 命令:adb shell cat /proc/meminfo 代码: private static final String FILENAME_PROC_MEMINFO = /proc/meminfo; /*...
  • ascii码换算的最小单位是字节,所以在计算机内存中要存放256个ASCII码字符,需要256个字节的存储空间。字节(Byte)是存储数据的基本单位,并且是硬件所能访问的最小单位。CPU 只能直接处理内存数据,不能直接处理硬盘...
  • 进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。...下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的。 ...
  • 内存就是存储程序以及数据的地方,比如当我们在使用WPS处理文稿时,当你在键盘上敲入字符时,它就被存入内存中,当你选择存盘时,内存中的数据才会被存入硬(磁)盘。在进一步理解它之前,还应认识一下它的物理概念。...
  • 一个指针变量需要存储数据,变量本身只能存地址,不能存数据,需要分配内存空间存储数据#include #include int main(){//char name[100] = {};数组确定大小是为了分配内存空间//如果使用指针变量接收数据//必须先为...
  • 20 Redis 的内存空间存储效率问题

    万次阅读 2021-12-09 20:48:43
    20 Redis 的内存空间存储效率问题前言一、内存碎片二、内存碎片形成的原因三、判断是否有内存碎片的方法四、清理内存碎片的方法总结 前言 做了数据删除,数据量已经不大了,使用 top 命令查看时还会发现 Redis ...
  • 内存从标准上可以分为:SIMM、DIMM内存从外观上可以分为:30线、64线、72线、100线、144线、168线、200线和卡式、插座式。内存从芯片类别上可以分为:FPM、EDO、SDRAM、RAMBUS、DDR内存从整体性能上可以分为:普通...
  • 但是我想说的是关于商业价值的角度去探讨,为什安卓手机对于性能的PK是特别的猛烈的,早期我们接触手机运行内存从之前的1G、2G、4G、6G、8G再到如今都有了12G、16G和18G的运行内存,而储存空间我了解到的从之前的8G...
  • 空间与直接内存的关系

    千次阅读 2020-12-01 14:52:44
    但类的元数据信息(metadata)还在,只不过不再是存储在连续的堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。 从上图可以看到,元空间和直接内存都是堆外内存,那么二者的区别是什么呢? ...
  • 内存地址存储内存空间

    千次阅读 2018-05-13 11:56:37
    1.内存地址用4位16进制和8位16进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一...
  • 电脑内存和磁盘空间有什么区别与联系、、、 ------------------- 很多购买电脑的同学仍然还不清楚内存和硬盘到底有什么区别,在电脑里面有什么作用,容易把内存当硬盘或把硬盘当内存,===========================...
  • 从书中可见,可寻址的最小内存空间存储的基本单元是不同的。 存储的基本单元,被称为存储字。 存储字的位数存储器中的数据线根数是相同的。 也就是说,存储器在取数据的时候,是按一个存储字一个存储字取的。 即...
  • 如何分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。 如何回收磁盘块:与内存管理中的动态分区分配很...
  • PCIe的内存地址空间、I/O地址空间和配置地址空间

    千次阅读 多人点赞 2018-08-12 18:07:14
    pci设备其它接口的设备(如i2c设备)最大的不同是存在内存地址空间和配置地址空间,本文分析一下它们的用途。 首先区分一下IO空间内存空间 cpu会访问的设备一般有内存和外设寄存器,如下图所示。x86架构采用...
  • Linux下共享内存编程(共享存储空间

    万次阅读 多人点赞 2018-07-29 23:44:08
    不要同时对共享存储空间进行写操作,通常,信号量用于同步共享存储访问。 最简单的共享内存的使用流程 ①ftok函数生成键值 ②shmget函数创建共享内存空间 ③shmat函数获取第一个可用共享内存空间的地址 ④shmdt...
  •  使用动态内存很明显的好处是:不需要预先分配存储空间且分配的空间可以根据程序的需要扩大或缩小,这样可以有效的使用内存空间。  malloc和free  C函数库中的malloc和free分别用于执行动态内存分配和释放。这...
  • 一个n阶对称矩阵存入内存,在采用压缩存储和采用非压缩存储时占用的内存空间分别是多少?怎么解答(python初学者,想请教一下)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,155,235
精华内容 462,094
关键字:

内存与储存空间的区别