堆栈

__stdcall 和 __cdecl 的区别

天涯浪子 提交于 2019-11-26 17:39:03
1. __cdecl __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,由调用者负责把参数压入栈,最后也是由调用者负责清除栈的内容,一般来说,这是 C/C++ 的默认调用函数的规则,MS VC 编译器采用的规则则是这种规则 2. __stdcall _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,由调用者负责把参数压入栈,最后由被调用者负责清除栈的内容,Windows API 所采用的函数调用规则则是这种规则 另外,采用 __cdecl 和 __stdcall 不同规则的函数所生成的修饰名也各为不同,相同点则是生成的函数修饰名前缀都带有下划线,不同的则是后缀部分,当然,这两者最大的不同点就在于恢复栈的方式不同,而且这点亦是最为重要的。 __cdecl 规则要求调用者本身负责栈的恢复工作,在汇编的角度上说,恢复堆栈的位置是在调用函数内,考虑这样一段 C++ 代码(在 VC 下 Debug) #include <cstdio> void __cdecl func( int param1, int param2, int param3) { int var1 = param1; int var2 = param2; int var3 =

启动 LAMP 堆栈 Web 应用程序

末鹿安然 提交于 2019-11-26 17:22:06
https://aws.amazon.com/cn/getting-started/projects/launch-lamp-web-app/ 在本项目中,您将了解如何使用 AWS Elastic Beanstalk 和 Amazon Relational Database Service (RDS) 部署高可用性的 LAMP 堆栈 Web 应用程序。此堆栈使用 Linux、Apache、MySQL 和 PHP。使用 Elastic Beanstalk,您只需上传代码,Elastic Beanstalk 即可自动处理包括容量预置、负载均衡、自动扩展和应用程序运行状况监控在内的部署工作。Elastic Beanstalk 可以根据应用程序的具体需求,使用可轻松调整的 Auto Scaling 设置来自动扩展和缩减应用程序。利用 Amazon RDS,您能够轻松在云中设置、操作和扩展关系数据库。Amazon RDS 可在处理耗时的数据库管理任务的同时,提供经济高效的可调容量。 来源: https://www.cnblogs.com/cloudrivers/p/11328984.html

大数据生态系统又一次更新!集装化成大趋势

前提是你 提交于 2019-11-26 17:13:47
全文共 2737 字,预计学习时长 5 分钟 图片来源:pexels.com/@bertellifotografia 近期,大生态数据系统领域发生了一件事情:思科(Cisco)将人工智能硬件框架与一个由八个GPU驱动的新型深度学习服务器相结合。Wikibon首席分析师James Kobielus在最近的一次采访中表示,思科承诺支持Kubeflow在人工智能领域的发展,“Kubeflow是一个开源工具,能使TensorFlow与Kubernetes容器编配引擎兼容。” TensorFlow是一个用于数值计算的开源软件库。其架构灵活,能够轻松应用到各种平台(GPUs, TPUs,CPUs)和多种设备(台式计算机、服务器集群、各种移动和边缘设备)的部署中。TensorFlow最初是由谷歌大脑团队(谷歌人工智能部门的一部分)开发的。它具有灵活的数值计算核心,是机器学习和深度学习的好帮手。他们开发了一种由八个CPU驱动的新型深度学习服务器。 JamesKobielus认为集装化正带领软件界走向一个新纪元。集装化正重塑几乎每个信息技术软件平台的格局,在人工智能和机器学习领域产生着一定的影响。例如,思科近期宣布,正在改善TensorFlow堆栈的集装化。Kobielus表示: 当我谈及高度复杂的AI时,指的是像TensorFlow这样的东西。例如,当用户在TensorFlow中构建深度学习模型时

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意味着在数据段中存放变量)。

面试题思考:Stack和Heap的区别 栈和堆的区别

故事扮演 提交于 2019-11-26 13:59:34
堆栈的概念:   堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。要点:堆,队列优先,先进先出(FIFO—first in first out)。栈,先进后出(FILO—First-In/Last-Out)。 堆和栈的区别: 一、堆栈空间分配区别:   1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;   2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 二、堆栈缓存方式区别:   1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;   2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。 三、堆栈数据结构区别:   堆(数据结构):堆可以被看成是一棵树,如:堆排序;   栈(数据结构):一种先进后出的数据结构。 Java中栈和堆的区别:   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。  

C++ 面试准备【二】

梦想的初衷 提交于 2019-11-26 13:56:54
目录 void gcc 和 g++的区别 gcc与g++都是GNU(组织)的一个编译器。 gcc与g++都可以编译c代码与c++代码。但是:后缀为.c的,gcc把它当做C程序,而g++当做是C++程序;后缀为.cpp的,两者都会认为是C++程序。 编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。 编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接(当然可以选择手动链接,使用命令如下),所以通常使用g++来完成联接。但在 编译阶段,g++会自动调用gcc,二者等价 。 gcc编译的四个步骤 cc编译C源码有四个步骤: 预处理 .i ----> 编译 .s ----> 汇编 .o ----> 链接 栈溢出原因和解决方式 堆栈溢出的最常见原因是 过度深度或无限递归 ,其中函数调用自身的次数太多,以至于存储与每个调用关联的变量和信息所需的空间超出了堆栈的范围。 Infinite recursion -> 如果递归算法可能递归未知次数或大量次数,则自己管理递归(通过维护自己动态分配的堆栈)或将递归算法转换为等效迭代算法 Very deep recursion -> 确保任何递归算法在已知最大深度后终止 Very large

Windbg_10-查看堆栈

青春壹個敷衍的年華 提交于 2019-11-26 06:41:35
1.内容概要: 堆栈的作用 查看堆栈的命令 1.1 :程序堆栈的结构: push,pop call, ret等能直接或间接改变sp,bp寄存器的值的指令都会改变栈的结构。 一个线程拥有一个独立的栈,线程执行函数,为每个函数开辟栈帧,函数退出则关闭该函数 的栈帧,回收栈空间,栈结构可以让调试器回溯出函数的调用关系,栈的结构如下: 1.2:windbg中的堆栈命令: 简单介绍常用三个: 注意:假如想查看某个线程的堆栈,可以使用~n k(n代表线程号),先得出进程信息,再选择线程查看线程信息。 1.3:命令使用的演示: 准备一个源程序,并且编译成exe文件: 使用windbg打开此exe: 加载程序后,如果未设置符号路径,先设置符号路径,便于在调试时获取更多信息,当然,这个程序是再自己主机上编译的Debug版本,wingdbg会自动找到exe中的符号路径地址,加载符号路径,辅助调试。如果不是在自己主机编译的debug版本,那么windbg根据该路径查找.pdb文件时就在本机上找不到,是一个无效地址。 提示:函数调用先后顺序依次从下到上,是一个栈的数据结构: 来源: CSDN 作者: qq_33168924 链接: https://blog.csdn.net/qq_33168924/article/details/103240542

GDB调试及coredump详解

情到浓时终转凉″ 提交于 2019-11-26 03:09:48
一、coredump:是针对程序异常而产生的core文件,包含程序运行时的内存、寄存器状态、堆栈指针、函数调用等信息,用于存储程序出错时的状态。 二、coredump的存储位置:与被执行文件在同一目录下。当然,位置可以在程序中通过 chdir 命令修改 三、如何判断是coredump文件:该文件主要的格式为 ELF 格式。可以通过 readelf -h core 进行判断,如图: 四、产生coredump的条件: 首先确认 当前会话 中的ulimit -c,若为0,则不会产生core,需要修改和设置。 附: ulimit -c unlimited #可以产生core且不受大小限制 ulimit -a #显示当前各种用户进程设置 #ulimit的某些参数设置与运行机器的配置有关,慎重使用。 ulimit -d unlimited #数据段长度 ulimit -m unlimited #最大内存大小 ulimit -s unlimited #堆栈大小 #以上是设置为无限制 #若是想设置对应字符大小,可以指定如下图: ulimit -c [size] 可能 -c 设置成 4 也不会生成core,因人而异。 当前用户对写入core目录的写权限有足够的空间。 其他不会产生core文件的原因。 五、coredump产生的几种情况 内存访问越界 多线程程序使用不安全的线程函数

Java服务,CPU100%问题快速定位

梦想与她 提交于 2019-11-26 02:32:49
找到相关服务,如何定位问题代码,也非常考验技术人的功底,今天简单说下思路。 假设,服务器上部署了若干Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载? 简要步骤如下: (1)找到最耗CPU的进程; (2)找到最耗CPU的线程; (3)查看堆栈,定位线程在干嘛,定位对应代码; 步骤一、找到最耗CPU的进程 工具:top 方法: 执行top -c ,显示进程运行信息列表 键入P (大写p),进程按照CPU使用率排序 图示: 如上图,最耗CPU的进程PID为10765。 步骤二:找到最耗CPU的线程 工具:top 方法: top -Hp 10765 ,显示一个进程的线程运行信息列表 键入P (大写p),线程按照CPU使用率排序 图示: 如上图,进程10765内,最耗CPU的线程PID为10804。 步骤三:查看堆栈,定位线程在干嘛,定位对应代码 首先,将线程PID转化为16进制。 工具:printf 方法:printf "%x\n" 10804 图示: 如上图,10804对应的16进制是0x2a34,当然,这一步可以用计算器。 之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。 接着,查看堆栈,找到线程在干嘛。 工具:jstack 方法:jstack 10765 |