LCD vs OLED 1. LCD 原理LCD 的发光,简要概括为:所有像素点对应一个背光层,负责发光,每个像素点最外层对应一个彩色滤光片,由中间层的正负极电路来控制液晶层的偏角,从而控制 RGB 三种颜色的混合比例。 2. OLED 原理OLED 全程为 Organic Light-Emitting Diode,即有机发光二极管 OLED 是一种特殊设计的自发光二极管,通过正负极电路,控制夹在中间的发光二极管发光。通 2022-01-19 hardware
PCIE 1. South bridge在解释 PCIE 之前,有必要先来解释一下 South bridge,cpu,主板之间的一些概念。 大家都知道,计算机中所有的数据都需要交给 CPU 处理才能发挥作用(不完全对),但那么多的设备,难道都需要和 CPU 交互吗? 当然不行,那样不仅极大地加重了 CPU 的负担(无论是制造还是运行),对于主板的布线也是一大考验,那有什么解决方案呢? 其实,这里可以分级的思 2022-01-19 hardware
Linux initcall 机制 1. initcall 设计思想linux 对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者通常提供一个xxx_init() 函数接口,以启动这个驱动程序同时提供某些服务。 那么,根据常识来说,这个 xxx_init() 函数肯定是要在系统启动的某个时候被调用,才能启动这个驱动程序。 最简单直观地做法就是:开发者试图添加一个驱动程序时,在内核启动 ini 2022-01-18 linux basic
2.5 middleware-buffer 不知道大家有没有发现,Tower Service trait 中,要求 ready + call 都接收一个 &mut self,这也就意味着,我们无法将其很好地扩展到多线程上! 你可能会觉得,针对每一个 service,调用一下 service.clone(),再传入不就好了吗?但假如一个 Service 包装了很多中间件,clone 的开销也是不可小觑的。 Tower 提供了这样一个中 2022-01-10 rust tower middlewares
2.4 tower-concurrency limit Concurrency 翻译过来是 并发,Concurrency Limit 也就是 并发控制,其核心限制条件是:同一时刻最多接收 n 个请求,和 RateLimit 有一定的相似之处,内层似乎都要使用一个计数器计数,但是具体如何实现,又有很大的不同。 1. 并发控制模型可以将对于请求的响应能力看成是一种资源,资源的数量是有限的,先到先得,那得不到的请求就应该置之不理吗?当然不是,得不到的可以排队 2022-01-10 rust tower middlewares
1.3 tower 中间件模型 1. 洋葱圈模型主流的中间件,大多提供了下面这种洋葱圈模型,方便用户在一个调用中插入自定义逻辑预处理(pre-handle)及后处理(post-handle),配合handler实现一个完整的请求处理生命周期。 比较形象的图示: 上面这种表示比较抽象,进一步结合实际中间件中的 pre_handler 和 post_handler,可以表示为下面的结构: 2. 深入中间件如果深入中间件,就会发现, 2022-01-10 rust tower basic
2.1 middleware custom 先来回顾一下 Tower 当中的中间件模型: 通过 Service Trait 定义服务功能,通过 Layer Trait 搭建骨架,并通过 Stack 将所有的中间件粘合起来。并且, Service 和 Layer 通常是一一对应的关系。 本节就来带着大家动手实现实现一个日志中间件。 1. 日志中间件实现以一个最简单的 Echo 业务 + 最简单的中间件 Log 为例,大致分为几个模块: 核心 2022-01-10 rust tower middlewares
2.2 tower-rate limit Tower 自带的流量控制中间件,核心功能为:在 x 时间内,最多接收 n 个请求,如果超出最大流量,休眠直到下一个刷新点 1. 核心数据结构为了描述这个核心功能,我们定义了下面的核心数据结构: rate: 描述一段时间内,最多允许多少请求通过 sleep: 定时器,表示休眠的时间 而这里的 RateLimit 就是我们想要对外提供的 Service,通过相对应的 RateLayer 创建,结 2022-01-10 rust tower middlewares
2.3 tower-timeout limit Timeout 这个中间件的责任也非常明确:如果某个服务调用时间过长,超出了规定的超时时间,直接返回错误 1. 模型抽象为此,Timeout 肯定需要保留下面两个结构 inner Service 超时时间 duration 12345#[derive(Debug, Clone)]pub struct Timeout<T> { inner: T, timeout 2022-01-10 rust tower middlewares
1.4 tower-ext 1. ext 设计模式xxx-ext 是 Rust 当中常用的一个设计模式,在满足某个 Trait 的前提下,引入很多的扩展功能(比如最常用的 Iterator,其实 skip, enumerate, take 都是针对 Iterator trait 的扩充) Tower 也给 Service 引入了这个设计模式,十分好用。 源码如下,TL;DR 1234567891011121314151617 2022-01-10 rust tower basic