计算机科学引论 70页

  • 542.31 KB
  • 2022-08-30 发布

计算机科学引论

  • 70页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
  4. 网站客服QQ:403074932
CPU的结构和指令的执行计算机科学引论\nCPU的基本部件计算机的基本模型有两个部件内存存储需要处理的数据存储处理好的数据存储程序CPU执行存储在内存中的程序,把需要处理的数据变换成所期望的新格式或内容(处理好的数据)结构比内存复杂得多内存CPU8/27/20212MachineStructure\nCPU的基本部件CPU究竟需要哪些部件?CPU的工作:执行程序(program)程序:一系列的指令(instruction)指令:对一个或多个数进行某个操作Z=X+YA=B*C操作(operator)操作数(operand)让CPU工作的第一步:告诉它操作和操作数的信息CPU只认识二进制数把指令编码成二进制数8/27/20213MachineStructure\nCPU的基本部件指令编码编码操作常用操作个数:20-30个用4-5位二进制数即可编码8/27/20214MachineStructure\nCPU的基本部件指令编码编码操作数操作数存储在内存中内存用地址索引用地址编码操作数?32位平台,地址一般是32位3操作数指令的话,地址要32*3=96位!现代内存相对于现代CPU的速度来说也太慢了把操作数放到快而小的存储空间指令中只编码一个地址8/27/20215MachineStructure\nCPU的基本部件指令编码编码操作数操作数放在哪里?比较小,可以用很短的地址编码非常快,和CPU的计算速度相当要快,就要小!寄存器(register)8/27/20216MachineStructure\nCPU的基本部件指令编码寄存器(register)CPU中存放操作数的空间小:一般不超过32个快:一般一个CPU周期可访问多次(2到10多次)编码操作数编码寄存器的地址32个寄存器须用5位二进制编码,3个操作数需要3*5=15位二进制数CPU寄存器内存8/27/20217MachineStructure\nCPU的基本部件指令编码寄存器中的数从何而来?数据总是存储在内存中的数据必须从内存读内存访问指令:只编码一个地址RISC类CPU甚至只编码半个地址,一个32位地址须由两条指令装载到寄存器并拼接而成CPU需要内存访问单元(memoryunit)CPU寄存器内存MU8/27/20218MachineStructure\nCPU的基本部件指令所指定的操作需要执行CPU需要有执行部件不同功能的执行部件有不同的名字ALU:算术逻辑单元(执行整数算术逻辑运算)FPU:浮点单元(执行浮点运算)……CPU寄存器MUALUFPU为何ALU/FPU要接到MU上?CISC类CPU允许指令使用内存操作数现代CPU为优化执行速度而这么设计8/27/20219MachineStructure\nCPU的基本部件指令也必须从内存中读取存储程序取指部件(instructionfetch)CPU寄存器MUALUFPUIFIF要读内存,连上MU?较老的CPU是这么设计的较新的CPU其MU被分裂成多个部件以提高速度8/27/202110MachineStructure\nCPU的基本部件指令从哪个内存单元取?IP/PCInstructionPointer,ProgramCounterCPU寄存器MUALUFPUIFPC每次取到指令后,IP/PC自动加适当的值指向下一条指令分支指令怎么办?8/27/202111MachineStructure\nCPU的基本部件控制器(ControlUnit)控制指令执行过程,协调各部件工作CPU寄存器MUALUFPUIFPCCUCPU核心逻辑,最难设计的部分。设计优劣直接影响CPU的性能。8/27/202112MachineStructure\nCPU指令执行过程第一步:取指把IP/PC的值交给MUMU读到指令给IFIP/PC增加,指向下一条指令寄存器MUALUFPUIFPCCU.8/27/202113MachineStructure\n指令执行过程第二步:指令译码(decode)解出指令的操作和操作数,并从寄存器读出需要的操作数寄存器MUALUFPUIFPCCUaddr1,r2,r3指令寄存器8/27/202114MachineStructure\n指令执行过程第三步:运算执行指令所指定的运算寄存器MUALUFPUIFPCCUaddr1,r2,r38/27/202115MachineStructure\n指令执行过程第四步:内存访问如果是要读写内存的指令:读写内存如果不是?暂停等待一周期,或跳过寄存器MUALUFPUIFPCCUaddr1,r2,r38/27/202116MachineStructure\n指令执行过程第五步:写回把结果写回寄存器寄存器MUALUFPUIFPCCUaddr1,r2,r38/27/202117MachineStructure\nMIPS的指令执行简化表示IFtchDcdExecMemWBALUI$RegD$RegPCinstructionmemory+4rtrsrdregisterALUDatamemoryimm1.取指2.译码3.执行4.内存5.写回8/27/202118MachineStructure\n程序的执行程序是多条指令的序列一条接一条地执行较老的CPU是这么设计的但很慢ALUI$RegD$RegALUI$RegD$Reg8/27/202119MachineStructure\n加速程序执行的方法流水线(pipeline)流水线是工业化生产的重要概念极大地提高了劳动生产率也可以提高CPU部件的“劳动生产率”流水线为什么有效?指令执行各步骤占用的部件不同如果各步骤串行进行,则大部分部件在大部分时间都空闲各步骤并行,让各部件都忙起来8/27/202120MachineStructure\n加速指令执行的方法指令执行各步骤部件占用情况第一步:取指IP/PC,MU,IF第二步:译码寄存器第三步:运算ALU/FPU第四步:内存访问MU第五步:写回寄存器8/27/202121MachineStructure\n加速指令执行的方法一条指令执行中占用资源情况寄存器MUALUFPUIFPCCU第一条指令开始译码的时候,取指的资源已经空闲此时已经可以开始取第二条指令了8/27/202122MachineStructure\n加速指令执行的方法指令流水线把多条指令的各执行步骤并行ALUI$RegD$RegALUI$RegD$RegALUI$RegD$RegALUI$RegD$Reg8/27/202123MachineStructure\n加速指令执行的方法周期(cycle)指令执行一步所需要的时间要使用流水线技术,各不同步骤的执行时间必须相同:都是一周期在同一个周期,有多条指令在流水线中每条指令在不同的执行步骤,占用不同的部件8/27/202124MachineStructure\n加速指令执行的方法流水线的性能例:执行10条指令,每指令5步骤,每步骤一周期不用流水线:5*10=50周期5级流水线:10+(5-1)=14周期加速比:50/14=3.57流水线的理论最高加速比=级数指令数越多,加速比越高无限多条指令加速比=级数一条指令??加速比为1不能加速!8/27/202125MachineStructure\n加速指令执行的方法流水线的性能指令的延迟(latency)执行一条指令所需时间流水线不能减少单条指令的延迟流水线可以减少程序的延迟指令的产出(throughput)单位时间内系统处理的指令数流水线可以增加指令的产出8/27/202126MachineStructure\n加速指令执行的方法流水线问题结构竞争:同一个周期使用相同的部件1.内存访问竞争ALUI$RegD$RegALUI$RegD$RegALUI$RegD$RegALUI$RegD$Reg8/27/202127MachineStructure\n加速指令执行的方法内存访问竞争在同一个周期,需要同时读取数据和指令用两个不同的内存:DSP、嵌入式CPU等用两个高速缓存(cache):通用CPU寄存器ALUFPUIFPCMUCUI-Cache.??Load/StoreD-Cache内存??MUMUL2CacheCPU控制核心设计难点8/27/202128MachineStructure\n加速指令执行的方法流水线问题结构竞争2.寄存器访问竞争ALUI$RegD$RegALUI$RegD$RegALUI$RegD$RegALUI$RegD$Reg同时读和写同时读两个值8/27/202129MachineStructure\n加速指令执行的方法寄存器访问竞争给寄存器加高速缓存?不现实寄存器非常快单个周期可以完成一次读和一次写前半个周期写,后半个周期读为何写在前?写操作是在前面的指令执行的寄存器很小可以做多个读端口寄存器ALUFPUIFPCCUI-CacheLoad/StoreD-Cache内存MUL2Cache8/27/202130MachineStructure\n机器语言与汇编语言CPU只能识别二进制数把指令编码成二进制数编码操作、操作数和其它信息机器语言8/27/202131MachineStructure\n机器语言与汇编语言MIPS的机器语言例655565opcodersrtrdfunctshamt32位opcode:操作码funct:操作码第二部分rs:SourceRegisterrt:TargetRegisterrd:DestinationRegistershamt:移位位数8/27/202132MachineStructure\n机器语言与汇编语言MIPS的机器语言例add$8,$9,$10opcode=0(查表)funct=32(查表)rs=9(操作数1)rt=10(操作数2)rd=8(目的操作数)shamt=0(非移位指令)8/27/202133MachineStructure\n机器语言与汇编语言MIPS的机器语言例add$8,$9,$100910832000000001001010100100010000000000二进制表示:机器语言指令十进制表示:MIPS还有其它格式的指令8/27/202134MachineStructure\n机器语言与汇编语言机器语言适合CPU使用,但不适合程序员人类对长串的数字不敏感但对符号敏感用符号表示指令的各种信息汇编语言8/27/202135MachineStructure\n机器语言与汇编语言汇编语言(assembly)机器指令与汇编指令一一对应在机器语言需要让人看的时候,常常实际使用汇编语言使用与机器语言相同的概念操作,操作数,……允许使用名字来索引变量比地址方便得多8/27/202136MachineStructure\n机器语言与汇编语言MIPS的汇编语言add$8,$9,$10操作操作数(寄存器)addsubbeq……$0~$31(32个寄存器)8/27/202137MachineStructure\n机器语言与汇编语言汇编语言程序设计用汇编语言写程序可以有最高的效率(如果程序员合格)比之机器语言前进了一大步被称为第二代程序设计语言问题机器指令相对简单程序员希望用较复杂的表达式与硬件相关移植到不同的CPU非常不方便8/27/202138MachineStructure\n程序语言什么才是适合程序设计的语言?接近人类的思维特性看起来象人类语言学习较容易机器无关同一个程序可以在不同硬件运行无需学习机器相关内容如果不关注最佳性能的话程序语言8/27/202139MachineStructure\n程序语言计算机如何执行程序语言程序?解释(interpret)逐条读取程序语句并立即执行各种script:.bat,.vbs,.js,.py,……由解释器处理(interpreter)翻译(translate)把程序语言程序翻译成机器程序C/C++,FORTRAN,Pascal,……由编译器处理(Compiler)为何一般不叫translator?不仅仅是翻译的工作8/27/202140MachineStructure\n程序语言为何解释和编译都存在?各有优缺点解释无需专门开发工具,易于扩充,灵活性大,升级解释器就可以改善所有已有程序执行效率低编译执行效率高开发较复杂,不便扩充,编译程序升级后所有现有程序必须重新编译才能得到更新8/27/202141MachineStructure\n程序语言程序语言设计原则尽可能接近人的思维习惯为何不用自然语言?目前的计算机软硬件平台还不能很好地理解自然语言程序语言是机器思维与人类思维之间的折衷机器思维人类思维机器语言汇编语言程序语言自然语言8/27/202142MachineStructure\n程序语言程序语言设计原则越接近自然语言更容易被程序员使用,更容易学习,程序设计效率高更远离计算机设计原理,更难以被计算机有效处理,执行效率低越接近机器语言更容易被计算机处理,执行效率高更难使用,程序设计效率低8/27/202143MachineStructure\n程序语言早期程序语言强调执行效率一次设计,多次运行运行时间远多于设计时间机器慢、少,任务多程序少,一般由专业人员设计FORTRAN很容易被翻译成高效率的机器程序不太容易使用8/27/202144MachineStructure\n程序语言现代程序语言有侧重各方面因素的语言现代计算机已经非常快,对很多任务已经可以不考虑执行效率程序语言可以考虑其它方面的因素设计效率,可移植性,……各种面向对象程序语言,Java,……现代软件技术可以兼顾多个因素较大范围内都适用的程序语言及其开发工具结合C++的一些开发工具8/27/202145MachineStructure\n程序语言程序语言对计算机设计思想的影响程序语言出现后,迅速替代汇编语言成为程序设计的主要语言计算机必须针对程序语言优化?!复杂指令集计算机(CISC:ComplexInstructionSetComputer)复杂的指令:尽量向程序语言的语句靠拢完备的指令:尽量实现程序语言使用的所有语句正交指令集编译优化技术尚不完善,不能很好优化程序主要用硬件设计填补程序语言和硬件间的差异8/27/202146MachineStructure\n程序语言程序语言对计算机设计思想的影响精简指令集(RISC:ReducedInstructionSetComputer)只实现少数必须的指令,利用编译优化技术生成优化的程序指令数量少,简单,可以编码成等长格式可以实现得非常快主要用编译器填补程序语言和硬件间的差异8/27/202147MachineStructure\n程序语言RISC支持者开发了大量的优化指令执行速度的技术高速缓存,深度流水线,分支预测,寄存器重命名,超标量,乱序执行……RISC支持者开发了大量的编译优化技术循环展开,软件流水,相关分析……CISC支持者把这些技术都用上了“伪CISC”:不再以指令集为目标x86依靠“事实上的工业标准”获得了空前成功RISCvs.CISC结果8/27/202148MachineStructure\n程序语言现代计算机开发模式软件和硬件结合考虑同时设计硬件和编译器,并照顾操作系统的需要研究热点:指令级并行程序语言改变了整个计算机产业8/27/202149MachineStructure\n程序语言程序语言类型说明型(例:Prolog)程序员描述程序的问题本身,而不是解决问题的算法对简单的问题:描述问题本身比算法更麻烦对复杂的问题:现有硬件必须要用特定的算法才能解决,通用解决算法难以胜任说明型程序语言只在较窄的范围使用8/27/202150MachineStructure\n程序语言程序语言类型命令型用命令序列描述程序函数型用嵌套的函数描述程序面向对象型用对象描述程序以上都是现实世界某个侧面的抽象广泛使用的程序语言应包含以上所有方面C++及其派生语言8/27/202151MachineStructure\n程序语言要素语句(statement)构成程序的原子声明语句(declarativestatement)程序的规格说明:数据类型,参数,……命令语句(imperativestatement)程序的算法说明注释(comment)8/27/202152MachineStructure\n程序语言要素变量(variable)与数据类型(type)变量:在程序执行过程中可以改变的量用于存储各类信息是对内存的抽象用名索引,不必使用地址索引有类型不同类型有不同的运算不兼容类型之间不能进行运算例:float*string8/27/202153MachineStructure\n程序语言要素基本数据类型(primitivedatatype)编译器缺省支持的数据类型intfloatchar……某些语言还有string数据结构(datastructure)由基本数据类型组成的有结构的数据类型数组(array)结构(structure)8/27/202154MachineStructure\n程序语言要素数组(array)一系列相同类型的数据定义intRooms[10];引用Rooms[0]=101;MyRoom=Rooms[5];下标(index)名8/27/202155MachineStructure\n程序语言要素结构(structure)由不同类型的数据组成的数据类型又叫异构数组(heterogeneousarray)structTZoomInfo{intID;floatw,h;};……TZoomInfoMyZoom;MyZoom.ID=110;合理划分程序的所有数据为恰当的结构会极大简化程序设计8/27/202156MachineStructure\n程序语言要素字面量(literal)在程序语言中,其值等于其文字串的本来含义的量与变量相对:表示变量的文字串是其名字,其值和名字无关,在程序中还可以改变例:整数650,字符串"Smith"常量(constant)给字面量的名字constintRoomNo=517;8/27/202157MachineStructure\n程序语言要素运算处理数据所需要的操作四则运算+-*/逻辑运算&&||!关系运算==!=><>=<=位运算&|^~计算机硬件特有的运算,但在很多算法中有很大的用处,所以很多程序语言都有8/27/202158MachineStructure\n程序语言要素运算赋值运算=把一个表达式的值赋给某个变量注意与相等关系的区别==才是相等关系运算与数学上使用的=有所不同某些语言使用不同的符号Pascal:=APL8/27/202159MachineStructure\n程序语言要素控制结构程序有各种不同的执行顺序顺序(sequence)分支(branch)循环(loop)必须有不同的控制语句(controlstatement)if(…){}else{}switch(…){case1:….case2:….}for(…;…;…){}8/27/202160MachineStructure\n程序语言要素过程(procedure)与函数(function)人类解决复杂问题的方法:分治(divide&conquer)分解成多个较小的问题,然后逐一解决,最后把小问题的解拼接成大问题的解程序语言也必须有类似的功能过程与函数程序语言中非常重要的概念,极大地方便了程序设计8/27/202161MachineStructure\n程序语言要素过程与函数把程序总的任务分解成多个小的部分,然后逐一解决每个小问题,再把小问题的解拼接起来以解决总的任务过程与函数的区别过程不返回值,函数要返回值微不足道(subtle)C/C++中不加以区别程序过程/函数8/27/202162MachineStructure\n程序语言要素函数的要素boolDrawCircle(intx,inty,intradix){……returntrue;}返回值类型名参数(parameter)实现8/27/202163MachineStructure\n程序语言要素调用函数if(DrawCircle(10,10,5)==false){……}直接用名返回值可直接使用实际使用来执行函数的参数实参(actualparameter)函数定义中的参数?形参(formalparameter)8/27/202164MachineStructure\n程序语言要素参数传递voidDrawFilledCircle(intx,inty,intradix){DrawCircle(x,y,radix);FillCircleWithPattern(x,y,radix,pattern);}boolDrawCircle(intx,inty,intradix){……x++;……是一个变量吗?值会变吗?8/27/202165MachineStructure\n程序语言要素参数传递参数传递的方式按值传递(passbyvalue)被调用函数(callee)的参数和调用函数(caller)所用的变量是两个不同的变量被调用函数中改变形参的值,调用函数所用实参的值是不会改变的voidDrawFilledCircle(intx,inty,intradix){DrawCircle(x,y,radix);boolDrawCircle(intx,inty,intradix){……x++;两个不同的变量修改后的值不会影响DrawFilledCircle中的x8/27/202166MachineStructure\n程序语言要素参数传递如果想要把改变后的值传回来?voidGetRoomSize(intw,inth){w=5;h=10;}voidmain(){intw,h;GetRoomSize(w,h);……两个不同变量!8/27/202167MachineStructure\n程序语言要素参数传递按引用传递(passbyreference)voidGetRoomSize(int&w,int&h){w=5;h=10;}voidmain(){intrw,rh;GetRoomSize(rw,rh);……同一个变量8/27/202168MachineStructure\n程序语言要素参数传递按引用传递voidGetRoomSize(int&w,int&h){w=5;h=10;}voidmain(){GetRoomSize(x2-x1,y2-y1);……????编译警告:Temporaryusedforparameter‘w’incallto……这种用法原则上是错误的如果一个函数的某个参数是引用类型,应当准备一个同类型的变量给该参数以存储函数中该变量被修改后的值8/27/202169MachineStructure\n谢谢!8/27/202170MachineStructure

相关文档