定义类与类之间的交互关系 泛化(Generalization)概念可以简单理解为继承关系代码实现public class A { ... }public class B extends A { ... }实现(Realization)概念一般是指接口和实现类之间的关系代码实现public interface A {...}public class B implements A { ... }聚合(Aggregation)概念聚合是一种包含关系,A类对象包含B类对象,B类对象的生
改善代码质量的20条编程规范 代码嵌套层次过深往往是因为 if-else、switch-case、for 循环过度嵌套导致的个人建议,嵌套最好不超过两层,超过两层之后就要思考一下是否可以减少嵌套过深的嵌套本身理解起来就比较费劲嵌套过深很容易因为代码多次缩进,导致嵌套内部的语句超过一行的长度而折成两行,影响代码的整洁。
染色算法的简单概述 这句话描述的是一种用于确定寄存器分配的染色算法在这个上下文中,我们有一个图,图的节点代表变量,边代表变量之间的干扰(即两个变量不能共享同一个寄存器)算法的目标的是为了判断给定的k个寄存器是否足够给所有的变量分配如果一个图可以用k种颜色来染色(即每个节点可以用一个颜色表示,且相邻的节点颜色不同),那么添加一个边数少于k的节点,仍然可以用k种颜色来颜色。因为新节点的边数少于k,所以至少有一种颜色是没有被它的任何邻居使用的。
LLVM 中的Value、User、Use设计 首先,定义一个简单的LLVM IR 代码片段,这里创建一个简单的加法操作在这个例子中,%1是一个Value,它代表了加法操作的结果.i32 是它类型,表示这是一个32位的整数10 和 20 是操作数,它们也是Value。
LLVM 寄存器分配 基本寄存器分配器是四种寄存器分配器中最简单的寄存器分配pass实现(<llvm_root/livm/lib/CodeGen/RegAllocBasic.cpp>)但麻雀虽小,五脏俱全,基本寄存器分配器中实现了根据溢出权重确实虚拟寄存器优先级、按优先级分配物理寄存器,以及物理寄存器不足时将虚拟寄存器溢出到内存等功能。因此,基本寄存器分配器非常适合作为自定义寄存器分配器实现参考LLVM3.0 之前的默认寄存器分配器是线性扫描分配器。
静态分析: 代码优化 Backward Analysis”或“反向分析”是一种分析技术,它从程序或代码的输出结果开始,逆向推导出程序的状态或者输入值这里的表达式“IN[s]=fs(OUT[s])”可以被解读为:给定一个状态s的输出OUT[s],通过某个函数fs来推导出该状态的输入IN[s]Reaching Definitions Analysis 是一种数据流分析技术,用于确定程序中某个变量定义对程序中其他点的可见性。
CPU 流水线相关情况 流水线中经常有一些被称为"相关"的情况发生,它使得指令序列中下一条无法按照设计的时钟周期执行,这些“相关”会降低流水线的性能流水线中的相关分为以下三种类型:结构相关、数据相关、控制相关。
长模式下的分页 长模式下的 4KB 分页下,由一个顶层目录、二级中间层目录和一层页表组成了 64 位地址翻译过程顶级页目录项指向页目录指针页,页目录指针项指向页目录页,页目录项指向页表页,页表项指向一个 4KB 大小的物理页各级页目录项中和页表项中依然存在各种属性位,这在图中已经说明其中的 XD 位,可以控制代码页面是否能够运行上图中没有了页表项,取而代之的是,页目录项中直接存放了 2MB 物理页基地址由于物理页始终 2MB 对齐,所以其地址的低 21 位为 0,用于存放页面属性位。
保护模式下的分页 页目录项、页表项都是 4 字节 32 位,1024 个项正好是 4KB(一个页),因此它们的地址始终是 4KB 对齐的低 12 位才可以另作它用,形成了页面的相关属性,如是否存在、是否可读可写、是用户页还是内核页、是否已写入、是否已访问等4MB 大小的页面下,页表项还是 4 字节 32 位,但只需要用高 10 位来保存物理页面的基地址就可以因为每个物理页面都是 4MB,所以低 22 位始终为 0。
简单页表和多级页表 同样一个虚拟内存地址,偏移量的部分和上面简单页表一样不变,但是原先的页号部分,把它拆成四段,从高到低,分成4级到1级。以一个页的大小是4K字节(4KB)为例,我们需要20位的高位,12位的低位。因为虚拟内存地址分布的连续性,树的第一层节点的指针,很多就是空的,也就是不需要对应对应的子树。做地址转换的页表,只需要保留虚拟内存地址的页号和物理内存地址的页号之间的映射关系即可。找到最终最终的物理页号,就好像通过一个特定的访问路径,走到树最底层的叶子节点。所谓不需要子树,其实就是不需要对应的2级,3级的页表。
CPU工作模式-长模式 保护模式下为了实现对中断进行权限检查,实现了中断门描述符,在中断门描述符中存放了对应的段选择子和其段内偏移,还有 DPL 权限如果权限检查通过,则用对应的段选择子和其段内偏移装载 CS:EIP 寄存器从实模式直接切换到长模式,也可以从保护模式切换长模式切换到长模式和切换保护模式的流程差不多,只是需要准备的段描述符有所区别,还有就是要注意同时开启保护模式和分页模式。
CPU工作模式- 保护模式 因为实模式下CPU不需要做权限检查,所以它可以直接中断向量表中的值装载CS:IP寄存器x86 CPU在第一次加电和每次reset后,都会自动进入实模式,想要进入保护模式,就需要程序员写代码实现从实模式切换到保护模式接下来,CPU 发现了 CRO 寄存器第 0 位的值是 1就会按 GDTR 的指示找到全局描述符表,然后根据索引值 8,把新的段描述符信息加载到 CS 影子寄存器,当然这里的前提是进行一系列合法的检查CPU 真正进入了保护模式,CPU 也有了 32 位的处理能力。
指令重排序 CPU由多个功能部件构成在这个结构中,一条指令执行时,要依次用到多个功能部件,分成多个阶段,虽然每条指令是顺序执行的,但每个部件的工作完成以后,就可以服务于下一条指令,从而达到并行的效果这种结构叫做。
Verilog HDL 基本概念 (1) 等式运算符中的"" 与 "=" 的区别是: 对于"“运算,参与比较的两个操作数必须逐位相等,其结果才为1,如果某些值是不定态X或高阻态Z,那么得到的结果是不定值X;而对于”="运算,则要求对参与的操作数中为不定态X或高阻态Z的位与进行比较,两个操作数也必须完全一致,其结果才为1,否则结果为0针对上面的 a、b,"ab"的返回结果为X,而"a=b"的返回结果为1。
对数的基本概念 特别地,我们称以10为底的对数叫做常用对数(common logarithm),并记为lg称以无理数e(e=2.71828…)为底的对数称为自然对数(natural logarithm),并记为ln零没有对数在实数范围内,负数无对数。[3] 在虚数范围内,负数是有对数的。