空间数据

堆栈,堆栈,堆和栈的区别【转载】

谁说我不能喝 提交于 2019-11-26 18:35:42
原文: http://www.cppblog.com/oosky/archive/2006/01/21/2958.html 非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。

socket阻塞与非阻塞,同步与异步【转】

岁酱吖の 提交于 2019-11-26 18:31:43
原文: socket阻塞与非阻塞,同步与异步 作者: huangguisu 1. 概念理解 在进行网络编程时,我们常常见到 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock) 四种调用方式: 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 也就是必须一件一件事做 , 等前一件做完了才能做下一件事。 例如普通 B/S 模式(同步):提交请求 -> 等待服务器处理 -> 处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 例如 ajax请求( 异步) : 请求通过事件触发 -> 服务器处理(这是浏览器仍然可以作其他事情) -> 处理完毕 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。 有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同 步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 例如,我们在s ocket 中调用r ecv 函数,如果缓冲区中没有数 据,这个函数就会一直等待,直到有数据才返回。而此时

Windows中进程的内存结构

落爺英雄遲暮 提交于 2019-11-26 17:39:09
基础知识: 堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Register)。每种变量都有不同的分配方式。先来看下面这段代码: #include <stdio.h> int g1=0, g2=0, g3=0; int main() { static int s1=0, s2=0, s3=0; int v1=0, v2=0, v3=0; //打印出各个变量的内存地址

C++中内存分配详解

余生颓废 提交于 2019-11-26 17:38:58
转载自51CTO.com http://developer.51cto.com/art/201107/276154.htm 我们都知道,内存基本上分为静态存储区、堆区和栈区三大部分。本文介绍的是C++中的内存分配的问题,希望对你有帮助,一起来看。 程序运行时,特别要注意的是内存的分配。下面介绍 C++ 程序设计中的 内存分配 。 一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 二、三者之间的区别 我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方。 例一

C++中内存分配详解

房东的猫 提交于 2019-11-26 17:38:45
转载自51CTO.com http://developer.51cto.com/art/201107/276154.htm 我们都知道,内存基本上分为静态存储区、堆区和栈区三大部分。本文介绍的是C++中的内存分配的问题,希望对你有帮助,一起来看。 程序运行时,特别要注意的是内存的分配。下面介绍 C++ 程序设计中的 内存分配 。 一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 二、三者之间的区别 我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方。 例一

缓存的一些问题和一些加密算法【缓存问题】

三世轮回 提交于 2019-11-26 17:14:14
缓存 1 需求背景 缓存不是必须的,是为了提升性能而增加的 目标: 减少磁盘数据库的查询,比如mysql的查询 ,更多的从内存中读取数据 mysql查询 通常在1s左右 (几百毫秒, 0.xxs),1s以上通常认为是慢查询 redis 支持操作的性能 1s可以支持1w+ 操作(更高 可达10W+) 场景 前提: 读取频繁 数据不经常变化,基本一定会做缓存处理 数据可能变化频繁,如果数据是产品的核心数据(比如评论数据),可以考虑构建缓存, 缓存时间短,即时缓存5分钟,也能减少很大程度的数据库查询操作,可以提升性能 2 缓存架构 数据存在哪? 多级缓存 本地缓存 全局变量保存 orm框架 queryset 查询集(查询结果集) 起到本地缓存的作用 django orm sqlalchemy 外部缓存 可以构建多级 外部存储 redis memcached 3 缓存数据 保存哪些数据 ? 数据以什么形式(类型)保存? 3.1 缓存的数据内容 一个数值 手机短信验证码 比如用户的状态数据 user:status -> 0 / 1 数据库记录 不以单一视图单独考虑,而是考虑很多视图可能都会用到一些公共数据,就把这些公共的数据缓存,哪个视图用到,哪个视图自己读取缓存取数据 ,(比如用户的个人信息,文章的信息) 比较通用,缓存一个数据可以被多个视图利用,节省空间 方式: Caching at

空间规划师的坐标系转换手册(国家2000大地坐标系适用)(转载)

可紊 提交于 2019-11-26 17:01:12
声明:本文所指空间规划师特指城乡规划师,此处仅在标题名称提法上与国家空间规划体系改革相呼应,文中仍以规划师或城乡规划师相称,并无额外之意,请勿过度解读;封面图片来自于网络,版权归原作者所有。 随着自然资源部的成立以及“建立国家空间规划体系”的提出,无论是国土规划还是城乡规划都在向统一的空间规划体系转变升级。作为统一空间规划体系的重要事件,2018年7月1日起,自然资源部全面启用2000国家大地坐标系,以此作为统一空间规划的一致性空间参考体系,对于城乡空间规划的空间参考要求也将会越来越高,城乡规划师也需要逐步学会如何将多元数据在不同空间参考下进行转换,尤其是转换为国家2000大地坐标系,这就是作者撰写本文的初衷,本文命名为《空间规划师的坐标转换手册》,其实更像是一个入门介绍,并不像手册那么深入完善的面面俱到,主要是怕写的太深又把我们规划师朋友讲糊涂,本文重点是想让规划师能看懂,能理解坐标系及其转换的原理,但我还是保留了这个名字,一是本文主要针对城乡规划师,二是希望规划师朋友们能把它像手册一样收藏,有需要的时候就想手册一样把它打开看看能够解决疑惑。 本文不是一篇专业的坐标系理论学术文章,而是试图尽量避开参数堆叠,通过规划师能理解的语境(作者本人也是规划出身的业余GISer),对坐标系的原理进行简化讲解,并对坐标系定义和转换的方法进行概括梳理,以便规划师在日常工作中需要的时候参考阅读。

stm32内存知识点(转)

只愿长相守 提交于 2019-11-26 16:43:24
1.bss段,data段、text段、堆(heap)和栈(stack) bss段:   bss段(bss segment)通常是指用来存放 程序中未初始化的全局变量 的一块内存区域。   bss是英文Block Started by Symbol的简称。   bss段属于静态内存分配。 data段:   数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。   数据段属于静态内存分配。 text段:   代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。   这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。   在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。 堆(heap):   堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。   当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);   当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。 栈(stack):    栈又称堆栈,是 用户存放程序临时创建的局部变量,   也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。

字符编码ANSI和ASCII区别、Unicode和UTF-8区别

这一生的挚爱 提交于 2019-11-26 16:15:02
一.位: 计算机存储信息的最小单位,称之为位(bit),音译比特,二进制的一个“0”或一个“1”叫一位。 二.字节 字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位,8个二进制位组成1个字节。在ASCII码中,一个标准英文字母(不分大小写)占一个字节位置,一个标准汉字占二个字节位置。 三.字符 字符是指计算机中使用的文字和符号,比如“1、2、3、A、B、C、~!·#¥%…*()+”等等。 四.ASCII码 先从最简单的ASCII说起吧,这个大家也熟悉:全名是American Standard Code for Information Interchange, 叫做“美国信息交换标准码”。ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。ASCII码是目前最普及的一种字符编码,它扎根于我们的互联网,操作系统,键盘,打印机,文件字体和打印机等。ASCII表如下: 当然,从这个名字美国信息交换标准码来看,ASCII码只适用于美帝,要是用在美帝之外的国家,就不能满足需求了。 ANSI码 ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。也就是说

高性能WEB服务NGINX

情到浓时终转凉″ 提交于 2019-11-26 14:06:59
I/O介绍 I/O: 网络IO:本质是socket文件读取 磁盘IO: 每次IO,都要经由两个阶段: 第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长 第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短 I/O模型 同步/异步:关注的是消息通信机制 同步:synchronous,调用者等待被调用者返回消息,才能继续执行 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态 阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起 I/O模型: 阻塞型、非阻塞型、复用型、信号驱动型、异步 非阻塞IO模型 阻塞IO模型 阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞 用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作 用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时