堆栈

《编码》读书笔记:从无到有构建计算机系统

人走茶凉 提交于 2020-02-10 07:49:47
1 简单的电报系统: 按键、发声装置,电池和一些导线即可构成: 当电报机的键按下时,发生器的电磁铁将可动棒拖下发出“滴”的声音;当键放开时,棒弹回初始位置,发出“嗒”的声音。快速的“嘀嗒”为点,慢速的则为划。 2 继电器 电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。 长距离导线会有很大的电阻,会导致电流越来越小。下图中的继电器系统就是为了增大电流。 上述通信系统中的继电器的简单实现: 3 逻辑代数与电路 逻辑代数是分析和设计逻辑电路的数学基础。逻辑代数是由英国科学家乔治·布尔(George·Boole)创立的,故又称布尔代数。 4 逻辑门 (logic gates) 逻辑门和通常让水和人通过的门十分相似。逻辑门通过阻挡或允许电流通过在逻辑中执行简单的任务。 (1)与门

数据结构与算法题目集(中文)7-22 堆栈模拟队列 (25分)

跟風遠走 提交于 2020-02-09 03:25:09
1.题目 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S) :判断堆栈 S 是否已满,返回1或0; int IsEmpty (Stack S ) :判断堆栈 S 是否为空,返回1或0; void Push(Stack S, ElementType item ) :将元素 item 压入堆栈 S ; ElementType Pop(Stack S ) :删除并返回 S 的栈顶元素。 实现队列的操作,即入队 void AddQ(ElementType item) 和出队 ElementType DeleteQ() 。 输入格式: 输入首先给出两个正整数 N1 和 N2 ,表示堆栈 S1 和 S2 的最大容量。随后给出一系列的队列操作: A item 表示将 item 入列(这里假设 item 为整型数字); D 表示出队操作; T 表示输入结束。 输出格式: 对输入中的每个 D 操作,输出相应出队的数字,或者错误信息 ERROR:Empty 。如果入队操作无法执行,也需要输出 ERROR:Full 。每个输出占1行。 输入样例: 3 2 A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T 输出样例: ERROR:Full 1

计算机是这样工作的

本秂侑毒 提交于 2020-02-09 03:12:12
陈民禾,原创作品转载请注明出处《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ,我的博客中有一部分是出自MOOC课程中视频,再加上一些我自己的理解。 一、首先在理解计算机是如何工作之前,我们先来理解一下现代计算机的模型。 现代计算机是存储程序计算机,依据冯诺依曼体系结构构造。从硬件的层面,也就是我们从计算机的主板。冯诺依曼体系结构我们可以大概抽象成一个cpu。还有一块可以抽象成内存,cpu和内存有一个连接,我们称之为总线,然后就是cpu内部,cpu里面有个很重要的寄存器,叫做ip,它总是指向内存的某一块区域,比如说它指向代码段,此时cpu就从IP指向的那个内存地址取过来一条指令执行,执行完之后Ip自加一,这样像贪吃蛇一样一步步向下面走,这就是从硬件方面解释的冯诺依曼体系。 二、计算机依靠机器语言进行工作,我们可以通过汇编语言来“指挥”计算机完成一些工作,下面就是一些汇编基础知识,总结如下: X86计算机的寄存器:32位的X86计算机的寄存器,它的低16位作为16位的寄存器,16位的寄存器,它还有8位的寄存器。8位的寄存器包含AH,BH,CH,DH,AL,BL,CL,DL。16位的寄存器包含AX,BX,CX,DX,BP,SI,DI,SP。所有开头为E的寄存器一般来讲是32位的。譬如EAX:累加器

unity接入bugly无法显示C#错误行号

被刻印的时光 ゝ 提交于 2020-02-08 18:48:34
项目上线后在bugly后台收集到一些c#的错误日志,如下所示: 可以看到堆栈信息,但看不到具体的行号,这对于一个函数中有多行代码的逻辑来说只能说帮助有限. 在unity社区发现目前并不支持release发布的l2cpp的版本显示行号,于是我尝试改为develop+mono进行打包测试,结果如下: 这次可以正常显示行号了,为了确认是develop+mono才能正常显示,我又试了试release+mono,结果如下: 跟release+l2cpp有点类似,可以看到堆栈,但仍然看不到行号,只是堆栈地址不再是00000000000,而变成aa376b8e5f9f41dbbb82909ca4c277f4了 目前googleplay必须用l2cpp打64位包进行上传,因此也不再深究这个堆栈地址有什么意义了. 总结:目前要想在bugly中看到c#异常的堆栈信息和明确的行号,必须使用develop+mono版进行打包,否则是看不到的. 目前无法获得具体行号,只知道哪个函数里的某行逻辑出错了,目前能做的只有把这个函数里的逻辑进行拆分,拆到多个函数里逐个调用,每个函数尽量保持最小切分粒度,然后放线上等下次报错了,无奈. 好消息 :unity官方说正在开发release+l2cpp版提供明确出错行号的功能,预计会在unity2020的某个版本里发布,参考链接如下: https://forum.unity

堆栈里的悄悄话——智能指针

折月煮酒 提交于 2020-02-08 16:44:19
栈里的对象 "构造完毕,请睁开眼吧!",迷迷糊糊中,听着这个声音,我睁开了眼睛,一位小哥映入眼帘。 “你是谁?我是谁?这又是什么地方?”,我的大脑一片空白。 “你是一个C++对象,这里是栈空间。我是创建你的线程,你先待着,一会儿会用到你,拜~” “唉,等一下...”,还没等我回过神,小哥已经走远。 环顾四周,这个叫栈的地方,有好多好多的对象,大小不一,不远处还有一个巨无霸对象足足有好几千字节。 “哇!好大一个对象!”,我不禁发出了惊叹。 “一看就是没见过世面的,这才多小的个头,就在那大呼小叫的”,突然传来一个声音。 “谁在说话?”,我四处望去,却没发现动静。 “往哪看呢,没那么远,就在你旁边”,我这才注意到眼皮底下有个小个子在说话。 “你才8个字节的对象,好大的口气!” “唉,纠正一下,我可不是对象哦,我只是一个指针,我指向的对象那才叫大呢!” 原来这小个子是个指针,顺着他指向的地址望去,果然有一庞然大物,虽不见其全身,估摸着至少也有几MB的大小。 “唉,你指向的对象为何不和我们在一块儿,我看那地方好像不属于栈的地界儿了”。 “说你没见过世面,你还不承认。咱们这栈空间有限,哪里装得下那么多大对象,他们那里叫 堆区 ,一般有身份的对象都放在那边的。那里的对象都是通过new关键字生成的,你们可没这待遇哦,还有...” “嘘!先别说话,你看线程小哥在干嘛?”,看到之前的小哥去了堆区

CPU100%问题快速定位思路

强颜欢笑 提交于 2020-02-08 04:39:46
一、CPU 100%问题定位 1、功能问题,通过日志,单步调试相对比较好定位。 2、性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底。 二、故障演练题目 某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,运维突然收到CPU异常告警。 问:如何定位是哪个服务进程导致CPU过载? 哪个线程导致CPU过载? 哪段代码导致CPU过载? 第一步 最消耗CPU的进程 工具 : top或者 htop(高级) 方法:top -c 显示进程运行详细列表 键入 P (大写P),按照cpu进行排序 如上图,最耗CPU的进程PID为1865 步骤二:找到最耗CPU的线程 工具:top 方法: top -Hp 1865 ,显示一个进程的线程运行信息列表 键入P (大写p),线程按照CPU使用率排序 如上图,进程1865内,最耗CPU的线程PID为2747 步骤三:将线程PID转化为16进制 工具:printf 方法:printf “%x\n” 2747 图示: 如上图,2747对应的16进制是abbn,当然,这一步可以用计算器。 注意:之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。 步骤四:查看堆栈,找到线程在干嘛 工具:pstack/jstack/grep 方法:jstack 10765 |

基于Cortex-M3的简易操作系统——简易任务调度(一)

亡梦爱人 提交于 2020-02-07 23:27:26
一、引言 上一次简单的记录了一下我学习用Cortex-M3写一个最小调度系统的过程,但大多是图片的堆砌,所以现在准备写一个基于Cortex-M3的简易操作系统的系列,也算记录一下学习操作系统的过程。 本系列使用基于Cortex-M3内核的STM32F103RCT6作为平台 代码开源在gitee上,大家可以自行下载: https://gitee.com/dwk88/SimpleOS 二、预备知识 本文默认你学习并实际开发过Cortex-M系列的的单片机,例如:STM32,Tiva等,熟悉汇编知识 你还需要了解Cortex-M3包含的寄存器以及它们的功能 首先我们来思考一个问题:如何让多个任务同时进行(并行),例如:算法程序计算(长时间占用MCU)和数据传输、显示、外部控制 要知道我们的单核MCU是无法同时执行两条指令的,要并行运行多个任务必然要多个MCU,但那样协调性和成本都是问题。 我们做不到并行,所以折中的解决方案是使用一个调度程序,周期性的切换执行的任务。 三、时间片轮转调度算法 时间片轮转的意思是,以一个固定的时间周期,每隔一段时间就切换MCU执行的任务。 下面举一个列子: void task1(void) { while(1) { GPIO_PinWrite(LED_Red.port, LED_Red.num, 1); Delay_ms(500); GPIO

pthread_mutex_t

夙愿已清 提交于 2020-02-07 03:30:24
在Linux中使用线程 http://blog.csdn.net/jiajun2001/article/details/12624923 :LINUX就是这个范围作者 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责 我并不假定你会使用Linux的线程,所以在这里就简单的介绍一下。如果你之前有过多线程方面的编程经验,完全可以忽略本文的内容,因为它非常的初级。 首先说明一下,在Linux编写多线程程序需要包含头文件pthread.h。也就是说你在任何采用多线程设计的程序中都会看到类似这样的代码: [cpp] view plain copy #include <pthread.h> 当然,进包含一个头文件是不能搞定线程的,还需要连接libpthread.so这个库,因此在程序连接阶段应该有类似这样的指令: gcc program.o -o program -lpthread 1. 第一个例子 在Linux下创建的线程的API接口是pthread_create(),它的完整定义是: [cpp] view plain copy int pthread_create(pthread_t * thread, const pthread_attr_t *attr, void *(*start_routine)( void*) void *arg)

Python 数据结构之堆栈的实现

╄→尐↘猪︶ㄣ 提交于 2020-02-07 01:33:20
堆栈 又称为栈或堆叠,堆栈是一个抽象数据类型(ADT),在大多数编程语言中常用。 堆栈的特性是 只能从一个口子出入数据,因此也被称作 LIFO表示后进先出 后进先出。 堆栈可通过数组,结构和链表来实现。堆栈可以是固定大小或它可动态调整。 # 堆栈基于Python语言的实现 ''' 堆栈的基本方法: push(value) 入栈 向堆栈内添加新的元素 pop() 出栈 将元素移出堆栈 peek() 得到堆栈顶部元素 但不删除它 is_full() 检查堆栈是否存满 没有长度限制的堆栈可不实现该方法 if_empty() 检查堆栈是否为空 len() 返回堆栈内元素个数 travel() 遍历堆栈 ''' class Stack ( object ) : """ 堆栈类 """ def __init__ ( self ) : """ 初始化 """ self . __stack = [ ] def __len__ ( self ) : """ 返回堆栈长度 """ return len ( self . __stack ) def push ( self , value ) : """ 入栈 """ self . __stack . insert ( 0 , value ) def pop ( self ) : """ 出栈 """ return self . __stack .

js变量和作用域

◇◆丶佛笑我妖孽 提交于 2020-02-07 00:39:23
js变量和作用域 (一)js变量 1. 变量数据类型和堆栈 1.1 数据类型 1.2 堆栈 2. 变量值的比较 3. 参数的传递 4. 类型检测 4.1 typeof 4.1 instanceof (二)js变量的作用域与解析 1. 变量对象及作用域链 2. js解析机制 2.1 预解析 2.2 解析冲突 2.3 逐行解析 (一)js变量 1. 变量数据类型和堆栈 1.1 数据类型 基本数据类型 数字 字符串 布尔值 undefined null 基本数据类型的值不能被修改,其值保存在栈中,当变量赋予新的值,栈中的值被覆盖 引用数据类型 对象 数组 引用数据类型的值可以被修改,其地址保存在栈中,值保存在堆中 1.2 堆栈 栈 堆 基本数据类型 a 值 引用数据类型 b 地址1 地址1 { } c 地址2 地址2 { } 2. 变量值的比较 基本数据类型 由于其值保存在栈中,每次比较都是栈中的值进行比较 引用数据类型 其地址保存在栈中,每次比较进行的都是栈中地址的比较,从堆栈表格中就可以看出,两个相同的对象,其保存在栈中的地址是不相同的 var a = { } , b = { } ; console . log ( a === b ) ; //得出结果为flase 总结:js中变量的比较是保存在栈中内容的比较 3. 参数的传递 基本数据类型 参数复制定义变量的值后进行传递 var a