堆栈

利用栈对两个数据存储并进行操作+-*/运算

蓝咒 提交于 2019-12-01 05:44:06
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define Max 100 4 5 int *p; 6 int *tos; 7 int *bos; 8 9 /*添加一个数据放到堆栈对顶端*/ 10 void push(int i) 11 { 12 if (p > bos) 13 { 14 printf("堆栈以满\n"); 15 return; 16 } 17 *p = i; 18 p++; 19 } 20 21 /*丛堆栈顶端取出一个数据*/ 22 int pop(void) 23 { 24 p--; 25 if (p < tos) 26 { 27 printf("堆栈下溢\n"); 28 return 0; 29 } 30 return *p; 31 } 32 33 int main() 34 { 35 int a, b; 36 char s[80]; 37 p = (int *)malloc(Max*sizeof(int)); 38 if (!p) 39 { 40 printf("分配内存失败"); 41 exit(1); 42 } 43 tos = p; 44 bos = p + Max - 1; 45 printf("请输入第一个数据:\n"); 46 scanf("%d", &a); 47 push(a); 48

golang学习笔记----并发

大城市里の小女人 提交于 2019-12-01 05:28:35
并发模型 并发目前来看比较主流的就三种: 多线程:每个线程一次处理一个请求,线程越多可并发处理的请求数就越多,但是在高并发下,多线程开销会比较大。 协程:无需抢占式的调度,开销小,可以有效的提高线程的并发性,从而避免了线程的缺点的部分 基于异步回调的IO模型: 比如nginx使用的就是epoll模型,通过事件驱动的方式与异步IO回调,使得服务器持续运转,来支撑高并发的请求 golang的goroutine就是为了追求更高效和低开销的并发 goroutine的简介 定义: 在go里面,每一个并发执行的活动成为goroutine。 详解:goroutine可以认为是轻量级的线程,与创建线程相比,创建成本和开销都很小,每个goroutine的堆栈只有几kb(而线程则需1M),并且堆栈可根据程序的需要增长和缩小(线程的堆栈需指明和固定),所以go程序从语言层面支持了高并发。 程序执行的背后:当一个程序启动的时候,只有一个goroutine来调用main函数,称它为主goroutine,新的goroutine通过go语句进行创建。 goroutine的使用 单个goroutine创建:在函数或者方法前面加上关键字go,即创建一个并发运行的新goroutine。 package main import ( "fmt" "time" ) func HelloWorld() { fmt

JavaScript系列:8道有意思的JavaScript面试题!

て烟熏妆下的殇ゞ 提交于 2019-12-01 02:46:46
JavaScript系列:8道有意思的JavaScript面试题! 前言 注意本次用cdn形式引入js学习,有node.js的玩家可以用node.js。CDN下载地址:https://vuejs.org/js/vue.min.js以及Node.js: Vue系列: windows下npm安装vue 今天博主将为大家分享JavaScript系列:8道有意思的JavaScript面试题!不喜勿喷,如有异议欢迎讨论! JavaScript 是一种有趣的语言,我们都喜欢它,因为它的性质。浏览器是JavaScript的主要运行的地方,两者在我们的服务中协同工作。JS有一些概念,人们往往会对它掉以轻心,有时可能会忽略不计。 原型、闭包和事件循环等概念仍然是大多数JS开发人员绕道而行的晦涩领域之一。正如我们所知,无知是一件危险的事情,它可能会导致错误。 1:浏览器控制台上会打印什么? var a = 10; function foo() { console.log(a); // ?? var a = 20; } foo(); 答案: undefined 使用var关键字声明的变量在JavaScript中会被提升,并在内存中分配值undefined。 但初始化恰发生在你给变量赋值的地方。 另外,var声明的变量是函数作用域的,而let和const是块作用域的。 所以,这就是这个过程的样子: var

逆向学习周记-C语言空函数

做~自己de王妃 提交于 2019-11-30 23:39:41
实验环境:WIN7虚拟机 软件:VC6 首先在VC6里面写一个空函数Fun(); F7编译运行一下,没有出错,接着在函数处使用F9下断点,使程序运行到Fun函数时停下。 接着F5开始运行这个程序 程序停在了Fun函数处,反汇编进去进行逆向分析 可以看到程序停在Fun函数的入口处,这里的call就是Fun函数的入口,F11跟进去进行分析。 原始堆栈图是这样的。 0040D408 call @ILT+5(_Fun) (0040100a) F11,跟进这个call进行分析,进入函数之后编译器会将跳出函数之后下一个要执行的地址压入堆栈,即将0040D40D压入堆栈,同时esp-4,esp变成0012FEF8,这时的堆栈是这样的: 跟进来之后是一个jmp,F11直接跳转。 现在进到函数里面了 00401010 push ebp 首先将ebp压栈,就是将[ebp]压入堆栈,即将0012FF48压入堆栈,然后esp的位置向上提升一个变为0012FEF4。 查看检查寄存器进行验证: 00401011 mov ebp,esp 将esp的值赋给ebp,也就是将0012FEF4赋给ebp,这时的堆栈图是这样的 查看寄存器验证,这里可以看到esp和ebp的值相等,说明上面那个堆栈图没有问题 00401013 sub esp,40h 将esp减去40h,也就是将esp的位置提升到0012FEB4位置

2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

感情迁移 提交于 2019-11-30 16:06:02
操作系统如何工作 一、计算机的三个法宝 1.存储程序计算机 2.函数调用堆栈机制(高级语言可以实现的基础机制) 3.中断 在第一周的作业中对存储程序计算机也就是通俗意义上的冯诺依曼计算机进行了介绍。 第二周的作业中介绍了函数堆栈的结构和寄存器。在这里就不再复述。 二、汇编代码的分析(难点及问题) 本次实验中接触到的是高级语言程序编译成汇编语言的代码,其中就遇到了以下问题。 1.堆栈增长方向的问题 在之前的学习中堆栈都是向下增长的,堆栈上方是高地址下方是低地址,如左图。而在本章中图2-1,堆栈方向为了直观一点变为下方是高地址上方是低地址,如右图。 而对堆栈为什么采用向下增长产生了疑惑。明明不太直观,为什么还是选择向下增长。直到我在网上找了很多资料才找到合理解释的理由。这样设计可以使得堆和栈能够充分利用空闲的地址空间。如果栈向上涨的话,我们就必须得指定栈和堆的一个严格分界线,但这个分界线怎么确定呢?平均分?但是有的程序使用的堆空间比较多,而有的程序使用的栈空间比较多。所以就可能出现这种情况:一个程序因为栈溢出而崩溃的时候,其实它还有大量闲置的堆空间呢,但是我们却无法使用这些闲置的堆空间。所以呢,最好的办法就是让堆和栈一个向上涨,一个向下涨,这样它们就可以最大程度地共用这块剩余的地址空间,达到利用率的最大化!原文衔接如下。 http://www.cnblogs.com/Quincy

python多线程,多进程

谁都会走 提交于 2019-11-30 16:05:43
threading. active_count ( ) 返回当前存活的线程类 Thread 对象。返回的计数等于 enumerate() 返回的列表长度。 threading. current_thread ( ) 返回当前对应调用者的控制线程的 Thread 对象。如果调用者的控制线程不是利用 threading 创建,会返回一个功能受限的虚拟线程对象。 threading. get_ident ( ) 返回当前线程的 “线程标识符”。它是一个非零的整数。它的值没有直接含义,主要是用作 magic cookie,比如作为含有线程相关数据的字典的索引。线程标识符可能会在线程退出,新线程创建时被复用。 threading. enumerate ( ) 以列表形式返回当前所有存活的 Thread 对象。 该列表包含守护线程, current_thread() 创建的虚拟线程对象和主线程。它不包含已终结的线程和尚未开始的线程。 threading. main_thread ( ) 返回主 Thread 对象。一般情况下,主线程是Python解释器开始时创建的线程。 threading. setprofile ( func ) 为所有 threading 模块开始的线程设置性能测试函数。在每个线程的 run() 方法被调用前, func 会被传递给 sys.setprofile() 。

JVM 线上故障排查基本操作

蓝咒 提交于 2019-11-30 13:13:19
#前言 对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的。各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题。楼主同样也遇到过这些问题,那么,遇到这些问题该如何解决呢? 首先,出现问题,肯定要先定位问题所在,然后分析问题原因,再然后解决问题,最后进行总结,防止下次再次出现。 今天的文章,就如我们的题目一样,讲的是基本操作,也就是一些排查线上问题的基本方法。为什么这么说呢?因为线上问题千奇百怪,就算是身经百战的专家也会遇到棘手的问题,因此不可能在一篇文章里说完,还有一个最重要的原因,当然就是楼主的水平不到位。 但不到位归不到位,任何经验都是值得记录的,因此,楼主有必要将这些问题记录一下。 还有,本文的排查环境是 Linux. # 1. CPU 飚高 线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢? 思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程。然后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码。最后对代码进行排查。 如何操作呢? 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中

zprofiler工具

丶灬走出姿态 提交于 2019-11-30 12:17:59
转自: zprofiler三板斧解决cpu占用率过高问题 此工具为阿里自产的profiler工具,在其他文章中看到有用此工具进行性能问题定位的。在此转载文章学习一下。 上周五碰到了一个线上机器cpu占用率过高的问题。问题本身比较简单,但是定位过程中动用了多个zprofiler的主要功能,感觉是一个很好的介绍使用zprofiler定位此类问题流程的案例。 在开始使用zprofiler之前,先使用perf确认瓶颈点是否在native中。(以下操作需要root权限,需要pe协助操作) 如果线上服务器没有安装perf,可以到 http://yum.corp.taobao.com/taobao/6/x86_64/test/aliperf/aliperf-0.3.9-9.el6.x86_64.rpm 下载rpm包,然后安装。 使用 perf top 命令,查看当前系统的热点函数。 如上图所示的情况即表明,热点在java代码中,因为java代码是jit执行的,perf看不到其符号,所以默认归入perf-<pid>.map中。 如果热点在libjvm.so中的函数,可以联系我们团队,协助进一步分析。比如如果热点是jit相关的函数,一般是codecache或者jit相关参数的问题;如果是gc相关的函数,可以用zprofiler分析一下gclog,然后调整gc相关的参数。 排除其他可能

健康,home? [java的内存浅析]

淺唱寂寞╮ 提交于 2019-11-30 11:51:19
健康,home? [java的内存浅析] 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 乐观上上,how can other kno u,u r yourself !I must be strong and carry on. -泥沙砖瓦浆木匠 一.闲谈下 201407月记着那时候身体垮了下来,呵呵。想说,对自己的说,也是对大家的负责吧。那时候胸疼胸闷,然后几乎累垮了,我还坚持了一星期,那一星期真的迷迷糊糊。完全不能看代码,看代码就晕。一直想睡想睡。胸口会间接的疼一下。直到29号那晚饭后,我胸很闷。去旁边附一三甲医院检查,做了可怕的心电图。医院也是为人好,但是后面发生完全不可理喻。那时候的心情就像下面的图,当听到一个急诊不负责阿姨全科医生说“心电图有个波略高,赶紧24小时监护,立即联系家长”(她是不知道,我爸爸那时候也是 冠心病 发生期,他是不知道我根本没大碍被她这么折腾。我的心情会怎么样?医生为什么这么不会做人?虽然我在医科大学读书。) 现在慢慢的康复,其实没什么大病,熬夜熬多了,身子垮了。目前还是带着血药。stay with me 很多很多。我记着,我会感激。最大的是Home and 亲人。 告诉大家: 健康第一,革命的本钱。说说容易,做做难。(尽量规律点,不管你熬不熬夜) 还有保持乐观