系统级编程
名词解释:共 5 题
1:指针:是一个变量,可以存储另外一个变量的内存地址,在 C 语言中,我们可以申明一个变量指向内存的地址,而不是数据本身,可以用
“&”获取变量的地址。
2:活动记录:函数调用时分配的一块内存。它通常在栈内被产生,也被栈的框架所调用
3:缓冲溢出:缓冲超过区域,所以重写了边界(Place more than the buffer can hold, so overwrite the boundary
)。
4:静态分配:程序在编译和链接阶段为变量分配内存空间。静态分配的变量在 main 之前分配内存和初始化变量,只到程序终止才释放内存。
每次调用函数不会重新初始化。
5:动态分配:在程序运行期间为变量分配内存空间。其中包括栈分配和堆分配。
6:垃圾回收:自动的收回堆分配的内存空间,它是一种绝对的内存管理,应用程序不必关心内存空间的释放,普遍的流行于现在面向对象的语
言中。
7:墙上时间:它是一种物理的挂在墙上或者戴在手上的表所显示的时间
8 CPU time:直接执行程序所用的时间加上为准备执行程序所花的系统时间。
9:timer:计时器,保存时间特定的时间片段,时间一到,程序转向另外一个状态或执行另外一个操作。
10:profile:用来测量执行一个源代码所花费时间的工具,可以显示程序的执行历史和提供必要的分析,同时它也可以发现一个程序的瓶颈,
所以我们可以使我们的代码更加有效,例如我们可以通过它知道程序的那个部分被频繁的调用,哪些区域可以导致瓶颈等。
11 temporal locality, 时间局部性: Temporal locality entails that addresses that are referenced are soon referenced repeatedly, and should thus be kept in
fast memory.
12 spatial locality, 空间局部性:Spatial locality entails that addresses near a referenced address will soon be accessed and should thus be brought into fast
memory
13 重定位: Compilers and assemblers generate code and data sections that start at address zero. The linker relocates these sections by
memory location with each symbol definition, and then modifying all of the references to those symbols so that they point to this memory location.
14 符号解析: Object files define and reference symbols. The purpose of symbol resolution is to associate each symbol reference with exactly one
symbol definition
15:线程:一个进程中的程序执行路径或控制路径
16:并发:A collection of autonomous(自主的) sequential threads, executing (logically) in parallel
17:异步:一个线程在访问某个资源时,其他的线程不能同时访问该资源。
associating a
简答;共 5 题
1:汇编和 编译的区别?(必考)
编译是从源程序产生目标程序的过程。即编译就是把高级语言变成计算机可以识别的 2 进制语言。
用汇编语言编写的程序叫汇编语言,机器不能直接识别,要由汇编程序将汇编语言翻译成机器语言,所以汇编程序把汇编语言翻译成机器语言
的过程称为汇编
3:函数调用的规范?What calling conventions?
主要是描述被调用代码的一下信息:
(1) 参数被分配的顺序 (2)参数被放在什么地方?放在栈里还是 register 中?(3)函数可能使用的 register(4)函数返回值
2:缓冲区溢出的概念以及危害?(必考)
缓冲区溢出就是缓冲超过区域,所以重写了边界。缓冲溢出会造成边界重写,得不到正确的值,在 C 语言中,无法检测是否超过了一个数组的
buffer,所以要尽量避免缓冲溢出。
3:垃圾回收的概念及方法的简单介绍?(必考)
垃圾回收:自动的收回堆分配的内存空间,它是一种绝对的内存管理,应用程序不必关心内存空间的释放,普遍的流行于现在面向对象的
语言中。主要的方法有:(1)标记清除法:在每一个块的顶部使用一个额外的标记,使用完之后清除这个标记。(2)复制法:使用两个堆,
把一个堆中的数据复制到另一个堆之中。(3)引用计数法:记录每个对象的指针的数目,当计数为 0 时,该对象被认为是垃圾。(4)分代
式垃圾回收法:频繁的检查年轻的对象是否为垃圾,较少的检查比较老的对象,因为我们认为年轻的对象生命周期比较短。
系统级编程
4:优化的原则是什么?优化有哪些方法?(必考)
原则:优化最好的方式是一个对算法的优化。
(1)The Clicking Optimizations(2)Faster Mathematics(3)Faster Loops(4)Avoiding Expression Repetitions
(5)Using Assembly(6)Using register(7)Use unsigned int instead of int if you know the value will never be negative.
(8)Pointer Dereferencing(8)Avoiding Temporary Variables(10)String Comparisons(11)Pre vs. Post Increment/Decrement(12)all by Value vs.
Call by Reference(13)Don't Reallocate, But Reuse(14)Use switch() instead of if...else...(15)Early loop breaking(16)Don‘t use recursion(递归).
Avoid the sqrt() square root(开平方根)
5:什么是内存层次结构?为什么要使用内存层次结构?(必考)
内存层次结构就是把更小,更快的设备放在 K 层,而把容量较大和速度比较慢,价格比较便宜的设备放在 K+1 层,因为程序倾向于访问 K 层
的数据,所以把比较便宜的,访问速度慢的放在 K+1 层,把访问速度最高,访问频率最高的放在 K 层,这样就在速度,价格和容量之间达到了
一个平衡。
6:阿姆达尔法则的内容是什么?
系统优化某部件所获得的系统性能的改善程度,取决于该部件被使用的频率,或所占总执行时间的比例。
P 为被优化部分占整个程序的比例
S 为被优化部分在优化前的执行时间与优化后的执行时间的比值(被优化部分的 speedup)
7:什么是堆?为什么要用堆?
堆就是一块内存区域,使用堆可以在任何时候分配和释放内存。
8:内存 bug 产生的原因?
(1)内存重写导致堆结构破坏 (2)一些内存块被多次写入 (3)内存泄露
9:整数的存储方法?
整数是一般按照补码的方式存在在计算机中的,正数的补码是它本身,负数的补码是取反加 1,然后获得补码。
编程和计算:共 3 题
1(给一段程序,画出活动记录)
#include
void swap(int
{
a, int b)
int c;
c = a;
a = b;
b = c;
}
int x =16;
int y = 32;
int main()
{
swap(x, y);
printf ("x-y = %d\n",x-y);
系统级编程
return 0;
}
2:命中率的计算
3:写一个并发程序(并发就是用线程来实现的)
系统级编程