堆栈

UCOSII之任务堆栈使用情况检查(通过OSTaskStkChk()函数查看)

我的梦境 提交于 2020-01-10 17:21:29
本文重点介绍如果使用函数OSTaskStkChk()函数来检查UCOSII系统下各任务堆栈的使用情况。 1、简单介绍一下OSTaskStkChk()函数参数和返回值: INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data) 参数prio : 被检测任务的优先级,也就是唯一标识被检任务的ID。 参数*p_stk_data:指向OS_STK_DATA 结构体的一个变量指针。 OS_STK_DATA 结构体如下: typedef struct os_stk_data { INT32U OSFree; /* Number of free entries on the stack */ INT32U OSUsed; /* Number of entries used on the stack */ } OS_STK_DATA; 返回值:0,表示函数返回成功,即:OS_ERR_NONE 异常返回值如下: OS_ERR_PRIO_INVALID :被检测任务的优先级优先级设置错误,可能比最高优先级都高了。要小于最高优先级并大于最低优先级,同时不要和自己检测任务的优先级相同 OS_ERR_TASK_NOT_EXIST :你要检测的任务没有被建立或者被分配到一个互斥PIP OS_ERR_TASK_OPT

逆波兰表达式

不羁岁月 提交于 2020-01-10 10:43:47
本文转载自: https://www.cnblogs.com/wanghetao/archive/2012/04/23/2466580.html 作者:wanghetao 转载请注明该声明。 逆波兰 表达式 表达式一般由操作数(Operand)、运算符(Operator)组成,例如算术表达式中,通常把运算符放在两个操作数的中间, 这称为中缀表达式(Infix Expression),如A+B。 波兰数学家Jan Lukasiewicz提出了另一种数学表示法,它有两种表示形式: 把运算符写在操作数之前,称为波兰表达式(Polish Expression)或前缀表达式(Prefix Expression),如+AB; 把运算符写在操作数之后,称为逆波兰表达式(Reverse Polish Expression)或后缀表达式(Suffix Expression),如AB+; 其中,逆波兰表达式在编译技术中有着普遍的应用。 算法: 一、 将中缀表达式转换成后缀表达式算法: 1、从左至右扫描一中缀表达式。 2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈 3、若读取的是运算符 (1) 该运算符为左括号"(",则直接存入运算符堆栈。 (2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。 (3) 该运算符为非括号运算符: (a)

x86常用汇编寄存器

时光怂恿深爱的人放手 提交于 2020-01-10 04:51:47
通用寄存器 32位 16位 高8位 低8位 EAX AX AH AL EBX BX BH BL ECX CX CH CL EDX DX DH DL ESI SI EDI DI ESP SP EBP BP E:Extend,X:逻辑与算数 EAX (Extend Add):累加器,在乘法和除法指令中自动使用;Win32中,一般用在函数的返回值中。 EBX (Extend Base):基地址寄存器,DS(数据段)中的数据指针。 ECX (Extend Count):计数器,CPU自动使用ECX作为循环计数器,在自妇产和循环操作中常用,在循环指令(LOOP)或串操-作中,ECX用来进行循环计数,每执行一次循环,ECX都会被CPU自动减一。 EDX (Extend Data):数据寄存器。 以上的寄存器常用来保存各种需要计算的值。 EBP (Extend Base Pointer):基地址指针寄存器,SS(堆栈段)中数据指针。EZBP有高级语言用来引用参数和局部变量,通常称为堆栈基地址寄存器。 ESP (Extend Stack Pointer):堆栈指针寄存器,SS(堆栈段)中堆栈指针,ESP用来寻址堆栈上的数据,ESP寄存器一般不参与算数运算,通常称为堆栈指针寄存器。 ESI (Extend Source Improve):源变址寄存器,字符串操作源指针。 EDI (Extend

7-4 堆栈操作合法性 (20分)

痞子三分冷 提交于 2020-01-10 03:28:41
7-4 堆栈操作合法性 (20分) 假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S和X序列,判断该序列是否合法。 输入格式: 输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。 输出格式: 对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。 输入样例: 4 10 SSSXXSXXSX SSSXXSXXS SSSSSSSSSSXSSXXXXXXXXXXX SSSXXSXXX 输出样例: YES NO NO NO # include <bits/stdc++.h> using namespace std ; int main ( ) { int n , m ; string a ; cin >> n >> m ; while ( n -- ) { int flag = 1 ; int sum = 0 ; cin >> a ; for ( int i = 0 ; i < a . size ( ) /*a[i]也可,但是不知是什么意思*/ ; i ++ ) { if ( a [ i ] ==

Java堆栈的区别

牧云@^-^@ 提交于 2020-01-10 00:26:46
1、概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存。 2、堆内存 1.什么是堆内存? 1 2 堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。 2.堆内存的特点是什么? 1 2 第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的的情况差不多,所以堆内存的特点就是: 先进先出,后进后出 ,也就是你先排队,好,你先买票。 第二点:堆可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,但缺点是,由于要在运行时动态分配内存,存取速度较慢。 3.new对象在堆中如何分配? 1 2 由Java虚拟机的自动垃圾回收器来管理 3、栈内存 1.什么是栈内存 1 2 栈内存是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量 2.栈内存的特点 1 2 第一点:栈内存就好像一个矿泉水瓶,像里面放入东西,那么先放入的沉入底部,所以它的特点是: 先进后出,后进先出 第二点:存取速度比堆要快,仅次于寄存器,栈数据可以共享,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性 3.栈内存分配机制 1 2 栈内存可以称为一级缓存,由垃圾回收器自动回收 4.数据共享 1 2 例子: int a = 3;

怎样分析java线程堆栈日志

北城以北 提交于 2020-01-09 18:50:10
注: 该文章的原文是由 Tae Jin Gu 编写,原文地址为 How to Analyze Java Thread Dumps 当有障碍,或者是一个基于 JAVA 的 WEB 应用运行的比预期慢的时候,我们需要使用 thread dumps 。如果对于你来说, thread dumps 是非常复杂的,这篇文章或许能对你有所帮助。在这里我将解释在 JAVA 中什么是 threads ,他们的类型,怎么被创建的,怎样管理它们,你怎样从正在运行的应用中 dump threads ,最后你可以怎样分析它以及确定瓶颈或者是阻塞线程。本文来自于 JAVA 应用程序长期调试经验的结果。 Java and Thread 一个 web 服务器使用几十到几百个线程来处理大量并发用户,如果一个或多个线程使用相同的资源,线程之间的竞争就不可避免了,并且有时候可能会发生死锁。 Thread contention 是一个线程等待锁的一个状态,这个锁被另外一个线程持有,等待被释放,不同的线程频繁访问 WEB 应用的共享资源。例如,记录一条日志,线程尝试记录日志之前必须先获取锁来访问共享资源。 死锁 是线程竞争的一个特殊状态,一个或是多个线程在等待其他线程完成它们的任务为了完成它们自己的任务。 线程竞争会引起各种不同的问题,为了分析这些这些问题,你需要使用 dump threads , dump threads

解决复杂应用程序问题时要考虑的首要问题

这一生的挚爱 提交于 2020-01-09 13:50:23
1、对于反应性事件:“将工程师带到现场,因为这样可以更容易地隔离问题。” 这是我听到的最常见的误解。让我解释一下:大多数复杂的问题都需要深入的调试会话。 收集必要的信息是很容易的,可以远程或由客户完成。但是,调试转储文件可能需要几个小时或几天。由于我们可能无法访问我们的私有符号,也无法与具有特定技术知识的同事协作访问,因此在现场工作实际上会减慢进程。 很多时候,在现场工作的一个重要价值是充当远程工程师的耳目,或者更好地理解我们无法通过电子邮件或电话很好理解的复杂问题。 2、“我们需要代码检查,因为我们的应用程序有性能问题。” 有时我会收到代码评审请求,但实际上,客户需要的是问题隔离。那有什么区别,我怎么知道我需要什么? 代码检查的目标是检查源代码并指出代码中不遵循最佳实践的部分,或者表示安全漏洞的部分,或者还可以针对速度进行优化的部分。 问题隔离的目标是隔离导致特定应用程序症状的问题。例如,崩溃、挂起、内存泄漏和性能瓶颈。 让我解释一下:想象一个ASP.NET应用程序性能不佳的场景。如果我代码审查应用程序,我可能会找到可以优化速度的方法。但是,如果应用程序的性能很慢,因为在数据库端或网络上存在瓶颈,那么通过代码检查获得的性能增益并不能解决问题。最坏的情况是,它甚至可能不明显。 如果您希望确保应用程序不存在通过实现最佳实践可以避免的潜在问题

堆栈,堆栈,堆和栈的区别

两盒软妹~` 提交于 2020-01-09 02:52:00
在C语言的学习中,对内存管理这部分知识的掌握尤其重要。 malloc()和free()的基本概念以及基本用法: 1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。关于分配失败的原因,应该有多种,比如说空间不足就是一种。 void free(void *FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 2、函数的用法:其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了。 3、关于函数使用需要注意的一些地方: A、申请了内存空间后,必须检查是否分配成功。 B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。 C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。 D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换

java堆栈 常量池 方法区

北战南征 提交于 2020-01-08 16:39:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 程序中存放数据的内存分为四块,另有一块存放代码。 1. 方法区:存放全局变量和静态变量 2.常量池:存放常量字符串 3.栈:存放函数的参数值,局部变量的值 4.堆:存放成员变量(实例变量),一般内存泄漏会发生 堆:存放所有new 出来的对象 栈:存放基本类型的变量数据和对象的引用,对象(new 出来的对象)本身并不存在栈中,而是存放在堆中或者常量池中(字符串常量对象) 常量池:存放基本类型常量和字符串常量 对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的垃圾回事器负责回收,因此大小和声明周期不需要确定,具有很大的灵活性 对于字符串来说,其对象的引用都是存储在栈中的, 如果是编译期已经创建好的(用双引号定义的)就存储在常量池中,如果是运行期(new 出来的对象) 则存储在堆中。对于equals相等的字符串,在常量池中也只有一份,在堆中有多份。 java的堆是一个运行时数据区,类的(对象从中分配空间,堆由垃圾回收机制来负责的,堆的优势就是可以动态的分配内存大小,生存期不必实现告诉编译器,因为他是在运行时动态分配内存的,java的垃圾收集器会自动收走这些不再使用的数据,但缺点是由于要在运行时动态分配内存,存取速比较慢)

Java中的堆栈内存浅析

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-08 00:05:33
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。   堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。   这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针! 来源: https://www.cnblogs