PA2实验报告
1.RTFSC 请整理一条指令在NEMU中的执行过程. (我们其实已经在PA2.1阶段提到过这道题了) 程序在nexus-am中被交叉编译成二进制指令被装入NEMU的内存中,NEMU通过一系列函数来取指令,解码指令,执行指令函数调用历程如图:
graph LR;
A[cpu_exec];
B[exec_once];
C[isa_exec];
D[update_pc];
E[instr_fetch];
F[set_width];
G[idex];
A-->B;
B-->C;
B-->D;
C-->E;
C-->F;
C-->G;
以指令0x00为例cpu执行模拟函数cpu_exec一路执行到instr_fetch在内存中取出指令0x00然后查询NEMU模拟器中存储的符合x指令集规范的表opcode_table(需要我们手动实现)得到对应的0x00这一条指令的执行宽度,opcode_table[0x00].width,调用宽度设置函数set_w
有符号数右移32位
在做项目的过程中把右移31位写成了右移32位,造成了大错,找了好久的bug,心累!!于是我发现一个我无法理解的情况,有符号右移32位得到的数和原来未移动的数相同。
#include<iostream>
using namespace std;
int main() {
int n = 0x11;
int n1 = n>>32;
printf("n1==0x%x\n",n1);
return 0;
}
Output:n1==0x11
为什么会发生这样的事情呢?
原因是: 对于32-bit的int,n>>32这一指令是未定义行为(undefined behaviour),所以处理器做出32%32的处理,所以最终n>>32就相当于n>>0,所以移动后的数和未移动的数相等。
下面我们做一下验证:n>>33
#include<iostream>
using namespace std;
int main() {
int n
关于汇编中EFLAGS寄存器中CF和OF标志位
前言近来在写项目过程中遇到了EFLAGS的OF和CF标志位,这两个功能有点相似,有点搞不清楚,所以去搜索一下,以下的内容是我对回答的粗略的翻译,原回答在此: about assembly CF(Carry) and OF(Overflow) flag
疑问我知道CF用来解释无符号数的进位,OF解释有符号数的溢出,所以对于有符号数和无符号数都是一串01序列,汇编程序是如何进行区分(differntiate)的?(通过用额外的存储空间记录类型信息?或是通过位置信息?) 还有就是OF和CF两个标志位能否互换(interchangeably)来使用.
回答有符号数和无符号数的区别在于用什么指令来操作数据,而非数据本身 , 现代计算机(自1970以来)用补码来表示整型数据,所以有符号数和无符号数的加法和减法的其实操作是一样的
有符号数和无符号数的不同关键在于如何对最高有效位 (sign bit) 解释,对于有符号数sign bit 用来代表正负(0代表正,1代表负),无符号数则正常计算。
不同的指令可能对同一个bit的解释不同。
OF(overflow flag)标志位告诉进位是否将结果最
377. Combination Sum IV
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] fina = new int[target+1];
//到达target=0时到达target==0的方式有1种,就是什么都不选
fina[0]=1;
//fina[i]表示target=i时有几种方式(路)可以到达target=0.
for(int i=1;i<=target;++i)
{
for(int j=0;j<nums.length;++j)
{
if(nums[j]<=i)
fina[i]+=fina[i-nums[j]];
}
}
return fina[target];
52. N-Queens II
N皇后N皇后是经典题目了,这篇文章不写解题思路,看解题思路可以看这一篇力扣的官方文章52. N-Queens这篇文章主要记录一下用二进制数解N皇后的疑问和解答
先贴代码:
class Solution {
public int totalNQueens(int n) {
return solve(n, 0, 0, 0, 0);
}
public int solve(int n, int row, int columns, int diagonals1, int diagonals2) {
if(n==row)
return 1;
int count =0;
int availablePosition = ~(columns|diagonals1|diagonals2)&((1<<n)-1);
while(availablePosition>0)
{
Spring Cloud Hystrix
Hystrix (还需要继续丰富)服务熔断:提供线程池,不同的服务走不同的线程池,实现不同服务调用的隔离,避免了服务雪崩的问题
Hystrix的使用详情1.创建请求命令HystrixCommand 它用来封装具体的依赖服务调用逻辑
同步执行
异步执行2.定义服务降级fallback是Hystrix命令执行失败时使用的后备方法,用来实现服务的降级处理逻辑,在HystrixCommand中可以通过重载getFallback()方法来实现降级逻辑这些情况可以不去实现降级逻辑执行写操作的命令执行批处理或离线计算的命令3.异常处理
异常传播HystrixCommad实现run()方法中抛出异常时,除了HystrixBadRequestException之外,其他异常均会被Hystrix认为命令执行失败并触发服务降级的处理逻辑
异常获取当Hystrix命令因为异常(除了HystrixBadRequest的异常)进入服务的降级逻辑之后,往往需要对不同异常做针对性处理4.命令名称,分组以及线程池划分通常情况下,尽量通过HystrixThreadPoolKey的方式来指定线程池的划分,而不是通过组名的
Spring Cloud Eureka 初入门
Eureka是什么?Eureka就是由Netflix公司开发的一款开源的服务注册和发现的的产品 SpringCloud将其集成到SpringCloud的子项目Spring-Cloud-netflix中实现SpringCloud的服务注册和发现功能
Eureka解决什么实际问题?Eureka解决的是服务的硬编码问题提供服务地址的问题,也就是微服务客户端不用在代码中硬写出微服务服务端,如果微服务客户端和服务端都有很多例如100个,那么每个微服物客户端都要写下100个服务端的IP地址以及端口,如果由于业务需求增加客户端或服务端,就又需要添加相应的代码,这样很难维护.
Eureka的划分Eureka可以分为Eureka Service端和Eureka Client端Eureka Client可以建立在微服务的服务端(Application Service)和客户端(Application Client).
Eureka的架构
简单的解释上图: 每一个Eureka Client(包括ApplicationService和ApplicationClient)需要向Eureka Service(服务
Chapter4-The-Network-Layer
In summary , this chapter has three major parts , The first past , section 4.1 and 4.2 cover the network layer function and services. The second part , section 4.3 and 4.4 covers forwarding , finally , the third past , section 4.5 through 4.7 covers routing.
4.1 IntroductionThe first past is used to introduce network layer function and services.
4.1.1 Forwarding and Routing
Forwarding : When the packet arrives at router’s input link , the router must move the packet to the appropriate output li