PAGE 14
北京大学信息科学技术学院考试试卷
考试科目: 计算机系统导论 姓名: 学号:
考试时间: 2016 年 1 月 4 日 小班教师:
题号
一
二
三
四
五
六
七
八
总分
分数
阅卷人
装订线内
装订线内 不要答题
以下以下为答题纸,共 页
以下为试题和答题纸,共21页。
得分
第一题 单项选择题(每小题1分,共20分)
注:请将选择题答案填写在下表中
题号
1
2
3
4
5
6
7
8
9
10
答案
题号
11
12
13
14
15
16
17
18
19
20
答案
下面哪条指令不会引起esp的变化?
movl %esp, %ebp
pushl %ebp
call printf
subl $20, %esp
单精度浮点数27.5实际存储在内存中的十六进制数值为:
0x41ee0000
0x425c0000
0x41dc0000
0x025c0000
参考信息:单精度浮点数阶码8位,尾数23位
下面哪条指令不是X86正确的寻址方式
movl $34, (%eax)
movl (%eax), %eax
movl $23, 10(%edx, %eax)
movl (%eax), 8(%ebx)
以下关于静态库链接的描述中,正确的是:
链接时,链接器会拷贝静态库中的所有目标模块。
使用库的时候必须把它们放在命令行的结尾处。
如果库不是相互独立的,那么它们必须排序。
每个库在命令行只须出现一次即可。
在foo.c文件中包含如下代码:
int foo(void) {
int error = printf("You ran into a problem!\n");
return error;
}
经过编译和链接之后,字符串"You ran into a problem!\n"会出现在哪个段中?
.bss
.data
.rodata
.text
一段程序中阻塞了SIGCHLD和SIGUSR1信号。接下来,向它按顺序发送SIGCHLD,SIGUSR1,SIGCHLD信号,当程序取消阻塞继续执行时,将处理这三个信号中的哪几个?
都不处理
处理一次SIGCHLD
处理一次SIGCHLD,一次SIGUSR1
处理所有三个信号
学完本课程后,几位同学聚在一起讨论有关异常的话题,请问你认为他们中谁学习的结果有错误?
发生异常和异常处理意味着控制流的突变。
与异常相关的处理是由硬件和操作系统共同完成的。
异常是由于计算机系统发生了不可恢复的错误导致的。
异常的发生可能是异步的,也可能是同步的。
下列说法正确的是:
A.SIGTSTP信号既不能被捕获,也不能被忽略
B.存在信号的默认处理行为是进程停止直到被SIGCONT信号重启
C.系统调用不能被中断,因为那是操作系统的工作
D.子进程能给父进程发送信号,但不能发送给兄弟进程
在系统调用成功的情况下,下面哪个输出是可能的?
int main() {
int pid = fork();
if (pid == 0) {
printf("A");
} else {
pid = fork();
if (pid == 0) {
printf("A");
} else {
printf("B");
}
}
exit(0);
}
AAB
AAA
AABB
AA
以下四句都是关于Unix I/O的说法。其中正确的是:
从网络套接字(socket)读取内容时,可以通过反复读的方式处理不足值问题,直到读完所需要的数量或遇到EOF为止。
以O_RDWR方式打开文件后,文件会有两个指针,分别记录读文件的当前位置和写文件的当前位置。
用read函数直接读取控制台输入的文本行,会自动在行末追加‘\0’字符。
使用dup2(4, 1)成功进行重定向后执行close(4),会导致1号文件描述符也不可用。
参考信息:O_RDWR表示文件可读可写;dup2(oldfd, newfd)表示将oldfd重定向给newfd。
下面是一段C程序代码:
#include?
#include?"csapp.h"
int?main()
{
printf("2");
if?(Fork())
{
printf("33");
Write(STDOUT_FILENO,?"lol",?3);
}
else
{
Sleep(1);
printf("233");
Write(STDOUT_FILENO,?"hhhh",?4);
}
fflush(stdout);
ret