《2022年系统及编程名词解释 .pdf》由会员分享,可在线阅读,更多相关《2022年系统及编程名词解释 .pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、学而不思则惘,思而不学则殆Preprocessing:预处理器( cpp)根据字符串 #开头的命令(directives) ,修改原始C 程序,并把它直接插入到程序文本中。Compile:编译将文本文件(.i)翻译成文本文件(.s)包含一个汇编语言程序Assemple:汇编器将( .s)翻译成机器语言指令,把机器指令打包成可重定位目标程序,并将结果保存在目标文件(.o)中Link :令连接器(ld)处理标准c 库中调用的函数与原函数(目标文件)并合的过程,再生成一个可执行文件。Activation Record:函数调用时分配的一块内存,它通常在栈内被产生,也被栈的框架所调用。Buffer o
2、verflow :字符串的长度超出了为数组分配的空间,所以重写了边界Garbage collection:垃圾回收,自动回收堆存储的过程Garbage collector :垃圾回收器,一种动态内存分配器,它自动释放程序中不再需要的已分配的块Timer:计时器,保存时间特定的时间片段,时间一到,程序转向另一个状态或执行另一个操作。 (计算机系统的组件,在某种程度上提供了测试时间的能力)Profile:用于测量执行一个源代码所花费的时间的工具,可以显示程序的执行历史和提供必要分析,同时它也可以发现一个程序的瓶颈,所以我们可以使代码更加有效Profiler :是一个找瓶颈发生地方的方式Garbag
3、e collection methods:1 标记清除法(Mark & Sweep ) :在每一块的顶部使用一个额外的标记,使用完清除这个标记2 复制法:使用两个堆,把一个堆中的数据复制到另一个堆3 引用计数法:记录每个对象的指针数目,当计数为0 时,该对象被认为是垃圾4 分代式垃圾回收法:频繁检查年轻对象是否为垃圾,较少地检查老的对象,应为我们认为年轻对象的生命周期短Alignment :要求某种类型的对象的地址必须是某个值K 的倍数How to Alignment :1 编译器在汇编代码中放入命令,指明全局数据所需的对齐2 对于有结构的代码,编译器可能需要在域的分配中插入间隙,以保证每个结
4、构元素都满足它的对齐要求,而结构本身对它的起始地址也有一些要求3 编译器可能需要添加一些填充到结构的末尾,这样结构数组的每个元素都会满足它的对齐要求Alignment rules :确保每种数据类型都是按照指定方式来组织和分配的,即每种类型对象都满足它的对齐限制就可以保证实施对齐Cache structure:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 19 页学而不思则惘,思而不学则殆Exception:异常,就是控制流中的突变,用来响应处理状态中的某些变化Cache miss:cold miss 冷不命中 :cache 为空导致
5、conflict miss 冲突不命中:容量不足Cache hit:当数据要K+1 层某个数据对象d 时,先在当前存储在K 层的一个块中查找d,如 d 刚好缓存在K 层中,则缓存命中。Static memory allocation :在程序编译,链接时分配地址的方法Dynamic memory allocation :在程序运行的时候分配地址空间Synchronization :通过交换信息,使多个进程或线程能够协作他们的活动Mutual exclusion :互斥,多个进程或者线程在一段时间内只能有一个进程或者线程独占访问共享对象。包括代码、数据和其他资源Critical section:
6、是一段访问共享资源的代码,当另一个进程已经在这段代码中运行时,这个进程就不能在这段代码中运行。Race condition:多个线程或进程读写一个共享data时结果依赖于他们执行的先后顺序Locality :时间局部性:刚用过的地址在不久的将来会再次被使用空间局部性:刚用过的地址的前后地址在不久的将来会被使用Optimal :优化,使代码更有效率,更小Memory alias: 存储器别名,指向存储器同一位置的不同指针Linker :将一个或多个由编译器合并的目标文件联合成一个单一的可执行程序Loader:实现加载函数到主存中的系统程序时间戳计数器是奔腾兼容处理器中的一个计数器,它记录自启动以
7、来处理器消耗的时钟周期数。 由于时间戳计数器(TSC )随着处理器周期速率的比例的变化而变化,因此提供了非常高的精度。 TSC 通常被用于剖析和监测代码。使用 rdtsc 指令可测量某段代码的执行时间,其精度达到微秒级,TSC 的节拍可以被转化为秒,方法是将其除以CPU 时钟速率 (在 linux中,可以从内核变量cpu_khz 读取) 。活动记录表函数回顾:int getbuf() char buf16; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 19 页学而不思则惘,思而不学则殆getxs(buf); return 1; vo
8、id test() int val; printf(Type Hex string:); val = getbuf(); printf(getbuf returned 0 x%xn, val); 活动记录表:Address 内容说明0012FDBC 调用 getxs()时压的 edi 0012FDC0 调用 getxs()时压的 esi 0012FDC4 调用 getxs()时压的 ebx 0012FDC80012FE23 getxs()的其他临时空间:0 xCC0012FE24 getxs()的栈底,存的是getbuf()的 ebp 0012FE28 getxs()返回到 getbuf()的
9、地址0012FE2C buf0 的地址: 0 x0012FE7C getbuf()调用 getxs()的参数0012FE30 调用 getbuf() 时压的 edi 0012FE34 调用 getbuf() 时压的 esi 0012FE38 调用 getbuf() 时压的 ebx 0012FE3C0012FE7B getbuf()的其他临时空间:0 xCC0012FE7C0012FE8B char buf16的空间0012FE8C getbuf()的栈底 ,存的是 test()的 ebp 0012FE90 getbuf()返回到 test()的地址0012FE94 调用 test()时压的 e
10、di 0012FE98 调用 test()时压的 esi 0012FE9C 调用 test()时压的 ebx 0012FEA00012FEDF test()的的其他临时空间:0 xCC0012FEE0val 的地址0012FEE4 test()的栈底,存的是main()的 ebp 0012FEE8 test()返回到 main()的地址0012FEEC 调用 main()时压的 edi 0012FEF0 调用 main()时压的 esi 0012FEF4 调用 main()时压的 ebx 0012FEF80012FF7F main()的其他临时空间:0 xCC0012FF80 保存的 ebp
11、0012FF7C main()的返回地址:返回到C 库函数指针的 sizeof 是 4 个字节getx() Stack Frame getbuf() Stack Frame test() Stack Frame 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 19 页学而不思则惘,思而不学则殆强制类型转换(精度损失,溢出)计算整数和浮点数的编码1 整数的编码2 负数3 浮点数内存错误(指到位置,原因,修改正确)Lab07 常见: malloc 分配的时候没有分配的足够多检查返回条件野指针数据类型(空字符)释放前先释放指针指向的元素内存错
12、误1.Code1 源代码Code1 修改后代码:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 19 页学而不思则惘,思而不学则殆Code1 修改点:1.补上必要的头文件声明2.给指针赋初值3.*input 的定义是多余的,可以删除。4. str = (char *) malloc(size1); ilist = (int *) malloc(size2); 应改为:str = (char *) malloc(sizeof(int)* (size1+1); ilist = (int *) malloc(sizeof(int)* size
13、2); 5.最后,最好加入free(str); free(ilist); #include #include #include void main() char *str, *input; int *ilist; int i, size1, size2; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 19 页学而不思则惘,思而不学则殆printf(Number of letters in word: ); scanf(%d, &size1);/* user inputs an integer */ printf(Number of i
14、ntegers: ); scanf(%d, &size2);/* user inputs an integer */str = (char *) malloc(size1+1); /错误 1:我们需要分配size1+1 大小的空间给str,因为 String 类型后面有一个 0ilist = (int *) malloc(size2); printf(Word: ); /错误 2:用户可能会输入超过输入的大小的字符串,所以用一个input 先把用户输入的字符串存储起来,再取前size1个字符给str,最后在str 后加一个 0scanf(%s, input); /* user inputs a
15、 string */for ( i = 0 ; i size1; i+) stri = inputi; strsize1 = 0; for(i = 0; i size2; i+) printf(Number %d of %d: , i + 1, size2); scanf(%d, ilist + i); /* user inputs an integer */ 2.Code2 源代码:Code2 修改后代码:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 19 页学而不思则惘,思而不学则殆Code2 修改点:1.补上必要头文件声明。2.
16、 char *newstr = malloc(strlen(str) + 1); 应改为:char *newstr =(char*)malloc(sizeof(char)*(strlen(str) + 1); 3.在 checkIF1() 函数中的if 上补上 free()函数。4.最好在 int i;加入说明,加强代码的可阅读性。3.Code3 源代码:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 19 页学而不思则惘,思而不学则殆Code3 修改后代码:精选学习资料 - - - - - - - - - 名师归纳总结 - - - -
17、 - - -第 8 页,共 19 页学而不思则惘,思而不学则殆Code3 修改点:1.补上必要的头文件声明。2.删去多余的data类型定义3.将 mergeSingleIfDifferent(char *s1, char *s2)中得 malloc() 修改 : char *str = (char *) malloc(sizeof(char)*(strlen(s1) + strlen(s2) + 1); 4.将 mergeArrayIfDifferent(char *results, char *strA1, char *strA2, size) 修改为 : mergeArrayIfDiffe
18、rent(char *results, char *strA1, char *strA2, int size) 5.修改 printAndFree() 的调用:printAndFree(i, resulti) 2. #include #include #include #include int checkIf1(char *str) char *newstr = (char *)malloc(strlen(str) + 1); /错误 1:不能把一个void * 放到一个char * 的函数中strcpy(newstr, str); /* set newstr to str */ 精选学习资料
19、 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 19 页学而不思则惘,思而不学则殆if (strcmp(newstr, 1) = 0) /* newstr is 1 */ return 1; free(newstr); return 0; void main() char *strArr4 = 1, 2, 3, 4; int i; for(i = 0; i 4; i+) printf(%dn, checkIf1(strArri); 3. #include #include #include struct data char *str1, *str2
20、; ; /* returns two strings concatenated if they are not the same, NULL otherwise */ char *mergeSingleIfDifferent(char *s1, char *s2) char *str = (char *) malloc(strlen(s1) + strlen(s2) + 1); if (strcmp(s1, s2) = 0) /* strings are equal */ /Error1: we have to free str before /we point it to a NULL /o
21、therwise we will never ever /get a chance to free it free(str); str = NULL; else strcpy(str, s1); strcat(str, s2); return str; /* copies merged strings (or NULL) into array of strings passed in (results) */ void mergeArrayIfDifferent(char *results, char *strA1, char *strA2, int size) int i; for(i =
22、0; i size; i+) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 19 页学而不思则惘,思而不学则殆resultsi = mergeSingleIfDifferent(strA1i, strA2i); void printAndFree(int c, char *str) if (str != NULL) printf(%d: %sn, c, str); free(str); void main() char *strArr18 = 1, 2, 3, 4, 5, 6, 7, 8; char *strArr28 = a, 2
23、, c, 4, e, 6, g, 8; char *results8; int i; mergeArrayIfDifferent(results, strArr1, strArr2, 8); for(i = 0; i Find(*pattern, 0); loc = 0; loc = data-Find(*pattern, 0) 每次循环之后,Find()又从0 开始遍历,造成了反复比较,使得循环效率过低。应该优化为在每次替换后,下一次从该次替换的位置开始遍历。改为:int x = 0; for (loc = data-Find(*pattern, 0); loc = 0; loc = dat
24、a-Find(*pattern, x) x = loc-pattern-GetLength()+1; if(xGetLength() +1; 每次循环都调用了一次GetLength() 函数,其结果是一样的,可以增加一个变量来替换,改为:int length=pattern-GetLength(); x = loc-length+1; 分析 3:单个插入开销太大for (int i = 0; i GetLength(); i+) data-Insert(loc + i, (*replacement)i); 可以将字符串整体插入,不需要使用循环将字符一个一个地插入,操作太频繁,开销太大,可改为:
25、data-Insert(loc , *replacement); 修改后的:void substitute(CString *data, CString *pattern, CString *replacement) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 19 页学而不思则惘,思而不学则殆int loc; int x = 0; int length=pattern-GetLength(); / find every occurrence of pattern: for (loc = data-Find(*pattern, 0
26、); loc = 0; loc = data-Find(*pattern, x) x = loc-length+1; if(xDelete(loc, pattern-GetLength(); / insert each character of the replacement string: data-Insert(loc , *replacement); 异常:控制流的突变,用来响应处理状态中的某些变化类型原因同异步返回行为中断来自 I/O 设备的信号异步返回到下一条指令陷阱有意的异常同步返回到下一条指令故障潜在可恢复的错误同步可能返回到当前指令终止不可恢复的错误同步不会返回用户模式下和内核模式的同步互斥:用户模式下,临界区。内核模式,信号量Lab14 连接器工作原理(符号解析,重定位)Lab13 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 19 页