微处理器具有以下基本功能:
指令控制:使计算机中的指令或程序严格按照规定的顺序执行。操作控制:将计算机指令产生的控制信号送往相应的部件,控制这些部件按指令的要求完成规定的工作。
时间控制:使计算机中各类控制信号严格按照时间上规定的先后顺序进行操作。
数据加工:对数据进行算术运算和逻辑运算等操作,或其他信息的处理。
8086微处理器的特点:采用了并行流水线工作方式,通过设置指令预取队列实现;对内存空间实行分段管理,实现对1MB空间的寻址;支持多处理器系统;工作于最小模式和最大模式两种工作模式。
指令执行部件EU:算术逻辑运算单元ALU:完成8位或16位的二进制算术运算和逻辑运算;
运算结果送到通用寄存器或标志寄存器或写入存储器。
FR标志寄存器:用来存放ALU运算后的结果特征或机器运行状态。
数据暂存寄存器:暂时存放参加运算的操作数,不可编程。
通用寄存器组:4个16位数据寄存器: AX、BX、CX、DX;4个16位地址指针与变址寄存器: SP、BP、SI、DI。
EU控制电路:接收从BIU指令队列中取来的指令,经过指令译码形成各种定时控制信号,对EU的各个部件实现特定的定时操作。
总线接口单元BIU:根据EU的请求,完成CPU与存储器、I/O接口之间的信息传送。
提供从存储器取指令送指令队列或直接送EU执行;从存储器或外设取数据送EU,或把EU操作结果送存储器或外设。
4个16位段地址寄存器CS:代码段寄存器;
DS:数据段寄存器;
SS:堆栈段寄存器;
ES:扩展(附加)数据段寄存器。
16位指令指针寄存器IP:存放下一条将要执行指令的偏移地址(有效地址EA);
20位地址加法器:将16位的逻辑地址变换成访存储器的20位物理地址,完成地址加法操作。
6字节指令队列:预存6个字节的指令代码。
总线控制电路:发出总线控制信号。 将8086CPU内部总线与外部总线相连。
Latest posts made by 无尽的思念
-
微处理器性能
-
多分支开发
现在开发中大多数公司中都在使用Git这个代码版本管理工具,几乎可以说是已经成为标配,刚入职不久的这家新公司也不例外。
去公司没多久,开始搭建项目,然后创建开发分支,有多少个后端人员就创建多少个开发分支,每个人都在自己的分支上进行开发。
首先需要拉取分支上的代码,方式可以使用命令行,使用git clone 代码地址 的方式或者使用IDEA的方式进行拉取,看个人的喜好。本人是使用IDEA的方式进行拉取,如果使用IDEA打开某个项目时,没有显示VCS这个菜单栏,则可以新建一个空的项目,这个菜单就会显示出来,然后按照下面的操作即可。第一次拉取一般需要输入git的账号和密码。
添加Git代码的地址,选择好对应的目录即可。
拉取代码后,IDEA右下角会显示当前对应的分支版本,如下图所示(只是举例,真实开发环境为内网,不让截图)
拉取代码后,下一步操作就是切换到自己的分支,使用命令行操作或者IDEA操作都可以,看个人喜好,本人是使用IDEA操作.
拉取鸣人自己分支bigstuff-release-V1-mr上最新代码的操作方式如下,
需要选择一个分支,然后拉取代码.
提交代码的方式方式如下,在IDEA的右上角有一个打钩的图标,点击它即可,同样,使用命令行操作也可以,看个人喜好。
会显示如下信息,让自己选择需要提交的文件,不同的IDEA显示方式会不一样。这里需要注意,在选择需要提交的文件时,不要提交一些没用的文件,
如IDEA配置文件iml。提交信息是一定要添加的,这是个好习惯,写一个简单的描述这次提交的代码做了什么事情,然后点击提交即可。
最后一步是push代码,即是真正的提交自己本地的代码到远程分支上面,操作方式如下:
-
内存管理
C标准库的内存管理用到的API是malloc()和free(),但是不建议在RTOS中直接调用,因为:C标准库的内存管理实现可能比较大,不适合小型嵌入式RAM不足的设备。可能会产生内存碎片,对于安全性要求高的嵌入式设备不适合。这两个函数会使得链接器配置得复杂。
freertos内存管理接口:freertos的内存管理和内核实现是相互独立的,内核规定内存管理接口,而接口内容却是可由外部自由实现。
但是freertos官方也提供了几种内存分配算法:heap1、heap2、heap3、heap4、heap5。
所以,需要内存管理的有合适的算法可以单独使用freertos提供内存分配算法到自己的设备或系统中。内存堆大小由宏configTOTAL_HEAP_SIZE决定。
heap1算法特点:只能申请不能释放。不会产生内存碎片。函数的执行时间是确定的。因为可直接查到空闲空间地址和大小。应用:这种方案一般用在安全性要求较高的系统中。用于从不删除任务、队列、信号量、互斥量等的应用程序。
实现:使用xNextFreeByte来定位下一个空闲的内存堆位置。因为freertos系统堆是一个大数组,所以,内存空间是连续的。所以xNextFreeByte值在heap1方案中实际保存的是已经被分配的内存大小,下次申请时跳过这些已申请的,剩下就是空闲空间。
pucAlignedHeap是一个指向对齐后的内存堆起始地址。用户提供的系统堆内存的起始地址不一定是对齐的内存地址,需要纠正,纠正后的系统堆内存起始地址保存在pucAlignedHeap。
-
在计算机系统中,为什么要限流?
在计算机系统中出现的限流问题原因是因为在访问计算机系统时或者是计算机系统本身出现了一些异常情况。比如流量过大,系统处理不过来。比如系统升级等等情况。
计算机系统容量是有限的,内存大小,CPU 处理数据的速度,都是有限的,不可能无限大。如果超过了一定的阙值,系统就会出现异常,甚至宕机。
- 现在微服务架构比较流行,各种服务比较多,服务之间调用频繁。
如果访问一个 API 服务时,超过了这个服务能提供的最大访问能力,服务会崩溃,那就要对这个服务进行保护,避免服务因访问过大导致服务不可用,不仅影响自己服务,也可能影响其它相关服务。采用什么方法保护服务呢?限流就是保护方法之一。
- 在 IT 高并发系统中,处于对系统的保护,需要对系统进行限流。
在互联网世界里,一根一根的网线把整个世界连接起来,那么网络里面传输的数据流动起来就形成了网络流。TCP 里就有限制流量的算法-滑动窗口算法。
- 在微服务系统里的 API 接口中,对接口做限制,保护接口安全,保证系统稳定。
对接口访问请求,怎么描述接口请求情况?一般用每秒请求数(request per second),并发请求数等,来描述对接口的请求情况。所以限制也是对每秒请求数进行限制。
还有平常使用的连接池技术,也可以理解为限流思想的一种,把连接数限制在一个数量上。把固定数量的连接放入“池子”中,很形象的说法。当然也是复用减少损耗。
-
解析 RocketMQ
什么是消息队列?顾名思义,首先得有一个队列,这个队列用来存储消息。那有了消息队列就得有人往里面放,有人往里面取。看到这里大家都恍然大悟,这莫非就是连小学生都知道的,经典的“生产者-消费者模式”?
Broker 是代理的意思,负责队列的存取等操作,我们可以把 Broker 理解为队列本身。
NameServer:我们可以同时部署很多台 NameServer 服务器,并且这些服务器是无状态的,节点之间无任何信息同步。
NameServer 起来后监听 端口,等待 Broker、Producer、Consumer 连上来,NameServer 是集群元数据管理中心。
Broker:Broker 启动,跟所有的 NameServer 保持长连接,每 30s 发送一次发送心跳包(像心跳一样持续稳定的发送请求)。心跳包中包含当前 Broker 信息 ( IP+ 端口等)以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic 跟 Broker 的映射关系。
简单来说,NameServer 是我们的整个 RocketMQ 集群的元数据管理中心,负责集群元数据的增删改查。先不管这个增删改查是怎么实现的,我们甚至可以理解就是数据库的增删改查,但是我们一定要知道这些元数据都长什么样子。才能知道 Producer、Consumer 及 Broker 是如何根据这些数据进行消息收发的。
如图所示,二主二从的 Broker 集群相关的元数据信息,包括 topicQueueTable、BrokerAddrTable、ClusterAddrTable、brokerLiveInfo、FilterServer -
java的回显是什么?
在很多不出网的情况下,一种是写webshell,就是内存,另一种就是回显,回显的主要方式有一下几种。分别是:defineClass;RMI绑定实例;URLClassLoader抛出异常;中间件;写文件css、js,dnslog。
回显技术简单的说就是在数据提交出现错误的时候, 已填写的信息仍在文本框中, 比如用户登录, 当用户输入错误的密码之后, 用户名仍在文本框, 只是密码框清空。
classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机。ClassLoader的加载过程主要被分为三个阶段:第一个阶段是加载,把.class文件加载到内存,并为它创建一个java.lang.Class对象;第二个阶段是连接,连接包括三阶段;第三阶段是初始化。优先对该类的父类进行初始化,然后对static修饰的变量和代码块进行初始化
当一个类加载的过程中,它首先不会去加载,而是委托给自己的父类去加载,父类又委托给自己的父类。因此所有的类加载都会委托给顶层的父类,即Bootstrap Classloader进行加载,然后父类自己无法完成这个加载请求,子加载器才会尝试自己去加载。
-
Pipeline 即流水线
Pipeline 即流水线,是 jenkins2.X 的新特性,是 jenkins 官方推荐使用的持续集成方案。与传统的自由风格项目不同,它是通过 jenkins DSL 编写代码来实现。相比于之前用户只能通过 Web 界面进行配置的方式来定义 Jenkins 任务,现在通过使用 jenkins DSL 和 Groovy 语言编写程序,用户可以定义流水线并执行各种任务。
Jenkins pipeline包含两类元素,分别是stages和steps。如图:
-
step 代表单一的操作;告诉 Jenkins 做什么。比如,代码从仓库检出代码,执行脚本
-
stage 等于一系列 step 的组合,通常来表示 Jenkins pipeline 进程的可示化。例如,Build、Test、Deploy等:流水线编译与部署;创建流水线任务。
之后开始新建Item
-
第二步:配置流水线任务:初学者对于 Pipeline 的脚本肯定无从入手的;但是 Pipeline 提供了一个非常有用的帮助文档。
http://127.0.0.1:8080/jenkins/job/Pipeline_maven/pipeline-syntax/
Pipeline 脚本有两种编写模式:Pipeline 脚本;Jenkinsfile 文件。
-
-
InnoDB如何解决幻读
Mysql有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读、不可重复读、幻读的问题。
其中InnoDB在RR的隔离级别下,解决了幻读的问题。
那么, 什么是幻读呢?幻读是指在同一个事务中,前后两次查询相同的范围时,得到的结果不一致
第一个事务里面我们执行了一个范围查询,这个时候满足条件的数据只有一条。第二个事务里面,它插入了一行数据,并且提交了。接着第一个事务再去查询的时候,得到的结果比第一次查询的结果多出来了一条数据。所以,幻读会带来数据一致性问题。
nnoDB如何解决幻读的问题?InnoDB引入了间隙锁和next-key Lock机制来解决幻读问题,为了更清晰的说明这两种锁。 -
神经网络算法
逻辑性的思维是指根据逻辑规则进行推理的过程;它先将信息化成概念,并用符号表示,然后,根据符号运算按串行模式进行逻辑推理;这一过程可以写成串行的指令,让计算机执行。然而,直观性的思维是将分布式存储的信息综合起来,结果是忽然间产生的想法或解决问题的办法。
这种思维方式的根本之点在于以下两点:首先:信息是通过神经元上的兴奋模式分布存储在网络上;第二:信息处理是通过神经元之间同时相互作用的动态过程来完成的。
人工神经网络就是模拟人思维的第二种方式。这是一个非线性动力学系统,其特色在于信息的分布式存储和并行协同处理。虽然单个神经元的结构极其简单,功能有限,但大量神经元构成的网络系统所能实现的行为却是极其丰富多彩的。
神经网络的研究内容相当广泛,反映了多学科交叉技术领域的特点。主要的研究工作集中在以下几个方面:生物原型研究。建立理论模型。网络模型与算法研究。人工神经网络应用系统。
-
序列化和反序列化
api接口开发:最核心最常见的一个过程就是序列化。所谓序列化就是把数据转换格式,序列化可以分两个阶段。
序列化:把我们语言识别的数据转换成指定的格式提供给别人:字典,列表,对象是提供给前端或其他服务。
反序列化:把别人提供的数据转换/还原成我们需要的格式。
我们在django中获取到的数据默认是模型对象也叫做qs对象,但是模型对象数据是无法直接提供给前端或别的平台使用的,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人,这就是序列化过程。
如果把前端传入到后台的数据,之后json格式字符串,再把后端存到数据库中,需要转成python中的对象,把json格式字符串转成python对象存到数据库的过程被称为反序列化。