空间数据

heap和stack的区别?

旧时模样 提交于 2019-12-06 02:01:50
1、申请方式    stack:由系统自动分配。例如,声明在函数中一个局部变量 int b; 系统自动在栈中为 b 开辟空间   heap:需要程序员自己申请,并指明大小,在 c 中 malloc 函数,对于 Java 需要手动 new Object()的形式开辟 2、申请后系统的响应   stack:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。   heap:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 3、申请大小的限制   stack:栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS 下,栈的大小是 2M(也有的说是 1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。   heap:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址

一文让你读懂懂阻塞、非阻塞、同步、异步IO

倖福魔咒の 提交于 2019-12-06 01:24:02
介绍 在谈及网络IO的时候总避不开阻塞、非阻塞、同步、异步、IO多路复用、select、poll、epoll等这几个词语。在面试的时候也会被经常问到这几个的区别。本文就来讲一下这几个词语的含义、区别以及使用方式。 Unix网络编程一书中作者给出了五种IO模型: 1、BlockingIO - 阻塞IO 2、NoneBlockingIO - 非阻塞IO 3、IO multiplexing - IO多路复用 4、signal driven IO - 信号驱动IO 5、asynchronous IO - 异步IO 这五种IO模型中前四个都是同步的IO,只有最后一个是异步IO。信号驱动IO使用的比较少,重点介绍其他几种IO以及在Java中的应用。 阻塞、非阻塞、同步、异步以及IO多路复用 在进行网络IO的时候会涉及到用户态和内核态,并且在用户态和内核态之间会发生数据交换,从这个角度来说我们可以把IO抽象成两个阶段:1、用户态等待内核态数据准备好,2、将数据从内核态拷贝到用户态。之所以会有同步、异步、阻塞和非阻塞这几种说法就是根据程序在这两个阶段的处理方式不同而产生的。 同步阻塞 当在用户态调用read操作的时候,如果这时候kernel还没有准备好数据,那么用户态会一直阻塞等待,直到有数据返回。当kernel准备好数据之后,用户态继续等待kernel把数据从内核态拷贝到用户态之后才可以使用

几种常见排序方法的基本介绍,性能分析,和c语言实现

不羁的心 提交于 2019-12-06 00:50:17
本文介绍8种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了能够条理清楚, 本文所有的算法和解释全部按照升序排序进行 首先准备一个元素无序的数组arr[],数组的长度为length,一个交换函数swap, 在main函数中实现排序函数的调用,并输出排序结果: void swap(int*x , int*y) { int temp = *x; *x = *y; *y = temp; } int main() { int arr[] = { 1,8,5,7,4,6,2,3}; int length = sizeof(arr) / sizeof(int); sort(arr, length); for (int i = 0;i < length;i++) { printf("%d\n", arr[i]); } return 0; } 插入排序 第一次循环: 第二次循环: 第三次循环: 外层循环每执行一次就从无序区向有序区中插入一个数据arr[i]   里层循环控制插入的数据arr[i]与其前一个数据比较,如果比前一个数据小,就让前一个数据后移1位   ...不断重复上述步骤,直到找到不比arr[i]小的数据arr[j],因为arr[j]后面的数据都后移了1位,所以直接将arr[i]放在空闲的arr[j+1]位置 c程序实现: void CRsort(int arr[],

数据结构 期末复习(1) 数据结构基本概念与顺序表基本操作

痴心易碎 提交于 2019-12-05 21:55:24
数据结构基本概念与顺序表基本操作 判断题 若用链表来表示一个线性表,则表中元素的地址一定是连续的。F 解析:存储方式为链式存储,地址可以是连续的也可以是分散的。 抽象数据类型中基本操作的定义与具体实现有关。F 解析:!!抽象数据类型、存储结构定义 单选题 在数据结构中,与所使用的计算机无关的数据结构是(A) A. 逻辑结构 B. 存储结构 C. 逻辑结构与存储结构 D. 物理结构 从物理存储上可以把数据结构分为 B A. 动态结构、静态结构 B. 顺序结构、链式结构 C. 线性结构、树形结构、图形结构和集合结构 D. 基本结构、构造型结构 下列关于数据的逻辑结构的叙述中,(A)是正确的。 A. 数据的逻辑结构是数据元素间关系的描述 B. 数据的逻辑结构反映了数据在计算机中的存储方式 C. 数据的逻辑结构分为顺序结构和链式结构 D. 数据的逻辑结构分为静态结构和动态结构 图形结构中元素之间存在(C)关系。 A. 一对一 B. 一对多 C. 多对多 D. 多对一 以下说法正确的是(D)。 A. 数据元素是数据的最小单位 B. 数据项是数据的基本单位 C. 数据结构是带有结构的各数据项的集合 D. 一些表面上很不相同的数据可以有相同的逻辑结构 数据的(B)包括集合、线性结构、树形结构和图形结构四种基本类型。 A. 存储结构 B. 逻辑结构 C. 基本运算 D. 算法描述

【Java基础】java虚拟机

流过昼夜 提交于 2019-12-05 19:28:48
一、梗概 现在用一张图来介绍每个区域存储的内容。 ​ 二、区域分类 2.1-运行时数据区 JVM运行时首先需要类加载器(classLoader)加载所需类的字节码文件。加载完毕交由执行引擎执行,在执行过程中需要一段空间来存储数据(类比CPU与主存)。这段内存空间的分配和释放过程正是我们需要关心的运行时数据区。,运行时数据区都包括,程序计数器,方法区(包含常量池),虚拟机栈,本地方法栈,堆 。 JVM本身就是一台虚拟的计算机,目的是为了实现一次编译处处执行。 2.2-程序计数器 程序计数器是一块较小的内存空间。他可以看做是当前线程所执行的字节码行号指示器。字节码解释器工作就是通过改变这个计数器的值来选择下一条需要执行的字节码指令。分支,循环,跳转,异常,线程恢复等基础功能都需要依赖这个计数器来完成。 由于JVM虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。当切换到另外一条线程时,若不保存当前未执行完线程的执行位置,下次处理机再执行这条线程时,又要重新开始执行。这种情况显然是不能容忍的。因此,为了线程切换后能正确的恢复到执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为‘线程私有’内存,

Android存储路径详细说明

混江龙づ霸主 提交于 2019-12-05 18:47:38
一、存储的分类 Android的存储路径实际分类为 内部存储路径 内部缓存存储路径 外部存储路径 外部缓存存储路径 在有些手机上,系统也会在内部划出一个内部的SDCard路径和内部存储路径,所以当有SDCard的时候,就会有6个路径存在了 内部存储空间中的应用私有目录 对于设备中每一个安装的 App,系统都会在内部存储空间的 data/data 目录下以应用包名为名字自动创建与之对应的文件夹。这个文件夹用于 App 中的 WebView 缓存页面信息,SharedPreferences 和 SQLiteDatabase 持久化应用相关数据等。 对于没有 Root 过的手机,普通用户是无法查看 data/data 目录内容的。不过开发人员可以使用模拟器调试应用,并通过 DDMS(Dalvik Debug Monitor Server)提供的 File Explorer 工具查看模拟器设备的存储空间。 注意:当用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。 外部存储空间中的应用私有目录 考虑内部存储空间容量有限,普通用户不能直接直观地查看目录文件等其他原因,Android 在外部存储空间中也提供有特殊目录供应用存放私有文件,文件路径为: /storage/emulated/0/Android/data/app package name 备注

Java虚拟机

人盡茶涼 提交于 2019-12-05 18:12:57
现在用一张图来介绍每个区域存储的内容。 ​ 运行时数据区怎么理解? JVM运行时首先需要类加载器(classLoader)加载所需类的字节码文件。加载完毕交由执行引擎执行,在执行过程中需要一段空间来存储数据(类比CPU与主存)。这段内存空间的分配和释放过程正是我们需要关心的运行时数据区。 运行时数据区 运行时数据区都包括,程序计数器,方法区(包含常量池),虚拟机栈,本地方法栈,堆 。 JVM本身就是一台虚拟的计算机,目的是为了实现一次编译处处执行。 程序计数器 程序计数器是一块较小的内存空间。他可以看做是当前线程所执行的字节码行号指示器。字节码解释器工作就是通过改变这个计数器的值来选择下一条需要执行的字节码指令。分支,循环,跳转,异常,线程恢复等基础功能都需要依赖这个计数器来完成。 由于JVM虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。当切换到另外一条线程时,若不保存当前未执行完线程的执行位置,下次处理机再执行这条线程时,又要重新开始执行。这种情况显然是不能容忍的。因此,为了线程切换后能正确的恢复到执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为‘线程私有’内存, 如果线程正在执行的是一个java方法

从内核文件系统看文件读写过程(转)

荒凉一梦 提交于 2019-12-05 15:31:33
系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行,处理器设有两种模式:“用户模式”与“内核模式”。一些 容易发生安全问题的操作都被限制在只有内核模式 下才可以执行,例如I/O操作,修改基址寄存器内容等。而 连接用户模式和内核模式的接口称之为系统调用 。 应用程序代码运行在用户模式下,当应用程序需要实现内核模式下的指令时,先向操作系统发送调用请求。 操作系统收到请求后,执行系统调用接口,使处理器进入内核模式 。当处理器 处理完系统调用操作后,操作系统会让处理器返回用户模式,继续执行用户代码 。 进程的虚拟地址空间可分为两部分, 内核空间和用户空间 。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们 都处于虚拟空间中,都是对物理地址的映射 。 应用程序中 实现对文件的操作过程就是典型的系统调用过程 。 回到顶部 虚拟文件系统 一个操作系统可以支持多种底层不同的文件系统(比如NTFS, FAT, ext3, ext4),为了给内核和用户进程提供统一的文件系统视图,Linux在用户进程和底层文件系统之间加入了一个抽象层,即虚拟文件系统(Virtual File System, VFS),进程所有的文件操作都通过VFS

面向对象介绍

萝らか妹 提交于 2019-12-05 14:54:25
面向对象 一、什么是面向对象 1.1 面向过程编程思想 1.2 面向对象编程思想 二、如何产生对象 2.1 什么是类 2.2 如何定义类 2.2.1 函数的名称空间和类的名称空间的区别 三、什么是对象 2.3 类的操作 四、类和对象的操作:增、删、查、改 4.1 查看类和对象的名称空间 4.2 类和对象的属性(类中的变量)操作 4.2.1 查找类和对象的属性 4.2.2 增加类和对象中的属性 4.2.3 修改类和对象中的属性 4.2.4 删除类和对象中的属性 五、类中的数据属性(类中的变量) 六、类中的方法(类中的函数) 七、对象属性的查找顺序 八、对象绑定方法的特殊之处 九、一切皆对象 TOC 面向对象 一、什么是面向对象 注意:编程思想仅仅是一门思想,与任何技术无关。 面向对象是一门编程思想 1.1 面向过程编程思想 核心是 过程 二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。 优点 将复杂的问题流程化,进而简单化 缺点 牵一发而动全身,程序的可扩展性差 1.2 面向对象编程思想 核心是 对象 二字,对象指的是 特征与技能 的结合体。 基于该编程思想编写程序,就好比在创造世界,一种 上帝式 的思维方式。 优点 可扩展性高 缺点 编写程序的复杂程度比面向过程高 二、如何产生对象

C语言 malloc函数

半世苍凉 提交于 2019-12-05 14:21:38
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/flowing_wind/article/details/81240910 谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道。 1、关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: 也可以这样认为(window下)原型: extern void *malloc(unsigned int num_bytes); 头文件: #include<malloc.h>或者#include<alloc.h>两者的内容是完全一样的1 如果分配成功:则返回指向被分配内存空间的指针 不然返回指针NULL 同时,当内存不再使用的时候,应使用free()函数将内存块释放掉。 关于:void*,表示未确定类型的指针,c,c++规定void*可以强转为任何其他类型的指针,关于void还有一种说法就是其他任何类型都可以直接赋值给它,无需进行强转,但是反过来不可以 malloc: malloc分配的内存大小至少为参数所指定的字节数 malloc的返回值是一个指针,指向一段可用内存的起始位置,指向一段可用内存的起始地址,多次调用malloc所分配的地址不能有重叠部分