[CSAPP] Tests
Categories 课内 CSAPP
Tags
Week 1
问题 1
在 C 语言编译过程中,汇编程序是由哪个工具产生?
- A. 预处理器
- B. 编译器
- C. 汇编器
- D. 链接器
问题 2
在 C 程序的编译过程中,以下哪一个工具的输出是二进制文件?
- A. 预处理器
- B. 编译器
- C. 链接器
- D. 编辑器
问题 3
高速缓存位于以下哪个部件之内?
- A. 寄存器
- B. 主存储器
- C. CPU
- D. 磁盘
问题 4
在计算机系统中,以下哪一项不属于 CPU 组成部分?
- A. 主存
- B. 高速缓存
- C. 寄存器
- D. 程序计数器
问题 5
在计算机系统的抽象层次中,对于一个在 CPU 中正在运行程序的抽象是?
- A. 源代码
- B. 虚拟内存
- C. 文件
- D. 进程
问题 6
十进制数 172 的二进制是:
- A. 10101110
- B. 11001110
- C. 10101100
- D. 10101010
问题 7
二进制 100100100 转换为十六进制是:
- A. 0x111
- B. 0x100100100
- C. 0x124
- D. 以上都不对
问题 8
在“六进制”表示中,13 x 12 等于?
- A. 156
- B. 200
- C. 1312
- D. 以上都不是
问题 9
0x5C5D - 0x2E9A = ?
- A. 0x2EF2
- B. 0x2EC3
- C. 0x2EC2
- D. 0x2DC3
答案:
B C C A D C C B D
Week 2
问题 1
在 64 位机器中,类型 int ** 所占的字节数为:
- A. 1
- B. 4
- C. 8
- D. 16
问题 2
X86 机型中,int x = 0xAC5A2EF3,假设 &x 为 0x2100,则字节存储单元 0x2102 中存储的数据为:
- A. AC
- B. 5A
- C. 2E
- D. F3
问题 3
大端法机器中,字符串 char *s = "hello world...",假设 s 为 0x2300,则 0x2305 中存储的字符为:
- A. o
- B. (空格)
- C. r
- D. l
问题 4
对于变量 x,以下哪个表达式的结果为:x 的最低有效字节不变,其它位均置为 1?
- A.
x & 0xFF - B.
x & ~0xFF - C.
x | 0xFF - D.
x | ~0xFF
问题 5
C 表达式 x == y 等价于:
- A.
!(x & y) - B.
!(x | y) - C.
!(x ^ y) - D. 以上都不是
问题 6
!!0x56 的结果是(!表示逻辑运算符):
- A. 0x56
- B. 0x01
- C. 0x65
- D. 0x00
问题 7
0x96 & 0x33 和 0x96 && 0x33 的结果分别为:
- A. 0x12,0x01
- B. 0x01,0x01
- C. 0x01,0x12
- D. 0x12,0x12
问题 8
变量 x 的二进制表示为 [10100011],则 x << 3 的结果是:
- A.
[00011000] - B.
[00011111] - C.
[10100011] - D. 不确定
问题 9
char 类型变量 x 的二进制表示为 [10100011],则 x >> 3(算术移位)的结果是:
- A.
[00001100] - B.
[00010100] - C.
[11110100] - D.
[00010100]
问题 10
对长度为 4 位的整数数据,-3 的补码编码为:
- A. 1011
- B. 1101
- C. 0101
- D. 1010
问题 11
假设有一个 10 位的补码整数类型,它的 TMin 数值为:
- A. 0
- B. -128
- C. -512
- D. -1024
答案:
C B B D C B A A C B C
Week 3
问题 1
对长度为 8 的整数类型,U2T(180) =
- A. -76
- B. -180
- C. 76
- D. 180
问题 2
char x = -100;unsigned char ux = x;则 ux 的值为:
- A. 100
- B. 256
- C. 156
- D. 非法数
问题 3
unsigned i = -1;则关系式 i >= 0 为:
- A. false
- B. true
- C. 任意值
- D. 非法操作
问题 4
表达式 -1 < 1U 的结果值是:
- A. 0
- B. 1
- C. -1
- D. 不确定
问题 5
设 8 位补码整数 a 的十进制值是 33,a 被截断成 6 位后的十进制值为:
- A. -33
- B. -31
- C. 1
- D. 33
问题 6
在无符号数加法中发生了溢出的是:
- A.
x + y(无符号加法和) =x - B.
x + y(无符号加法和) =y - C.
x + y(无符号加法和) >x - D.
x + y(无符号加法和) <x
问题 7
对于长度为 4 位的无符号乘法,5 x 7 =
- A. 3
- B. 5
- C. 7
- D. 35
问题 8
TMax 的加法逆元是:
- A.
TMax - B.
TMin - C.
TMin + 1 - D. 无
问题 9
对长度为 4 的整数数据,x=[1010],y=[1100],x + y 补码加法的结果为:
- A. 1010
- B. 0110
- C. 1100
- D. 10110
问题 10
整数变量 x 乘以 52,只使用 +、-、<< 运算,其 C 表达式为:
- A.
(x << 5) + (x << 4) - B.
(x << 6) - (x << 4) + (x << 2) - C.
(x << 6) - (x << 2) - D.
(x << 6) + (x << 4) - (x << 5)
问题 11
采用 8 位补码,-100 的二进制表示是:
- A. 01100100
- B. 11100100
- C. 10011100
- D. 10011000
问题 12
对于长度为 6 位的补码乘法,30 x 4 =
- A. -120
- B. 120
- C. 56
- D. -8
答案:
A C B A B D A C B B C D
Week 4
问题 1
对一个负整数进行除以 128 的补码除法,在执行算术右移之前需要加上的偏置值为:
- A. 1
- B. 7
- C. 63
- D. 127
问题 2
补码整型数据的运算满足:
- A. 交换律
- B. 结合律
- C. 分配律
- D. 以上都满足
问题 3
二进制小数 101.101 的十进制值是:
- A. 101.101
- B. 5.5
- C. 5.101
- D. 5.625
问题 4
二进制循环小数 10.0110110 [110] 的数值是:
- A. 9/7
- B. 17/7
- C. 2.3
- D. 2.5
问题 5
十进制数字 23 用浮点表示时的小数字段 frac 为:
- A. 1101
- B. 1011
- C. 0111
- D. 1110
问题 6
数字 11 用浮点表示,采用 K 位阶码,则 exp 字段为:
- A.
2^(K-1) + 2 - B.
2^K + 1 - C. 3
- D.
4 - 2^(K-1)
问题 7
假设一个参照 IEEE 浮点格式的 8 位浮点格式,有 1 个符号位、3 个阶码位和 4 个小数位,在此编码下 01010101 的十进制值为:
- A. 85.0
- B. 42.0
- C. 5/4
- D. 21/4
问题 8
假设一个参照 IEEE 浮点格式的 8 位浮点格式,有 1 个符号位、4 个阶码位和 3 个小数位,其编码表示为 10000101,则对应的阶码值为:
- A. -6
- B. -7
- C. -14
- D. -15
问题 9
假设一个参照 IEEE 浮点格式的 11 位浮点表示,有 1 个符号位、6 个阶码位和 4 个小数位。其最大非规格数是:
- A. 2 的 -26 次方 × 15
- B. 2 的 -34 次方 × 15
- C. 2 的 -18 次方 × 15
- D. 2 的 -18 次方 × 16
问题 10
假设一个参照 IEEE 浮点格式的 6 位浮点表示,有 1 个符号位、2 个阶码位和 3 个小数位。其最小的正数是:
- A. 1/64
- B. 1/16
- C. 1/8
- D. 1
问题 11
二进制小数 10.1011 向偶数舍入到小数点右边 2 位后的数值是:
- A. 10.10
- B. 11.00
- C. 10.11
- D. 以上都不是
问题 12
二进制小数 11.011 向偶数舍入到小数点右边 2 位后的数值是:
- A. 11.01
- B. 11.10
- C. 11.00
- D. 以上都不是
问题 13
1e20 + (-1e20 + 1.25) 在计算机中的运行结果是:
- A. 0.0
- B. 5.1
- C. N/A
- D. 以上都不对
问题 14
关于浮点运算,以下说法正确的是:
- A. 浮点加法具有交换律
- B. 浮点加法具有结合律
- C. 说法 A 和 B 都正确
- D. 说法 A 和 B 都错误
问题 15
在计算机系统中,以下两个命题为真的是:
(1) 对任何 int i,表达式 ( i * i ) >= 0
(2) 对任何非 inf 及非 NaN 的 float f,表达式 ( f * f ) >= 0.0
- A. 仅 1
- B. 仅 2
- C. 1 和 2
- D. 都不是
答案:
D D D B C A D A B C C B A A B
Week 5
问题 1
假设制造口罩的过程包括了缝制、消毒两个步骤,而且其耗时分别占 25% 和 75%,按照 Amdahl 定律,为了将生产速度加快 1/3 倍,消毒步骤所需要的加速比是多少?
- A. 1.33
- B. 1.50
- C. 1.67
- D. 2.00
问题 2
在汇编语言中,函数的返回值最后是存放在哪个寄存器?
- A.
%rdi - B.
%rax - C.
%rsp - D. 不确定
问题 3
已知 %rcx 值为 0x100,%rdi 值为 0x18,则操作数 0x36(%rcx, %rdi, 2) 表示的地址值为?
- A.
0x166 - B.
0x172 - C.
0x254 - D.
0x25E
问题 4
下列 MOV 指令中有错误的是?
- A.
movw %si, %di - B.
movl $0x1234, %edi - C.
movq %edx, (%rsp) - D.
movb $22, -23(%rsi)
问题 5
若当前栈顶的地址为 0x0f0100,%rbx 存的值为 0x126,当执行完指令 pushq %rbx 后,栈顶的地址为?
- A.
0x0f00f8 - B.
0x0f0092 - C.
0x0f0108 - D.
0x0f0126
问题 6
假设 %rax 存的值为 0x108, %rsp 存的值为 0x158, 执行 popq %rax 指令后,%rsp 的值为?
- A.
0x108 - B.
0x150 - C.
0x158 - D.
0x160
答案:
B B A C A D
Week 6
问题 1
%rdi = 0x310,%rsi = 0x06,%rdx = 0x20,执行 leaq 0x51(%rdi, %rsi, 4), %rdx ,则 %rdx 值为:
- A.
0x31A - B.
0x371 - C.
0x379 - D.
0x395
问题 2
%rci = 0x363, 执行 xorq %rci, %rci , 则 %rci 值为
- A.
1 - B. 0
- C. 0x363
- D. 以上都不是
问题 3
以下哪条指令是将 %rdx 的内容乘以 2
- A.
imulq $2 - B.
imulq %rdx, $2 - C.
salq $1, %rdx - D.
sarq $1, %rdx
问题 4
条件码 ZF 是
- A. 进位标志
- B. 零标志
- C. 溢出标志
- D. 符号标志
问题 5
与下列汇编代码相对应的 C 代码是cmpl %edi, %esisetbe %al
- A.
int comp(int a, int b) { return a >= b; } - B.
int comp(int a, int b) { return a <= b; } - C.
int comp(unsigned a, unsigned b) { return a >= b; } - D.
int comp(unsigned a, unsigned b) { return a <= b; }
问题 6
与下列汇编代码最直接对应的 C 代码是cmp %rdi, (%rdx)jge .L3
- A.
if (a <= *p) goto done; - B.
if (a == p) goto done; - C.
if (a != 0) goto done; - D.
if (a >= *p) goto done;
问题 7
已知变量 a 在 %rdx, b 在 %rsi,与以下汇编代码对应的 C 代码是leaq (%rdx, %rsi, 16), %rdxtestq %rdx, %rdxjne .L3
- A.
if (a + b + 16 == 0) goto .L3; - B.
if (a + 16 * b == 0) goto .L3; - C.
if (a + 16 + b != 0) goto .L3; - D.
if (a + 16 * b != 0) goto .L3;
答案:
C B C B C A D
Week 7
问题 1
cmpq $12, %rcx
jl .L3
salq $4, %rbx
.L3
incq %rbx
所对应 C 代码的划线处应填:
if (_________)
b <<= 4;
else
b++;
- A. k < 12
- B. k > 12
- C. k <= 12
- D. k >= 12
问题 2
C 语言的 while 循环语句转换到汇编语言,常用的两种翻译方法之一是
- A. do while
- B. jump to end
- C. guarded-do
- D. conditional move
问题 3
310040: mov 0x5(%rdx), %rax
310045: callq 310020 <some_function>
310052: add (%rcx), %rax
汇编代码如上所示,在执行 call 指令前,%rip 为
- A. 310040
- B. 310045
- C. 310020
- D. 310052
问题 4
汇编代码如上所示,call 指令执行之后,哪个值被压入栈中
- A. 310040
- B. 310045
- C. 310020
- D. 310052
问题 5
汇编代码如上所示,call 指令执行之后(即进入了被调用函数),%rip 值为
- A. 310040
- B. 310045
- C. 310020
- D. 310052
问题 6
int fun1()
{
int a1 = 123;
int a2 = 456;
int a3 = 789;
int value = change(a1, &a2, &a3);
value >>= 3;
return value;
}
在对应的汇编程序中
- A.
a1必须存放在内存中 - B.
a2可以存放在寄存器中 - C.
a3必须存放在内存中 - D.
value必须存放在内存中
答案:
D C B D C C
Week 8
问题 1
int A[6];
已知 A 的起始地址为 a,其第 i 个元素的地址是:
- A.
a + 2i - B.
a + 4i - C.
a + 6i - D.
a + 8i
问题 2
char **C[12];
已知 C 起始地址为 c,则 C 的第 k 个元素的地址是:
- A.
c + 2k - B.
c + 8k - C.
c + 12k - D.
c + 24k
问题 3
int rect[32][32];
int i, j;
int result;
假设 rect、i、 j、result 分别在寄存器 %rdi、%rsi、%rdx、%rax 中,
则 movl 0x60(%rdi, %rsi, 256), %eax 相对应的 C 代码是:
- A.
result = rect[2*i][15]; - B.
result = rect[2*i][24]; - C.
result = rect[8*i][15]; - D.
result = rect[8*i][24];
问题 4
struct TCP {
short dest_port;
char offset;
int sn;
struct {
char ACK;
char SYN;
char FIN;
} flag;
struct TCP *next;
};
struct TCP *msg;
则 msg->flag.SYN 的偏移量是多少?
- A. 7
- B. 8
- C. 9
- D. 10
问题 5
如上,此结构体的总大小为多少?
- A. 18
- B. 19
- C. 24
- D. 32
问题 6
struct MEMO {
int index;
char flag;
int ref;
char title[21];
char *content;
char isPrivate;
};
为了节省空间,重新排列这个结构体中的字段,则最优的字段次序是:
- A.
index,flag,ref,title0~title20,content,isPrivate - B.
title0~title20,index,flag,ref,content,isPrivate - C.
content,index,ref,flag,title0~title20,isPrivate - D.
flag,content,isPrivate,index,title0~title20,ref
问题 7
union {
unsigned char c[8];
unsigned int i[2];
} dw;
for (int j = 0; j < 8; j++)
dw.c[j] = 0xd0 + j;
在小端法机器中,i[0] 的值为:
- A.
0xd0d1d2d3 - B.
0xd3d2d1d0 - C.
0xd7d6d5d4 - D.
0xd4d5d6d7
问题 8
使用教材练习题 3.43 的内容,与下列汇编程序相对应的 C 代码是:
movq (%rdi), %rax
movq 8(%rdi), %rbx
addq (%rbx), %rax
movq %rax, (%rsi)
- A.
*dest = up->t1.u + up->t1.w; - B.
*dest = up->t1.u + up->t1.v; - C.
*dest = up->t1.u + *up->t2.p; - D.
*dest = up->t2.a[0] + *up->t2.p;
问题 9
下列存储器中存取速度最快的是:
- A. Flash-Memory U盘
- B. SDRAM
- C. SSD 固态硬盘
- D. SRAM
问题 10
我们平时所说的内存条是:
- A. 固态硬盘 SSD
- B. 非易失性存储器
- C. 主存 main memory
- D. 一级缓存
答案:
B B B C C C B C D C
Week 9
问题 1
已知一个磁盘的转速 = 10000 RPM,平均寻道时间 T_avg_seek = 9ms,磁盘的平均访问时间 T_access = 12.02ms,则每条磁道的平均扇区数为:
- A. 200
- B. 300
- C. 400
- D. 500
问题 2
扫描读取一个二维数组中的所有元素值,按行读取和按列读取的差别在于:
- A. 按行读的空间局部性更好
- B. 按列读的空间局部性更好
- C. 按行读的时间局部性更好
- D. 按列读的时间局部性更好
问题 3
上网时,点击昨天看过的一条链接,很可能不用去远程访问 Web 网站就可以直接本地打开这个网页的缓存。技术上这属于:
- A. 缓存替换
- B. 缓存好运
- C. 缓存冲突
- D. 缓存命中
问题 4
以下关于程序局部性和缓存命中率的说法,错误的是:
- A. 程序的空间局部性越好,缓存命中率就倾向于越高
- B. 程序的时间局部性越好,缓存命中率就倾向于越高
- C. 数组引用时的步长越大,缓存命中率就倾向于越高
- D. 对于读取指令来说,循环体越小,缓存命中率就倾向于越高
问题 5
高速缓存分为直接映射、组相联、全相联高速缓存等类型,根据以下哪一项能够区分直接映射和其它类型:
- A. 高速缓存的总容量
- B. 高速缓存的标记位数
- C. 每个数据块的字节数
- D. 每个组的高速缓存行数
问题 6
已知一个系统的物理地址宽 16 位 (m = 16),其高速缓存大小为 1024 字节,是四路组相联的 (E = 4),块大小为 4 字节 (B = 4),这个高速缓存的组数是多少?
- A. 16
- B. 32
- C. 64
- D. 128
问题 7
如上,高速缓存的标记位即 tag 的位数是多少?
- A. 1
- B. 2
- C. 6
- D. 8
答案:
B A D C D C D
Week 10
问题 1
采用练习题 6.12 的高速缓存(p.436),引用地址 0x123a,则返回的字节是:
- A. 3F
- B. 30
- C. C0
- D. 26
问题 2
如上,这个高速缓存的标志位数 (t) 是多少?
- A. 4
- B. 6
- C. 8
- D. 12
问题 3
在作业题 6.34(p.454)基础上,对于一个总大小为 128 字节的高速缓存,src 数组的行 1(第二行)的命中 (h) 及不命中 (m) 分布值为:
- A. m m m m
- B. m m h m
- C. m m h h
- D. m h h h
问题 4
在作业题 6.34(p.454)基础上,对于一个总大小为 96 字节的高速缓存,src 数组的行 2(第三行)的命中 (h) 及不命中 (m) 分布值为:
- A. m h m h
- B. m h h h
- C. m m h h
- D. m m m h
问题 5
对于存储器山而言,步长 stride 值越大表明:
- A. 时间局部性越好
- B. 时间局部性越差
- C. 空间局部性越好
- D. 空间局部性越差
问题 6
int example(int a, int b)
{
int r1 = fun(a, 0);
int r2 = fun(b, 1);
int r = r1 - r2;
return r << 2;
}
在对应的汇编程序中,需要采用被调用者保存寄存器来保存的值有几个?
- A. 1
- B. 2
- C. 3
- D. 4
答案:
D C D B D B
Week 12
问题 1
采用 ELF 格式的目标文件中, .text 节存放的是
- A. 程序代码
- B. 程序中用到的字符串
- C. 程序中的已初始化的全局变量
- D. 文件类型信息
问题 2
在可重定位目标文件中,符号表是存放在哪个节里
- A.
.text - B.
.data - C.
.bss - D.
.symtab
问题 3
以下哪一个工具可以查看目标文件的结构和内容
- A.
vim - B.
gcc - C.
readelf - D.
make
问题 4
静态链接器的主要任务之一是:
- A. 符号定义
- B. 加载目标文件
- C. 执行目标文件
- D. 重定位
问题 5
/* Module 1 */
#include <stdio.h>
int a;
int main() {
a = 0;
p2();
a++;
printf("%d\n", a);
return 0;
}
/* Module 2 */
int a = 20;
int p2() {
a = 10;
}
编译链接后,运行输出的结果是:
- A. 1
- B. 11
- C. 20
- D. 21
问题 6
符号解析所涉及到的强弱符号,其中弱符号被分配到可重定位目标文件的哪个节?
- A.
.text - B.
.data - C.
.bss - D.
COMMON
问题 7
已知:
g.o --> libx.a --> liby.a --> g.og.o --> liby.a --> libz.a --> libx.a
使得静态链接器能够解析所有符号引用的最小命令行是:
- A.
gcc g.o libx.a liby.a libz.a - B.
gcc g.o libx.a liby.a libz.a libx.a - C.
gcc g.o libx.a liby.a g.o liby.a libz.a libx.a - D.
gcc g.o libx.a liby.a libz.a libx.a liby.a
问题 8
下列汇编代码中,第一行指令的地址是多少?
(由于格式原因,以虚线代表空格)
XXXXXX: 77 02 - - - - ja 4004d5
XXXXXX: 5d - - - - - pop %rbp
- A.
4004d0 - B.
4004d1 - C.
4004d3 - D.
4004d5
问题 9
net.o 文件中的一个重定位条目 5e: R_X86_64_PC32 search-0x4, 该条目位于文件的哪个节
- A.
.text - B.
.data - C.
.symtab - D.
.rel.text
问题 10
在一个重定位条目 3a: R_X86_64_32 address 中, 3a 的含义是:
- A. 待修改的引用的节内偏移
- B. 这是一个 32 位 PC 相对地址的引用
- C. 被修改引用应该指向的符号
- D. 待修改的全局符号的定义地址
问题 11
可重定位目标文件、可执行目标文件的格式具有相似之处,它们有着相同类型 的节,但不包括以下哪一项
- A.
.text - B.
.rel.data - C.
.bss - D.
.symtab
问题 12
关于静态库和动态库,以下错误的是:
- A. 使用静态库的可执行文件所占用的磁盘/内存空间,相对比使用动态库的可执行文件要大
- B. 静态链接的可执行文件必须依赖静态库的存在才能运行
- C. 动态链接的可执行文件必须依赖动态库的存在才能运行
- D. 使用动态库的程序更加方便升级和部署
问题 13
对于动态链接所形成的可执行目标文件的 .data 节,以下描述正确的是:
- A. 其中包含有局部变量。
- B. 其中包含有符号表。
- C. 在运行前,有些部分需要进行重定位。
- D. 在加载时,加载器保持原样地复制其内容到内存、并执行其中的指令。
问题 14
在动态链接过程中,链接器 ld 输出的是
- A. 可重定位目标文件
- B. 部分链接的可执行目标文件
- C. 完全链接的可执行目标文件
- D. 重定位和符号表文件
问题 15
linux> gcc -shared –fpic -o libgraph.so node_model.c edge_model.c
其中 -fpic 选项的用途为
- A. 创建静态目标文件
- B. 编译时进行动态链接
- C. 生成与位置无关的代码
- D. 创建可执行目标文件
问题 16
进行链接时打桩的通常条件是:
- A. 能够访问程序的源代码文件
- B. 能够访问程序的可重定位目标文件
- C. 能够访问程序的可执行目标文件
- D. 能够访问程序的汇编代码
答案:
A D C D B D B B D A B B C B C B
Week 13
问题 1
在能够改变程序控制流的各种机制中,不包含以下哪一项
- A. 函数调用
- B. 强制类型转换
- C. 进程上下文切换
- D. 中断
问题 2
以下有关各类异常的正确描述是:
- A. 中断是同步的
- B. 陷阱异常即
syscall意味着发生了某些致命错误 - C. 当故障处理完成并且恢复后,返回到下一条指令
- D. 如果一个应用程序发生了终止异常,终止处理程序从来不将控制返回给该应用程序
问题 3
四个进程的运行时间段为:A( 1 – 4 ), B( 3 – 6 ), C( 5 – 9 ), D( 7 – 11 )
在两两组合的所有进程对中,有多少对是并发运行的?
- A. 2
- B. 3
- C. 4
- D. 5
问题 4
对于进程表述错误的是:
- A. 进程提供的抽象之一是:在时间上提供了一个独立的逻辑控制流
- B. 普通用户程序的进程,运行初始时是在用户模式中
- C. 当异常发生时,控制从应用程序转到异常处理程序,处理器将模式从用户模式变为内核模式
- D. 在进行两个进程的上下文切换时,一般是处于用户模式
问题 5
以下程序会输出多少行“2”?
int main()
{
fork();
if (fork() == 0) {
fork();
printf("2\n");
exit(0);
}
printf("2\n");
exit(0);
}
- A. 3
- B. 4
- C. 6
- D. 7
问题 6
int main()
{
int status;
int k = 1;
if (fork() == 0) {
printf("a"); fflush(stdout);
k++;
} else {
printf("b"); fflush(stdout);
if (waitpid(-1, &status, 0) > 0) {
if (WIFEXITED(status) != 0) {
printf("%d", WEXITSTATUS(status) * 2);
fflush(stdout);
}
}
}
printf("c"); fflush(stdout);
exit(k);
}
以上程序的一种可能的输出是什么?
- A. abc2c
- B. acb2c
- C. bca4c
- D. bac4c
问题 7
如果进程 A 和子进程 A1、 进程 B 和子进程 B1、 进程 C 和子进程 C1 都被挂起,它们后续被调度的先后次序是
- A. 不能确定,与调度器实现有关
- B. A 先于 A1, B 先于 B1, C 先于 C1
- C. A1 先于 A, B1 先于 B, C1 先于 C
- D. 先 A、B、C,再 A1、B1、C1
问题 8
在程序中调用 wait(status),以下错误的是
- A. 它相当于
waitpid(-1, status, 0) - B. 调用进程继续运行,并等待着子进程终止的消息通知
- C. 当有一个子进程终止后,
wait(status)返回 - D. 通过
wait(status),父进程得以回收已终止的子进程
问题 9
void fork9() {
if (fork() == 0) {
printf("Running Child, PID = %d\n", getpid());
while (1); /* Infinite loop */
} else {
printf("Running Parent, PID = %d\n", getpid());
while (1); /* Infinite loop */
}
}
如果 父进程号为 6639,子进程号为 6640,以下正确的陈述是
- A. 此程序在命令行中运行时,先输出 6639,再输出 6640
- B. 在命令行中运行此程序,执行
kill 6640后,子进程终止并被回收 - C. 在命令行中 运行此程序, 执行
kill 6640后,子进程成为孤儿进程 - D. 在命令行中运行此程序,执行
kill 6639、kill 6640后,由init进程回收子进程 6640
答案:
B D B D C D A B D
Week 14
问题 1
已知:
linux> ./myexample
Child1: pid=3196 pgrp=3195
Child2: pid=3197 pgrp=3195
linux> ps
PID TTY TIME CMD
3175 pts/2 00:00:00 tcsh
3196 pts/2 00:00:02 myexample
3197 pts/2 00:00:02 myexample
3201 pts/2 00:00:00 ps
请问执行什么命令,然后可以产生以下效果?
linux> ps
PID TTY TIME CMD
3175 pts/2 00:00:00 tcsh
3201 pts/2 00:00:00 ps
- A.
/bin/kill 3195 - B.
/bin/kill -9 3195 - C.
/bin/kill -9 -3195 - D.
/bin/kill 3196 3197
问题 2
在 shell 窗口中,用户输入了一个可执行文件名并运行它。此时 shell 程序中的主要处理流程是:
- A.
execve(),然后调用fork() - B.
fork(),然后调用execve() - C.
fork(),然后在子进程中调用execve() - D.
execve(),然后调用fork(),然后在父进程中调用execve()
问题 3
在 Linux shell 中运行一个程序时,按 Ctrl-Z 可以将它停止,此处内核发送的信号是:
- A.
SIGINT - B.
SIGQUIT - C.
SIGALRM - D.
SIGTSTP
问题 4
void sig_handler(int sig) {
printf("Caught\n");
exit(0);
}
int main() {
signal(SIGINT, sig_handler);
printf("Wait\n");
pause();
printf("End\n");
return 0;
}
在 shell 中运行以上程序,然后按 Ctrl-C,请问输出是什么?
- A. Wait
- B. Caught
- C. Wait
Caught
End - D. Wait
Caught
问题 5
int beeps = 0;
void handler(int sig) {
if (sig == SIGALRM)
safe_printf("BEEP\n");
if (++beeps < 5)
alarm(1);
else {
safe_printf("BOOM!\n");
exit(0);
}
}
main() {
signal(SIGALRM, handler);
signal(SIGINT, handler);
alarm(1);
while (1) {
}
}
执行以上程序,在 2.5 秒时按 Ctrl-C,当程序运行结束的全部输出是什么?
- A. BEEP
BEEP - B. BEEP
BEEP
BOOM! - C. BEEP
BEEP
BEEP
BEEP
BOOM! - D. BEEP
BEEP
BEEP
BEEP
BEEP
BOOM!
问题 6
已知 SIGUSR1 是用户定义的信号,默认行为是终止进程。
以下这个程序的所有输出的 counter 值之和是多少?
pid_t pid;
int counter = 101;
void handler1(int sig) {
counter = counter * 2;
printf("counter = %d\n", counter);
fflush(stdout); /* Flushes the printed string to stdout */
kill(pid, SIGUSR1);
}
void handler2(int sig) {
counter ++;
printf("counter = %d\n", counter);
exit(0);
}
main() {
signal(SIGUSR1, handler1);
if ((pid = fork()) == 0) {
signal(SIGUSR1, handler2);
kill(getppid(), SIGUSR1);
while(1) {};
} else {
pid_t p; int status;
if ((p = wait(&status)) > 0) {
counter += 100;
printf("counter = %d\n", counter);
}
}
}
- A. 101
- B. 406
- C. 606
- D. 706
问题 7
setjmp 函数的特点是:
- A. 调用一次,从不返回
- B. 调用一次,返回一次
- C. 调用一次,返回两次
- D. 调用一次,返回一次或者多次
问题 8
在程序正常运行时,以下哪些函数的行为是 “调用一次,从不返回”? (多选)
- A.
execve - B.
fork - C.
longjmp - D.
setjmp
问题 9
虚拟内存的位置通常在哪里
- A. 高速缓存
- B. 物理内存
- C. 硬盘
- D. 服务器
问题 10
CPU / 进程如果对内存中的数据进行读写操作,使用的地址是:
- A. 物理地址
- B. 虚拟地址
- C. 高速缓存地址
- D. 磁盘逻辑块地址
答案:
C C D D C C D AC C B
Week 15
问题 1
在地址翻译时,使用 TLB 的直接好处是
- A. 节省页表的存储空间
- B. 节省数据页的存储空间
- C. 节省页表的查找时间
- D. 节省数据页的查找时间
问题 2
对于一个地址翻译的案例,我们假设:
- 内存是按字节寻址的。
- 页面大小是 32 字节。
- 虚拟地址的长度是 12 位。
- 物理地址的长度是 10 位。
- TLB 是二路组相联的,一共有 16 个条目。
已知虚拟地址 0x3D2。求 PPO
- A.
0x12 - B.
0x1E - C.
0x02 - D.
0x3D
问题 3
如上,已知虚拟地址 0x3D2。试求 TLBT
- A.
0x01 - B.
0x03 - C.
0x06 - D.
0x07
问题 4
在一个 k 级页表体系中,虚拟地址中的 VPN 被分隔成 VPN 1、VPN 2、… VPN k。其中,VPN i(1 <= i <= k-1)的用途是:
- A. 用于查找页内的一个数据块
- B. 用于查找页的物理地址 PPN
- C. 用于查找第 i 级页表中的一个 PTE 条目
- D. 用于查找第 i 级页表的基址
问题 5
以下关于页表的描述中,错误的是:
- A. 利用页表,可实现虚实地址变换。
- B. 页表由页表条目(页表项)组成,页表项反映了对应虚页的存储状态。
- C. 页表的大小由实页数及每个页表条目所需字节数决定。
- D. 在多级页表中,第一级页表是常驻主存。
问题 6
一个程序的主体代码如下:
int fd;
char *mmaped;
fd = open("hello.txt", O_RDWR);
mmaped = (char *)mmap(NULL, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
mmaped[5] = 'e';
munmap(mmaped, 10);
hello.txt 原来内容为 "Hello, world!",运行以上程序之后,现在内容为:
- A.
Hello, world! - B.
Helle, world! - C.
Helloe, world! - D.
Helloe world!
问题 7
以下哪一项体现了动态内存隐式分配器的特点:
- A. Java语言中的
new - B. C语言中的
free - C. Python语言中的垃圾收集
- D. C++语言中的多重继承
问题 8
动态内存分配器的两个性能指标,即吞吐率和内存利用率之间的关系是
- A. 内存和磁盘的关系
- B. 时间和空间的关系
- C. 网络和本地的关系
- D. 全局和局部的关系
问题 9
在隐式空闲链表(implicit list)中,块与块之间的链接主要是依靠什么来完成
- A. 块的长度信息
- B. 块的分配/空闲标记
- C. 块的单向链表指针
- D. 块的双向链表指针
问题 10
在采用隐式空闲链表的动态存储分配过程中,搜索一个空闲块进行存储分配的放置策略不包括
- A. Mark and Sweep
- B. 首次适配法
- C. next fit
- D. 最佳适配法
问题 11
在隐式空闲链表中,增加脚部作为边界标记的主要原因是
- A. 便于知道邻居块的对齐情况
- B. 便于增加碎片的大小
- C. 便于一个已被释放的块和前一个空闲块合并
- D. 便于一个已被释放的块和后一个空闲块合并
问题 12
假设一个显式空闲链表,每个空闲块中有四字节的 pred 和 succ 指针,头部和脚部都存放在四字节的字中,不允许有效载荷的大小为零。对齐要求为双字对齐。符合要求的最小块大小是
- A. 16 字节
- B. 20 字节
- C. 24 字节
- D. 32 字节
问题 13
在实际应用中,malloc 动态内存管理包通常采用的分配器方案是
- A. 隐式空闲列表
- B. 显式空闲列表
- C. 简单分离存储的空闲链表
- D. 分离适配的空闲链表
问题 14
为了支持采用隐式空闲链表的动态存储器分配,使用教材图 9-39 所示的内存块布局。请在以下程序的空白处选择合适语句:
/* given a pointer p to an allocated block, i.e., p is a pointer returned by some previous malloc()/realloc() call; returns the pointer to the header of the block */
void *header(void* p) {
void *ptr;
_____________;
return ptr;
}
- A.
ptr = p - 1 - B.
ptr = (void *)((int *)p - 1) - C.
ptr = (void *)((int *)p - 4) - D. 以上都不对
问题 15
为了支持采用隐式空闲链表的动态存储器分配,使用教材图 9-39 所示的内存块布局。请在以下程序的空白处选择合适语句:
/* given a pointer to a valid block header or footer, returns the usage of the current block, 1 for allocated, 0 for free */
int allocated(void *hp) {
int result;
____________;
return result;
}
- A.
result = (*(int *)hp) & 1 - B.
result = (*(int *)hp) & 0 - C.
result = (*(int *)hp) | 1 - D. 以上都不对
答案:
C A B C C D C B A A C C D B A
Page views: Loading... · Visitors: Loading...
Except where otherwise noted, original content on this site is dedicated to the public domain under CC0 1.0.
Powered by Hexo & Theme mdsuper
沪ICP备2026040813号