精华内容
下载资源
问答
  • 内存管理有哪几种方式

    千次阅读 2013-10-07 21:22:12
    常见的内存管理方式块式管理,业式管理, 段式管理, 段业式管理。 最长用的是段业式管理。 (1) 块式管理:把主存分为一块一块的,当所需的程序片段不再主存时就分配一块主存空间,把程序load入主存,就算...

    常见的内存管理方式有块式管理,业式管理, 段式管理, 段业式管理。

    最长用的是段业式管理。

    1) 块式管理:把主存分为一块一块的,当所需的程序片段不再主存时就分配一块主存空间,把程序load入主存,就算所需的程序片段只有几个字节也只能把这一块都分给他,造成很大的浪费,但易于管理。

    2) 业式管理:把主存分为一页一页的,每一页的空间要比一块小很多,显然这种分法的空间利用率要比块式管理高很多。

    3) 段式管理:把主存分为一段一段的,每一段的空间要比一页小很多,这种方法在空间利用率上比业式管理高很多,但有另外一个缺点:一个程序片段可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上。

    4) 段业式管理:结合了段式和业式的优点。把主存先分为若干段,每个段又分成若干业。

    段业式管理每取一数据要访问3次内存:

    第一次是由段表地址寄存器段表始址后访问段表,由此取出对应段的页表在内存中的地址

    第二次则是访问页表得到所要访问的物理地址
    第三次才能访问真正需要访问的物理单元

    展开全文
  • c语言中内存的分配方式有哪几种

    千次阅读 2018-07-28 16:07:38
    内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等。 2、栈上分配 在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。 3、堆上分配...

    1、静态存储区分配

    内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等。

    2、栈上分配

    在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。

    3、堆上分配

    堆分配(又称动态内存分配)程序在运行时用malloc或者new申请内存,程序员自己用free或者delete释放,动态内存的生存期由我们自己决定。

    展开全文
  • 进程间通信有哪几种方式?

    千次阅读 2019-04-28 16:01:55
    无名管道( pipe ):管道是一半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中...

    答:管道、消息队列、信号量、共享内存、套接字

    • 无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
    • 高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
    • 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    • 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    • 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
    • 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
    • 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。



    • 进程间通信IPC:
      https://www.cnblogs.com/CheeseZH/p/5264465.html
      总结:

      进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。

      IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

      一、管道

      管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。

      1、特点:

      1. 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

      2. 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

      3. 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

       

      二、FIFO

      FIFO,也称为命名管道,它是一种文件类型。

      1、特点

      1. FIFO可以在无关的进程之间交换数据,与无名管道不同。

      2. FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

       

      三、消息队列

      消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。

      1、特点

      1. 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。

      2. 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。

      3. 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

       

      四、信号量

      信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

      1、特点

      1. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。

      2. 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。

      3. 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。

      4. 支持信号量组。

       

      五、共享内存

      共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。

      1、特点

      1. 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。

      2. 因为多个进程可以同时操作,所以需要进行同步。

      3. 信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

      进程间的五种通信方式介绍

       

    展开全文
  • 几种内存模型

    千次阅读 2018-12-19 08:19:40
    这篇文章主要讨论的是多线程与内存的关系。 实际上,内存模型对单线程而言,它只保证程序在单线程执行的情况下,程序能够得到正确的结果。 一、内存模型是什么 内存模型是对内存进行读写访问过程的抽象。也可以这样...

    首先跟大家确定一个大前提是内存模型是与多线程息息有关的。这篇文章主要讨论的是多线程与内存的关系。

    实际上,内存模型对单线程而言,它只保证程序在单线程执行的情况下,程序能够得到正确的结果。

    一、内存模型是什么

    内存模型是对内存进行读写访问过程的抽象。也可以这样说,内存模型定义正确的内存读写行为(单线程)。
    

    二、重排序是什么

    重排序是重新调整语句或指令的顺序去提高程序的执行性能。

    编译器重排序: 不改变在单线程中程序执行结果时,可以重新安排语句的执行顺序。

    处理器重排序: 由于处理器使用缓存、缓冲区等技术,使得对内存的加载和存储看上去可能在乱序执行。

    三、as-if-serial语义是什么

    无论怎么重排序,程序在单线程下的执行结果不能被改变。

    四、几种内存模型的比较

    顺序一致性内存模型是一个理论的内存模型,处理器内存模型和Java内存模型都是在此基础上进行不同程度的弱化,

    目的是为了提高程序执行的性能。

    4.1、顺序一致性内存模型

    4.1.1、什么是顺序一致性内存模型

    通俗语义是多线程的程序执行应该和多个线程在一个处理器核上交错执行的效果一致。

    4.1.2、顺序一致性内存模型的特点

    禁止编译器优化:按(单线程)程序的顺序依次访问内存。
    禁止处理器优化:每个写的操作是立即可见的通过内存。

    4.1.3、内存模型与多线程之间的关系

    在这里插入图片描述
    图 4-1-1

    通过一个例子来说明顺序一致性内存模型
    在这里插入图片描述
    图 4-1-2

    这个会有几种的执行路径和可能的结果
    在这里插入图片描述
    第一种
    在这里插入图片描述
    第二种
    在这里插入图片描述
    第三种
    在这里插入图片描述
    第四种(不可能出现的结果)

                           图 4-1-3
    

    从图4-1-2的示例中,我们可以很快得出几种执行路径和结果,在图4-1-3中清晰展示可能的执行路径和结果。那为什么第四种情况在顺序一致性内存模型不可能出现了,

    是由顺序一致性内存模型的特点所决定的,在顺序一致性内存模型中是禁止处理器重排序的,导致第四种的的执行结果不能出现 。什么请求下会出现第四种情况了,就是接

    下来要讲处理器内存模型。

    4.2、处理器内存模型

    处理器内存模型是在顺序一致性内存模型基础上放松其中一个或多个操作顺序(写读、写写、读读和读写)而产生的一种内存模型。

    注意:这里的放松是指允许写读、写写、读读和读写其中一种或多种操作可以重排序。

    这里以TSO的处理器内存模型来讲解

    TSO内存模型是在顺序一致性内存模型基础放松对写读操作顺序(重排序)而产生的一种内存模型。

    4.2.1、内存模型与多线程关系

    由于现代处理器都使用写缓冲区,因此现代处理器都允许都写读操作进行重排序。

    在这里插入图片描述 图 4-2-1

    示例:
    在这里插入图片描述
    图 4-2-2

    TSO除了以上顺序一致性内存模型产生执行路径和结果之外,还有一种tso特有的执行路径和结果

    该图中左边图是引用于Sequential Consistency &TSO文章中图和右图引用于深入理解 Java 内存模型(一)——基础
    在这里插入图片描述
    该图中左边图是引用于Sequential Consistency &TSO文章中图和右图引用于深入理解 Java 内存模型(一)——基础
    图4-2-3

    图4-2-2中示例,可能会出现的执行结果在图4-2-3中进行展示。从图4-2-3可以看出这是由于处理器中执行顺序与内存访问顺序不一致而出现的结果,这是由于处理器内存系统导致的重排序。

    那下面要讲的Java内存模型会扮演什么的角色了。

    问题:

    1、编译器的重排序与处理器中都写读可以进行重排序有什么区别。

    2、如果编译器进行读读重排序,但是TSO的内存模型是不允许进行读读重排序的,这两者就会产生矛盾。

    4.3、Java内存模型

    它描述一组规则或是规范,这个定义了一个线程对共享变量的写入何时对另一个线程可见。

    它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化

    4.3.1、内存模型与多线程的关系

    从图4-3-1中我们可以明显看出Java

    该图来引用于深入理解Java内存模型文章中图
    在这里插入图片描述
    图 4-3-1 该图来引用于深入理解Java内存模型文章中图

    4.3.2、正确同步的程序、未正确同步或是未同步的程序

    未同步的多线程程序

    编译器

    class Demo1 {
    int x = 0;
    int y = 0;

    public void write() {
    y = 1;
    int r1 = x;
    }

    public void read () {
    x = 2;
    int r2 = y;
    }
    }

    可能的执行路径和结果:
    在这里插入图片描述
    图 4-3-2

    处理器

    如上文提到处理器内存模型中示例,产生的执行路径和结果

    正确同步的多线程程序

    编译器:

    class Demo1 {
    volatile int x = 0;
    volatile int y = 0;

    public void write() {
    y = 1;
    int r1 = x;
    }

    public void read () {
    x = 2;
    int r2 = y;
    }
    }

     执行路径和结果
     
                                      图 4-3-3
    
        读者可以自行画其它的执行路径和结果。
    

    Sparc-TSO处理器:Sparc-TSO处理器使用的内存模型是TSO(上文所讲的)

    示例

    在这里插入图片描述

                                        图4-3-4
    

    通过在定义x和y变量时,加一个volatile修饰符。在最终执行的指令序列中会在S1和L1,S2和L2之间分别添加一个StoreLoadBarrier内存屏障。最终达到下图效果。

    在这里插入图片描述
    图 4-3-5

    右边线程与左边的处理器在这里是一致的

    这使得指令在执行顺序与在内存中的执行顺序一致

                               处理器中执行顺序:A1:S1 => A2 => A3:L1
    
                               内存中执行顺序:    A1:S1 => A3:L1
    

    java内存模型控制线程对内存的访问

                    结论:正确同步Java内存模型的多线程跟顺序一致性的内存模型的执行路径是一致的。
    

    正确同步多线程+Java内存模型 == 顺序一致性的内存模型。

    4.3.3、Java的内存模型对程序员是透明的

    Java的内存模型是对程序员是透明的,那Java内存模型是已什么方式呈现给程序员,

    Java内存模型是已happens-before方式呈现给程序员的。

    4.3.4、happens-before规则

    概念

         后一个语句执行需要依赖前一个语句的执行结果,且前一个语句按顺序排在后一个语句的前面。
    

    但并不意味后一个语句一定在前一个语句之后执行。

    int a = 1;
    int b = 2;
    int c = a + b + 1;

    执行路径
    在这里插入图片描述
    图 4-3-6

    程序如果能优化,编译器和处理器会尽可能的进行优化(即是提高性能)。

    几个规则

    程序顺序规则、监视器锁的规则、volatile变量规则、传递性等,具体含义可以参照SR-133: Java Memory Model and Thread Specification深入理解 Java 内存模型的系列文章等文章。

    4.3.5、解决什么问题

    它保证内存一致性,对程序员是透明的,它是通过解决重排序问题来保证的

    它能禁止某种特定类型的编译器重排序

    它能禁止某种特定类型的处理器重排序

    通过内存屏障来禁止处理器重排序。在生成最终指令的序列过程中插入内存屏障(在使用同步原语(lock,volatile等)适当的位置插入)。

    并不是对所有的处理器重排序都禁止,它只是禁止某种特定类型的重排序。

    4.4、Java内存模型、处理器内存模型和顺序一致性内存模型关系

    顺序一致性内存模型是一个理论的内存模型。处理器内存模型是参照顺序一致性内存模型进行弱化的实现。

    参考文档

    1、深入理解 Java 内存模型的系列文章

    2、wikipedia顺序一致性

    3、CPU cache结构和缓存一致性(MESI协议)

    4、CPU系统架构,cache miss终于明白点了

    5、Sequential Consistency&TSO

    6、内存模型和缓存一致性协议入门

    7、JSR-133: Java Memory Model and Thread Specification

    展开全文
  • 内存分配方式有几种

    万次阅读 2013-10-12 09:11:55
    内存分配方式有几种? 静态存储区 栈 堆 的内存分配 1,从静态存储区域分配内存。程序编译的时候内存已经分配好了,并且在程序的整个运行期间都存在,例如全局变量。 2,在栈上创建。在执行函数时,函数内局部...
  • 虚拟化是什么,虚拟化主要分为哪几种

    万次阅读 多人点赞 2019-05-22 22:10:42
    1.虚拟化是资源的一逻辑表示,并不会受限于物理资源。 2.运行的环境不在真实的硬件上,而是硬件之上的虚拟内存中的一段,或者说是虚拟的环境中。 3.虚拟化为数据、计算能力、存储资源等提供了一个逻辑视图,而不是...
  • 操作系统的内存管理单元(Memory Management Unit,MMU)只能完成一次虚拟地址到物理地址的映射,但获得的物理地址只是虚拟机物理地址而不是机器物理地址,所以需要VMM参与,以获得总线上可以使用的机器地址为实现...
  • Java常见的几种内存溢出及解决方法

    千次阅读 2018-04-27 00:00:31
    ava常见的几种内存溢出及解决方法【情况一】:java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一个原因是程序中死循环; 如果是java堆内存不够的...
  • 可能出现内存泄漏的几种情况

    千次阅读 2017-04-05 23:04:05
    定义    简单来说,内存泄漏就是程序在申请一个内存空间后没有释放,直到程序运行结束后才释放。这样看起来似乎没什么大问题,但是如果程序会持续运行很长时间...   内存泄漏可能发生在如下几种条件下:    1
  • 进程间通信有哪几种方式

    千次阅读 2018-03-02 13:14:34
    无名管道( pipe ):管道是一半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中...
  • 内存泄漏的检测 几种常见场景和解决方法
  • Jvm内存溢出的几种情况

    千次阅读 2017-07-27 23:43:24
    关于Jvm内存溢出的几种情况
  • 创建线程池有哪几种方式

    千次阅读 2020-05-04 22:15:27
    创建线程池有哪几种方式一、Executors二、ThreadPoolExecutor 一、Executors Executors是一个线程相关的工具类。主要提供了以下几种创建线程池的方法: index method corePoolSize maximumPoolSize ...
  • Redis有哪几种数据淘汰策略?

    千次阅读 2018-06-10 14:16:55
    noeviction:当内存限制达到,谁也不删除,返回错误。allkeys-lru:尝试回收最少使用的键,使得新添加的数据空间存放。volatile-lru:尝试回收最少使用的键,但仅限于在过期集合的键,使得新添加的数据空间存放。...
  • 简述几种人脸识别的主要方法

    万次阅读 2019-05-29 08:33:58
    人脸识别的方法很多,以下介绍一些主要的人脸识别方法。 (1)几何特征的人脸识别方法 几何特征可以是眼、鼻、嘴等的形状和它们之间的几何关系(如相互之间的距离)。这些算法识别速度快,需要的内存小,但识别率较低...
  • 导致JS内存泄漏的几种情况

    千次阅读 2017-08-07 14:32:57
    内存泄漏是开发中很常见的问题,即使使用具有自动管理内存的语言,也可能出现内存泄漏的情况,内存泄漏可能会引起变慢、延迟、崩溃等问题。要解决内存泄漏问题,首先要弄懂什么是内存泄漏,什么情况下会导致内存...
  • C++类几种情况的内存布局

    千次阅读 2017-10-17 00:39:04
    关于C++类内存布局的几种情况,需要多熟悉
  • 最近朋友推荐了一篇关于内存溢出与内存泄漏的文章,感觉写的还不错,于是便在网上搜索了一番,对这块进行了加固,发现自己之前写的代码也存在一些内存泄漏的风险,所以弄懂内存泄漏与内存溢出是很有利于我们提高代码...
  • Windows内存管理的几种方式和优缺点

    千次阅读 2016-07-27 11:34:03
    Windows内存管理方式主要分为:页式管理、段式管理和段页式管理。 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页。把内存空间按页的大小划分为片或者页面,然后把页式虚拟地址与内存地址建立...
  • 主要包括单一连续分配、固定分区分配和动态分区分配。 注意:此处的连续内存分配是将整个进程的数据整块加载到内存之中。 1.单一连续分配(单任务处理) 内存在此方式下分为系统区和用户区,系统区仅提供给操作...
  • 造成内存泄露的几种原因 C++

    万次阅读 多人点赞 2018-01-29 13:35:18
    先考虑一情况,对一个已知对象进行拷贝,编译系统会自动调用一构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。 //main.cpp #include #include "student.h" int main...
  • 8.内存连续分配方式采用的几种算法及各自优劣

    千次阅读 多人点赞 2018-05-25 09:46:59
    主要包括单一连续分配、固定分区分配和动态分区分配。1.单一连续分配内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式...
  • 一、五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部...
  • 内存分配的三方式

    千次阅读 2018-07-23 16:54:36
    内存分配方式: 一:从全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。 二:从栈区分配:在执行函数的时候,函数中的局部变量的...
  • C语言中申请内存几种方式

    万次阅读 2018-09-19 15:00:48
    一、C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量.<2>在栈上创建在执行函数时,...
  • Java四引用类型 1.引用的基本概念 强引用:当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了。如果一个对象具有强引用,JVM就不会去GC它,JVM...
  • 1,增加内存; 2,使用内存淘汰策略。 3,Redis集群。 重点介绍下23; 第2点: 我们知道,redis设置配置文件的maxmemory参数,可以控制其最大可用内存大小(字节)。 那么当所需内存,超过maxmemory怎么办?...
  • XML文档定义方式:定义形式,dtd文档类型定义和schema模式本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的)普通区别:1.schema 是内容开放模型,可扩展,功能性强,而...
  • 栈:原始数据类型(Undefined Null Boolean Number String)堆:引用数据类型(对象、数组、函数)原始数据引用数据4、总结区别 a 声明变量时不同的内存分配: 1)原始值:存储在栈(stack)中的简单数据段,...
  • android 内存使用详情查询的几种方法

    千次阅读 2018-07-18 11:02:22
    android /proc/ 目录下为我们提供了操作系统几乎所有的状态信息,当然也包含系统的内存使用信息,下面列举了一些对应内存使用情况的目录信息: /proc/meminfo 机器的内存使用情况 /proc/pid/maps pid 为进程号,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,303,397
精华内容 521,358
关键字:

内存主要包括哪几种