目录
Q 计算机系统五层层次结构从下到上由哪五层组成?他们之间有哪些区别和联系?
Q 什么是计算机体系结构?什么是计算机组成原理?以乘法指令为例说明二者区别。
Q 存储器按存取方式,可以分成哪四类?哪些采用随机访问,哪些采用串行访问?
Q 在m位低位交叉编址中,假设存取周期为T,总线传输周期为r,为了实现流水线方式存储,应满足什么条件?如果连续读取m个字,所需要的时间是多少?
1)计算机系统由硬件和软件两部分组成,它们在逻辑上是等效的(例如,对于乘法运算,可以设计一个专门的硬件电路来实现,也可以通过执行多次加法运算来实现)
2) 计算机系统性能由硬件和软件共同决定
1)计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成
2)指令和数据存储在存储器中,并可以按地址访问
3)指令和数据均以二进制表示:运算规则简单、两种稳态的物理器件容易制造、便于用逻辑门实现算术运算
4)指令由操作码和地址码构成,操作码指明操作的性质,地址码表示操作数在存储器中的位置
5)首次提出存储程序:指令在存储器内按顺序存放,根据首地址执行第一条指令,之后按照该程序的规定顺序执行其他指令(按地址访问并顺序执行指令)
6)以运算器为中心,I/O设备与存储器交换数据也要通过运算器,CPU利用率极低,因此,现代计算器以存储器为中心
1)存储体:存放二进制信息
2)地址寄存器(MAR):存放访存地址
3)数据寄存器(MDR):暂存要从存储器中读或写的信息
4)时序控制逻辑:用于产生存储器操作所需的各种时序信号
存储体:由多个存储单元构成的存储器件
存储单元:包含若干存储单元并具有特定的存储地址的存储单位
存储字:存储单元存储的一串二进制代码
存储字长:存储字中二进制代码的位数
机器字长:CPU一次能处理的二进制数据的位数
1)微程序机器、传统机器、操作系统机器、汇编语言机器、高级语言机器
2)微程序机器和传统机器是物理机器,属于硬件;操作系统机器、汇编语言机器和高级语言机器是虚拟机器,属于软件。各层次间,下层是上层的基础,上层是下层的扩展
1)翻译:将一种语言编写的程序全部翻译成另一种语言,然后再执行,只需翻译一次,通常会生成可执行文件
2)解释:将源程序的一条语句翻译成另一种语言的对应语句,并立即执行,紧接着再翻译下一句,每次执行都要翻译
1)计算机体系结构是指程序员所见到的计算机的属性,概念性的结构与功能特性。如指令系统、数据类型等
2)计算机组成原理是指如何实现计算机体系结构所体现出来的属性,对程序员透明
3)以乘法指令为例,计算机是否有乘法指令,属于体系结构的问题;乘法指令是采用专用的乘法器,还是使用加法器和移位器构成,属于计算机组成原理的问题
1)数据通路带宽:数据总线一次所能并行传送信息的位数
2)吞吐量:系统在单位时间内处理请求的数量
3)响应时间:用户向计算机发送一个请求,到系统对该请求作出响应并获取它所需要的结果的等待时间,包括CPU时间与等待时间
1)可以分为随机存储器(RAM)、只读存储器(ROM)、顺序存取存储器和直接存取存储器
2)随机存储器和只读存储器采用随机访问,即存取时间与物理地址无关;顺序存储器(如磁带)和直接存储器(如磁盘)采用串行访问,即存取时间与物理地址有关
1)存储容量 = 存储字数 × 字长
2)单位成本:每位价格 = 总成本 / 总容量
3)存储速度:数据传输率 = 数据的宽度 / 存储周期
1)由下至上分别为外存、辅存、内存、高速缓冲存储器(Cache)和寄存器。价位越来越高,速度越来越快,容量越来越小,CPU访问频率越来越高
2)存储系统层次结构主要体现在“Cache - 主存”层次和“主存 - 辅存”层次。前者主要解决CPU和主存速度不匹配的问题,由硬件自动完成,对所有程序员完全透明;后者主要解决存储系统的容量问题,由操作系统和硬件共同完成,对应用程序员透明,对系统程序员不透明
1)存取时间:启动一次存储器操作到完成本次操作所经历的时间
2)存取周期:进行一次完整的读写操作所需的全部时间,即连续两次独立访问存储器操作之间所需的最小时间间隔,包含存取时间和恢复时间
3)主存带宽:又称数据传输率,表示每秒从主存进出信息的最大数量
1)静态随机存储器(SRAM)和动态随机存储器(DRAM),都属于易失性存储器
2)SRAM:非破坏性读出,不需要刷新。存取速度快,但集成度低,功耗大,常用于Cache
3)DRAM:破坏性读出,需要刷新。集成度高、价位低、容量大、功耗低,但是速度比SRAM慢,常用于主存
1)集中刷新:在一个刷新周期内,利用一段固定的时间对所有行进行再生,在此期间停止读写操作,称为“死时间”
2)分散刷新:把对每行的刷新分散到各个工作周期,没有死区,但加长了系统的存取周期,降低了整机的速度
3)异步刷新:将刷新周期除以行数,得到两次刷新操作之间的时间间隔,避免CPU连续等待,而且减少了刷新次数
1)掩模式只读存储器(MROM):出厂后内容不能被更改
2)一次可编程只读存储器(PROM):可以进行一次性编程
3)可擦除可编程只读存储器(EPROM):可以用紫外线或电擦除,对内容进行多次更改
4)闪存(FLash Memory):断电后也能保存信息,可进行多次的快速擦除重写,需先擦除再写入,如U盘、SD卡
5)固态硬盘(SSD)
1)采用高速元器件
2)采用“Cache - 主存”存储结构:①避免CPU空等I/O访存;②缓解CPU和主存速度不匹配的问题
3)调整主存结构,采用双端口存储器、多模块存储器,例如单体多字存储器和多体并行存储器
1)双端口RAM是指同一个存储器有左、右两个独立的端口,分别具有两组互相独立的地址线、数据线和读写控制线。允许两个独立的控制器同时异步地访问存储单元
2)当两个端口的地址不同时,在两个端口上进行读写操作一定不会发生冲突
3)两个端口同时存取存储器的同一地址单元时,可能会发生冲突,例如同时写入数据,或者一个写入另一个读出。此时可以通过置“忙”信号来暂时关闭一个端口,让两个端口异步的访问存储器
1)存储器中只有一个存储体,在一个存取周期内,从同一地址取出多个CPU字,然后将指令逐条送至CPU执行
2)增大了存储器的带宽,提高了工作速度,但指令和数据必须连续存放
1)高位交叉编址方式:高位地址表示体号,地位地址为体内地址,为顺序存储
不能提高单次访存速度,但能使多个应用并行访存,提高系统的并发性
2)低位交叉编址方式:低位地址为体号,高位地址为体内地址,程序连续存放在相邻体中,为交叉存储
可以采用流水线的方式并行存取,提高存储器的带宽
1)T= mr
2)连续读取m个字,所需要的时间为T + (m - 1)r
3)如果采用高位交叉编址,连续读取m个字所需要的时间仍然为mT
1)空间局部性原理:在最近的未来要用到的信息与现在正在使用的信息,在存储空间上是相邻的
2)时间局部性原理:在最近的未来要用到的信息,很有可能是现在正在使用的信息
3)Cache是介于CPU和主存之间的高速小容量存储器,利用程序的局部性原理,将主存的存储空间分块,把某些主存块复制到Cache中,缓解CPU与主存之间的速度矛盾
4)Cache与主存之间以“块”为单位进行数据交换,每次被访问的主存块一定会被立即调入Cache
1)全相联映射:主存块可以放到Cache的任意位置。Cache的存储空间利用充分、命中率高,但查找标记最慢
2)直接映射:主存块只能放到特定的某个Cache行(行号=主存块号%总行数)。只需对比一个标记,速度最快,但Cache存储空间利用不充分,命中率低
3)组相连映射:主存块可以放到特定分组的任意位置。是另外两种方式的折中,综合效果好
随机算法、先进先出算法(FIFO)、最近最少使用(LRU)、最不常用(LFU)
什么?不会?听我的,已经考不上了,准备下一年吧
写命中时,
1)写回法:只修改Cache,而不立即写回主存,只有当此块被换出时才写回主存,因此需要增加一位脏位表示是否被修改过
2)全写法:必须把数据同时写入Cache和主存,访存次数增加,速度慢,但更能保证数据一致性,一般采用写缓冲
写不命中时,
3)写分配法:把主存中的块调入Cache,在Cache中修改。通常搭配写回法
4)非写分配发:只写入主存,不调入Cache。搭配全写法
现代计算机通常采用多级Cache结构,各级Cache间采用“全写法+非写分配法”,Cache和主存之间采用“写回法+写分配法”
1)一个程序(进程)在逻辑上被分为若干大小相等的“页面”
2)页面大小与快的大小相同
3)每个页面可以离散的放入不同的主存块中
4)用页表来记录逻辑地址和物理地址的对应关系
1)页式虚拟存储器
2)段式虚拟存储器
3)段页式虚拟存储器
指令又称机器指令,是指示计算机执行某操作的命令,是计算机运行的最小功能单位。一条指令通常由操作码和地址码两部分组成
1)按地址码数分类:①零地址指令;②一地址指令;③二地址指令;④三地址指令;⑤四地址指令
2)按指令长度分类:定长指令字结构和变长指令字结构
3)按操作码长度分类:定长操作码和可变长操作码
4)按操作类型分类:数据传送类、运算类、程序控制类和输入输出类
1)隐含寻址:有效地址由程序制指定,寻址期间访存0次
2)立即寻址:形式地址A即是操作数,访存0次
3)直接寻址:形式地址A就是有效地址EA,即EA=A,访存1次
4)一次间接寻址:形式地址A中的内容是有效地址EA,即EA=(A),访存2次
5)寄存器寻址:EA=R,访存0次
6)寄存器间接一次寻址:EA=(R),访存1次
7)基址寻址:将CPU中基址寄存器(BR)中的内容,加上指令格式中的形式地址A,形成操作数的有效地址,即EA=(BR)+A。便于程序浮动,方便实现多道程序并发运行,访存1次
8)变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容之和,即EA=(IX)+A,其中IX可为变址寄存器,也可用通用寄存器作为变址寄存器。变址寄存器是面向用户的,适合编织循环程序,访存1次
9)相对寻址:EA=(PC)+A,多用于转移指令,访存1次
10)复合寻址
11)堆栈寻址
RISC:精简指令集,CISC:复杂指令集
1)指令控制:完成取指令、分析指令和执行指令的操作
2)操作控制:一条指令的功能往往是由若干操作信号的组合实现的
3)时间控制:对各个操作加以时间上的控制
4)数据加工:对数据进行算数和逻辑运算
5)中断处理:对计算机运行过程中出现的异常情况和特殊请求进行处理
CPU由运算器和控制器组成
运算器的基本结构有,
1)算术逻辑单元ALU
2)暂存寄存器
3)通用寄存器组
4)累加寄存器ACC
5)程序状态字寄存器PSW
6)移位器、计数器
控制器的基本结构有,
1)程序计数器PC
2)指令寄存器IR
3)指令译码器、时序系统、微操作信号发生器
4)地址寄存器MAR
5)数据寄存器MDR
用户可见的寄存器:通用寄存器组、程序状态字寄存器PSW、程序计数器PC
用户不可见的寄存器:MAR、MDR、IR、暂存器
1)取指周期
(PC)→MAR
M(MAR)→MDR
(MAR)→IR
(PC)+1→PC
2)间址周期
Ad(IR)→MAR
M(MAR)→MDR
(MDR)→Ad(IR)
3)执行周期
4)中断周期
(SP)-1→SP
(SP)→MAR
(PC)→MDR
(MDR)→M(AMR)
向量地址→PC
5)指令周期有单指令周期和多指令周期,指令间串行
1)程序:由指令序列组成
微程序:由微指令序列组成,每一种微指令对应一个微程序
2)指令:对程序执行步骤的描述
微指令:对指令执行步骤的描述
3)微命令与微操作一一对应
4)微指令中可能包含多个微命令
1)指令执行过程划分为不同阶段,占用不同的资源,使多条指令同时执行。性能指标有,吞吐率,加速比,效率
2)吞吐率:指单位时间内流水线所完成的任务数量
3)加速比:完成同一批任务,不使用流水线所用的时间和与使用流水线所用的时间之比
4)效率:流水线的设备利用率。在时空图上,流水线的效率定义为完成n个任务占用的时空区有效面积与n个任务所用的时间与k个流水线段所围成的时空区总面积之比
1)结构相关(资源冲突):由于多条指令在同一时刻争用同一资源而形成的冲突
2)数据相关(数据冲突):后一条指令必须等前一条指令执行完才能执行
3)控制相关(控制冲突):当流水线遇到转移指令和其他改变PC值的指令而造成断流
1)超标量技术:每个时钟周期内可以并发多条独立指令,需要配置多个功能部件,不能调整指令的执行顺序
2)超流水线技术:在一个时钟周期内再分段,一个功能部件使用多次,不能调整指令的执行顺序
3)超长指令字:由编译程序挖掘出指令间的并行性,将多条能并行操作的指令组合成一条,具有多个操作码字段
1)早期计算机外部设备少时大多采用分散连接方式,不易实现随时增减外部设备,为更好地解决I/O设备和主机之间连接的灵活性,发展为了总线连接
2)总线是一组能为多个部件分时共享的公共信息传送线路
3)总线具有机械特性(尺寸,管脚数等)、电气特性(有效电平)、功能特性(地址、数据、控制)和时间特性(信号的时序关系)
1)单总线:只有系统总线,结构简单、成本低、易扩充,但带宽低、负载重且不支持并发传送操作
2)双总线:有主存总线和I/O总线,支持突发传送、将低速的I/O设备从单总线分离出来,但需要增加通道等硬件设备
3)三总线:分别为主存总线、I/O总线和DMA总线,提高了I/O设备性能,使其更快地响应命令,提高了系统吞吐量,但系统工作效率低
总线定时是指总线在双方交换数据的过程中需要时间上的配合关系的控制,实质是一种协议或规则
1)同步定时方式:由统一时钟控制数据传输。优点是传输速度快,总线控制逻辑简单;缺点是不能及时进行数据通信的有效性检验,可靠性较差
2)异步定时方式:采用应答方式,没有公共时钟标准,分为不互锁方式、半互锁方式和全互锁方式。优点是总线周期长度可变,能够保证两个工作速度相差较大的部件或设备之间可靠地进行信息交换;缺点是速度稍慢
3)半同步通信:同步与异步的结合,在统一时钟的基础上,增加一个“等待”响应信号
4)分离式通信:各模块均有权申请占用总线,采用同步方式通信,各模块准备数据时不占用总线,总线利用率高
1)程序查询方式:CPU“忙等”慢速设备完成工作,二者串行工作
2)程序中断方式:设备准备数据时,CPU继续工作。设备准备好之后向CPU发出中断请求,CPU在指令周期的末位,即当前指令执行完毕后,检查中断并做出中断响应
3)DMA控制方式:主存与高速I/O设备之间有一条直接数据通路(DMA总线),DMA控制器自动控制磁盘与主存的数据读写,每完成一整块数据读写,才向CPU发出一次中断请求
4)通道方式:CPU执行I/O指令对通道发出命令,由通道执行一系列通道指令,代替CPU对I/O设备进行管理,通道程序提前编制好放在主存中
1)统一编址方式:和存储器统一编址,I/O地址作为存储器地址的一部分,占用存储器空间
2)独立编制方式:和存储器分开编址,需要专门的I/O指令
计算机在执行程序过程中,出现异常情况或特殊请求时,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,处理完毕后CPU又自动返回到现行程序的间断处,继续执行原程序
中断隐指令的任务
1)关中断:为了保护中断现场期间不被新的中断打断
2)保存断点:将原来程序的断点,即程序计数器PC的内容保存起来
3)引出中断服务程序:通常使用硬件向量法,由硬件产生向量地址,再由向量地址找到中断服务程序入口地址
中断服务程序的任务
4)保护现场:保存通用寄存器和状态寄存器的内容,以便返回原程序后可以恢复CPU环境
5)中断服务
6)恢复现场
7)开中断,中断返回
单重中断:执行中断服务程序时不响应新的中断请求
多重中断:又称中断嵌套,执行中断服务程序时可以响应新的中断请求
1)停止CPU访问:控制简单,CPU处于不工作状态或保持状态,为充分发挥CPU对主存的利用率
2)DMA与CPU交替访存:一个CPU周期分为两部分,分别供DMA和CPU访存。不需要总线使用权的申请、建立和归还,硬件逻辑较为复杂
3)周期挪用:CPU不访存时,不冲突;CPU正在访存时,存取周期结束让出总线;CPU与DMA同时请求访存时,I/O访存优先
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有, 也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手