空间数据

C/C++内存四区

烂漫一生 提交于 2019-12-27 02:15:27
内存模型图 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0~3G是用户态空间,3~4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中。其逻辑地址其划分如下: 各个段说明如下: 3G用户空间和1G内核空间 静态区域: text segment( 代码段 ):包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。 data segment( 数据段 ):存储程序中已初始化的全局变量和静态变量 bss segment( BSS段 ):存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量,对于未初始化的全局变量和静态变量,程序运行main之前时会统一清零。即未初始化的全局变量编译器会初始化为0 动态区域: heap( 堆区 ): 当进程未调用malloc时是没有堆段的,只有调用malloc时采用分配一个堆,并且在程序运行过程中可以动态增加堆大小(移动break指针),从低地址向高地址增长。分配小内存时使用该区域。 堆的起始地址由mm_struct 结构体中的start_brk标识,结束地址由brk标识。 memory mapping segment( 映射区 ):存储动态链接库等文件映射、申请大内存(malloc时调用mmap函数) stack( 栈区 ):使用栈空间存储函数的返回地址

深入理解C语言内存管理

北慕城南 提交于 2019-12-27 02:10:21
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。 问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int var1 = 1; 4 5 int main(void) { 6 int var2 = 2; 7 printf("hello, world!\n"); 8 exit(0); 9 } 经过gcc hello.c进行编译之后得到了名为a.out的可执行文件 [tuhooo@localhost leet_code]$ ls -al a.out -rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out ls命令是查看文件的元数据信息 [tuhooo@localhost leet_code]$ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),

深入理解Java虚拟机-Java内存区域透彻分析

我与影子孤独终老i 提交于 2019-12-26 16:09:22
Java虚拟机深入理解 系列全部文章更新中... 深入理解Java虚拟机-Java内存区域透彻分析 深入理解Java虚拟机-常用vm参数分析 深入理解Java虚拟机-JVM内存分配与回收策略原理,从此告别JVM内存分配文盲 深入理解Java虚拟机-如何利用JDK自带的命令行工具监控上百万的高并发的虚拟机性能 深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析 深入理解Java虚拟机-你了解GC算法原理吗 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这些知识之后,才能更好的进行Jvm调优或者更加深入的学习,本来这些知识是晦涩难懂的,所以希望能够讲解的透彻且形象。 0 运行时数据区域 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 Java 虚拟机所管理的内存一共分为Method Area(方法区)、VM Stack(虚拟机栈)、Native Method Stack(本地方法栈)、Heap(堆)、Program Counter Register(程序计数器)五个区域。 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。具体如下图所示: 上图介绍的是JDK1.8 JVM运行时内存数据区域划分。1.8同1.7比

操作系统知识系列之基础篇

為{幸葍}努か 提交于 2019-12-26 08:34:34
一、操作系统概述 特性 1. 并发: 同一时间间隔内支持执行多个任务, 对于一个核则是交替执行; 2. 共享: 硬件资源或数据资源支持多个进程共享; 3. 异步: 并发情况下, 一个程序会陆陆续续被执行,完成时间不可预知; 4. 虚拟: 物理实体转化为逻辑实体,如虚拟内存。 基本功能 CPU管理:对处理器的管理和调度最终归结为对进程和线程的管理和调度,包括进程控制和管理,线程控制和管理,确定处理器调度策略,设计处理器调度算法,做好处理器分配和回收。 存储管理:存储管理的主要任务是管理内存资源,为多道程序运行提供有力支撑,提高存储空间利用率,具体来说有内存分配与回收,地址转换与存储保护,内存共享与存储扩充等。 设备管理:设备管理的除妖任务是管理各种外部设备,完成用户提出的I/O请求;加快数据传输速度,发挥设备的并行性,提高设备的利用率;提供设备驱动程序和中断处理请求。 文件管理:文件库案例的主要任务有提供文件逻辑组织方法,提供文件物理组织方法,提供文件存取和使用方法,实现文件目录管理,实现文件共享和安全性控制,实现文件存储空间管理等。 体系结构 大内核:将操作系统作为一个整体放在内核当中。 微内核:将操作系统的功能进行详细划分,只有微内核在内核态中存在,其他的在用户态。由于存在用户态和内核态的切换所以会影响系统整体性能。 补充 用户栈: 进程在用户空间时创建的栈

字节对齐 详解

你离开我真会死。 提交于 2019-12-25 08:51:25
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任 何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的 排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型 的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没 有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出 的结果的高低字节进行拼凑才能得到该32bit数 据。显然在读取效率上下降很多。 二.字节对齐对程序的影响: 先让我们看几个例子吧(32bit,x86环境,gcc编译器): 设结构体如下定义: struct A { int a; char b; short c; }; struct B { char b; int a; short c; };

动态数组(一维二维)探秘

隐身守侯 提交于 2019-12-24 18:38:12
因为做leetcode的一道算法题 https://leetcode-cn.com/problems/regular-expression-matching/ ,需要用到二维数组,结果自己在理解和使用上有很大误解,所以单独拿出来,从内存等各方面透彻的梳理一遍。 一维数组 char * a = (char*)malloc(8 * sizeof(char)); memset(a, 0, 8); for (int i = 0; i < 8; i++) { *(a + i) = 'a' + i; } for (int i = 0; i < 8; i++) { cout << *(a+i); } for (int i = 0; i < 8; i++) { cout << a[i]; } free(a); 输出内容abcdefghabcdefgh 这样申请与char a[8]是一样的,不管是底层实现还是使用,都是一样的,这就是一个8个字节长度的数组。我们看内存,也是一段连续的数据。 释放内存的时候,系统可以根据内存管理把这连续的8个字节的空间回收。 二维数组 我们先看一下正常的用法 char a[8][4] = { 0 }; for (int i = 0; i < 8; i++) { for (int j = 0; j < 4; j++) { a[i][j] = 'a' + i; } }

C++学习笔记二:vector(向量)

偶尔善良 提交于 2019-12-23 10:24:54
C++学习笔记二:vector(向量) 介绍 用法 介绍 vector是一个可存储任意类型数据的动态数组。 分配空间方式:当分配空间不够时,会申请更大的内存空间(增长倍数:2),将原数据拷贝到新的内存块中,释放原内存空间。[连续线性空间] 用法 1. 声明和初始化 int size = 10 ; int a = 1 ; int arr [ 5 ] = { 1 , 2 , 3 , 4 , 5 } ; //vector construction vector < int > v1 ; //vector initialization:five types vector < int > v1 ( size ) ; //type 1 vector < int > v1 ( size , 5 ) ; //type 2 vector < int > v2 ( v1 ) ; //type 3 vector < int > v2 ( v1 . begin ( ) , v1 . begin ( ) + 4 ) ; //type 4 vector < int > v2 ( arr , arr + 2 ) ; //type 5 2. 基本操作 (1)字符串拼接 v1 . push_back ( a ) ; // 尾部插入 v1 . pop_back ( ) ; //尾部删除 v1 . insert (

R学习笔记(1):R是什么

强颜欢笑 提交于 2019-12-23 04:43:49
本文最新版已更新至http://thinkinside.tk/2013/05/03/r_notes_1_what.html 在学习量化投资的时候,我发现了R(www.r-project.org)。R到底是什么呢?在开始之前,先看看R的神奇之处。 1. R初窥 从CRAN(The Comprehensive R Archive Network)cran.r-project.org—mirrors.html中选择一个镜像,然后下载合适的安装包(R支持Linux、Mac OS X和Windows)。 安装并运行R后,可以看到R的控制台(我的操作系统是Mac OS): 在R的控制台输入如下命令: > install.packages('quantmod') # 安装quantmod包 > require(quantmod) #引用quantmod包 > getSymbols("GOOG",src="yahoo",from="2013-01-01", to='2013-04-24') #从雅虎财经获取google的股票数据 > chartSeries(GOOG,up.col='red',dn.col='green') #显示K线图 > addMACD() #增加MACD图 就能够看到下图的效果了: 最后,退出R: > q()#Terminate an R Session 2. R是什么

JAVA虚拟机JVM的简单认识

泪湿孤枕 提交于 2019-12-22 16:58:02
以前面试的时候经常会被问到Java虚拟机的问题,面试官会问到: ------------你知道虚拟机吗? ------------虚拟机内存机构是什么样的? ------------栈区和堆区的区别你知道吗? ------------虚拟机的类加载机制你知道吗? ------------虚拟机的双亲委派机制你知道吗? ------------java虚拟机的垃圾回收你知道吗? ------------JVM的优化你知道吗?内存优化你知道吗? 等等。。。。。。。。。。不知道!。。。。好,那就先这样吧,我们会过两天通知你面试结果,先回家等着吧。就这样等到了天荒地老,也没有等到面试的结果和通知。 如果你看完这篇文章还不了解虚拟机,面试的时候还被虚拟机的问题问住,我只能说,你没有认真看。 以上内容纯属废话,请看下面: -------------------------------------------------------------------------------------------- 一、java虚拟机的认知 1、JVM是Java Virtual Machine(Java虚拟机)的缩写。 虚拟机,字面理解就是虚拟的计算机。计算机可以安装操作系统吧,所以这个虚拟的计算机里面亦可以安装操作系统,比如Windows、Linux。就可理解成,虚拟机就是一款软件

零拷贝

大城市里の小女人 提交于 2019-12-22 16:40:58
1.1 Linux的普通I/O过程 这是一个从磁盘文件中读取并且通过Socket写出的过程,对应的系统调用如下。 read(file, tmp_buf, len); write(socket, tmp_buf, len); 1. 程序使用read()系统调用,系统由用户态转换为内核态,磁盘中的数据由DMA(Direct memory access)的方式读取到内核读缓冲区(kernel buffer)。DMA过程中CPU不需要参与数据的读写,而是DMA处理器直接将硬盘数据通过总线传输到内存中。 2. 系统由内核态转为用户态,当程序要读的数据已经完全存入内核读缓冲区以后,程序会将数据由内核读缓冲区,写入到用户缓冲区,这个过程需要CPU参与数据的读写。 3. 程序使用write()系统调用,系统由用户态切换到内核态,数据从用户缓冲区写入到网络缓冲区(Socket Buffer),这个过程需要CPU参与数据的读写。 4. 系统由内核态切换到用户态,网络缓冲区的数据通过DMA的方式传输到网卡的驱动(存储缓冲区)中(protocol engine) 可以看到,普通的拷贝过程经历了 四次内核态和用户态的切换 (上下文切换), 两次CPU从内存中进行数据的读写过程 ,这种拷贝过程相对来说比较消耗系统资源。 1.2 内存映射方式I/O tmp_buf = mmap(file, len);