自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 收藏
  • 关注

原创 RocketMQ消息队列-@RocketMQMessageListener实现原理

相当于定义一个消费者,定义了消费者的一些属性实现接口来处理具体消费逻辑每个消费者初始化了一个对象,该对象中包含消费实例和消费者的属性服务启动的时候开启一个线程轮训队列中的消息,如果没有就一直阻塞,拿到消息后,最终会调用自己实现的onMessage方法。

2023-09-02 16:12:56 4466

原创 Redisson分布式锁实现原理

tryLock()方法获取锁会失败,lock()方法获取锁一定会成功。不传锁的过期时间,会开启watchDog机制,每隔一段时间(默认10s),重置超时时间。

2023-07-21 11:28:21 506

原创 Redis分布式锁的演变历程

Redlock红锁是为了解决主从架构中当出现主从切换导致多个客户端持有同一个锁而提出的一种算法。大家可以看官方文档(),以下来自官方文档的翻译。想用使用 Redlock,官方建议在不同机器上部署 5 个 Redis 主节点,节点都是完全独立,也不使用主从复制,使用多个节点是为容错。一个客户端要获取锁有 5 个步骤客户端获取当前时间T1(毫秒级别);使用相同的key和value顺序尝试从N个Redis实例上获取锁。

2023-07-18 17:16:45 261

原创 线程池中的线程异常了会怎么处理

当执行方式是execute时,可以看到堆栈异常的输出。当执行方式是submit时,堆栈异常没有输出。但是调用方法时,可以捕获到异常。不会影响线程池里面其他线程的正常执行。线程池会把这个线程移除掉,并创建一个新的线程放到线程池中。

2023-07-07 16:59:07 350

原创 Thread、Runnable、Callable、Future、FutureTask之间的关系

Thread 和 Runnable 是一个策略模式,FutureTask 和 Callable 又是一个策略模式,最后通过 Runnable 和 FutureTask 的继承关系,将这 2 个策略模式组合在一起。

2023-06-29 15:19:37 233

原创 Nacos-04-@RefreshScope自动刷新原理

综上所述,来总结下@RefreshScope 实现流程1.需要动态刷新的类标注@RefreshScope 注解2.@RefreshScope 注解标注了@Scope 注解,并默认了ScopedProxyMode.TARGET_CLASS;属性,此属性的功能就是在创建一个代理,在每次调用的时候都用它来调用GenericScope get 方法来获取对象。

2023-05-20 15:24:05 3029

原创 Nacos-03-Nacos与Eureka的区别

Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。默认模式是:客户端心跳上报Nacos实例健康状态,默认间隔5秒,Nacos在15秒内未收到该实例的心跳,则会设置为不健康状态,超过30秒则将实例删除。对于永久实例的的监看检查,Nacos 采用的是注册中心探测机制,注册中心会在永久服务初始化时根据客户端选择的协议类型注册探活的定时任务。Eureka只支持AP方式。

2023-05-10 11:20:12 465

原创 Nacos-02-Nacos的临时与持久化实例区别

SDK 的注册方式实际是通过 RPC 与注册中心保持连接(Nacos 2.x 版本中,旧版的还是仍然通过OpenAPI 的方式),客户端会定时的通过 RPC 连接向 Nacos 注册中心发送心跳,保持连接的存活。默认模式是:客户端心跳上报Nacos实例健康状态,默认间隔5秒,Nacos在15秒内未收到该实例的心跳,则会设置为不健康状态,超过30秒则将实例删除。Nacos会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样也⽐造成雪崩要好。

2023-05-10 10:16:03 1206

原创 Nacos-01-Nacos基本介绍

​ Nacos 中的一组配置集,是组织配置的维度之一。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。:Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

2023-05-09 18:10:01 818

原创 为什么我在公司里访问不了家里的电脑?

IPV4地址有限,但通过NAT路由器,可以使得整个内网N多台机器,对外只使用一个公网IP,大大节省了IP资源。内网机子主动连接公网IP,中间的NAT会将内网机子的内网IP转换为公网IP,从而实现内网和外网的数据交互。普通的NAT技术,只会修改网络包中的发送端和接收端IP地址,当内网设备较多时,将有可能导致冲突。因此一般都会使用NAPT技术,同时修改发送端和接收端的IP地址和端口。由于NAT的存在,公网IP是无法访问内网服务的,但通过内网穿透技术,就可以让公网IP访问内网服务。

2022-12-13 11:28:47 423

原创 为什么我们家里的IP都是192.168开头的?

IP地址就像快递里填的送件和收件地址,是一串编号,用于在纷繁复杂的网络世界中标识你的位置。IPv4有32位,最多能表示42亿个IP地址。为了更好的管理它们,教科书上出现过ABC这样的分类方式,并且在ABC类里还分为私有地址和公有地址。但目前流行使用CIDR的方式进行分类。为了表示更多主机,我们可以将网络分为广域网和局域网,广域网用公有地址,局域网使用私有地址。将公有地址乘上私有地址,就能表示远大于42亿台的机子。家庭网络较小,往往小区内几幢楼构成一个局域网,这几幢楼共用一个公有IP地址。

2022-12-08 19:34:20 1098

原创 用了TCP协议,就一定不会丢包吗?

首先,我们两个手机的绿皮聊天软件客户端,要通信,中间会通过它们家服务器。大概长这样。但为了简化模型,我们把中间的服务器给省略掉,假设这是个端到端的通信。且为了保证消息的可靠性,我们盲猜它们之间用的是TCP协议进行通信。为了发送数据包,两端首先会通过三次握手,建立TCP连接。一个数据包,从聊天框里发出,消息会从聊天软件所在的用户空间拷贝到内核空间的发送缓冲区(send buffer) ,数据包就这样顺着传输层、网络层,进入到数据链路层,在这里数据包会经过流控(qdisc),再通过RingBuffer发到物理层

2022-12-08 11:33:28 1717 1

原创 既然IP层会分片,为什么TCP层还要分段

我们知道网络就像一根管子,而管子吧,就会有粗细。一个数据包想从管子的一端到另一端,得过这个管子。但数据包的量有大有小,想过管子,数据包不能大于这根管子的粗细。问题来了,数据包过大时怎么办?答案比较简单。会把数据包切分小块。这样数据就可以由大变小,顺利传输。回去看下网络分层协议,数据先过传输层,再到网络层。这个行为在传输层和网络层都有可能发生。在传输层(协议)里,叫分段。在网络层(层),叫分片。那么不管是分片还是分段,肯定需要按照一定的长度切分。在里,这个长度是。在层里,这个长度是。那MSS和MTU是什么关系

2022-12-07 16:41:56 501 1

原创 为什么TCP会粘包

还记得四层网络协议长什么样子吗?四层网络模型每层各司其职,消息在进入每一层时都会多加一个报头,每多一个报头可以理解为数据报多戴一顶帽子。这个报头上面记录着消息从哪来,到哪去,以及消息多长等信息。比如,记录的是硬件的唯一地址,记录的是从哪来和到哪去,传输层头记录到是到达目的主机后具体去哪个进程。可以把网络比喻为一个水管,是有一定的粗细的,这个粗细由**网络接口层(数据链路层)*提供给*网络层,一般认为是的(1500),直接传入整个消息,会超过水管的最大承受范围,那么,就需要进行切片,成为一个个数据包,这样消息

2022-12-07 15:20:38 115

原创 路由器,集线器,交换机,网桥,光猫有啥区别?

网线替代了上面的灰色部分,实现物理层互联。如果想要两台电脑互联成功,还需要确保每一层所需要的步骤都要做到位,这样数据才能确保正确投送并返回。从数据链路层到物理层,数据会被转为01比特流。此时需要把比特流传到另一台电脑。通过一根网线,两段水晶头插入网口,把两台电脑连起来。A电脑和B电脑完成连接之后,可以尝试从A电脑中ping一下B,再从B电脑中ping一下A。如无意外,都能ping通。A给B发个消息,从应用层到数据链路层,会分别加上A和B的各种’'身份信息"。比如在传输层会加上A和B的应用端口号,在网络层加上

2022-12-06 16:53:50 722

原创 Spring-Cloud-Gateway-09-动态路由与自动刷新

大体的意思就是说,事件的发布者发布事件,事件的监听这对对应的事件进行监听,当监听到对应的事件时,就会触发调用相关的方法。因此,在事件处理中,事件是核心,是事件发布者和事件监听者的桥梁。回顾前几节的内容,我们的路由配置是在服务启动之后通过各个渠道(配置文件、注册中心、缓存等)加载进来的,那么如果我们想要改变路由的配置,不得不重启服务,这样一来就十分麻烦,所以就引申出了。两种不同的方法,有兴趣的同学可以去实现下,这里写的很粗糙,只是提供大致的方向,还有很多细节没有涉及。方法就是在事件发布的时候触发。

2022-10-26 17:34:49 3358

原创 Spring-Cloud-Gateway-08-路由的自动装配与加载流程

可以发现,RouteDefinitionLocator的作用是汇聚不同源的路由信息RouteDefinition,RouteLocator可以直接自定义路由,还可以通过RouteDefinitionLocator获取所有的配置的RouteDefinition,最终转换成Route供调用方RoutePredicateHandlerMapping获取。

2022-10-25 19:32:49 877

原创 Spring-Cloud-Gateway-07-GatewayFilterChain的执行过程

的排序是在很前面的,按道理这种响应处理的类应该是在靠后才对,这里的设计比较巧妙。大家可以看到chain.filter(exchange).then(),意思就是执行到我的时候直接跳过下一个,等后面的过滤器都执行完后才执行这段逻辑。:从请求中获取body缓存到网关上下文,这样就可以直接从网关上下文中拿到请求参数,而不会出现从request中拿到之后还要回填到请求体的问题。:根据 lb:// 前缀过滤处理,做负载均衡,选择最终要调用的服务地址。:根据匹配的 Route ,计算请求的地址。:转发路由网关过滤器。

2022-10-20 15:44:13 1191 1

原创 Spring-Cloud-Gateway-06-DispatcherHandler调用解析

DispatcherHandler的注入在自动装配那一节已经说过了,忘记的同学可以重新会看一下。接口,则调用重写的getOrder方法,否则返回null,最后会返回。接口或者都没有实现,那么通过getOrder方法得到的值来排序。接下来我们来看下最核心的handle方法是如何具体处理请求的。接着回到前面的handle方法中,其中有一步就是用来排序的。就是我们需要的,通过名字可以猜到就是用来处理路由转发的。可以看到,这里初始化了核心的三部分内容,具体是。中,通过handle方法来处理具体的请求。

2022-10-20 10:09:39 708

原创 Spring-Cloud-Gateway-05-请求到HttpWebHandlerAdapter的调用链路

通过这些类的名字,我们可以发现,HttpHandler 往下就是具体的 Web 容器了,也就是说有具体的 Web 容器来接受请求,然后通过调用 HttpWebHandlerAdapter#handler 来进行后续的处理。这样我们也就明白了 为什么 HttpHandler 的具体实现是一个适配器,因为它要适配不同的底层容器,Spring webFLux 不仅仅可以使用 NettyReactiveWebServer 作为底层Web 容器,也可以使用 tomcat、jetty等 servlet 的容器。

2022-10-19 15:32:23 861

原创 Spring-Cloud-Gateway-04-HttpWebHandlerAdapter到DispatcherHandler调用流程

具体实现类是ExceptionHandlingWebHandler,那么是怎么调用到DispatcherHandler中的?更加底层的一个 API,也就是说很可能是由 HttpHandler 来调用 WebHandler (请求由下往上),但是。通过调试可知,当存在后续filter时,会继续调用filter方法,否则直接调用this.handler.handle方法。类的handle方法会调用父类WebHandlerDecorator的handle方法。对象,通过分析得到持有的。

2022-10-18 16:46:30 970

原创 Spring-Cloud-Gateway-03-网关自动装配

找到gateway的依赖,spring-cloud-starter-gateway点进去之后找到它的依赖从名称上可以判断spring-cloud-gateway-server是gateway的核心依赖,找到依赖包,看到如下结构spring.factories是一些自动装配的类,如下可以看到其中比较重要的是GatewayAutoConfiguration,负责很多bean的初始化,类声明如下:和分别是在之前和之后加载其中和算是比较重要的装配类先看WebFluxAutoConfiguration,类声明

2022-10-17 16:33:09 785 1

原创 Spring-Cloud-Gateway-02-请求调用基本流程

之后,会通过一些匹配条件,定位到真正的服务节点,并且在这个转发过程前后,进行一些细粒度的控制,其中。:GateWayFilter的实例,使用过滤器,可以在请求被路由之前或者之后对请求进行修改。:开发人员可以匹配HTTP请求中的内容(请求头和请求参数),如果请求断言匹配则进行路由。:构建网关的基础模块,由ID、目标URL、过滤器等组成。spring cloud gateway 官网的流程图。

2022-10-17 16:29:52 2235

原创 Spring-Cloud-Gateway-01-网关基本概念

的概念,网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。如果没有其他更优方法,我们只能记录每个微服务对应的地址,分别去调用,但是这样会有很多的问题和潜在因素。认证复杂,每个微服务可能存在不同的认证方式,客户端去调用,要去适配不同的认证,存在跨域的请求,调用链有一定的相对复杂性(防火墙 / 浏览器不友好的协议)。

2022-10-17 16:27:04 561

原创 深入浅出计算机组成原理26-Superscalar和VLIW:如何让CPU的吞吐率超过1?

我们先回顾一下第 4 讲,不知道你是否还记得这个公式:程序的 CPU 执行时间 = 指令数 × CPI × Clock Cycle Time这个公式里,有一个叫 CPI 的指标。我们知道,CPI 的倒数,又叫作 IPC(Instruction Per Clock),也就是一个时钟周期里面能够执行的指令数,代表了 CPU 的吞吐率。那么,这个指标,放在我们前面几节反复优化流水线架构的 CPU 里,能达到多少呢?答案是,最佳情况下,IPC 也只能到 1。

2022-10-12 14:16:44 400

原创 深入浅出计算机组成原理25-冒险和预测(四):今天下雨了,明天还会下雨么?

好了,这一讲,我给你讲解了什么是控制冒险,以及应对控制冒险的三个方式。第一种方案,类似我们的操作数前推,其实是在改造我们的 CPU 功能,通过增加对应的电路的方式,来缩短分支带来的延迟。另外两种解决方案,无论是“假装分支不发生”,还是“动态分支预测”,其实都是在进行“分支预测”。只是,“假装分支不发生”是一种简单的静态预测方案而已。在动态分支预测技术里,我给你介绍了一级分支预测,或者叫 1 比特饱和计数的方法。其实就是认为,预测结果和上一次的条件跳转是一致的。

2022-10-11 14:55:18 174

原创 深入浅出计算机组成原理24-冒险和预测(三):CPU里的“线程池”

好了,总结一下。这一讲里,我为你介绍了乱序执行,这个解决流水线阻塞的技术方案。因为数据的依赖关系和指令先后执行的顺序问题,很多时候,流水线不得不“阻塞”在特定的指令上。即使后续别的指令,并不依赖正在执行的指令和阻塞的指令,也不能继续执行。而乱序执行,则是在指令执行的阶段通过一个类似线程池的保留站,让系统自己去动态调度先执行哪些指令。这个动态调度巧妙地解决了流水线阻塞的问题。指令执行的先后顺序,不再和它们在程序中的顺序有关。我们只要保证不破坏数据依赖就好了。

2022-10-11 14:34:29 157

原创 深入浅出计算机组成原理23-冒险和预测(二):流水线里的接力赛

这一讲,我给你介绍了一个更加高级,也更加复杂的解决数据冒险问题方案,就是操作数前推,或者叫操作数旁路。操作数前推,就是通过在硬件层面制造一条旁路,让一条指令的计算结果,可以直接传输给下一条指令,而不再需要“指令 1 写回寄存器,指令 2 再读取寄存器“这样多此一举的操作。这样直接传输带来的好处就是,后面的指令可以减少,甚至消除原本需要通过流水线停顿,才能解决的数据冒险问题。这个前推的解决方案,不仅可以单独使用,还可以和前面讲解过的流水线冒泡结合在一起使用。

2022-10-11 14:15:54 511

原创 深入浅出计算机组成原理22-冒险和预测(一):hazard是“危”也是“机”

讲到这里,相信你已经弄明白了什么是结构冒险,什么是数据冒险,以及数据冒险所要保障的三种依赖,也就是数据依赖、反依赖以及输出依赖。一方面,我们可以通过增加资源来解决结构冒险问题。我们现代的 CPU 的体系结构,其实也是在冯·诺依曼体系结构下,借鉴哈佛结构的一个混合结构的解决方案。我们的内存虽然没有按照功能拆分,但是在高速缓存层面进行了拆分,也就是拆分成指令缓存和数据缓存这样的方式,从硬件层面,使得同一个时钟下对于相同资源的竞争不再发生。

2022-10-11 11:25:07 709

原创 深入浅出计算机组成原理21-面向流水线的指令设计(下):奔腾4是怎么失败的?

相信到这里,你对 CPU 的流水线技术,有了一个更加深入的了解。你会发现,流水线技术和其他技术一样,都讲究一个“折衷”(Trade-Off)。一个合理的流水线深度,会提升我们 CPU 执行计算机指令的吞吐率。我们一般用 IPC(Instruction Per Cycle)来衡量 CPU 执行指令的效率。IPC 呢,其实就是我们之前在第 3 讲讲的 CPI(Cycle Per Instruction)的倒数。也就是说, IPC = 3 对应着 CPI = 0.33。

2022-10-10 19:41:13 183

原创 深入浅出计算机组成原理20-面向流水线的指令设计(上):一心多用的现代CPU

讲到这里,相信你已经能够理解,为什么我们的 CPU 需要流水线设计了,也能把每一个流水线阶段在干什么,和上一讲的整个 CPU 的数据通路的连接过程对上了。可以看到,为了能够不浪费 CPU 的性能,我们通过把指令的执行过程,切分成一个一个流水线级,来提升 CPU 的吞吐率。而我们本身的 CPU 的设计,又是由一个个独立的组合逻辑电路串接起来形成的,天然能够适合这样采用流水线“专业分工”的工作方式。因为每一级的 overhead,一味地增加流水线深度,并不能无限地提高性能。

2022-10-10 11:30:55 163

原创 深入浅出计算机组成原理19-建立数据通路(下):指令+运算=CPU

好了,今天我们讲完了,怎么通过连接不同功能的电路,实现出一个完整的 CPU。我们可以通过自动计数器的电路,来实现一个 PC 寄存器,不断生成下一条要执行的计算机指令的内存地址。然后通过译码器,从内存里面读出对应的指令,写入到 D 触发器实现的指令寄存器中。再通过另外一个译码器,把它解析成我们需要执行的指令和操作数的地址。这些电路,组成了我们计算机五大组成部分里面的控制器。

2022-10-09 15:52:40 200

原创 深入浅出计算机组成原理18-建立数据通路(中):指令+运算=CPU

好了,到了这里,我们可以顺一顺思路了。通过引入了时序电路,我们终于可以把数据“存储”下来了。我们通过反馈电路,创建了时钟信号,然后再利用这个时钟信号和门电路组合,实现了“状态记忆”的功能。电路的输出信号不单单取决于当前的输入信号,还要取决于输出信号之前的状态。最常见的这个电路就是我们的 D 触发器,它也是我们实际在 CPU 内实现存储功能的寄存器的实现方式。

2022-10-09 15:06:12 141

原创 深入浅出计算机组成原理17-建立数据通路(上):指令+运算=CPU

好了,到这里,我们已经把 CPU 运转需要的数据通路和控制器介绍完了,也找出了需要完成这些功能,需要的 4 种基本电路。它们分别是,ALU 这样的组合逻辑电路、用来存储数据的锁存器和 D 触发器电路、用来实现 PC 寄存器的计数器电路,以及用来解码和寻址的译码器电路。虽然 CPU 已经是由几十亿个晶体管组成的及其复杂的电路,但是它仍然是由这样一个个基本功能的电路组成的。只要搞清楚这些电路的运作原理,你自然也就弄明白了 CPU 的工作原理。

2022-10-09 14:47:04 410

原创 深入浅出计算机组成原理16-浮点数和定点数(下):深入理解浮点数到底有什么用?

到这里,我们已经讲完了浮点数的表示、加法计算以及可能会遇到的精度损失问题。可以看到,虽然浮点数能够表示的数据范围变大了很多,但是在实际应用的时候,由于存在精度损失,会导致加法的结果和我们的预期不同,乃至于完全没有加上的情况。所以,一般情况下,在实践应用中,对于需要精确数值的,比如银行存款、电商交易,我们都会使用定点数或者整数类型。比方说,你一定在 MySQL 里用过 decimal(12,2),来表示订单金额。

2022-09-30 16:50:48 147

原创 深入浅出计算机组成原理15-浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?

你会看到,在这样的表示方式下,浮点数能够表示的数据范围一下子大了很多。正是因为这个数对应的小数点的位置是“浮动”的,它才被称为浮点数。随着指数位 e 的值的不同,小数点的位置也在变动。对应的,前面的 BCD 编码的实数,就是小数点固定在某一位的方式,我们也就把它称为定点数。回到我们最开头,为什么我们用 0.3 + 0.6 不能得到 0.9 呢?这是因为,浮点数没有办法精确表示 0.3、0.6 和 0.9。

2022-09-30 16:28:36 106

原创 深入浅出计算机组成原理14-乘法器:如何像搭乐高一样搭电路(下)?

通过精巧地设计电路,用较少的门电路和寄存器,就能够计算完成乘法这样相对复杂的运算。是用更少更简单的电路,但是需要更长的门延迟和时钟周期;还是用更复杂的电路,但是更短的门延迟和时钟周期来计算一个复杂的指令,这之间的权衡,其实就是计算机体系结构中 RISC 和 CISC 的经典历史路线之争。

2022-09-30 14:28:57 365

原创 深入浅出计算机组成原理13-加法器:如何像搭乐高一样搭电路(上)?

相信到这里,你应该已经体会到了,通过门电路来搭建算术计算的一个小功能,就好像搭乐高积木一样。我们用两个门电路,搭出一个半加器,就好像我们拿两块乐高,叠在一起,变成一个长方形的乐高,这样我们就有了一个新的积木组件,柱子。我们再用两个柱子和一个长条的积木组合一下,就变成一个积木桥。然后几个积木桥串接在一起,又成了积木楼梯。当我们想要搭建一个摩天大楼,我们需要很多很多楼梯。但是这个时候,我们已经不再关注最基础的一节楼梯是怎么用一块块积木搭建起来的。这其实就是计算机中,无论软件还是硬件中一个很重要的设计思想,

2022-09-29 17:15:52 212

原创 深入浅出计算机组成原理12-理解电路:从电报机到门电路,我们如何做到“千里传信”?

可以说,电报是现代计算机的一个最简单的原型。它和我们现在使用的现代计算机有很多相似之处。我们通过电路的“开”和“关”,来表示“1”和“0”。就像晶体管在不同的情况下,表现为导电的“1”和绝缘的“0”的状态。我们通过电报机这个设备,看到了如何通过“螺旋线圈 + 开关”,来构造基本的逻辑电路,我们也叫门电路。一方面,我们可以通过继电器或者中继,进行长距离的信号传输。另一方面,我们也可以通过设置不同的线路和开关状态,实现更多不同的信号表示和处理方式,这些线路的连接方式其实就是我们在数字电路中所说的门电路。

2022-09-28 17:17:06 542

原创 深入浅出计算机组成原理11-二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?

众所周知,现代计算机都是用 0 和 1 组成的二进制,来表示所有的信息。前面几讲的程序指令用到的机器码,也是使用二进制表示的;我们存储在内存里面的字符串、整数、浮点数也都是用二进制表示的。万事万物在计算机里都是 0 和 1,所以呢,搞清楚各种数据在二进制层面是怎么表示的,是我们必备的一课。然后呢,我们重点来看一看,大家在实际应用中最常遇到的问题,也就是文本字符串是怎么表示成二进制的,特别是我们会遇到的乱码究竟是怎么回事儿。我们平时在开发的时候,所说的 Unicode 和 UTF-8 之间有什么关系。

2022-09-27 16:16:21 221

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除