编程题
编程题与day1是相同的
选择题
选择题 1:
Go 中关于整型切片的初始化,以下正确的是?
A. s := []int{1, 2, 3, 4, 5}
B. s := make([]int)
C. s := make([]int, 0)
D. s := make([]int, 5, 10)
答:选ACD。
A. s := []int{1, 2, 3, 4, 5}
使用花括号初始化切片,可以直接指定切片的元素。这种方式初始化的切片的长度和容量都等于初始化的元素个数。
C. s := make([]int, 0)
使用 make 函数初始化切片,第一个参数为数据类型,第二个参数为切片的长度,第三个参数为切片的容量(可省略)。如果省略第三个参数,容量默认与长度相等。
D. s := make([]int, 5, 10)
使用 make 函数初始化切片,并指定切片的长度和容量。这种方式初始化的切片的长度等于第二个参数,容量等于第三个参数。
B. s := make([]int) 这种方式是错误的,因为 make 函数第二个参数必须指定切片的长度。
另外,可以对比c++vector相应的初始化方式:
A. vector<int> v{1, 2, 3, 4, 5};
B. vector<int> v; // c++中的vector初始化时可以不指定长度,默认长度为0\
C. vector<int> v(0);
B. vector<int> v(5);
选择题 2:
以下哪些操作可能触发本地 CPU cache 失效?
A. 本地读取
B. 本地写入
C. 远端读取
D. 远端写入
答:选D。
参考:[1]缓存一致性协议MESI详解
题干中的CPU cache失效指的是MSEI协议中的 I (invalid)状态。
由于多核CPU中有多个多级缓存,因此引入MSEI协议以实现多核CPU缓存的一致性。
I 状态表明该缓存行无效,如果要获取数据的话,就要去DRAM中加载最新的。
MSEI四个状态是对于每个CPU的缓存自己而言的,也即每个CPU的缓存都维护自己的MSEI状态。因此这里的local cache指的是当前CPU的cache,而remote cache指的是其它CPU的缓存,例如一个CPU有CA,CB两个核,对于CA而言,CA自己的缓存就是local cache,CB的缓存就是remote cache。当其它CPU的缓存执行写操作,更新了数据的内容,local cache里的内容就过期了,也就转为 I 状态。
由下图[1]可以看到,切换到 I 状态的操作只有remote write。