当前位置:文档之家› 深入理解计算机系统笔记

深入理解计算机系统笔记

深入理解计算机系统笔记
深入理解计算机系统笔记

深入理解计算机系统

(1) 对于一个无符号数字x,截断它到k位的结果就相当于计算x mod 2^k.

(2) 在大多数的机器上,整数乘法指令相当地慢,需要12或者更多的始终周期,然而其他整数运算-例如加法、减法、位移运算和移位-只需要1个时钟周期.因此,编译器使用的一项重要的优化就是试着使用移位和加法运算的组合来代替乘以常数因子的乘法.

(3) 在大多数的机器上,整数除法要比整数乘法更慢-需要30或者更多的始终周期.除以2的幂也可以用移位运算来实现,只不过我们用的是右移,而不是左移.对于无符号和二进制补码数,分别使用逻辑移位和算术移位来达到目的.

1.注意系统的分类:主流的IA32(也就是x86),以及x86-64(也就是x64),还有种Intel的与原32位系统不兼容的

IA64。

2.编译系统由预处理器,编译器,汇编器和链接器组成。

3.单指令多数据并行称为SIMD并行,其扩展为SSE指令集。

4.x64上long为8字节,指针也为8字节。

5.无符号数右移必须采用逻辑右移,而有符号数一般采用算术右移。

6.有符号数遇见无符号数会默认强转为无符号数。

7.short转为unsigned时,是先扩展大小再符号转换。

8.补码非的计算:从左到右将第一个为1的位前的所有位取反。

9.负数的补码移位向下舍入。

10.正浮点数能使用整数排序函数来进行排序。

11.浮点加法和乘法不具备结合性,浮点乘法在加法上不具备分配性。

12.预处理器扩展源代码,然后编译器生成源代码的文本汇编代码,汇编器转成二进制汇编码,链接器生成exe或dll 或lib。

13.寄存器可以保存地址也可以保存值。注意汇编中的加括号表示为取该地址指向的值,如(%eax)指%eax中保存的地址指向的值。

14.传送指令的两个操作符不能都指向存储器。

15.栈指针%esp保存着栈顶元素的值,%eax保存函数返回值。

16.栈从高地址往低地址分配,堆从低地址往高地址分配。

17.注意:lea,假设为leal 7(%edx, %eax, 4),则当%edx中保存的是地址时,lea为取有效地址,而当%edx中保存的是值时,lea为算术运算,即7 + %edx + %eax * 4。这儿的%eax总保存值。说白了,其实lea一直是在做计算,只是%edx影响了直观表达而已。

18.注意:处理有无符号值的操作是通过不同的汇编指令来区分的。

19.大多数汇编器根据一个循环的do-while形式来产生循环代码,逆向工程会用到。

20.指令无视操作数的长度。

21.因为有个条件传送的优化策略,所以(xp ? *xp : 0)这条语句其实两个选择分支都会执行。

22.32位系统中,大多数栈中信息的访问其位置都是基于帧指针的。而64位系统中,栈的存储信息数已被弱化,所以无帧指针了。

23.访问某个局部变量的前提是该局部变量至少有个可引用的地址,所以局部变量被保存在了栈中。

24.为了防止从效率低的存储器读写值时,可能因数据未对齐而造成多次读写从而导致低性能,IA32要求数据一定要对齐。编译器在编译时会强制对齐。

25.汇编指令leave等于俩pop,效果一样,选择随意。pop和push在栈上分配空间的方式是直接栈指针减去或加上偏移量。

26.指针之差等于相差字节数 / 所指类型大小字节数。

27.寄存器不够用时会出现寄存器溢出,这时就必须有值被保存在栈上了,一般是将只读变量放入栈。

28.GCC会对局部char类型的缓冲区插入金丝雀保护代码。

29.在C中内联汇编代码只能针对某一类机器。

30.SSE2引入浮点数面向寄存器的指令集,而不用基于栈的方法。

31.x64能让汇编代码比x32少很多,但是实际性能提升不会很大。但是从改进上来说性能应该提升很大很大啊,为什么。。。难道是x32已经被优化的变态了???

32.注意rep有时当空操作使。

33.x64中,栈空间向下128字节以内的区域仍可以被函数访问,该区域被ABI称为红色地带。

34.浮点相关:把存储模型,指令和传递规则组合称为浮点体系结构。

35.逻辑门只是简单的响应输入的变化而已。

36.HCL中,'='只是表示用一个名字来称谓一个表达式。其类switch的表达中的”1:“等同于switch中的Default Case。

37.寄存器文件上的读或写端口都分别成对,一个传ID,一个传内容。

38.访存阶段读写存储器,写回阶段将结果写到寄存器文件。

39.寄存器文件和数据存储器等都是当前时钟随意读,下一时钟统一写入更新。即时钟控制状态元素的更新。

40.流水线即保持各单元在时钟周期内忙碌不已,一套流水线硬件供多个流水线使用。

41.加载互锁和数据转发技术结合起来足以处理可能类型的数据冒险。

42.当流水线化的系统中出现多条指令引起的异常时,最深的指令被处理的优先级最高。

43.每个时钟周期执行多个操作称为超标量,而超线程是指一个核同时运行俩线程。

44.处理器功能单元的性能表示中,延迟指按照严格顺序执行完成合并运算所需要的最小周期数,而吞吐量指理论上最快完成一个操作所需周期数。

45.使用SSE可以降低吞吐量界限。

46.书写适合条件传送实现的”功能式“代码。

47.每个加载/存储单元每个时钟周期只能启动一条加载/存储操作。

48.性能提高技术:①.采用合适的算法和数据结构。②.消除连续的函数循环调用,在可能时尽量将计算移到循环外;消除不必要的存储器引用,引入临时变量来保存中间结果;保持内层循环在存储器层面的局部性。③展开循环;通过多个累计变量和重新结合等技术,提高指令级并行;用功能的风格重写条件操作,使得编译采用条件数据传送。

49.内存是硬盘的缓存。

50.core i7上所有的SRAM高速缓存存储器都在CPU芯片上。

51.对于性能来说,存储器访问总数和不命中率相比,不命中率影响要更大。估计是因为存储器的写回缓存机制。

52.存储器性能注意:将注意力集中在内循环上,大部分计算和存储器访问都发生在这里;通过按照数据对象存储在存储器中的顺序,以步长为1来读数据,从而使得空间局部性最大;一旦从存储器中读入了一个数据对象,就尽可能多的使用它,从而使得时间局部性最大。

53.对于静态库的链接,只会链接程序中用到的该库(.lib)中的模块(.obj)。这其实也解释为什么分别链接静态库版本和动态库版本的两程序大小相差不是那么悬殊。

54.当前指令处理完后,处理器才能去发现中断是否发生。

55.Linux系统调用的参数都是通过通用寄存器而不是栈传递的。

56.C++的try-catch是C种setjmp和longjmp的更加结构化的版本。

57.DRAM作为磁盘的缓存,不命中开销巨大。

58.磁盘上的交换文件同时又作为DRAM保存数据的缓存。

59.延迟私有对象中的拷贝最充分的利用了稀有的物理存储器,这是通过写时拷贝实现的。

60.一个系统中被所有进程分配的虚拟存储器的全部数量是受磁盘上交换空间的数量限制的。

61.造成堆利用率很低的主要原因是内存碎片的存在。

62.有时为了极个别的几个特殊情况而要去每次调用时都检查,还不如通过某些方式直接把特殊情况一般化,能用通用的方式去处理。

63.内存引用导致的崩溃要注意:引用坏指针/野指针,以及读未初始化的存储器。

64.UNIX信号是不排队的,若为考虑处理,则会直接丢弃。

65.函数内部的static变量也是线程间共享的。

66.注意并行和并发的区别,并行程序是一个运行在多个处理器上的并发程序。

67.线程数多过核数对效率反而会有影响,但影响不大。

68.注意:rand和ctime,localtime等函数时线程不安全的,慎用啊慎用!可用其可重入版本。

69.互斥锁记得相同顺序加锁解锁。

70.包装错误处理函数,是一个非常不错的做法。

//============================================

2010.07.08

深入理解计算机系统(1) 反汇编器一些特性说明: 1) IA32指令长度从1~15个字节不等.指令编码被设计成使常用的指令以及操作较少的指令所需的字节数少,二那些不太常用或操作数较多的指令所需字节数较多.

2) 指令格式是按照这样一种方式设计的,从某个给定位置开始,可以将字节唯一地解码成机器指令.例如,只有指令pushl %ebp是以字节值55开头的.

3) 反汇编器只是根据目标文件中的字节序列来确定汇编代码的.它不需要访问程序的源代码或汇编代码.

4) 反汇编器使用的指令命名规则与GAS(Gnu ASembler)使用的有些细微的差别.

5) 与code.s中的汇编代码相比,我们发现结尾多了一条nop指令.这条指令根本不会被执行(它在过程返回指令之后),即使执行了也不会有任何影响(所以称之为nop,是"no operation"的简写,同城读作"no op").编译器插入这样的指令是为了填充存储该过程的空间.

(2) IA32加了一条限制,传送指令的两个操作数不能都指向存储器位置.将一个值从一个存储器位置拷到另一个存储器位置需要两条指令-第一条指令将源值加载到寄存器值写入目的位置.

(4) 根据惯例,所有返回真书或指针值的函数都是通过将结果放在寄存器%eax中来达到目的的.

(5) 加载有效地址(Load effective address)指令leal实际上是movl指令的变形.它的指令形式是从存储器读取数据到寄存器,但实际上它根本就没有引用存储器.它的第一个操作数看上去是一个存储器引用,但该指令并不是从指定的位置读入数据,而是将有效地址写入到目的操作数(如寄存器).

(6) 一元操作,只有一个操作数,既作源,也作目的.这个操作数可以是一个寄存器,也可以是一个存储器位置.比如说incl(%esp)会是栈顶元素加 1.这种语法让人想起C中的加1运算符(++)和减1(--).

(7) 二元操作,第二个操作数既是源又是目的.这种语法让人想起C中向+=这样的赋值运算符.不过要注意,源操作数是第一个,目的操作数是第二个,这是不可交换操作特有的.例如,指令subl %eax, %edx使寄存器%edx的值减去%eax中的值.第一个操作数可以是立即数、寄存器或存储器位置.第二个操作数可以是寄存器或是存储器位置.不过同movl指令一样,两个操作数不能同时都是存储器位置.

(8) divi指令执行无符号除法,通常会事先将寄存器%edx设置为0. //============================================

2010.07.09

深入理解计算机系统(1) 汇编语言中,直接跳转时给出一个标号作为跳转目标地;间接跳转的写法是"*"后面跟一个操作数指示符.如jmp *%eax 表示用寄存器%eax中的值作为跳转目标; jmp *(%eax) 表示已%eax中的值作为读地址,从存储器中读出跳转目标;

(2) call指令有一个目标,指明被调用过程起始的指令地址. 同跳转一样,调用可以是直接的,也可以是间接的.在

汇编代码中,直接调用的目标是一个标号,而间接调用的目标是*后面跟一个操作数指示符,其语法与movel指令的操作数的语法相同.

(3) call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处.返回地址是紧跟在程序中call后面的那条指令的地址.这样当被调用过程返回时,执行会从此继续.ret指令从栈中弹出地址,并跳转到那个位置.要正确使用这条指令,就要使栈准备好,栈指针要指向前面call指令存储返回地址的位置.leave指令可以用来使栈做好返回的准备.它等价于下面的代码序列: movl %ebp, %esp //set stack pointer to beginning of frame popl %ebp // restore saved %ebp and set stack ptr to end of call's frame 另外这样准备工作也可以通过直接使用传送和弹出操作来完成. 寄存器%eax可以用来返回值,如果函数要返回整数或指针的话.

(4) 根据惯例,寄存器%eax, %edx, 和%ecx被划分为调用者保存(caller save)寄存器.当过程p调用Q时,Q可以覆盖这些寄存器,而不会被破坏任何P所需要的数据. 另外,寄存器%ebx, %esi和%edi被划分为被调用者保存(callee save)寄存器.这意味着Q必须在覆盖他们之前,将这些寄存器的值保存到栈中,并在返回前恢复他们,应为P(或某个更高层次的过程)可能会在今后的计算中需要这些值.此外,根据这里描述的惯例,必须保持寄存器%ebp和%esp.

(5) 单操作数的操作符&和*可以产生指针和间接引用指针.也就是,对于一个表示某个对象的表达式Expr,&Expr表示一个地址.对于表示一个地址的表达式Addr-Expr,*Addr-Expr表示该地址中的值.因此,表达式Expr与*&Expr是等价的. 可以对数组和指针应用数组下标操作,如数组引用A[i]与表达式*(A+i)是一样的.它计算第i个数组元素的地址,然后访问这个存储器位置.

(6) 数组元素在存储器中是按照"行优先"的顺序排列的,这就意味着先是行0的所有元素,后面是行1的所有元素,以此类推.

(7) 一个联合的总的大小等于它最大域的大小.

(8) 无论数据是否对齐,IA32硬件都能正确工作.不过,Intel还是建议要对齐数据以提高存储器系统的性能.Linux沿用的对齐策略是2字节数据类型(例如short)的地址必须是2的倍数,而较大的数据烈性(例如int, int*, float和double)的地址必须是4的倍数.注意,这个要求就意味着一个short类型对象的地址最低位必须等于0.类似地,任何int类型的对象或指针的地址的最低两位必须都是0. //============================================

2010.07.13

深入理解计算机系统(1) 编写高效程序需要两类活动: 第一、我们必须选择一组最好的算法和数据结构; 第二、我们必须编写出编译器能够有效优化以转换成高效可执行代码的源代码.

(2) 优化程序性能的基本策略: 1) 高级设计.为手边的问题悬着适当的算法和数据结构.要特别警觉,避免使用会渐进的产生糟糕性能的算法或编码技术.

2) 基本编码原则. 避免限制优化的因素,这样编译器就能产生高效的代码. 消除连续的函数调用.在可能时,将计算移到循环之外.考虑有选择的妥协程序的模块性以获得更大的效率. 消除不必要的存储器引用.引入临时变量来保存中间结果.只有在最后的值计算出来时,才将结果存放到数组或全局变量中.

3) 低级优化. 尝试各种与数组代码相对的指针形式. 通过展开循环降低循环开销. 通过诸如迭代分隔之类的技术,找到使用流水线的功能单元的方法. 最后的忠告,要小心避免花费精力在令人位家的结果上.一项有用的技术是.在优化代码时使用检查代码(checking code)来测试代码的每个版本,以确保在这一过程中没有引入错误,检查代码将一系列测试应用到程序上,确保它得到期望的结果.

(3) 量化评价一个程序中局限性的简单原则: 重复引用同一个变量的程序有良好的时间局限性. 对于具有步长为k的引用模式的程序,步长越小,空间局限性越好.具有步长为1的引用模式的程序有很好的空间局限性.在存储器中以大步长跳来跳去的程序空间局限性会很差. 对于取指令来说,循环有好的时间和空间局限性.循环体越小,循环迭代次数越多,局部性越好.

(4) 推荐以下技术: 将你的注意力集中在内部循环上,大部分计算和存储器访问都发生在这里. 通过按照数据对象存储在存储器中的顺序来读取数据数据,从而使得你的程序中的空间局部性最大. 记住,不明中率只是确定你代码性能的一个因素(虽然是重要的).存储器访问数量也扮演着重要角色,有时需要在两者之间做一下折中.

//============================================

2010.07.19

深入理解计算机系统(1) 学习链接只是的原因: 理解连及其将帮助你构造大型程序. 理解连接将帮助你避免一些危险的编程错误. 理解连将帮助你理解其他重要的系统概念. 理解链接将使你能够开发共享库.

(2) 一个典型的ELF可重定位目标文件包含下面几个节: .text:以编译程序的机器代码. .rodata:只读数据,如printf语句中的格式串和开关(switch)语句的跳转表. .data:以初始化的全局c变量.局部C变量在运行时被保存在栈中,既不出现在.data中,也不出现在.bss节中. .bss:未初始化的全局变量.在目标文件中这个节不占据实际的空间,它仅仅是一个占位符.目标文件格式区分初始化和未初始化变量是为了空间效率:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间. .symtab:一个符号表(symbol table),他存放在程序中被定义和引用的函数和全局变量的信息. .rel.text:当连接器把目标文件和其他文件结合时,.text节中的许多位置都需要修改.一般而言,任何调用外部函数或者引用全局变量的指令都需要修改.另一方面,调用本地函数的指令则不需要修改.注意,可执行目标文件中并不需要重定位信息,因此通常省略,除非使用者显式地指示连接器包含这些信息. .rel.data:被模块定义或引用的任何全局变量的信息.一般而言,任何已初始化全局变量的初始值是全局变量或者外部定义函数的地址都需要被修改. .debug:一个调试符号表,其中有些表目是程序中定义的局部变量和类型定义,有些表目是程序中定义和引用的全局变量,有些是原始的C源代码.只有以-g选项调用编译驱动程序时,才会得到这张表. .line:原始C源程序中的行号和.text节中机器指令之间的映射.只有以-g选项调用编译驱动程序时才会得到这张表. .strtab:一个字符串表,其内容包括.systab和.debug节中的符号表,以及节头部中的节名字.字符串表就是以null结尾的字符串序列.

(3) 利用static属性隐藏变量和函数的名字. C程序员使用static属性在模块内部隐藏变量和函数声明,就像你在jave和c++中使用public和private声明一样.C源代码文件扮演模块的角色.任何声明带有static属性的全局变量或者函数都是模块私有的.类似的,任何声明为不带static属性的全局变量和函数都是公开的,可以被其他模块访问.尽可能用static书香来保护你的变量和函数时很好的编程习惯.

(4) 函数和已经初始化的全局变量是强符号,未初始化的全局变量是弱符号.

(5) 根据强弱符号的定义,unix连接器使用下面的规则来处理多出定义的符号: 规则1:不允许有多个强符号. 规则2:如果有一个强符号和多个弱符号,那么选择强符号. 规则3:如果有多个弱符号,那么从这些弱符号中任意选择一个.

//============================================

2010.07.20

深入理解计算机系统(1) 共享库(shared library)是致力于解决静态库缺陷的一个现代创新产物. 共享库是一个目标模块,在运行时,可以加载到任意的存储器地址,并在存储器中和一个程序连接起来,这个过程称为动态链接(dynamic linking),是由一个叫动态连接器(dynamic linker)的程序来执行的.

(2) 共享库的"共享"在两个方面有所不同.首先,在任何给定的文件系统中,对于一个库只有一个.so文件.所有引用该库的可执行目标文件共享这个.so文件中的代码与数据,而不像静态库的内容那样被拷贝和嵌入到引用它们的可执行的文件中.其次,在存储器中,一个共享库的.text节只有一个副本可以被不同的正在运行的进程共享.

(3) java定义了一个标准调用规则,叫做jave本地接口(jave native interface, JNI),它允许java程序调用"本地的"c和C++函数,JNI的基本思想是将本地的C函数,比如说foo,编译到共享库中,如foo.so.当一个长在运行的java程序试图调用函数foo时,java解释程序利用dlopen接口(或者某个类似于此的东西)动态链接和加载foo.so,然后再调用函数foo.

(4) 理解ECF很重要的原因: 理解ECF将帮助你理解重要的系统概念. 理解ECF将帮助你理解应用程序是如何与操作系统交互的. 理解ECF将帮助你编写有趣的新应用程序. 理解ECF将帮助你理解软件异常如何工作.

(5) 当异常处理程序完成处理后,根据引起一场的事件的类型,会发生一下三种情况中的一种:

1. 处理程序将控制返回给当前指令Icurr(当事件发生时正在执行的指令).

2. 处理程序将控制返回给Inext(如果没有发生异常将会执行的下一条指令).

3. 处理程序终止被中断的程序.

(6) 异常的类型有:中断(interrupt), 陷阱(trap), 故障(fault)和终止(abort).

(7) 任何逻辑流在时间上和另外的逻辑流重叠的进程被称为并发进程(concurrent process). 而这两个进程就被称为并发运行. 进程和其他进程轮换运行的概念称为多任务(multitasking).一个进程执行它的控制流的一部分的每一时间段叫做时间片(time slice).因此,多任务也叫做时间分片(time slicing).

(8) 进程的三种状态: 运行.进程要么在CPU上执行,要么在等待被执行且最终会被调度. 暂停.进程的执行被挂起(suspended),且不会被调度. 终止.进程永远地停止.进程因为三种原因终止:收到一个信号,该信号的默认行为是终止进程;从主程序返回;调用exit函数.

(9) 一个终止了但还未被回收的进程成为僵死进程(zombie). //============================================

2010.07.21

深入理解计算机系统(1) 任意时刻,虚拟页面的集合都分为三个不相交的子集: 未分配的: VM系统还未分配(或者创建)的页.未分配的块没有任何数据和他们相关联,因此也就不占用任何磁盘空间. 缓存的: 当前缓存在物理存储器中的已分配页. 未缓存的: 没有缓存在物理存储器中的已分配页.

(2) 显示分配器的一些相当严格的约束条件: 处理任意请求序列. 立即响应请求. 只使用堆. 对齐块(对齐要求). 不修改已分配的块.

(3) 与套接字限定相关的流限定: 限定一:输入函数跟在输出函数之后.如果中间没有插入对fflush, fseek, fsetpos或者rewind的调用,一个输入函数不能跟在一个输出函数之后.fflush函数清空与流相关的缓冲区. 限定二:输入函数跟在输入函数之后. 如果中间么有插入对fflush, fseek, fsetpos或者rewind的调用, 一个输出函数不能跟随在一个输入函数之后,除非该输入函数遇到了一个文件结束. 对I/O流的第一个限定能够通过采用在每个输入操作前刷新缓冲区这样的规则来保证实现. 保证实现第二个限定的唯一办法是,对同一个打开的套接字描述符打开两个流,一个用来读,一个用来写; FILE *fpin, *fpout; fpint = fopen(sockfd, "r"); fpout = fopen(sockfd, "w"); 但是这样做也有问题,因为它要求应用程序在两个流上都要调用fclose,这样才能释放与每个流相关联的存储器资源,避免存储器xie lou(bd太龌龊了). fclose(fpin);

fclose(fpout);

//============================================

2010.08.05

深入理解计算机系统(1) 四类线程不安全函数. 第一类: 不保护共享变量的函数; 第二类: 保持跨越多个调用的状态的函数; 第三类: 返回指向静态变量的指针的函数; 第四类: 调用线程不安全函数的函数;

(2) 死锁. 程序员使用p和v操作顺序不当,以至两个信号量的禁止区域(forbidden region)重叠.

重叠的禁止区域引起了一组称为死锁区域(deadlock region)的状态. 死锁是一个相当困难的问题,因为它不总是可预测的.

(3) 使用简单而有效的规则来避免死锁. 互斥锁加锁顺序规则: 如果对于程序中每对互斥锁(s, t), 每个既包含s也包含t的线程都按照相同的顺序同时对他们加锁,那么这个程序就是无死锁的.

第一章:计算机系统漫游

这本书是为这样一些程序员而写的,他们希望通过了解这些部件如何工作以及如何影响程序的准确性和性能,来提高自身的技能.

系统中所有的信息--包括磁盘文件,存储器中的程序,存储器中存放的用户数据以及网络上传送的数据,都是由一串比特表示的.

c语言是贝尔实验室的Dennis Ritchie于1969-1973年间创建的.美国国家标准化组织在1989年颁布了

ANSI C的标准.该标准定义了C语言和一系列函数库,即所谓的标准C库.

c和unix操作系统关系密切.c从开始就是作为一种用于unix系统的程序语言开发出来的.unix内核的大部分,以及所有它支持的工具和函数库都是用c语言编写的.

c是一个小而简单的语言,c语言的设计是由一个人完成的,其结果就是这是一个简洁明了,没有什么冗赘的设计. c是为实践目的设计的.c是设计用来实现unix操作系统的.它是系统编程的首选.同时它非常适用于应用级程序的编写.

预处理器,编译器,汇编器和连接器一起构成了编译系统.

汇编语言是非常有用的,因为它为不同的高级语言的不同编译器提供了通用的输出语言.

GNU环境包括EMAC编译器,GCC编译器,GDB调试器,汇编器,连接器,处理二进制文件的工具以及其他一些部件.

shell是一种命令行解释器,它输出一个提示符,等待你输入一行命令,然后执行这个命令.如果该命令的第一个

单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,要加载和执行该文件.

每个I/O设备都是通过一个控制器或适配器于I/O总线连接起来的.控制器和适配器之间的区别主要在它们

的组成方式.控制器是I/O设备本身中或是主板上的芯片组,而适配器则是一块插在主板插槽上的卡.

主存是临时存储设备,在处理器执行程序时,它被用来存放程序和程序处理的数据.物理上来说,主存是由一组DRAM芯片组成的,逻辑上来说,存储器是由一个线性的字节数组组成的.

中央处理单元简称处理器,是解释存储在主存中指令的引擎.处理器的核心是一个被称为程序计数器的字长大小的存储设备.在任何一个时间点上,PC都指向主存中的某条机器语言指令.

从系统通电开始,直到系统断电,处理器一直在不假思索的重复执行相同的基本任务:从程序计数器指向的存储器处读取指令,解释指令中的位,执行指令中的简单操作,然后更新程序计数器指向下一条指令,而这条指令并不一定在存储器中和刚刚执行的指令相邻.

利用称为DMA(直接存储器存取)的技术,数据可以不通过处理器而直接从磁盘到达主存.

常字符串的显示过程:存储器到寄存器文件,再从寄存器文件到显示设备.

一个典型的寄存器文件只存储几百字节的信息,主存里可存放几百万字节.然而,处理器从寄存器文件中读数据比从主存中读取要快几乎100倍.

L1和L2高速缓存是用一种叫做静态随机访问存储器的硬件技术实现的.

我们可以把操作系统看成是应用程序和硬件之间插入的一层软件.

操作系统有两个基本功能:防止硬件被失控的应用程序滥用;在控制复杂而又通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法.

程序在现代系统上运行时,操作系统会提供一种假象,就好像系统上只有这个程序是在运行的.这些假象是通过进程的概念来实现的,进程是计算机科学中最重要和最成功的概念之一.

在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成.每个线程都运行在进程的上下文中,并共享同样的代码和全局数据.

虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,好像每个进程都在独占的使用主存.每个进程看到的存储器都是一致的.

每个进程看到的虚拟地址空间由大量准确定义的区组成,从最低的地址开始:程序代码和数据(代码和数据区是由可执行目标文件直接初始化的);堆(作为调用像 malloc和free这样的c标准库函数的结果,堆可以在运行时动态的扩展和收缩);共享库(共享库的概念非常强大,但是也是个相当难懂的概念);栈 (位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用);内核虚拟存储器(内核是操作系统总是驻留在存储器中的部分).

虚拟存储器的运作需要硬件和操作系统软件之间的精密复杂的相互合作,包括对处理器生成的每个地址的硬件翻译.基本思想是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存.

Linux逐渐发展成为一个技术和文化现象,通过和GNU项目的力量结合,Linux项目发展成为了一个完整的,符合Posix标准的Unix操作系统的版本,包括内核和所有支撑的基础设施.

操作系统内核是应用程序和硬件之间的媒介,它提供三个基本的抽象概念:文件是I/O设备的抽象概念:虚拟存储器是对主存和磁盘的抽象概念:进程是处理器,支撑和I/O设备的抽象概念.//

第二章:信息的表示和处理

2的n次方的二进制表示为1后面加n个0;

指针变量将用到机器的全字长,long int*也是这样;

可移植性的一个方面就是使程序对不同数据不敏感;

c标准对不同类型的数字范围设置了下限,但是没有上限;

存储数据分大端法和小端法;

反汇编器是一种确定可执行程序文件所表示的指令序列的工具;

不同的机器使用不同的且不兼容的指令和编码方式;

布尔的and和异或分别相当于模2的乘法和加法;

c标准没有明确定义使用那种类型的右移;

c和c++中的有符号树是默认的;

c的标准并没有要求用二进制补码来表示有符号数;

c库中的文件定义了一组常量,来限定运行编译器的这台机器的不同整型数据的范围;

printf没有使用任何输出变量类型的信息(how);

无符号和有符号数混合运算,将有符号数转化为无符号数;

一种有名的用来执行二进制补码的非的技术是取反并加一;

编译器用移位和加法运算的组合来代替乘以常数因子的乘法;

单精度浮点的符号,指数和有效数字分别是1,8,23.双精度为1,11,52.有效数字的第一位总是1,因此我们不需要表示它;

IEEE浮点格式定义了4种不同的舍入方式,默认是找到最接近的匹配.这四种方式为:向偶数舍入,向0舍入,向上舍入,向下舍入;

浮点寄存器使用一种特殊的80位的扩展精度格式;

浮点数取非就是简单的将其符号位取反;

第三章:程序的机器级表示

汇编程序员可以看到程序计数器,整数,浮点数寄存器和条件码寄存器;

汇编代码只是将存储器看成是一个很大且按字节寻址的数组;

对标量数据类型,汇编代码也不区分有符号和无符号数,不区分各种类型的指针,甚至不区分指针和整数;

程序存储器包含程序的目标代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的存储器块;

IA32 CPU有8个32位值的寄存器,前6个是通用的,后2个保存栈指针和帧指针;

最频繁使用的指令是执行数据传送的指令;

局部变量通常是保存在寄存器中;

除了右移操作,所有的指令都不区分有符号数和无符号数;

IA32程序用程序栈来支持过程的调用,栈用来传递过程参数,存储返回信息,保存寄存器以供以后的恢复之用,以及用于本地存储;

为单个过程分配的那部分栈称为栈帧,它的最顶端是以两个指针定界的;

寄存器%eax可以用来返回值,如果函数要返回整数或指针的话;

IA32中%eax,%edx和%ecx被划分为调用者保存寄存器,其余三个为被调用者保存寄存器;

IA32也仍然在不断增加新的指令类,来支持处理多媒体应用的需要;

许多计算机系统要求某种数据类型的对象必须是某个值的k倍,这种对其限制简化了处理器和存储器系统之间的接口硬件设计;

&操作符可以应用到任何左值类的c表达式上,包括变量,结构,联合和数组元素;

用高级语言编写的程序可在许多不同的机器上编译执行,而汇编代码是于特定机器密切相关的;

1997-PentiumII 1999-PentiumIII 2001-Pentium4;

美国商标局不允许用数字作为商标;

Intel现在称其指令集为IA32;

汇编代码非常接近于机器代码;

汇编代码只是将存储器看成是一个很大的,按字节寻址的数组;

机器实际执行的程序只是对一系列指令进行编码的字节序列,机器对产生这些指令的源代码一无所知;

call过程调用 leave为返回准备栈 ret从过程调用中返回;

指针提供一种统一方式,能够远程访问数据结构;

malloc函数返回一个通用指针;

指针也可以指向函数,这提供了一个很强大的存储和传递代码引用的功能(how);

数年来,AMD的策略一致是在技术上紧跟Intel后面,生产性能稍低但是价格更便宜的处理器;

浮点数使用一组完全不同的指令和寄存器(相对整数来说);

IA32加了一条限制,传送指令的两个操作数不能都指向存储器的位置,第一个是源操作数,第二个是目标操作数;

局部变量通常是保存在寄存器中的,这样就能更快的访问到它;

加载有效地址(load effective address)指令leal实际上是movl指令的变形,但目标操作数必须是一个寄存器; 编译器产生的代码中会用一个寄存器存放多个程序值,还会在寄存器之间传送程序值;

汇编代码提供了实现非顺序控制流的较低层次的机制,这是通过借助条件码寄存器来完成的;

当执行PC相关的寻址时,程序计数器的值是跳转指令后面的那条指令的地址,,而不是跳转指令本身的地址; switch语句不仅提高了c代码的可读性,而且通过使用一种跳转表的数据结构使得实现更加高效,跳转表是一个数组,表项i是一个代码段的地址,这个代码段实现的是当开关索引值等于i时程序应该采取的动作;

数据传递,局部变量的分配了释放是通过操纵程序栈来实现的;

IA32程序用程序栈来支持过程调用;

当对一个局部变量使用地址操作符&的时候,该变量不能保存在寄存器中;

call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处.返回地址是紧跟在程序中call后面的那条指令的地址.ret指令从栈中弹出地址并跳转到那个位置;

在较老的IA32处理器模型中,整数乘法指令要花费30个时钟周期,所以编译器要尽可能的避免使用它,而大多数新近的处理器模型中,乘法指令只需要3个时钟周期,所以不一定会进行这样的优化;

c和c++都要求程序显式的用free函数来释放已经分配的空间,在Java中,释放是由运行时系统通过一个称为垃圾回收的进程自动完成的;

寄存器溢出是IA32一个很常见的问题,因为处理器的寄存器数量太少了;

结构的实现类似于数组的实现,因为结构的所有组成部分都存放在存储器中连续的区域内,而指向结构的指针就是结构的第一个字节的地址;

struct数据类型的构造函数是c提供的于c++和java对象最为接近的东西;

蠕虫是这样一种程序,它可以自己运行,并且能够将一个完全有效的自己传播到其他的机器上.与此相应的,病毒是这样一段代码,它能将自己添加都包括操作系统在内的其他程序中,但是它不能独立的运行;//

(14 15 16节未看)

第五章:优化程序性能

编写高效的程序需要两类活动:第一,我们必须选择一组最好的算法和数据结构;第二,我们必须编写出编译器能够有效优化以转成高效可执行代码的源代码;

事实上,编译器只能执行有限的程序转换,而且妨碍优化的因素还会阻碍这种转换,妨碍优化的因素就是程序行为中那些严重依赖于执行环境的方面;

编译器优化程序的能力受几个因素的限制,包括:要求它们绝不能改变正确的程序行为:它们对程序行为,对使用它们的环境了解有限;需要很快的完成编译工作;

编译器必须假设不同的指针可能会指向存储器中同一个位置,这造成了一个主要的妨碍优化的因素,这也是可能严重限制编译器产生优化代码机会的程序的一个方面;

编译器会假设最糟的情况,并保持所有的函数调用不变;

代码移动的优化包括识别出要执行多次但是计算结果不会改变的计算,因而我们可以将计算移动到代码前面的,不会被多次求值的部分;

c中的字符串是以null结尾的字符序列,strlen必须一步一步的检查这个序列,直到遇到null字符;

过程的调用会带来相当大的开销,而且妨碍大多数形式的程序优化;

消除不必要的存储器引用,具体是用一些临时变量,这些变量很可能被存在寄存器中(如果没有溢出的话);

在汇编代码级,看上去似乎是一次是执行一条指令,每条指令都包括从寄存器或存储器取值,执行一个操作,并把结果存回到一个寄存器或存储器位置.在实际的处理器中,是同时对多条指令求值的.在某些设计中,可以有80或更多条指令在处理中.

P6 微体系结构是自20世纪90年代后期以来许多厂商生产的高端处理器的典型.在工业界称为超标量,意思是它可以在每个时钟周期执行多个操作,而且是乱序的, 整个设计有两个主要部分:ICU(Instruction Control Unit,指令控制单元)和EU(Execution Unit,执行单元).

ICU从指令高速缓存中读取指令,指令高速缓存是一个特殊的高速缓存存储器,它包含最近访问的指令;

指令解码逻辑接收实际的程序指令,并将它们转换成一组基本的操作;

加载和存储单元通过数据高速缓存访问存储器,这是一个高速存储器,包含最近访问的数据值;

退役单元纪录正在进行的处理,并确保遵守机器级程序的顺序语意.退役单元控制着寄存器的更新;

任何对程序状态的更新都只会在指令退役时才发生,只有在处理器能够确信这条指令的所有分支都预测正确了,才能这样做;

执行时间的范围从基本整数操作的一个周期,到加载,存储,整数乘法和更常见的浮点操作的几个周期,到除法和其他复杂操作的许多个周期;

处理器的几个功能单元被流水线化了,这意味着在前一个操作完成之前,它们就可以开始一个新的操作;

浮点乘法器要求连续的操作之间至少要一两个周期,而两个除法器根本就没有流水线化;

标记可以与并不会写道寄存器文件中的中间值相关联;

循环展开本身只会帮助整数求和情况中代码的性能,因为我们的其他情况是被功能单元的执行时间限制的;

编译器可以很容易的执行循环展开,只要优化级别设置得足够高(例如,优化选项-O2)许多编译器都能例行公事的做到这一点,在命令行上以'-funroll-loops'调用GCC,它会执行循环展开;

有时候,我们能够通过使用指针,而不是数组改进一个程序的性能;编译器对数组代码应用非常高级的优化,而对指针只应用最小限度的优化,为了可读性的缘故,通常数组代码更可取一些;

循环分割:我们可以通过将一组合并操作分割成两个或更多的部分,并在最后合并结果来提高性能;

对于整数数据类型的情况,总共只有八个整数据传区可用.其中两个指向栈中的区域;

八个整数和八个浮点寄存器的限制是IA32指令集的不幸产物,前面讲到国的重命名消除了寄存器名字和寄存器数据实际位置之间的联系.在现代处理器中,寄存器名字之简单的用来标识在功能单元之间传递的程序

值.IA32只提供了很少量的这样的标识符,限制了在程序中能表达的并行性的数量;

某个与及其相关的因素将浮点乘法能达到的CPE限制在了1.5,而不是理论极限值的1.0;

程序优化的通用原则对各种不同的机器都适用,即使某种特殊的特性组合导致最优性能依赖于特殊的机器;

到目前,台式机或服务器中几乎每个处理器都支持投机执行;

一个存储器读的结果依赖于一个非常近的存储器的写叫做读写相关,它导致了处理速度的下降;

movl %edx,(%ecx)被翻译成两个操作:storeaddr指令计算存储操作的地址,创建一个存储缓冲区中的条目,并设置该条目的地址字段;storedata指令设置该条目的数据字段;

通常,处理器/存储器接口是处理器设计中最复杂的部分之一.不查阅详细的文档和使用机器分析工具,我们只

能给出实际行为的一个假象的描述;

由于存储器操作占到了程序很大一部分,存储器子系统优化成以独立的存储器操作来提供更大的并行性;

优化程序性能的基本策略:

1.高级设计,为手边的问题选择适当的算法和数据结构;

2.基本编码原则,消除函数的连续调用,在可能时,将计算移到循环外.考虑有选择的妥协程序的模块性以获得更大的效率;消除不必要的存储器引用,引入中间变量来保存中间结果,只有在最后的值计算出来的时候,才将结果存放到数组或全局变量中;

3.低级优化.尝试各种于数组代码相对的指针形式;通过展开循环降低循环开销;通过诸如迭代分割之类的技术,找到使用流水线化的功能单元的方法;

Unix系统提供了一个剖析程序GPROF.这个程序产生两种形式的信息.首先,它确定程序中每个函数花费了多少CPU时间.其次,它计算每个函数被调用的次数,以调用函数来分析;

库函数qsort是际遇快速排序算法进行排序的;

剖析是工具箱中一个很有用的工具,但是它不应该是唯一一个,即使测量不是很准确,特别是对较短的运行时间来说.结果只适用于被测试的那些特殊的数据;

Amdahl定律的主要观点:要想大幅度提高整个系统的速度,我们必须提高整个系统很大一部分的速度; Amdahl 定律描述了一个改进任何过程的通用原则.除了适用于提高计算机系统的速度外,它还能指导一个公

司试着降低生产剃须刀的成本,或是指导一个学生改进他或她的平均绩点.或许它在计算机世界里最有意义,在计算机世界中,我们通常将性能提高一倍或更多.只有通过优化系统很大一部分才能获得这么高的提高率;

第六章:存储器层次结构

RAM分SRAM和DRAM

DDR-SDRAM:双倍数据速率同步DRAM.通过时钟的两个边沿作为控制信号,从而使DRAM的速度加倍. ROM是以它们能被重编程的次数和对它们进行重新编程的机制来区分的:PROM,EPROM,EEDROM.闪存是基于EEPROM的;

存储在ROM设备中的程序通常被称为固件,当一个计算机系统通电以后,它会运行存储在ROM中的固件;

总线是一组并行的导线,能携带数据,地址和控制信号;

系统总线将CPU连接到I/O桥接器,存储器总线将I/O桥接器连接到主存,I/O桥接器也将系统总线和存储器总线连接到I/O总线;

扇区包含相等数量的数据位,扇区之间由一些间隙分隔开,间隙用来存储标识扇区的格式化位;

多个盘面时,任何时刻,所有读写头都位于同一柱面上;

磁盘是以扇区大小的块来读写数据的;

磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护着逻辑块号和实际磁盘扇区之间的映射关系;

在磁盘可以存储数据之前,它必须被磁盘控制器格式化,这包括标识扇区的信息填写扇区之间的间隙,标识出表面有故障的柱面并且不适用它们,以及在每个区中预留出一组柱面作为备用;

在使用存储器映射I/O的系统中,地址空间中有一块地址是为与I/O设备通信保留的,每个这样的地址称为一个I/O端口;

现代计算机频繁使用基于SRAM的高速缓存;

有良好局部性的程序比局部性差的程序运行得更快;

代码区别于程序数据的一个重要属性是在运行时不能修改;

局部变量的反复引用是好的,步长为1的引用模式是好的;

如果你的程序需要的数据是存储在CPU寄存器中的,那么在执行期间,在零个周期内就能访问到它们;如果存储在高速缓存中,需要1-10个周期;如果存储在主存中,需要50-100个周期;而如果存储在磁盘上,需要大约20 000 000个周期;

具有良好局部性的程序倾向于一次又一次的访问相同的数据项集合,或是倾向于访问邻近的数据项集合;

特别的,我们将注意力集中在CPU和主存之间作为缓存区域的高速缓存存储器上,因为它们对应用程序性能影响最大;

随机访问存储器(random-access memory,RAM)分为两类--静态的和动态的.静态RAM(SRAM)比动态

RAM(DRAM)更快,但也贵得多;

SRAM将每个位存储在一个双稳态的存储器单元里;每个单元是用一个六晶体管电路来实现的.这个电路有这样一个属性,它可以无限期的保持在两个不同的电压配置或状态之一;

DRAM存储器可以制造的非常密集--每个单元由一个电容和一个访问晶体管组成;

只要有电,SRAM就是持续的,与DRAM不同,它不需要刷新.SRAM的存取比DRAM快.SRAM对诸如光和电噪音这样的干扰不敏感.代价是SRAM单元比DRAM单元使用更多的晶体管,因而没那么密集,而且更贵,功耗更大;

电路设计者将DRAM组织成二维阵列而不是线性数组的一个原因是降低芯片上地址管脚的数量;

DRAM芯片包装在存储器模块中,它插到主板的扩展槽上;二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间;

增强的DRAM:FPM DRAM(fast page mode DRAM,快页模式DRAM);EDO DRAM(extended data out DRAM,扩展数据输出DRAM);SDRAM(synchronous DRAM, 同步DRAM);DDR SDRAM(double data-rate synchronous DRAM,双倍数据速率同步);Rambus DRAM;

一些系统在固件中提供了少量的输入和输出函数--例如,PC的BIOS例程;I/O桥接器将系统总线的电信号翻译成存储器总线的电信号;

磁盘是由一个或多个叠放在一起的盘片组成的,它们放在一个密封的包装里,正个装置通常别叫做磁盘驱动器,虽然我们通常简称位磁盘;

对扇区的访问时间有三个主要部分:寻道时间,旋转时间,传送时间;

从存储器中读一个512字节扇区大小的块的时间对SRAM来说大约是256ns,对DRAM来说大约是4000ns.磁盘访问时间比SRAM大约大4000倍;比DRAM大约大2500倍;

当操作系统想要执行一个I/O操作时,例如读一个磁盘扇区的数据到主存,操作系统会发送一个命令到磁盘控制器,让它读某个逻辑块号.控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个(盘面,磁道,扇区)

的三元组,这个三元组唯一的标识了对应的物理扇区.控制器上的硬件解释这个三元组,将I/O头移动到适当的柱面,等待扇区移动到I/O头下,将I/O头感知到的位放到控制器上的一个小缓冲区中,然后将它们拷贝到主存中;

像图形卡,监视器,鼠标,键盘,这样的设备都是通过诸如Intel的PCI(peripheral component interconnect外围设备互联)总线这样的I/O总线连接到CPU和主存的;

虽然I/O总线比系统总线和存储器总线慢,但是它快页容纳种类繁多的第三方I/O设备;

USB控制器是一个将设备连接到USB的电路,USB的吞吐率可以达到12Mbit/s,是为慢速或中速串行设备设计的;

图形卡包含硬件和软件逻辑,它们负责代表CPU在显示器上画像素;

磁盘控制器包含硬件和软件逻辑,它们用来代表CPU读写磁盘;

当一个设备连接到总线时,它与一个或多个端口相关联;

逻辑块的概念不仅能够提供给操作系统一个更简单的接口,还能够提供一层抽象,使得磁盘更加健壮;

磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护着逻辑块号和实际磁盘扇区之间的映射关系;

操作系统用主存来缓存磁盘文件系统中最近被使用的磁盘块;

对于取指令来说,循环有好的时间和空间局部性,循环体越小,循环次数越多,局部性越好;

一般而言,层次结构中较低层的设备的访问时间较长,因此为了补偿这些较长的访问时间,倾向于使用较大的块; 在一个有虚拟存储器的系统中,DRAM主存作为存储在磁盘上的数据块的缓存,是有操作系统软件和CPU上

的地址翻译硬件共同管理的;

高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:组选择;行匹配;字抽取;

冲突不命中在真实的程序中很常见,会导致令人困惑的性能问题;

即使程序有良好的空间局部性,而我们的高速缓存中也有足够的空间来存放两个数组的块,每次引用还是会导致冲突不命中,这是因为这些块被映射到了同一个高速缓存组;

直写高速缓存通常是非写分配的,写回高速缓存通常是写分配的;

只保存指令的高速缓存称为i-cache,只保存程序数据的高速缓存称为d-cache.一个典型的桌面系统CPU芯片本身就包括一个L1 i-cache和一个L1 d-cache;

一方面,较大的高速缓存可能会提高缓存命中率;另一方面,使得大存储器运行得更快总是要难一些的;

现代系统通常会折中,使高速缓存块包含4-8个字;

传统上,努力争取时钟频率的高性能系统会选择直接映射L1高速缓存,而在较低层上使用比较小的相关度,但是没有固定的规则;

一般而言,高速缓存越往下层,越可能使用写回而不是直写;

因为一行总是存储一个块,术语行和块通常互换使用,例如,系统专家总是说高速缓存的行大小,实际上他们指的是块大小;

理解存储器层次结构本质的程序员能够利用这些知识,编写出更有效的程序,无论具体的存储系统是怎样的.特别的,我们推荐下列技术:将你的注意力集中在内部循环上,大部分计算和存储器访问都发生在这里;通过按照数据对象存储在存储器中的顺序来读数据,从而使得你程序中空间局部性最大;一旦从存储器中读入一个数据对象,就尽可能多的使用它,从而使得你程序中的时间局部性最大;记住,不命中率只是确定你代码性能的一个因素,存储器访问数量也扮演着重要的角色,有时候要在两者之间做一下折中;//(6.6未看)

第七章:连接

连接器完成的两个主要任务:符号解析和重定位.

编译器和汇编器生成地址0开始的代码和数据节.

目标文件:可重定位目标文件,可执行目标文件,共享目标文件.

ELF 可重定位目标文件:ELF头以一个16字节的序列开始,这个序列描述了字的大小和生成该文件的系统的字节顺序. .test.:已编译程序的机器代码;.rodata.:只读数据;.data.:已初始化的全局变量;.bss.:为初始化的全局变量;.symtab.:存放程序中被定义和引用的函数和全局变量的信息.

连接器上下文中有三种符号:块内定义的全局符号;块外定义的全局符号和本地符号;

定义为带c static属性的本地过程变量不是在栈中管理的,编译器在.data.和.bss.中为每个定义分配空间;

任何声明为static属性的全局变量或函数是模块私有的;

编译器来保证本地符号的唯一性;

当编译器遇到一个不是在当前模块中定义的变量时,它会假设该符号是在其他某个模块中定义的,生成一个连接器符号表表目;

运行时的存储器映像:未使用->只读段->读写段->运行时堆->共享库的存储器映射区域->用户栈->内核虚拟存储器;

加载运行:可执行文件中段头表的指导下,加载代码和数据->程序入口点_start->初始化函数->注册函数->主函数->返回;

c的启动代码对于每个c程序都是相同的,都需要跳到main函数;

链接就是将不同部分的代码和数据收集和组合成为一个单一文件的过程,这个文件可被加载到存储器并执行.链接可以执行于编译时,也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是在程序被加载器加载到存储器并执行时;甚至执行于运行时,由应用程序来执行;

链接器在软件开发中扮演着一个关键的角色,因为他们使得分离编译成为了可能;

理解链接器将帮助你构造大型程序;理解链接器将帮助你避免一些危险的编程错误;理解链接器将帮助你理解语言的作用域规则是如何实现的;理解链接器将帮助你理解其他重要的系统概念;理解链接器使你能够开发共享库;

目标文件纯粹是字节块的集合,这些块中,有些包含程序代码,有些则包含程序数据,而其他的则包含指导链接器和加载器的数据结构.链接器将这些块连接起来,确定链接块的运行时位置,并且修改代码和数据块中的各种位置.链接器对目标机器了解甚少,产生目标文件的编译器和汇编器已经完成了大部分工作;

目标文件有三种形式:1.可重定位目标文件包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件;2.可执行目标文件包含二进制代码和数据,其形式可以被直接拷贝到存储器并执行;3.共享目标文件一种特殊类型的可重定位目标文件,可以在加载活着运行时,被动态的加载到存储器并链接;

各个系统之间,目标文件的格式都不相同;

SUN Solaris使用的是Unix ELF(可执行可链接格式).尽管我们的讨论集中在ELF上,但是不管是那种格式,基本的概念是相似的;

ELF 头以一个16字节的序列开始,这个序列描述了字的大小和生成该文件的系统的字节顺序.ELF头剩下的

部分包含帮助链接器解析和解释目标文件的信息.其中包括了ELF头的大小,目标文件的类型(可重定位,可执行或是共享等),机器类型(IA32等),节头部表的文件偏移,以及节头部表中的表目大小和数量.不同节的位置和大小是有节头部表描述的,其中目标文件中每个节都有一个固定大小的表目;

每个可重定位目标文件m都有一个符号表,它包含m所定义和引用的符号的信息.在链接器的上下文中,有三种不同的符号:1.由m定义并能被其他模块引用的全局符号.全局链接器符号对应于非静态的c函数以及被定义为不带c的static属性的全局变量;2.由其他模块定义的并被模块m引用的全局符号.这些符号称为外部符号,对应于定义在其他模块中的c函数和变量;3. 只被模块m定义和引用的本地符号.有的本地链接器符号对应于代static属性的c函数和全局变量.这些符号在模块m中的任何地方都是可见的,但是不能被其他模块引用.

.symtab中的符号表不包含对应于本地非静态程序变量的任何符号.这些符号在运行时在栈中被管理,链接器第此类符号不感兴趣;

c程序员使用static属性在模块内部隐藏变量和函数声明;

链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来;

编译器只允许每个模块中的每个本地符号只有一个定义,编译器还确保静态本地变量,他们也也会有本地链接器符号,拥有唯一的名字;

当编译器遇到一个不是在当前模块中定义的符号(变量或是函数)时,它会假定该符号是在其他模块中定义的,生成一个链接器符号表表目,并把它交给链接器处理;

c++和java中能使用重载函数,是因为编译器将每个唯一的方法和参数列表组合编码成一个对链接器来说是一个唯一的名字.这种编码过程叫做毁坏,而相反的过程叫做恢复;

函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号;

根据强弱符号的定义,Unix链接器使用下面的规则来处理多处定义的符号:1.不允许有多个强符号;2.如果有一个强符号和多个弱符号,那么选择强符号;3.如果有多个弱符号,那么从这些弱符号中任意选择一个;

所有的编译系统都提供一种机制,将所有相关的目标文件打包为一个单独的文件,称为静态库,它也可以作为链接器的输入;

在Unix系统中,静态库以一种称为存档的特殊文件格式存放在磁盘中.存档文件是一组连接起来的可重定位目标文件的集合,有一个头部描述每个成员目标的大小和位置;

在符号解析的阶段,Unix链接器从左到右按照它们在编译器驱动程序命令行上出现的相同顺序来扫描可重定位目标文件和存档文件;

一旦链接器完成了符号解析这一步,它就把代码中的每个符号引用和确定的一个符号定义(也就是它的一个输入目标模块中的一个符号表表目)联系起来.在此时,链接器就知道它的输入目标模块中的代码节和数据节的确切大小.现在就可以开始重定位步骤了,在这个步骤中,将合并输入模块,并为每个符号分配运行时的地址. 重定位由两部分组成:重定位节和符号定义(这步完成时,程序中的每个指令和全局变量都有一个唯一的运行时存储器地址了);重定位节中的符号引用.

当汇编器生成了一个目标模块时,它并不知道数据和代码最终将存放在存储器的什么位置.它也不知道这个模块引用的任何外部定义的函数或者全局变量的位置.所以,无论何何时编译器遇到对最终位置未知的目标引用,它就会生成一个重定位表目,告诉链接器在将目标文件合并成可执行文件时如何修改这个引用,代码的重定位

表目放在.relo.text中,已初始化数据的重定位表目放在.relo.data中;

可执行文件的.init节定义了一个小函数,叫做_init,程序的初始化代码会调用它;

ELF可执行文件被设计为一个很容易加载到存储器,连续的可执行文件组块被映射到连续的存储器段.段头表描述了这种映射关系;

加载器将可执行目标文件中的代码和数据从磁盘拷到存储器中,然后通过跳转到程序的第一条指令,即入口点,来运行该程序.这个将程序拷贝到存储器并运行的过程叫做加载;

当加载器运行时,它创建了一个存储器映像.在可执行文件中段头表的知道下,加载器将可执行文件的相关内容拷贝到代码和数据段,接下来,加载器跳转到程序的入口点,也就是符号_start的地址._start地址处的启动代码是在目标文件ctrl.o中定义的,对所有的c程序都是一样的.在从.text 和.init节中调用了初始化例程后,启动代码调用atexit例程,这个程序附加了一系列在应用调用exit函数时应该调用的程序.exit函数运行 atexit注册函数,然后通过调用_exit将控制返回给操作系统,接着,启动代码调用应用程序的main程序,这就开始执行我们的c代码了,在应用程序返回之后,启动代码调用_exit程序,它将控制返回给操作系统;

Unix系统中的每个程序都运行在一个进程上下文中,这个进程上下文有自己的虚拟地址空间,当shell运行一个程序时,父shell进程生成一个子进程,他是父进程的一个复制品.子进程通过execve系统调用启动加载器.加载器删除子进程已有的虚拟存储器段,并创建一组新的代码,数据,堆和栈段.新的栈和堆段被初始化为零.通过将虚拟地址空间中的页映射到可执行文件的页大小的组块,新的代码和数据段被初始化为可执行文件的内容.最后,加载器跳转到_start地址,它最终会调用应用的main函数.除了一些头部信息,在加载过程中没有任何从磁盘到存储器的数据拷贝.直到CPU引用一个被映射的虚拟页,才会进行拷贝,此时,操作系统利用它的页面调度机制自动将页面从磁盘传送到存储器;

共享库是致力于解决静态库缺陷的一个现代创新产物.共享库是一个目标模块,在运行时,可以加载到任意的存储器地址,并在存储器中和一个程序链接起来.这个过程称为动态链接,是由一个叫做动态链接器的程序来执行的;

在存储器中,一个共享库的.text节只有一个副本可以被不同的正在运行的进程共享;

生成动态链接的可执行文件时,链接器拷贝了一些重定位和符号表信息,它们使得运行时可以解析对动态库中代码和数据的引用;

加载器将可执行文件的内容映射到存储器,并运行这个程序.链接器还可能生成部分链接的可执行程序,这样的文件中有未解析的到定义在共享库中的程序和数据的引用.在加载时,加载器将部分链接的可执行文件映射到存储器,然后调用动态链接器,它通过加载共享库和重定位程序中的引用来完成链接;

(7.7 7.11 7.12未理解)

第十章:虚拟存储器

存储器很容易被破坏.如果某个进程不小心写了另一个进程使用的存储器,那么进程可能以某种完全和程序逻辑无关的令人迷惑的方式失败;

为了更加有效地管理存储器并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟存储器.虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的,一致的,私有地址空间.通过一个很清晰的机制,虚拟存储器提供了三个重要的能力:它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高

效地使用了主存;它为每个进程提供了一个一致的地址空间,从而简化了存储器管理;它保护了每个进程的地址空间不被其他进程破坏;

虚拟存储器是危险的.每次应用程序引用一个变量,间接引用一个指针,或者调用一个诸如malloc这样的动态分配包程序时,它就会和虚拟存储器发生交互;

本章的前一部分描述虚拟存储器是如何工作的,后一部分描述的是应用程序如何使用和管理虚拟存储器;

计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每个字节都有一个唯一的物理地址;

早起的PC使用物理地址寻址,为通用计算设计的现代处理器使用的是虚拟寻址;

CPU芯片上叫做MMU的专用硬件,利用存放在主存中的查询表来动态的翻译虚拟地址,该表的内容由操作系统管理的;

一个地址空间的大小是由表示最大地址所需要的位数来描述的;

这就是虚拟存储器的思想.主存中的每个字节都有一个选自虚拟地址空间的虚拟地址,和一个选自物理地址空间的物理地址;

概念上而言,虚拟存储器被组织为一个存放在磁盘上的N个连续的字节大小的单元组成的数组.每字节都有唯一的虚拟地址,这个唯一的虚拟地址是作为到数组的索引的;

VM系统通过将虚拟存储器分割为称为虚拟页的大小固定的块,来处理这个问题.每个虚拟页的大小为2的P 次方字节.类似的,物理存储器被分割为物理页,大小也是2的p次方字节.

在任意时刻,虚拟页的集合都分为三个不相交的子集:

未分配的:VM系统还未分配的页,未分配的块没有任何数据和它们相关联,因此就不占用任何磁盘空间;

缓存的:当前缓存在物理存储器中的已分配页;

未缓存的:没有缓存在物理存储器中的已分配页;

DRAM比SRAM要慢大约10倍,而磁盘要比DRAM慢大约100000多倍.因此,DRAM缓存中的不命中比起SRAM缓存中的不命中要昂贵的多;

因为大的不命中处罚和访问第一字节的开销,虚拟页趋向于很大,典型的是4-8KB;

比起硬件对SRAM缓存,操作系统对DRAM缓存使用了更复杂精密的替换算法,最后,因为对磁盘的访问时间很长,DRAM缓存总是使用写回,而不是直写;

同任何缓存一样,虚拟存储器系统必须有某种方法来判定一个虚拟页是否放在DRAM中的某个地方.如果是,系统还必须确定这个虚拟页存放在哪个物理页中.如果不命中,系统必须判断这个虚拟页存放在磁盘的哪个位置,在物理存储器中选择一个牺牲页,并将虚拟页从磁盘拷贝到DRAM中,替换这个牺牲页;

这些功能是由许多软硬件联合提供的,包括:操作系统软件,MMU中的地址翻译硬件,和一个存放在物理存储器中叫做页表的数据结构.页表将虚拟页映射到物理页. 每次地址翻译硬件将一个虚拟地址转换为物理地址时,都会读取页表.操作系统负责维护页表的内容,以及在磁盘与DRAM之间来回传送页;

页表就是一个PTE的数组.虚拟地址空间中的每个页在页表中的一个固定偏移量处都有一个PTE;

因为DRAM缓存是全相关联的,任意物理页都可以包含任意虚拟页;

地址翻译硬件将虚拟地址作为一个索引;

虚拟存储器是在20世纪60年代早起发明的,远在CPU-存储器之间的差距的加大引发产生SRAM缓存之前; 虚拟存储器工作的相当好,这主要归功于我们的老朋友局部性;

操作系统为每个进程提供了一个独立的页表,因而也就是一个独立的虚拟地址空间;

多个虚拟页面可以映射到同一个共享物理页面上;

独立的地址空间允许每个进程为它的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处;

这样的一致性极大的简化了链接器的设计和实现,允许链接器生成全链接的可执行文件,这些可执行文件是独立于物理存储器中代码和数据的最终位置的;

一般而言,每个进程都有自己的私有代码,数据,堆以及栈区域,是不和其他进程共享的.在这种情况中操作系统创建页表,将相应的虚拟页映射到不同的物理页;

然而,在一些情况中,还是需要进程来共享代码和数据的.例如,每个进程必须调用相同的操作系统内核代码,而每个c程序都会调用标准库中的程序;

当一个运行在用户进程中的程序要求额外的堆空间时,操作系统分配一个适当的数次和连续的虚拟存储器页面,并且将它们映射到物理存储器中任意位置的k个任意的物理页面.由于页表工作的方式,操作系统没有必要分配k个连续的物理存储器页面.页面可以随机的分散在物理存储器中;

有趣的一点是加载器从不真正的从磁盘中拷贝任何数据到存储器中.当每个页面第一次被引用时,虚拟存储器系统将自动并按需的把数据从磁盘上调入到存储器,页面引用或者是当CPU取一条指令时,或者是当一条正在执行的指令引用一个存储器位置时;

任何现代计算机系统必须为操作系统提供手段来控制对存储器系统的访问.不应该允许一个用户进程修改它的只读文本段,而且也不应该允许它读或者修改任何内核中的代码和数据结构.不应该允许它读或者写其他进程的私有存储器,并且不允许它修改任何与其他进程共享的虚拟页面,除非所有的共享者都显式的允许它这么做;

运行在内核模式中的进程可以访问的任何页面,但是运行在用户模式中的进程只能访问那些SUP为0的页面; CPU中的一个控制寄存器,页表基址寄存器指向当前的页表;

MMU利用VPN来选择适当的PTE.例如vpn0选择pte0等.将页表条目中的PPN和虚拟地址中的VPO串联起来,就得到相应的物理地址,注意,因为物理和虚拟页面都是P字节的,所以PPO和VPO是相同的;

当出项页面命中时,CPU硬件执行的步骤:

处理器生成一个虚拟地址,并把它传送给MMU;

MMU生成PTE地址,并从高速缓存/主存请求得到它;

高速缓存/主存向MMU返回PTE;

MMU构造物理地址,并把它传送给高速缓存/主存;

高速缓存/主存返回所请求的数据字给处理器;

页面命中完全由硬件来处理的,而处理缺页要求硬件和操作系统内核协作完成的;

第一步到第三步同上

PTE中的有效位是零,所以MMU触发了一次异常,传递CPU中的控制到操作系统内核中的缺页异常处理程序;

缺页处理程序确定出物理存储器中的牺牲页面,如果这个页面已经被修改了,则把它页面换出到磁盘;

缺页处理程序页面调入新的页面,并更新存储器中的PTE;

缺页处理程序返回到原来的进程,驱使导致缺页的指令重新启动,CPU将引起缺页的指令重新发送给MMU.

深入理解计算机系统第二版家庭作业答案

深入理解计算机系统(第二版)家庭作业第二章深入理解计算机系统二进制 2.55-2.57 略 2.58 int is_little_endian(){ int a = 1; return *((char*)&a); } 2.59 (x&0xFF) | (y&~0xFF) 2.60 unsigned replace_byte(unsigned x, unsigned char b, int i) { return (x & ~(0xFF<<(i<<3))) | (b << (i<<3)); } 2.61 A. !~x B. !x C. !~(x>>((sizeof(int)-1)<<3)) D. !(x&0xFF) 注意,英文版中C是最低字节,D是最高字节。中文版恰好反过来了。这里是按中文版来做的。 2.62 这里我感觉应该是英文版对的,int_shifts_are_arithmetic() int int_shifts_are_arithmetic(){ int x = -1; return (x>>1) == -1; } 2.63 对于sra,主要的工作是将xrsl的第w-k-1位扩展到前面的高位。 这个可以利用取反加1来实现,不过这里的加1是加1<<(w-k-1)。

如果x的第w-k-1位为0,取反加1后,前面位全为0,如果为1,取反加1后就全是1。 最后再使用相应的掩码得到结果。 对于srl,注意工作就是将前面的高位清0,即xsra & (1<<(w-k) - 1)。额外注意k==0时,不能使用1<<(w-k),于是改用2<<(w-k-1)。 int sra(int x, int k){ int xsrl = (unsigned) x >> k; int w = sizeof(int) << 3; unsigned z = 1 << (w-k-1); unsigned mask = z - 1; unsigned right = mask & xsrl; unsigned left = ~mask & (~(z&xsrl) + z); return left | right; } int srl(unsigned x, int k){ int xsra = (int) x >> k; int w = sizeof(int)*8; unsigned z = 2 << (w-k-1); return (z - 1) & xsra; } 2.64 int any_even_one(unsigned x){ return !!(x & ()); } 2.65 int even_ones(unsigned x){ x ^= (x >> 16); x ^= (x >> 8); x ^= (x >> 4); x ^= (x >> 2); x ^= (x >> 1); return !(x&1);

计算机组成原理知识点总结——详细版

计算机组成原理2009年12月期末考试复习大纲 第一章 1.计算机软件的分类。 P11 计算机软件一般分为两大类:一类叫系统程序,一类叫应用程序。 2.源程序转换到目标程序的方法。 P12 源程序是用算法语言编写的程序。 目标程序(目的程序)是用机器语言书写的程序。 源程序转换到目标程序的方法一种是通过编译程序把源程序翻译成目的程序,另一种是通过解释程序解释执行。 3.怎样理解软件和硬件的逻辑等价性。 P14 因为任何操作可以有软件来实现,也可以由硬件来实现;任何指令的执行可以由硬件完成,也可以由软件来完成。对于某一机器功能采用硬件方案还是软件方案,取决于器件价格,速度,可靠性,存储容量等因素。因此,软件和硬件之间具有逻辑等价性。 第二章 1.定点数和浮点数的表示方法。 P16 定点数通常为纯小数或纯整数。 X=XnXn-1…..X1X0 Xn为符号位,0表示正数,1表示负数。其余位数代表它的量值。 纯小数表示范围0≤|X|≤1-2-n 纯整数表示范围0≤|X|≤2n -1

浮点数:一个十进制浮点数N=10E.M。一个任意进制浮点数N=R E.M 其中M称为浮点数的尾数,是一个纯小数。E称为浮点数的指数,是一个整数。 比例因子的基数R=2对二进制计数的机器是一个常数。 做题时请注意题目的要求是否是采用IEEE754标准来表示的浮点数。 32位浮点数S(31)E(30-23)M(22-0) 64位浮点数S(63)E(62-52)M(51-0) S是浮点数的符号位0正1负。E是阶码,采用移码方法来表示正负指数。 M为尾数。P18 P18

2.数据的原码、反码和补码之间的转换。数据零的三种机器码的表示方法。 P21 一个正整数,当用原码、反码、补码表示时,符号位都固定为0,用二进制表示的数位值都相同,既三种表示方法完全一样。 一个负整数,当用原码、反码、补码表示时,符号位都固定为1,用二进制表示的数位值都不相同,表示方法。 1.原码符号位为1不变,整数的每一位二进制数位求反得到反码; 2.反码符号位为1不变,反码数值位最低位加1,得到补码。 例:x= (+122)10=(+1111010)2原码、反码、补码均为01111010 Y=(-122)10=(-1111010)2原码11111010、反码10000101、补码10000110 +0 原码00000000、反码00000000、补码00000000 -0 原码10000000、反码11111111、补码10000000 3.定点数和浮点数的加、减法运算:公式的运用、溢出的判断。 P63 已知x和y,用变形补码计算x+y,同时指出结果是否溢出。 (1)x=11011 y=00011 (2)x=11011 y=-10101 (3)x=-10110 y=-00001

(完整版)计算机组成原理知识点总结

第2章数据的表示和运算 主要内容: (一)数据信息的表示 1.数据的表示 2.真值和机器数 (二)定点数的表示和运算 1.定点数的表示:无符号数的表示;有符号数的表示。 2.定点数的运算:定点数的位移运算;原码定点数的加/减运算;补码定点数的加/减运算;定点数的乘/除运算;溢出概念和判别方法。 (三)浮点数的表示和运算 1.浮点数的表示:浮点数的表示范围;IEEE754标准 2.浮点数的加/减运算 (四)算术逻辑单元ALU 1.串行加法器和并行加法器 2.算术逻辑单元ALU的功能和机构 2.3 浮点数的表示和运算 2.3.1 浮点数的表示 (1)浮点数的表示范围 ?浮点数是指小数点位置可浮动的数据,通常以下式表示: N=M·RE 其中,N为浮点数,M为尾数,E为阶码,R称为“阶的基数(底)”,而且R

为一常数,一般为2、8或16。在一台计算机中,所有数据的R都是相同的,于是不需要在每个数据中表示出来。 浮点数的机内表示 浮点数真值:N=M ×2E 浮点数的一般机器格式: 数符阶符阶码值 . 尾数值 1位1位n位m位 ?Ms是尾数的符号位,设置在最高位上。 ?E为阶码,有n+1位,一般为整数,其中有一位符号位EJ,设置在E的最高位上,用来表示正阶或负阶。 ?M为尾数,有m位,为一个定点小数。Ms=0,表示正号,Ms=1,表示负。 ?为了保证数据精度,尾数通常用规格化形式表示:当R=2,且尾数值不为0时,其绝对值大于或等于0.5。对非规格化浮点数,通过将尾数左移或右移,并修改阶码值使之满足规格化要求。 浮点数的机内表示 阶码通常为定点整数,补码或移码表示。其位数决定数值范围。阶符表示数的大小。 尾数通常为定点小数,原码或补码表示。其位数决定数的精度。数符表示数的正负。

计算机操作系统(第四版)1-8章 课后答案(全)

第一章操作系统引论 1.设计现代OS的主要目标是什么?答:方便性,开放性,有效性,可扩充性 2.OS的作用可表现在哪几个方面?答:OS作为用户与计算机硬件系统之间的接口;OS作为计算机系统资的管理者;OS实现了对计算机资源的抽象。 3.为什么说操作系统实现了对计算机资源的抽象?答:OS首先在裸机上覆盖一层1/0设备管理软件,实现了对计算机硬件操作的第一层次抽象;在第一层软件上再覆盖文件管理软件,实现了对硬件资源操作的第二层次抽象。0s通过在计算机硬件上安装多层系统软件,增强了系统功能,隐藏了对硬件操作的细节,由它们共同实现了对计算机资源的抽象。 4·说明推动分时系统形成和发展的主要动力是什么?答:主要动力是提高资源利用率和系统吞吐里,为了满足用户对人一机交互的需求和共享主机。 5.何谓脱机I/O和联机I/O?答:脱机1/0是指事先将装有用户程序和数据的纸带或卡片装入纸带输入机或卡片机,在外围机的控制下,把纸带或一片上的数据或程序输入到殖带上。该方式下的输入输出由外围机控制完成,是在脱离主机的情况下进行的。而耽机1/0方式是指程序和数据的輸入输出都是在主机的直接控制下进行的。 6.试说明推动分时系统形成和发展的主要动力是什么?答:推动分时系统形成和发展的主要动力是更好地满足用户的需要。主要表现在:CPU的分时使用缩短了作业的平均周转时间;人机交互能力使用户能直接控制自己的作业;主机的共享使多用户能同时使用同一台计算机,独立地处理自己的作业。 7.实现分时系统的关键问题是什么?应如何解决?答:关键问题是当用户在自己的终端上键入命令时,系统应能及寸接收并及时处理该命令,在用户能接受的时采内将结果返回给用户。解决方法:针对及时接收问题,可以在系统中设路多路卡,健主机能同时接收用户从各个终端上轮入的数据;为每个终端配路缓冲区,暂存用户捷入的命令或教据。针对反时处理问题,应便所有的用户作业都直接进入内存,并且为每个作业分配一个时间片,允许作业只在自己的时间片内运行,这样在不长的时间内,能使每个作业都运行一次。 8.为什么要引入实时OS?答:实时操作系统是指系统能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。引入实时OS是为了满足应用的需求,熏好地满足实时控制领域和实时信息处涯领域的需要。 9.什么是硬实时任务和款实时任务?试举例说明。答:硬实时任务是指系统必须满足任务对截止时间的要求,否则可能出现难以预测的结是。举例来说,运载火箭的控制等。软实时任务是指它的截止时间并不严格,偶尔错过了任务的截止时间,对系统产生的影响不大。举例:网页内容的更新、火车售票系统。 10.试从交互性、及时性以及可靠性方面,将分时系统与实时系统进行比较。答:(1)及时性:实时信息处理系统对实时性的要求与分时系统类似,都是以人所能受的等待时间来确定;而实时控制系统的及时性,是以控制对象所要求的开始截止时间或完成截止时间来确定的,一般为秒级到毫秒级,甚至有的要低于100微妙。(2)交互性:实时信息处理系统具有交互性,但人与系统的交互仅限于访问系统中某些特定的专用服务程序。不像分时系统那样能向终端用户提供数据和资源共享等服务。(3)可靠性:分时系统也要求系统可靠,但相比之下,实时系统则要求系统具有高度的可靠性。因为任何差错都可能带未巨大的经济损失,甚至是灾难性后,,所以在实时系统中,往往都采取了

计算机信息管理系统基本情况及功能说明

计算机信息管理系统基本 情况及功能说明 This model paper was revised by the Standardization Office on December 10, 2020

计算机信息管理系统基本情况及功能说明 山西福康源药业集团有限公司 基本情况 我公司使用的为用友时空医药管理软件。 用友时空在多年流通领域信息化平台研发的基础上,针对当前流通企业在快速发展过程中呈现出的管理模式创新多变、大规模快速扩张、降低运营成本获取规模效益等方面的特征,引入SOA理念,采用“工具平台化、体系架构化”的研发策略设计开发了KSOA流通企业信息融通平台(下文中简称“KSOA平台”)。 KSOA平台面向国内流通企业中高端客户,旨在以面向服务的、集成一体化的信息管理平台支撑流通企业差异化竞争、持续化发展战略的贯彻执行。 KSOA平台涵盖了流通企业经营中的业务职能、财务职能、人力资源管理职能、协同办公职能和决策支持职能等等。包括批发业务系统,连锁业务系统,零售业务系统,仓储管理系统,供应商在线自助系统,客户在线自助系统,网上在线购物系统,财务管理系统,协同办公系统,人力资源管理系统,应用服务系统等核心模块。 本《用户操作手册》对KSOA平台重点介绍包括KSOA平台涉及概念、通用单据操作说明、主要业务流程等内容,内容浅显易懂。用户在启用KSOA管理系统前,须仔细阅读本操作手册,了解各个子系统、各模块及功能情况,并在商品提供商的指导下实施、操作。

北京时空超越科技有限公司致各软件用户:请严格遵照本《用户操作手册》使用,对于因违反操作流程和规范所导致的系统问题,要求时空超越公司提供的任何相关的服务和支持,不列入商品售后服务的免费服务范畴。 对于用户在实际系统操作中所遇到,本《用户操作手册》中未有涉及的相关操作,请与北京时空超越公司技术部取得联系,获得相应解决办法及操作指导。 第一部分:平台整体概述 1.1第一章单据中出现的名词 账:账的概念来源于实际业务处理和企业会计核算方法,其表现形式与会计核算所使用账簿账页格式类似。根据核算对象不同分为商品总账、货位商品账、往来 账等。 货位:是为了明显标出些商品所在的位置,以便规范管理、统计分析、查询分类,货位可以根据用户需要灵活设置,既可以标示商品作在物理位置,也可以标示 商品所在虚拟位置。KSOA平台中货位字段西文名称是“hw”。 批号:是指用于识别“批”的一组数字或字母加数字,用以追溯和审查该批药品的生产历史。KSOA平台中批号字段西文名称是“pihao”。 保质期:的保质期是指商品在条件下的质量保证期限。商品的保质期由提供,标注在限时使用的商品上。在保质期内,商品的生产企业对该商品质量符合有关标 准或明示担保的质量条件负责,销售者可以放心销售这些商品,消费者可以 安全使用。保质期在单据明细项中相应字段是“baozhiqi”字段。 商品淘汰:流通企业在经营过程中,对于因各种原因(如滞销等)不适合销售的商品

02318自考计算机组成原理(问答)总结讲解

1.简述主存与CACHE之间的映象方式。 【答案】主存与CACHE之间的映象方式有直接映象、全相联印象、组相联印象三种。直接映象是指主存储器中的每个块只能够映象到CACHE中唯一一个指定块的地址映象方式。全相联映象是指每个主存块都能够映象到任一CACHE块的地址映象方式。组相联印象是直接映象和全相联映象两种方式的结合,它将存储空间分成若干组,在组间采用直接映象方式,而在组内采用全相联印象方式。 2.简述存储器间接寻址方式的含义,说明其寻址过程。 【答案】含义:操作数的地址在主存储器中,其存储器地址在指令中给出。 寻址过程:从指令中取出存储器地址,根据这个地址从存储器中读出操作数的地址,再根据这个操作数的地址访问主存,读出操作数。 3.微程序控制器主要由哪几部分构成?它是如何产生控制信号的? 【答案】微程序控制器主要由控制存储器、微指令寄存器μIR、微地址寄存器μAR、地址转移逻辑等构成。 操作控制信号的产生:事先把操作控制信号以代码形式构成微指令,然后存放到控制存储器中,取出微指令时,其代码直接或译码产生操作控制信号。 4.简述提高总线速度的措施。 【答案】从物理层次:1增加总线宽度;2增加传输的数据长度;3缩短总线长度;4降低信号电平;5采用差分信号;6采用多条总线。从逻辑层次:1简化总线传输协议;2采用总线复用技术;3采用消息传输协议。 5.简述中断方式的接口控制器功能。 【答案】中断方式的接口控制器功能:①能向CPU发出中断请求信号;②能发出识别代码提供引导CPU在响应中断请求后转入相应服务程序的地址;③CPU要能够对中断请求进行允许或禁止的控制;④能使中断请求参加优先级排队。 6.CPU与DMA访问内存冲突的裁决的方法有哪些? 【答案】①CPU等待DMA的操作;②DMA乘存储器空闲时访问存储器;③CPU与DMA交替访问存储器。 08真题1.高速缓存Cache用来存放什么内容?设置它的主要目的是什么? (3分) 参考答案:Cache中存放当前活跃的程序和数据,作为主存活跃区的副本。(2分) 设置它的主要目的是解决CPU 与主存之间的速度匹配。(2分) 2.什么是堆栈?说明堆栈指针SP的作用。(3分) 参考答案:堆栈是一种按先进后出(或说成是后进先出)顺序进行存取的数据结构或存储区域。常在主存中划一小块连续单元区作为堆栈。(3分) 堆栈指针SP是用来保存最后进入堆栈的位置(栈顶)的寄存器。(1分) 3.简述微程序控制方式的基本思想。它有什么优点和缺点? (3分) 参考答案:(P132-134)微程序控制的基本思想可归纳为: (1)将微操作命令以微码形式编成微指令,并事先固化在控制存储器(ROM)中。(1分) (2)将一条机器指令的操作分解为若干微操作序列,用一段微程序对应地解释执行,微程序中每条微指令所包含的微命令控制实现一步操作。(1分) 优点:结构规整,有利于设计自动化;易于修改与扩展,灵活性、通用性强;适于作系列机的控制器,性能价格比较高;可靠性较高,易于诊断与维护。(1分) 缺点:速度相对较慢。(1分) 4.什么是中断?请说明它的特点和适用场合。(3分) 参考答案:中断是指在计算机的运行过程中,CPU接到更紧迫的服务请求而暂停执行现行程序,转去执行中断服务程序,以处理某些随机事态;并在处理完毕后自动恢复原程序的执行。(2分) 主要特点是具有随机性,通过执行程序来处理随机事件。(1分) 它适用于中低速I/O操作的管理,以及处理随机发生的复杂事件。(1分) 5.什么是串行总线?什么是并行总线?试比较它们的应用场合。(3分) 参考答案:串行总线采用一条数据线;并行总线采用多条线路并行地传输数据信号。(2分) 串行总线一般用于较长距离的较低速率的数据传输;并行总线一般用于较短距离的高速数据传输。(2分) 07真题1.半导体随机访问存储器芯片主要有哪两种类型?(5分) 参考答案:主要有静态存储器(SRAM)芯片和动态存储器(DRAM)芯片。 2.简述CISC和RISC的含义。(5分) 参考答案:CISC:复杂指令系统计算机,其指令条数较多,指令功能和结构复杂,进而机器结构复杂。(2分)RISC:精简指令系统计算机,其指令条数较少,指令结构和功能简单,进而机器结构简单,提高了机器的性能价格比。

计算机操作系统习题答案武汉大学出版社

第一章操作系统概论 1.单项选择题 ⑴B; ⑵B; ⑶C; ⑷B; ⑸C; ⑹B; ⑺B;⑻D;⑼A;⑽B; 2.填空题 ⑴操作系统是计算机系统中的一个最基本的系统软件,它管理和控制计算机系统中的各种系统资源; ⑵如果一个操作系统兼有批处理、分时和实时操作系统三者或其中两者的功能,这样的操作系统称为多功能(元)操作系统; ⑶没有配置任何软件的计算机称为裸机; ⑷在主机控制下进行的输入/输出操作称为联机操作; ⑸如果操作系统具有很强交互性,可同时供多个用户使用,系统响应比较及时,则属于分时操作系统类型;如果OS可靠,响应及时但仅有简单的交互能力,则属于实时操作系统类型;如果OS在用户递交作业后,不提供交互能力,它所追求的是计算机资源的高利用率,大吞吐量和作业流程的自动化,则属于批处理操作系统类型; ⑹操作系统的基本特征是:并发、共享、虚拟和不确定性; ⑺实时操作系统按应用的不同分为过程控制和信息处理两种; ⑻在单处理机系统中,多道程序运行的特点是多道、宏观上并行和微观上串行。

第二章进程与线程 1.单项选择题 ⑴B;⑵B;⑶ A C B D; ⑷C; ⑸C; ⑹D; ⑺C; ⑻A; ⑼C; ⑽B; ⑾D; ⑿A; ⒀D; ⒁C; ⒂A; 2.填空题 ⑴进程的基本状态有执行、就绪和等待(睡眠、阻塞); ⑵进程的基本特征是动态性、并发性、独立性、异步性及结构性; ⑶进程由控制块(PCB)、程序、数据三部分组成,其中PCB是进程存在的唯一标志。而程序部分也可以为其他进程共享; ⑷进程是一个程序对某个数据集的一次执行; ⑸程序并发执行与顺序执行时相比产生了一些新特征,分别是间断性、失去封闭性和不可再现性; ⑹设系统中有n(n>2)个进程,且当前不在执行进程调度程序,试考虑下述4种情况: ①没有运行进程,有2个就绪进程,n个进程处于等待状态; ②有一个运行进程,没有就绪进程,n-1个进程处于等待状态; ③有1个运行进程,有1个等待进程,n-2个进程处于等待状态; ④有1个运行进程,n-1个就绪进程,没有进程处于等待状态; 上述情况中不可能发生的情况是①; ⑺在操作系统中引入线程的主要目的是进一步开发和利用程序内部的并行性;

深入理解计算机系统lec01-intro

Computer Systems: A Programmer’s Perspective 计算机系统详解 Lecture 1 Intro February 25, 2011 Wu junmin (jmwu@https://www.doczj.com/doc/7014651650.html,)

Outline °Course Theme °Five great realities of computer systems °Administrative Matters °Lecture topics and assignments

课程出发点 ° Abstract vs. Reality °抽象是必须的,但也应该考虑问题的实现! °其他计算机课程通常强调抽象的地方: ?抽象数据类型 ?渐进分析法 °这些抽象往往是受限的: ?特别是当计算机系统中存在一些小的缺陷 ?有必要去深入了解计算机系统中一些底层的实现 °通过了解具体的实现有助于: ?成为更有效率的程序员 -能够更有效的找出并且消除bug -能够更好的进行程序性能调优 ?为以后的计算机类“系统”级课程做好准备 -编译, 操作系统, 网络, 计算机体系结构, 嵌入式系统等等

Great Reality #1 °Int ’s 不是整数, Float ’s 不是实数°举例 ? x 2 ≥ 0? -Float ’s: 是! -Int ’s: – 40000 * 40000 --> 1600000000 – 50000 * 50000 --> ?? ? (x + y) + z = x + (y + z)? -Unsigned & Signed Int ’s: 是! -Float ’s: – (1e20 + -1e20) + 3.14 --> 3.14 – 1e20 + (-1e20 + 3.14) --> ?? -1794967296 0

计算机系统的操作和管理操作规程

李生晓梦晓李飞刀制作双击可修改,再上传必究 再上传必究计算机系统的操作和管理操作规程 1、目的:通过制定计算机系统的操作和管理操作规程,有效控制计算机系统的操作和管理符合质量规定的要求。 2、依据:新《药品经营质量管理规范》及现场检查指导原则的规定制定本制度。 3、适用范围:适用计算机系统的操作和管理全过程。 4、责任者:分店所有在册人员。 5、内容: 5.1计算机信息管理员依照编制好操作人员岗位权限,对员工发放管理软件登录使用信息,由使用者保存,应注意对自己使用的登录信息做到保密,由质量负责人监督,防止人员之间相互跨权限登录使用计算机管理系统。 5.2计算机信息管理员负责建立系统管理软件的服务器和数据库,对数据库产生的数据信息应采取安全保密的储存管理,对每天产品的数据信息进行备份,防止数据缺失,数据应保存至少5年。 5.3当数据的录入因疏忽产生错误时,操作人员应当及时联系门店质量负责人及计算机信息管理员提出数据修改申请,由质量负责人审核、确认后,由计算机信息管理员进行数据的修改。 5.4药品在计算机系统上的采购和收货:采购员每次采购药品时,依据系统数据库生成采购订单,采购订单确认后,系统自动生成采购计划;药品到货时,收货员根据系统生成的采购计划,对照实物确认相关信息后,方可进行验收,系统录入相关信息后系统生成“采购记录”。 5.5药品在计算机系统上的验收:药品验收员按规定进行药品质量验收,对照药品实物在系统采购记录的基础上核对药品的批号、生产日期、有效期、到货数量等内容并系统确认后生成验收记录。 5.6药品在计算机系统上的养护:系统依据质量管理基础数据和养护制度,对药品按期

深入理解计算机系统LAB2

LAB1实验报告 实验目的: 使用课程知识拆除一个“Binary Bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等理解。 实验简介: 一个“Binary Bombs”(二进制炸弹,简称炸弹)是一个Linux可执行C程序,包含phase1~phase6共6个阶段。炸弹运行各阶段要求输入一个字符串,若输入符合程序预期,该阶段炸弹被“拆除”,否则“爆炸”。实验目标是你需要拆除尽可能多的炸弹。 运行结果: 通关密码储存在0014301-151420131.txt文件中。 成功运行结果截图: 实验中的六组密码:

PHASE1:字符串比较 本关比较简单,根据课件中的提示用GDB将最先压栈的那个字符串常量打印出来,然后将其作为密码输入,比较成功后即通关。 08048ab2 : 8048ab2: 83 ec 14 sub $0x14,%esp 8048ab5: 68 04 9f 04 08 push $0x8049f04 8048aba: ff 74 24 1c pushl 0x1c(%esp) 8048abe: e8 4d 04 00 00 call 8048f10 将地址0x8049f04中的值打印出来: 即“The future will be better tomorrow.” PHASE2:循环 在查看汇编语言的时候,会看到有调用一个read_six_number函数,猜测此题是让输入六个数字。 08048ad3 : 8048ad3: 56 push %esi 8048ad4: 53 push %ebx 8048ad5: 83 ec 2c sub $0x2c,%esp 8048ad8: 8d 44 24 10 lea 0x10(%esp),%eax 8048adc: 50 push %eax 8048add: ff 74 24 3c pushl 0x3c(%esp) 8048ae1: e8 46 05 00 00 call 804902c 8048ae6: 83 c4 10 add $0x10,%esp 8048ae9: 83 7c 24 08 01 cmpl $0x1,0x8(%esp)------→判定是否为1 8048aee: 74 1e je 8048b0e 8048af0: e8 12 05 00 00 call 8049007 8048af5: eb 17 jmp 8048b0e 8048af7: 8b 03 mov (%ebx),%eax 8048af9: 01 c0 add %eax,%eax----→进行自加,扩大两倍 8048afb: 39 43 04 cmp %eax,0x4(%ebx) 8048afe: 74 05 je 8048b05 8048b00: e8 02 05 00 00 call 8049007 8048b05: 83 c3 04 add $0x4,%ebx 8048b08: 39 f3 cmp %esi,%ebx 8048b0a: 75 eb jne 8048af7 8048b0c: eb 0a jmp 8048b18

计算机控制系统基本知识

第一部分DCS系统介绍 第一章计算机控制系统简介 第一节概述 计算机控制系统是指以计算机为控制设备所组成的自动控制系统。计算机具有实现各种数学运算和逻辑判断的能力。其主要特点是: 1运算速度快,能存储大量的数据,具有很强的信息处理能力; 2、容易实现各种控制规律(PID控制、串级控制、复合控制等); 3、将显示、打印、报警、给定参数等功能集中在控制台上,方便运行人员操作与监视; 4、指导运行人员正确地进行操作和控制。 计算机在电厂生产过程自动化中的应用,主要有以下三个方面。 1数据采集和处理 计算机数据采集和处理系统的功能是:定时采集生产过程中大量的,经过一次测量仪表 发送、统一信号、模/数转换后的过程参数信号,并按预定的要求对它们进行分析、计算和处理,最后进行CRT显示、报警、打印或储存。 计算机数据采集处理系统的结构示意图如下图实线部分所示。 数据处理的另一种应用形式是操作指导。计算机根据生产过程提出的数学模型进行计 算,寻找出生产过程的最优操作条件和数值,并CRT显示屏上显示出来或通过打印机打印 给操作人员。由操作人员去改变模拟调节器的给定值或直接操纵执行机构,从而把生产过程控制在最佳状态。 操作指导属于计算机开环监控方式。

简图:计算机数据处理与操作指导系统 2、直接数字控制(DDC) 生产过程的被调参数通过模拟量输入计算机,由计算机按预定的控制规律进行运算,并运算的结果由输出通道去直接控制执行机构,从而把被调参数保持在给定值上。这样的控制方式称为直接数字控制。 简图:直接数字控制系统 3、监督计算机控制(SPC) 监督计算机控制是指计算机根据生产过程的信息,按照过程的数学模型,求出生产过程 最优运转的操作条件和数值,并直接去改变模拟调节器的给定值,由模拟调节器或DDC控制机实行对生产过程的控制,从而使生产过程处于最优化状态。 简图:监督计算机控制系统

计算机组成原理考试重点以及题库总结

计算机组成原理考试重点以及题库总结

计算机组成原理考试重点以及题库总结 第一章 重点一:计算机系统由硬件和软件两部分组成,软件又分为系统软件和应用软件。 重点二:冯诺依曼机的组成与特点 1.冯诺依曼机由控制器、运算器、存储器、输入设备和输出设备五 部分组成。 2.数据和指令存储在存储器,按地址访存。 3.指令和数据用二进制表示。 4.指令由操作码和地址码组成。 5.存储程序 6.以运算器为中心 重点三:区分存储字、存储字长、机器字长、CPI、MIPS、FLOPS 存储字:存储单元中二进制代码的组合。 存储字长:存储单元中二进制代码的位数。 机器字长:CPU 一次能处理数据的位数,与CPU中的寄存器位数有关

CPI:执行一条指令所需时钟周期数 MIPS:每秒执行百万条指令 FLOPS:每秒浮点运算次数 题库中对应的习题: 1、存储字是指() A、存放在一个存储单元中的二进制代码组合 B、存放在一个存储单元中的二进制代码位数 C、存储单元的个数 D、机器指令的位数 2、存储字长是指() A、存放在一个存储单元中的二进制代码组合 B、存放在一个存储单元中的二进制代码位数 C、存储单元的个数 D、机器指令的位数 3、电子计算机的发展已经经历了四代,四代计算机的主要元器件分别是() A、电子管、晶体管、中小规模集成电路、激光器件 B、晶体管、中小规模集成电路、激光器件、光介质 C、电子管、晶体管、中小规模集成电路、大规模集成电路 D、电子管、数码管、中小规律集成电路、激光器件 4、完整的计算机系统应包括() A 运算器、存储器、控制器 B 外部设备和主机 C 主机和应用程序 D 配套的硬件设备和软件系统

管理系统中计算机应用

《管理系统中计算机应用》期末复习题 一、单选题 1.使用EXCEL建立的工作簿文件的扩展名是( A )。 2.在Excel中,组成一个工作表的基本单元是( C )。 3.在Excel中,默认状态下新建的工作簿中包含的工作表数量是( C )。 4.企业中业务信息的特点是数据(A )。 5.数据处理过程是从(C ) 6.输入数组公式之后,会发现公式自动出现一对( C ),即代表数组公式输入成功。 7.以下单元格描述方式中采用混合引用的是( C )。 8.下列选项中,属于推动移动商务发展的新兴技术的是( C ) 9.以下单元格描述方式中采用绝对引用的是( A )。 10.企业计算机应用从组织内部向外部逐步扩展、延伸的过程称为企业的( B ) 11.人们日常生活和工作接触最多的信息系统是( A ) 12.下单元格描述方式中采用相对引用的是( B )。 13.包含智能化查询和服务支持系统的DSS应用被称为( B ) 14.按键盘组合键( A )即可输入数组公式,实现一次性对多个单元格输入公式的操作。 15.Excel2003是一种主要用于( A )的工具。 16. 在Excel中,默认状态下新建的工作簿中包含的工作表数量是(C )。 17.按拓扑结构划分,计算机网络分为( C ) 18.根据资源分布结构和处理过程的不同,网络信息处理平台分为( D ) 19. 工作表第28列的列标为( B )。 20 在Excel中,单元格地址的表示方式是( A )。 21.因特网发展的基础框架是( A ) 22.由数据库、计算机软硬件系统、数据库管理系统、数据库管理员和用户构成的整体是(B ) 23. 在单元格中输入数据时,如果需要在单元格内换行应使用( C )键。 24. 在默认格式下,当在一个单元格内输入6-1时,单元格中显示的数据为( C )。 25.能充分利用多处理器平台,同步处理数据的数据库系统是(D ) 26.从一个学生关系中找出所有学生考试成绩的操作属于( A ) 27.如果一个关系模式的码由单一属性构成,那么它(D ) 28.在SQL语言中,命令动词DELETE属于( C ) 29.以下运算中不是算数运算符的是( D )。 30.以人的观点模拟事物本身的模型称为(B ) 31.从规划内容上看,企业信息系统规划分为(D ) 32.在可行性分析中,能回答“项目在企业中能否获得支持”的是(D ) 33.在Excel 中,给当前单元格输入数值型数据时,默认为( C )。 34.在用户需求难以确定的情况下,信息系统开发宜选用( D ) 35.当向Excel 工作表单元格输入公式时,使用单元格地址D$2 引用D 列2 行单元格,该单元格的引用称为( B )。

计算机组成原理考点总结

《计算机组成原理》总结 --内部复习文件 第一章计算机系统概论 1.1计算机的分类 电子计算机分两大类:电子模拟计算机、电子数字计算机 2.4计算机的性能指标:(基本运算p5) ⑴处理机字长:处理机运算器一次能够完成二进制运算的位数,如32位、64位 ⑵存储器容量:存储器中所有存储单元的总数目,通常用 KB,MB,GB,TB来表示 ⑶计算机五个组成部分:存储器、运算器、控制器、输入设备、输出设备(其中cpu由运算器和控制器组成) ⑷冯.诺依曼型计算机的设计思想:存储程序并按地址顺序执行 ⑸计算机软件一般分为两大类:①系统程序②应用程序 ⑹硬件可以由软件来实现,软件也可以由硬件来实现,故软件与硬件的逻辑等价性。 第二章运算方法和运算器 1.计算机中常用的数据表示格式有两种:一是定点格式,二是浮点格式。 2.阶码位数多,表示数的范围大;尾数位数多,说明该数的精确度越高。 3.数的机器码表示:原码、反码、补码、移码表示法

4.浮点加、减法运算步骤:(0操作数检查)、(比较阶码大小并完成对阶)、(尾数求和运算)、(结果规格化处理)、(舍入处理) 第三章多层次的存储器 3.1.1存储器的分类: 1.按存取方式分:随机存储器和顺序存储器 2.按存储内容可变分:只读存储器(ROM)和随机存储器(RAM) 3.6 cache基本原理: ①cache解决的问题:为了解决cpu与主存之间速度不匹配问题; ②cache基于的原理:程序运行过程中具有(空间局部性)和(时间局部性)原理。 ③cache实现是由(硬件)方式实现 ④cache地址没有增加,容量也没有增加。 ⑤cache命中率:(重点p91大题计算) 3.6.2 主存与cache的地址映射 ①全相联映射方式:主存中的任意一块可以放在cache中的任意一行上优点:非常灵活缺点:比较电路难以设计和实现适用:适合于小容量cache采用 ②直接映射方式:主存块只能拷贝到cache的一个特定位置上优点:硬件简单,成本低缺点:每个主存块只有一个固定的行位置可存放。适用:适合需要大容量cache的场合。 ③组相联映射方式:综合前面两者的优缺点。 3.6.3 替换策略

《计算机组成原理》总结完整版

《计算机组成原理》学科复习总结 ★第一章计算机系统概论 ?本章内容:本章主要讲述计算机系统的组成、计算机系统的分层结构、以及计算机的一些主要指标等 ?需要掌握的内容:计算机软硬件的概念,计算机系统的层次结构、体系结构和计算机组成的概念、冯.诺依曼的主要思想及其特点、计算机的主要指标 ?本章主要考点:概念 1、当前的CPU由那几部分组成组成? 控制器、运算器、寄存器、cache (高速缓冲存储器) 2、一个完整的计算机系统应包括那些部分? 配套的硬件设备和软件系统 3、什么是计算机硬件、计算机软件?各由哪几部分组成?它们之间有何联系? 计算机硬件是指计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机设备的实物组成。主要包括运算器(ALU)、控制器(CU)、存储器、输入设备和输出设备五大组成部分。软件是计算机程序及其相关文档的总称,主要包括系统软件、应用软件和一些工具软件。软件是对硬件功能的完善与扩充,一部分软件又是以另一部分软件为基础的再扩充。 4、冯·诺依曼计算机的特点 ●计算机由运算器、存储器、控制器、输入设备和输出设备五大部件组成 ●指令和数据以同等地位存于存储器内,可按地址寻访 ●指令和数据用二进制表示 ●指令由操作码和地址码组成,操作码用来表示操作的性质,地址码用来表示操作数在存储 器中的位置 ●指令在存储器内按顺序存放 ●机器以运算器为中心,输入输出设备和存储器间的数据传送通过运算器完成 5、计算机硬件的主要技术指标 ●机器字长:CPU 一次能处理数据的位数,通常与CPU 中的寄存器位数有关 ●存储容量:存储容量= 存储单元个数×存储字长;MAR(存储器地址寄存器)的位数 反映存储单元的个数,MDR(存储器数据寄存器)反映存储字长 主频 吉普森法 ●运算速度MIPS 每秒执行百万条指令 CPI 执行一条指令所需的时钟周期数 FLOPS 每秒浮点运算次数 ◎第二章计算机的发展及应用 ?本章内容:本章主要讲述计算机系统、微型计算机系统的发展过程以及应用。 ?需要掌握的内容:计算机的发展的不同阶段区分的方法、微型计算机发展中的区分、摩尔定律 ?本章主要考点:概念 1、解释摩尔定律

计算机操作系统【第八章】 汤子瀛版

计算机操作系统【第八章】 1.分别就数据项、记录和文件的概念进行解释。 数据项可分为基本数据项和组合数据项。基本数据项是用于描述一个对象某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,又称为原子数据、数据元素或字段,其具有数据名、数据类型及数据值三个特性。组合数据项则由若干数据项构成。记录是一组相关数据项的集合,用于描述一个对象某方面的属性。文件是具有文件名的一组相关信息的集合。 2.按文件的物理结构,可将文件分为哪几类? 按文件的物理结构,可将文件分为三类:(1)顺序文件,指把逻辑文件中的记录顺序地存储到连续的物理盘块中;(2)链接文件,指文件中的各个记录可以存放在不相邻的各个 物理块中,但通过物理块中的链接指针,将它们链接成一个链表;(3)索引文件,指文件中的各个记录可以存放在不相邻的各个物理块中,但通过为每个文件建立一张索引表来实 现记录和物理块之间的映射关系。 3.文件系统的模型可分为三层,试说明其每一层所包含的基本内容。 答:文件系统模型如图所示: (1)最低层为对象及其属性说明,主要包括文件、目录、磁盘存储空间等三类对象。(2)最高层是文件系统提供给用户的接口,分为命令接口、程序接口和图形化用户接口等三 种类型。(3)中间层是对对象进行操纵和管理的软件集合,是文件系统的核心部分,拥有文件存储空间管理、文件目录管理、地址映射、文件读写管理及文件共享与保护等诸多功能。具体又可分为四个子层:①I/O控制层(又称为设备驱动程序层),主要由磁盘驱动程序和磁带驱动程序组成,负责启动I/O设备和对设备发来的中断信号进行处理;②基本文 件系统层(又称为物理I/O层),主要用于处理内存与磁盘或磁带机系统之间数据块的交换,通过向I/O控制层发送通用指令及读写的物理盘块号与缓冲区号等I/O参数来完成;③基 本I/O管理程序层(即文件组织模块层),负责完成与磁盘I/O有关的大量事务,包括文件所在设备的选定、文件逻辑块号到物理块号的转换、空闲盘块的管理及I/O缓冲的指定等; ④逻辑文件系统层,负责所读写的文件逻辑块号的确定、目录项的创建与修改、文件与记录的保护等。 文件系统接口 对对象操纵和管理的软件集合逻辑文件系统 基本I/O管理程序(文件组织模块) 基本文件系统(物理I/O层) I/O控制层(设备驱动程序) 对象及其属性说明 4.对于一个较完善的文件系统,应具备哪些功能? 对于一个较完善的文件系统,应具备一系列的功能,包括对文件存储空间的管理、目录管理、文件的读写管理以及文件的共享与保护等。其中,有些功能对用户是透明的,就呈现 在用户面前的功能来说,可通过用户对文件所能施加的操作来表现。对文件的操作可分为两大类:一类是对文件自身的操作,包括文件的创建、删除、读、写、截断及文件读/写位 置的设置;一类是对记录的操作,包括记录的遍历(即检索所有记录)、单个记录的检索以及记录的插入、修改和删除。 5.什么是文件的逻辑结构?什么是文件的物理结构? 文件的逻辑结构是指从用户的观点出发所观察到的文件组织形式,也就是用户可以直接处理的数据及其结构,它独立于物理特性;而文件的物理结构则是指文件在外存上的存储组

计算机组成原理知识点总结

《计算机组成原理》(白中英)复习 第一章计算机系统概论 电子数字计算机的分类(P1) 通用计算机(超级计算机、大型机、服务器、工作站、微型机和单片机)和专用计算机。计算机的性能指标(P5) 数字计算机的五大部件及各自主要功能(P6) 五大部件:存储器、运算器、控制器、输入设备、输出设备。 存储器主要功能:保存原始数据和解题步骤。 运算器主要功能:进行算术、逻辑运算。 控制器主要功能:从内存中取出解题步骤(程序)分析,执行操作。 输入设备主要功能:把人们所熟悉的某种信息形式变换为机器内部所能接收和识别的二进制信息形式。 输出设备主要功能:把计算机处理的结果变换为人或其他机器所能接收和识别的信息形式。 计算机软件(P11) 系统程序——用来管理整个计算机系统 应用程序——按任务需要编制成的各种程序 第二章运算方法和运算器 课件+作业 第三章内部存储器 存储器的分类(P65) 按存储介质分类: 易失性:半导体存储器 非易失性:磁表面存储器、磁芯存储器、光盘存储器 按存取方式分类: 存取时间与物理地址无关(随机访问): 随机存储器RAM——在程序的执行过程中可读可写 只读存储器ROM——在程序的执行过程中只读 存取时间与物理地址有关(串行访问): 顺序存取存储器磁带 直接存取存储器磁盘 按在计算机中的作用分类: 主存储器:随机存储器RAM——静态RAM、动态RAM 只读存储器ROM——MROM、PROM、EPROM、EEPROM Flash Memory 高速缓冲存储器(Cache) 辅助存储器——磁盘、磁带、光盘 存储器的分级(P66) 存储器三个主要特性的关系:速度、容量、价格/位 多级存储器体系结构:高速缓冲存储器(cache)、主存储器、外存储器。 主存储器的技术指标(P67) 存储容量:存储单元个数M×每单元位数N 存取时间:从启动读(写)操作到操作完成的时间 存取周期:两次独立的存储器操作所需间隔的最小时间,时间单位为ns。

相关主题
文本预览
相关文档 最新文档