计算机指令

实现 Redis 协议解析器

元气小坏坏 提交于 2019-12-05 11:45:38
本文是 《用 Golang 实现一个 Redis》系列文章第二篇,本文将分别介绍 Redis 通信协议 以及 协议解析器 的实现,若您对协议有所了解可以直接阅读协议解析器部分。 Redis 通信协议 Redis 自 2.0 版本起使用了统一的协议 RESP (REdis Serialization Protocol),该协议易于实现,计算机可以高效的进行解析且易于被人类读懂。 RESP 是一个二进制安全的文本协议,工作于 TCP 协议上。客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。 RESP 定义了5种格式: 简单字符串(Simple String): 服务器用来返回简单的结果,比如"OK"。非二进制安全,且不允许换行。 错误信息(Error): 服务器用来返回简单的结果,比如"ERR Invalid Synatx"。非二进制安全,且不允许换行。 整数(Integer): llen 、 scard 等命令的返回值, 64位有符号整数 字符串(Bulk String): 二进制安全字符串, get 等命令的返回值 数组(Array, 旧版文档中称 Multi Bulk Strings): Bulk String 数组,客户端发送指令以及 lrange 等命令响应的格式 RESP 通过第一个字符来表示格式: 简单字符串:以"+" 开始, 如:"+OK\r\n"

【java虚拟机】Java内存模型

梦想与她 提交于 2019-12-05 09:57:31
作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7518259.html 一、什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常,而在另外一套平台上并发访问却经常出错,因此在某些场景下就不许针对不同的平台来编写程序。 Java内存模型即要定义得足够严谨,才能让Java的并发内存访问操作不会产生歧义;Java内存模型也必须定义地足够宽松,才能使得虚拟机的实现有足够的自由空间去利用硬件的各种特性来获取更好的执行速度。经过长时间的验证和修补,JDK1.5(实现了JSR-133)发布之后,Java内存模型已经成熟和完善起来了,一起来看一下。 二、主内存和工作内存 Java内存模型的主要目的是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。注意一下,此处的变量并不包括局部变量与方法参数,因为它们是线程私有的,不会被共享,自然也不会存在竞争,此处的变量应该是实例字段

JVM那些事儿之内存区域

孤者浪人 提交于 2019-12-05 09:16:11
相信绝大多数java开发者或多或少的都应该知道jvm,但是有多少人又深入去了解过,笔者深感自身能力的不足,去看了些资料,觉得还是有必要整理下自己的学习记录,时常回头看看,多看多实践提升自己的能力,故开始进行jvm相关的知识梳理和记录,一起来学习吧 前言 从我们刚开始学习java时,我们就被告知其“一次编写,到处运行”的特点,随着学习和工作的深入,你也应该了解了构成这种特点的原因,说到这里,有点像中间件的思想,有人说过,没什么东西是不能通过添加一个中间件来完成的,如果一个不行,那就两个。 由于jvm的存在,使得java语言可以不去关注系统区别而进行同一套代码的开发,借助class字节码文件在jvm上运行,只需要jvm关注底层系统即可,有没有点像中间件的思想,将底层处理相关部分抽离出来构成jvm,而开发者无需关注底层实现,根据自己的需要进行自己的开发即可 但是同时由于jvm的存在屏蔽了许多的底层细节,方便了开发人员,但是其缺点也是很明显的,在我们需要对程序进行优化,比如内存,CPU,并发量,IO等进行必要的处理时,就有点懵逼,你是不是经历过下面的场景: 程序内存占用满了,导致程序经常宕机需要重启,不知道从哪里查问题,怎么优化? 程序偶尔莫名其妙的卡顿,代码检查了一遍又一遍,没问题,不知道接下来怎么搞了? 服务器上资源紧张,需要优化配置,怎么做? ... 其他更加离奇的现象就不列举了

llvm编译系统结构分析

核能气质少年 提交于 2019-12-05 06:17:41
LLVM 编译系统分析 中间代码 工具集 编译流程 整个 LLVM 编译系统的组成可分成三部分:LLVM 中间代码,用于分析、 优化、代码生成等工作的集成库,以及建立在以上集成库基础之上的工具,包括汇 编器、链接器、调试器等等。本章将先依次分析这三个组成部分,然后再对 LLVM 的编译流程作详细的说明。 中间代码 LLVM 中间代码是一种采用 SSA 形式的 IR(Immediate Representation,中间 表达),使用的指令集为 LLVM 虚拟指令集。该指令集是一个类似 RISC(Reduced Instruction Set Computer,精简指令集计算机)的三地址指令集,含有简单的控制 指令和使用带类型指针的访存指令,拥有独立于高级语言和目标处理器的语法,易 于进行代码分析和优化。使用 LLVM 虚拟指令集的 LLVM 中间代码可以三种方式 存在:存在于内存中的编译器 IR、存在磁盘上的字节码(bytecode)、以及可供人 阅读的汇编代码。这三种存在方式是同一中间代码的不同表达形式,可分别用于: 在编译器执行编译遍时提供方便高效的中间代码转换或者中间代码分析、作为 JIT 编译器(Just-In-Time Compiler)在本地执行客户处理器代码的格式、以及方便开 发人员进行代码调试的汇编代码。LLVM 中间代码由虚拟指令集、中间代码高层结构

计算机基本运行原理

。_饼干妹妹 提交于 2019-12-05 04:14:41
CPU 运算很快,但存储容量很小,而且断电后数据就丢了 比内存快百倍,比硬盘快百万倍 要做的几件事 运行指令 不能保存指令,指令全在内存中 上电后执行的第一条指令放在地址0xFFFFFFF0处,通常是跳转指令,到BIOS 靠缓存和流水线技术,提高利用率 缓存 利用了局部性原理 流水线 避免可以并行的不同指令(工作)之间互相等待 比如CPU通常要做四件事 通知内存取指令 翻译指令 执行指令 把结果写会内存 内存 比硬盘速度快,但断电后数据就丢了 硬盘 慢,但是容量大,断电还能保存下来 机械式硬盘需要靠磁头在高速旋转的磁片上挪来挪去进行寻址和读写 啥都好的,就贵了。。。否则别的部件就消失了,比如历史上的软盘什么的。 计算机启动过程 来源: https://www.cnblogs.com/wyp1988/p/11905033.html

计算机组成原理复习(2)

放肆的年华 提交于 2019-12-05 02:54:22
中央处理器由运算器和控制器两大部分组成。 运算器接收从控制器送来的命令并执行相应的动作,对数据进行加工和处理。 运算器主要由算术逻辑单元(ALU)、暂存寄存器、累加寄存器、程序状态字寄存器(PSW)、通用寄存器组、计数器(CT)、移位器组成。 程序状态字寄存器用于保存系统的运行状态。条件转移指令执行时,需对标志寄存器的内容进行测试,判断是否满足转移条件。 程序状态字寄存器用于存放程序状态字,而程序状态字的各位表征程序和机器运行状态,如:含有进位标志C、结果为零标志Z等。 通用寄存器用于存放操作数和各种地址信息等,其位数与机器字长相等,这样便于操作控制。 控制器的基本功能就是执行指令,每条指令的执行是由控制器发出的一组微操作实现的。 控制器的功能是取指令、分析指令和执行指令,并产生有关操作控制信号。 控制器由硬布线控制器和微程序控制器两种类型。 控制器由程序计数器(PC)、指令寄存器(IR)、指令译码器、存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、时序系统和微操作信号发生器等组成。 控制器的工作原理是根据指令操作码、指令的执行步骤(微命令序列)和条件信号来形成当前计算机个部件要用到的控制信号。计算机整机各硬件系统在这些控制信号的控制下协同运行,产生预期的执行结果。 程序计数器用于存放下一条指令在主存中的地址,具有自增功能。 程序计数器的内容为下一条指令在主存中的地址

计算机组成(一):计算机分类与发展方向

孤人 提交于 2019-12-05 01:50:30
从实现和使用的角度对计算机分类: 从指令和数据流的角度:     1.单指令流&单数据流(SISD):冯诺伊曼体系结构   2.单指令流&多数据流(SIMD):阵列处理器、向量处理器   3.多指令流&但数据流(MISD):不存在   4.多指令流&多数据流(MIMD):多处理器、多计算机 发展方向:   便携、超强的运算能力                                                         power by 王道&百度脑图 来源: https://www.cnblogs.com/wellkeys/p/11895737.html

I/O管理杂记

纵然是瞬间 提交于 2019-12-04 20:59:14
  这是一篇杂记,记录了操作系统层面与I/O管理的零散知识点,用于温习使用。由于I/O管理是一个很大的范畴,后续会不断按照自己的生产需求来补充用的到的知识点。计算机系统是人造系统,没有绝对的对错(相对于自然系统的绝对性),只有特定场景下的优劣。我们在理解一块知识时应当从它提出的背景以及要解决的问题出发,去理解机制而不是纠结于如何具体的实现。即使目的相同,不同的公司或开发者在不同场景下的实现也不尽相同,了解几个例子加深自己的理解、帮助自己构建起知识体系即可(个人观点)。 设备控制器   设备控制器是计算机中的一个实体,其主要职责是 控制一个或多个I/O设 备,以实现I/O设备和计算机之间的数据交换。它是 CPU与I/O设备之间的接口 ,它接收从CPU发来的命令,并去控制I/O设备工作, 以使处理机从繁杂的设备控制事务中解脱出来 。设备控制器是一个 可编址 的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;若控制可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个设备。设备控制器的复杂性因不同设备而异,相差甚大,于是可把设备控制器分成两类:一类是用于控制 字符设备 的控制器,另一类是用于控制 块设备 的控制器。在微型机和小型机中的控制器,常做成印刷电路卡形式,因而也常称为接口卡,可将它插入计算机。有些控制器还可以处理两个、四个或八个同类设备。   控制器由

计算机中的周期

筅森魡賤 提交于 2019-12-04 19:17:19
1、机器周期 机器完成一个基本操作所需要的时间。 在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、 存储器 读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。 来源: https://www.cnblogs.com/qaswzh/p/11879669.html

Linux查看端口占用常用指令

心已入冬 提交于 2019-12-04 18:00:39
1. netstart指令 netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。如果你的计算机有时候接收到的数据报导致出错数据或故障,你不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么你就应该使用netstat查一查为什么会出现这些情况了。 查看系统当前被正在使用的端口信息: netstart -lntp 参数说明 -l --listening 显示正在被监听的套接字服务 -n --numeric 不需要解析域名 -t --tcp 只显示tcp的通信信息 -p --programs 显示套接字通信的PID或者程序的名字 2. lsof指令 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如TC和UDP等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口