ca中的100个问题
- 计算机是如何创建的?
1.1 能不能在框图中,构建计算机的结构(画出计算机的datapath?)
1.2 从逻辑门的角度,画出计算机架构
1.3 指令的执行过程是怎么样的,手画出来。 - 计算机是如何被控制的?(ISA)
- 计算机如何提高性能? (pipelining -> data harzards -> forward, branch prediction, caches, and parallelism)
- ISA有哪些分类(data operations, data transfers, sequencing)
- processor execution model是指什么?(atomic, sequence,visible?)
- program storage model指什么?
- 计算机函数调用的过程是怎样的?(栈空间如何维护,caller saved register, callee saved register)
- 常见指令有哪些类型?(X86/ARM/JVM/PTX/PPC/SPARC)
- 从哪几个角度看指令?(Machine types, ISA classes, Addressing modes, Instruction width, CISC vs RISC)
10.怎么从数据结构角度理解Address modes?
https://baike.baidu.com/pic/%E9%97%B4%E6%8E%A5%E5%AF%BB%E5%9D%80/10335629/1/8718367adab44aed4f0621f7b71c8701a18bfb5d?fr=lemma#aid=1&pic=8718367adab44aed4f0621f7b71c8701a18bfb5d
- basic machine types有哪些?(Memory-to-memory machines, register machines, 综合体等等)
- BASIC ISA classes有哪些?(Accumulator/GPR+loadstore/GPR+reg-mem/Stack/Comparison)
- 问题11中的,各个ISA的执行过程是怎样的,机器代表有哪些?
- 指令宽度有什么讲究?定长指令与变长指令分别有什么优缺点?ARM/X86的指令长度是怎样的?
- General purpose register machines dominate机器有哪些优点?
- CISC 与 RISC ,从编译器设计和硬件架构设计两个维度点评?
- 请在图纸是哪个画一个single-cycle的处理器框图结构,并描述不同类型指令的处理过程。
- 请分析single-cycle处理器的最大速度瓶颈在哪里?
- 清画出single-cycle处理器的门级电路结构,并说明跳转指令执行电路的关键设计。
- mid-exam 问题,需要逐一完成。
- single-cycle处理器是如何资源的?(大锅饭,大家都消耗同样的时间)
- multi-cycle 处理器如何改进?
- pipeline处理器,核心秘诀是什么? (非pipeline是怎么浪费的?pipeline是怎么提高的)
将资源做细粒度的划分,从而避免了浪费。 - 为什么要pipeline?(频率提高,不同事物同时运行)生活中有哪些示例?
- 从单个活动来说,从single-cyle到pipeline,如果保证latency不变,时钟频率如何变化?
- pipeline处理器,对单个事物的latency是如何影响的?
- pipeline处理器,对事物的吞吐率是如何影响的?在满载和非满载的情况下,吞吐率差异?
- pipeline处理器,可以跑多快,计算公式是?
- pipeline的开销? (需要register存储pipeline每个阶段的开销)
- 现实中的pipeline会存在哪些问题?(stage长短不一,pipeline经常没有满载,register开销大)
- pipeline中存在那些冲突?(资源竞争,数据依赖,控制)
- pipeline的RAW冲突中,什么样的情况forwar能解决? 什么样的情况forward解决不了?
(饭必须要做熟,饭如果还没有做熟,即数据没有生产出来,forward也无法解决) - WAR冲突为什么在pipeline中不存在?(WAR,前辈读完,后辈才能写)
- pipeline为什么会存在冲突?(打破ISA承诺:sequential & atomic, ==> parallel & multi-cycle)
- pipeline中hazards怎么检测?
(流水线每个环节有一张表:那个指令?用了那些资源?输入那些信息?需要那些资源。理论上有这张表,就可以完成hazard检测。或者换个维度,为每个指令建立一张表,跑到了那个流水线环节,用了那些资源,需要那些资源,中间结果是什么等等) - 编译器插入nop指令,解决hazards的方法有什么缺点?(可移植性? 换了处理器后功能?性能?)
- branch hazards&data hazards有什么共同点?(一个是取指依赖前面计算结果,一个是计算依赖前面计算结果,都是依赖,但发生的阶段不一样而已)
- branch delay slot怎么克服?(思路1: 将slot用起来,执行和分制无关的指令; 思路2: 减少slot,加快决定走那条分制的决策; 思路3: 分支预测)
- branch delay slot— 思路1有什么问题? (在流水线长(十几条流水线)的情况下,很难找到很多指令将slot塞满)
- 1-bit branch predictor与2-bit branch predictor的本质区别? (2-bit branch predictor更中庸,不急着跳变,存在一个状态观察)
- branch predictor的实现结构时什么样的?(pc – valid — predict bits — branch target)
- exception(non-normal)与interrupts(external)的主要区别是?常见的exception 与interrupts有哪些?
(exception: divide by zero/misaligned mem access/page fault/mem protect violation, interrupts: keyboard/disk drive ready/ arrival of network packet) - exception 与 interrupts的类型有哪些(synchronous/asynchronous, user request/coerced, maskable/non-maskable, within/between instructions, resume/terminate)
- 手画一个加法器(列举一个加法进位的过程,并画出对应的抽象电路)
- 加法的进位路径长,如何优化? 有哪些算法?
- 为什么要有补码,从十进制的角度如何理解补码?
- 手画一个乘法器(列举乘法的等式过程,并画出对应的抽象电路)
- 浮点数和定点数的优缺点?(精度,范围,误差???)
- 如何从可视化的角度理解浮点数? 给一个定点数,如何手算转换成浮点数?
- 对于精度计算中,各种舍入方式有什么特点?(rounding to zero/even… 四舍五入等等) (从误差积累的角度考虑…)
- 定点数的小数加减乘,列式子计算? (与十进制类似,先忽略小数点,做完后一起算账)
- 浮点数的加减乘分别怎么做,列式子计算? (加减,要对阶。乘除,位数的乘法,指数的加法)
- leading zero算法?在什么场景下需要? 其作用是什么?(浮点数加减和浮点数乘除,分别在哪个环节下需要leading zero算法)
- 十进制转二进制怎么做,手动列式子计算?
- 计算机除法怎么做? 手动列式子计算?
- 定点数转化成浮点数,怎么做?简述过程(用十进制比喻怎么做)
- 浮点数转换成定点数,怎么做?简述过程(用十进制比喻怎么做)
- 计算机中为什么要有alignment?能不能举例子说明?(总线宽度/cacheLine/页表)
- 传输中为什么引出burst概念,其是如何提高效率的?(批量传输,减少请求次数,即请求一次传输多个数据)什么时候会用到burst?(cache,DMA,访问某一个压缩数据)
- 传输中为什么存在OOO概念?(能做的先做,将slot利用起来)发送方在什么场景下产生OOO请求(RAW)?收到OOO的相应后要做什么操作?(bucket sort)
- 试着画出存储树的结构?(processID->page->cache->bus->…)
- 指令在乱序执行后,为什么一定要顺序提交?那些情况下可以不用顺序提交?那些情况下一定要顺序提交?(branch/exception/interrupt)
- 访存(mem acc instruction/ load/store),从算法的角度看其实什么?(search)
- cache能加速的依据是什么?(locality)cache对程序员的启发是什么?(程序访问数据时,要注意locality和alignment,locality和alignment好的程序性能高)
- 把cache抽象成搜索算法后(每个line是一个村子),搜索目标是什么?(X省.X村.yy人,搜索对象是X省.X村,因为该村的所有人都在一个cacheLine中)搜索对象是什么?(cache中存在的所有村子),该搜索树长的是什么样子?请画出来。
- cache抽象成搜索算法后,有那些搜索TAG算法?(linear, hash, linear+hash)
- 从搜索算法角度,如何理解cache的淘汰算法?(搜索最老的,搜索用的最少的等等)
- [那些外设]从容量/latency/throughput角度,罗列常见外设与接口?
- [怎么连接]处理器与外设之间如何连接?(Buses, serial)
68.1 并行传输bus与串行传输的对比?
(并行:线间的skew/synchronization,线间的干扰,外界对线上的干扰[电容/电阻/电感])
(串行:无需同步,外界对线上的干扰,差分,校准,时钟恢复,均衡等) - 串行传输常见问题及解决方法?(校准,时钟恢复,均衡)
- 处理器和外设如何交互?(I/O instruction, memory mapped, DMA)
- 处理器和外设在什么时候交互?(polling, interrupts)。两者有什么特点?(polling比较快,但比较费; interrupts相比慢[需要OS参与,更慢],但便宜)
- polling和interrupts在系统层面的对立和统一?(polling, 在CPU底层也是interrupts)
- interrupts从数据结构角度看,本质是什么?(是一个查表的过程,从中断号,到中断服务程序)
- buses 和 serial的接收方的时钟分别怎么获取?(分别有什么优缺点,有什么开销?)
- buses 与 serial的应用场景,发展趋势?(serial: off-chip, buses: on-chip. on-chip上address/data/req等解耦)
- I/O 交互中,I/O instruction有什么优缺点?(费指令,指令译码代价大; 慢: 一次只访问一个register,cache/burst等无法发挥作用)
- I/O 交互中,I/O memory address有什么优缺点?(cons: 占用memory空间; pros: 访问I/O与访问memory的指令归一化,电路简单)
- I/O交互中,为什么引出DMA?(释放CPU数量)DMA应用场景中I/O交互类型是什么?DMA是如何工作的?(从哪里来,去哪里,多少东西?怎么干)
- 通信中,出现冲突怎么办?(collision detect)重现错误怎么办?(差错控制)怎么发起通信?(master/slave)要不要主持人?(… …)
- cache,mem中的address/port/bank的冲突分别是啥样的,画图表示?
- cache set-associative架构中,set_id产生的哈希函数有那些?为什么常用异或运算?
- mem address在计算cache tag(line in all space)/word in line/ byte in word中,是如何分工的?
- 手写direct-mapped/set-associative/fully-associative软件模拟代码,硬件电路结构。评价这几种方式的优缺点。
- 手写LRU/PLRU软件伪代码,硬件电路结构。评价几种方式的优缺点。
84.1 cache的容量怎么计算?
84.2 cache的性能怎么度量?
84.3 cache的miss率,容量和速度之间的大致曲线是怎样的? - write-through/ write-back的行为,优缺点?(WT:简单&慢,WB:复杂&快, WB需要维护valid/dirty等状态)今天主流的做法?(WB)write-back有什么要特别注意的?(flush?)
- 请解释allocate-on-write? (根据locality原则,近期写过的,近期也会读。cacheLine是一层楼,目前写的只有一个房间,因此在allocate-on-write时,先要把这一层楼读回来,然后更新该房间,到此才算是一个新的楼层)
- 为什么要把I-CACHE与D-CACHE分开?I-CACHE有什么特点?(RO, read on every cycle)
- 为什么要引出virtual mem? (1 物理的不够;2 物理的浪费(holes); 3 物理的相互干扰)
89.1 32-bit的机器,供4GB,所有程序共4GB的空间,够用么?总空间不够了怎么办?程序间互相覆盖了怎么办?(每个程序都有4GB的虚拟空间)
89.2 · - virtual mem的核心思想是什么?(Indirection)
89.1. virtual memory是怎么解决内存不够用的问题?这个方法的代价是什么?(映射到硬盘。该方法速度慢。)
89.2 virtual memory是怎么解决空洞问题? (资源细分,然后见缝插针。这点思路像流水线提高CPU利用率。资源细化调度思路)
89.3 virtual memory是怎么解决程序安全的问题?(应用程序只管控虚拟地址,每个应用程序的MAP由操作系统管理,具体使用那些物理地址交给操作系统管理) - virtual memory是怎么工作的,基本流程如何?
90.1 如果PA在DDR中,其流程是怎样的?(VA, VA->PA, 用PA从DDR中抓取数据)
90.2 如果PA不在DDR中,其流程是怎样的?(从DISK拿数据到DDR中,然后再从DDR中抓数据返回,同时刷新VA-PA的映射) - 最朴素的page table是怎样的?fine 与 coarse page table的优缺点?coarse page table在一个table内部是怎么寻址的?
- 32-bit机器中,256M和8GB的两个情形下的ram,其映射过程是咋样的?这两种映射过程分别有什么特点(8GB中,ram有33位地址,空间比va大,一个程序用不完Pa,也是机器位宽拓展到64 bit原因)
- page的walk through从搜索算法角度怎么看?(先搜在那个page,再搜在page内那个offset,层次化搜索)
- page fault在什么情况下会产生?(page table指向diskl时,即该page不在DDR中,类似cache中的miss)
94.1 产生后的处理流程是怎样的?(向OS报告–>OS除旧–>OS迎新–>OS更新表–>OS返回。 除旧[如果page dirty,需要writeback],迎新[新的读回来后要刷新映射表table])
94.2 各个阶段分别花多长时间?(向OS报告100–>OS除旧4000w–>OS迎新4000w–>OS更新表1000–>OS返回10000) - page替换有哪些常见的算法?如何评价各个算法?
95.1 page的替换算法与cache的替换算法在本质上有什么异同? - virtual address中,memory protection如何实现?(粗粒度看,映射到不同的page。映射到不同的PA ? )
96.0 page protetion flag是如何实现的,有哪些权限?权限越界时会发生什么?(细粒度看,映射到同一page,但权限有限制,r/rwx/COW(copy on write)/rx)
96.1 memory sharing如何实现?(两个程序的VA,映射到同一个PA)
96.2 linux 的program address space是如何实现的?(virtual space与physical space都是按照这个流程实现的么?Kernal/stack/libraries/heap/data/text)
96.3 什么是false sharing? (共享同一个房间,但不是同一个床位) - 为什么需要TLB?()
97.1 引入TLB后,整体的工作流程是什么样的?(这两个维度是完全相互独立的:TLB是否hit? Page是否在RAM?) - Page Table 能不能放在disk中?(不能) 如果不能放在disk中,当程序过多时RAM不够用怎么办?如何能减少page table size?(fine -> coarse)
- Page table Size能不能压缩?
99.1 引入indirection为何能压缩省RAM?(level-1的一定放在RAM,level-2/3可以放在DISK中)
99.2 Multi-level page table核心思想是什么?
99.3 Multi-level page table为什么具有可行性?(sparse memory)
99.4 从算法角度如何看Multi-level page? (树的剪枝)
100 PIPT, VIVT, VIPT各种架构的原理? 优缺点?
(VIVT: 快,多进程之间无法共享虚拟cache; PIPT:慢,先必须查看TLB; VIPT:Virtually indexed, Physically tagged)