bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

【計(jì)算機(jī)體系結(jié)構(gòu)-02】機(jī)器模型-創(chuàng)新互聯(lián)

1. 機(jī)器模型 (Machine Model)

計(jì)算機(jī)的基本工作就是進(jìn)行運(yùn)算,那么計(jì)算就需要有用來處理計(jì)算方法的處理單元和提供或保存數(shù)值的存儲(chǔ)單元。一般將用來處理計(jì)算方法的處理單元稱為 算術(shù)邏輯單元 (ALU--Arithmetic Logic Unit)。在一個(gè)計(jì)算過程中可能會(huì)是這樣的一個(gè)流程,從存儲(chǔ)單元中取出一些數(shù)據(jù),放進(jìn)ALU中進(jìn)行計(jì)算,然后將計(jì)算結(jié)果保存到存儲(chǔ)單元中。

創(chuàng)新互聯(lián)長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為藍(lán)田企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),藍(lán)田網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

那么完成這個(gè)計(jì)算流程的機(jī)器模型是如何利用存儲(chǔ)單元和算術(shù)邏輯單元構(gòu)建起來的?該如何訪問存儲(chǔ)器?機(jī)器模型該允許什么樣的指令和操作?操作數(shù)怎么獲取從哪來?結(jié)果又該放在哪?

?
首先明確一點(diǎn),機(jī)器模型不是指令集架構(gòu),上篇文章《【計(jì)算機(jī)體系結(jié)構(gòu)-01】指令集體系結(jié)構(gòu)、微體系結(jié)構(gòu)簡(jiǎn)介》已經(jīng)說明了,指令集架構(gòu)是為軟件編程提供的一種規(guī)范,它是關(guān)于計(jì)算和操作指令如何封裝制定的一套標(biāo)準(zhǔn),而 機(jī)器模型則是一種更加基礎(chǔ)的理論,是構(gòu)建出存儲(chǔ)器和 ALU 的物理結(jié)構(gòu),從而確定數(shù)據(jù)如何移動(dòng),又如何從 ALU 移動(dòng)到存儲(chǔ)器。

2. 幾種簡(jiǎn)單的機(jī)器模型 2.1. 棧基架構(gòu) (Stack-Based Architecture)

不管你信不信,在一個(gè)處理器中是可以沒有寄存器的(寄存器不是必要的)。OK,來看一個(gè)歷史上實(shí)際搭建過的處理器,它的結(jié)構(gòu)非常簡(jiǎn)單。
在這里插入圖片描述

那么可以看圖片中的這種機(jī)器模型,利用棧結(jié)構(gòu)存儲(chǔ),而棧只是一個(gè)存儲(chǔ)器,并非寄存器。棧的結(jié)構(gòu)相信大家已經(jīng)很清楚,數(shù)據(jù)會(huì)遵循先入后出的順序入棧、出棧。這個(gè) 機(jī)器模型的工作流程很簡(jiǎn)單,只需要從棧頂開始取兩個(gè)元素,通過 ALU 計(jì)算,然后將結(jié)果保存棧頂。

2.2. 累加器架構(gòu) (Accumluator Architecture)

下面是一個(gè)累加器的結(jié)構(gòu)。
在這里插入圖片描述
累加器,顧名思義會(huì)對(duì)一個(gè)數(shù)值不停的做加法,而得到的結(jié)果最終也只會(huì)有一個(gè),操作數(shù)只有一個(gè),因此在處理器中只會(huì)有一個(gè)寄存器,所有的計(jì)算都是自動(dòng)的或不可見的。同時(shí)還可以提供給累加器另外一個(gè)操作數(shù),即除了寄存器中的操作數(shù)還提供一個(gè)來自存儲(chǔ)器 (Memory) 的操作數(shù),此時(shí)則需要給該操作數(shù)命名。

2.3. 寄存器-存儲(chǔ)器架構(gòu) (Register-Memory Architrecture)

在這里插入圖片描述

根據(jù)上面累加器的兩個(gè)參數(shù)方案那么很容易想到上圖這種架構(gòu),寄存器-存儲(chǔ)器架構(gòu),即一個(gè)源操作數(shù)來自于存儲(chǔ)器,該操作數(shù)需要命名,而另一個(gè)操作數(shù)可以來自于寄存器(不需要命名),然后,還可以有一個(gè)目的存儲(chǔ)(可選),用于保存計(jì)算結(jié)果的存儲(chǔ)位置,同樣需要命名才可以。那么這種結(jié)構(gòu)一個(gè)操作最多需要有兩個(gè)命名的操作數(shù)。

2.4. 寄存器-寄存器架構(gòu) (Register-Register Architecture)

在這里插入圖片描述
那么寄存器-寄存器架構(gòu),兩個(gè)操作數(shù)均來自于處理器中的寄存器,同時(shí)兩者均需被命名,當(dāng)需要有目的存儲(chǔ)時(shí),還需要為目的存儲(chǔ)操作數(shù)命名。

2.5. 以上幾種架構(gòu)的比較

在這里插入圖片描述
這四種架構(gòu),需要被命名的操作數(shù)數(shù)目分別為012或32或3,相信通過上文你已經(jīng)清楚了,后面兩種架構(gòu)為什么是2或3,因?yàn)橛袝r(shí)候數(shù)據(jù)計(jì)算結(jié)果的保存目的地會(huì)隱式的確定無需命名,當(dāng)需要明確指出時(shí),那么就會(huì)多一個(gè)命名操作數(shù)。

例如,X86架構(gòu)中的第一個(gè)操作數(shù)總是作為結(jié)果的保存位置,因此它會(huì)少命名一個(gè)操作數(shù)。例如MIPSRISC架構(gòu)則需要將三個(gè)操作數(shù)全部命名。

3. 棧基架構(gòu) (Stack-Based Architecture) 3.1. 棧基架構(gòu)機(jī)器模型工作原理

棧基架構(gòu)雖然是個(gè)很老的架構(gòu)模型,但是很經(jīng)典。過去的Burrough's 5000 (B5000)機(jī)器就是使用的棧基架構(gòu)(1960年),近一點(diǎn)的Java虛擬機(jī)實(shí)際上也是利用棧結(jié)構(gòu)實(shí)現(xiàn)。
在這里插入圖片描述

用一個(gè)例子🌰來說明棧基架構(gòu)機(jī)器模型的工作原理,來看上圖這個(gè)計(jì)算表達(dá)式,首先用a加上b * c,然后整個(gè)括號(hào)的計(jì)算結(jié)果除以a加上d * c再減去e的運(yùn)算結(jié)果才得到最終的表達(dá)式結(jié)果。這對(duì)于我們來說計(jì)算這個(gè)表達(dá)式很簡(jiǎn)單,但對(duì)于計(jì)算機(jī)來說就沒那么直接了,甚至有點(diǎn)復(fù)雜。
在這里插入圖片描述

實(shí)際上計(jì)算機(jī)會(huì)將這個(gè)表達(dá)式分解并生成一個(gè) 解析樹,就上圖這樣。一個(gè)二叉樹的結(jié)構(gòu),所有的葉子節(jié)點(diǎn)上是需要做計(jì)算的數(shù),其它節(jié)點(diǎn)則是運(yùn)算符。開始先由b乘以c加上a,用這個(gè)結(jié)果除以另一邊的子表達(dá)式。整個(gè)二叉樹用順序結(jié)構(gòu)保存即為計(jì)算機(jī)應(yīng)該要做的操作表達(dá)式,像下面這樣。

在這里插入圖片描述
如果現(xiàn)在使用的是棧基架構(gòu)的機(jī)器模型,那么就意味著會(huì)有一個(gè)求值棧,首先pusha到棧中,接著push b到棧中、push c到棧中,當(dāng)遇到運(yùn)算符,拿棧頂?shù)膬蓚€(gè)元素做對(duì)應(yīng)的運(yùn)算,再保存到棧中,依次類推就會(huì)得到下面這樣的棧操作流程。

在這里插入圖片描述
通過這樣的棧操作流程,就可以把左邊的子表達(dá)式結(jié)果計(jì)算出來,依照該方法繼續(xù)姐可以計(jì)算出整個(gè)表達(dá)式的結(jié)果。你會(huì)發(fā)現(xiàn)計(jì)算機(jī)在計(jì)算這樣長的表達(dá)式,實(shí)際上可以在一個(gè)很小的棧中完成對(duì)整個(gè)表達(dá)式的計(jì)算,并且有一個(gè)好處是,完全不需要對(duì)任何一個(gè)操作數(shù)命名(因?yàn)椴僮鲾?shù)是固定的,總是拿棧頂?shù)膬蓚€(gè)元素作運(yùn)算)。因此這個(gè)機(jī)器模型可以讓你跑任何現(xiàn)實(shí)的程序。

?
需要注意的一點(diǎn)是,棧是處理器狀態(tài)的一部分,并且很多時(shí)候在指令集體系架構(gòu)的角度來看棧是無限大的。但在實(shí)際上,計(jì)算機(jī)中的棧是有限長的,因?yàn)樵谟?jì)算機(jī)中無論如何都不可能出現(xiàn)一個(gè)無限長且真實(shí)存在的棧。它只是在概念上是無限的,因此你需要保證不能發(fā)生棧溢出(內(nèi)存溢出、主存儲(chǔ)器溢出)。 例如,上面例子中的表達(dá)式如果是很長,或者產(chǎn)生的解析樹太深,都會(huì)導(dǎo)致棧溢出的可能。

3.2. 棧基架構(gòu)的設(shè)計(jì)和優(yōu)化(求值棧)

🤕基礎(chǔ)設(shè)計(jì):
假如現(xiàn)在有一個(gè)指令集架構(gòu)的微架構(gòu)實(shí)現(xiàn)是基于棧基架構(gòu)的,由于求值棧在進(jìn)行計(jì)算時(shí)總是需要兩個(gè)操作數(shù),那么就將求值棧中的頂部的兩個(gè)元素的地址是保存在寄存器中,而其余的則保存在主存中(包含溢出的元素)。每一次入棧操作都會(huì)產(chǎn)生一次內(nèi)存引用,每一次出棧操作也會(huì)有一次內(nèi)存引用(出棧會(huì)將棧中的元素返回到主存中)。而且更重要的是,當(dāng)發(fā)生棧溢出后,將會(huì)增加額外的內(nèi)存引用,因?yàn)樵谧鰲2僮鲿r(shí)需要將主存的數(shù)據(jù)先拿出來。顯然,這樣的結(jié)構(gòu)讓操作產(chǎn)生的步驟非常的多(內(nèi)存引用)。

🤪優(yōu)化設(shè)計(jì):
那么站在微系體系架構(gòu)優(yōu)化的角度考慮,將棧中的N個(gè)元素全部直接保存在寄存器中(棧中的所有元素N小于或等于可用的寄存器數(shù)),這樣每次執(zhí)行pushpop操作時(shí)就不必執(zhí)行內(nèi)存引用,就只有當(dāng)發(fā)生棧溢出時(shí)才需要增加一步內(nèi)存引用操作。

Okay,用優(yōu)化后的棧來計(jì)算一下,繼續(xù)再用上面的例子,現(xiàn)在給出限制條件,限制棧的大小為 2,即最多只能放兩個(gè)元素,超過則會(huì)發(fā)生溢出。

在這里插入圖片描述

先來看這個(gè)例子都會(huì)做什么,首先push了三次元素進(jìn)棧,然后對(duì)頂部的兩個(gè)元素做乘法,然后再做加法,之后再三次push操作,棧頂兩個(gè)元素相乘,用結(jié)果加上a,接著push e,用上一次結(jié)果減去e,再將棧頂兩個(gè)元素做除法完成計(jì)算。

但是棧中只能存放兩個(gè)元素,那么來看看在棧操作中具體會(huì)發(fā)生什么事情,

  • 第一步push a,這時(shí)候時(shí)空棧,沒問題,直接進(jìn),非空非滿棧;
  • 第二步,接著push b,也 OK,此時(shí)為滿棧;
  • 第三步,當(dāng)push c的時(shí)候,發(fā)現(xiàn)棧已經(jīng)滿了,這個(gè)時(shí)候還想要再push,那就會(huì)發(fā)生 棧下溢(Underflow),此時(shí)會(huì)先將棧底元素也就是a,保存到主存中(Main Memory),該操作會(huì)發(fā)生一次內(nèi)存引用,圖中的ss(a)表示將astore到主存中,R0寄存器的值改變?yōu)?code>a的主存地址(這便發(fā)生額外的一次內(nèi)存引用),然后將c壓入棧頂。
  • 第四步,將棧頂?shù)膬蓚€(gè)元素做乘法運(yùn)算,將結(jié)果b * c保存到R1,棧元素減一,同時(shí)從a的主存地址獲取(fetche)a(發(fā)生內(nèi)存引用)也就是圖中的sf(a),將a保存到R0中,此時(shí)棧中有兩個(gè)元素,棧頂是R1 = b * c,滿棧;
  • 第五步,將棧頂?shù)膬蓚€(gè)元素做加法運(yùn)算,將結(jié)果a + b * c入棧保存到R0,棧元素減一,此時(shí)棧中只有一個(gè)元素即為棧頂元素R0 = a + b * c,非空非滿棧;
  • 第六步,push a,進(jìn)棧,沒問題,R1 = a,此時(shí)為滿棧,棧頂元素為a
  • 第七步,push d進(jìn)棧,發(fā)生underflow,將棧底元素保存到主存發(fā)生一次內(nèi)存引用(ss(a + b * c))R0保存a + b * c的存儲(chǔ)地址,此時(shí)棧頂元素為R2 = d,滿棧;
  • 第八步,push c進(jìn)棧,發(fā)生underflow,將棧底元素保存到主存,發(fā)生一次內(nèi)存引用(ss(a)),此時(shí)棧頂元素為R3 = c,滿棧;
  • 第九步,將棧頂?shù)膬蓚€(gè)元素做乘法運(yùn)算,將結(jié)果d + c保存到R2,棧元素減一,同時(shí)從a的主存地址獲取(fetche)a(發(fā)生內(nèi)存引用)也就是圖中的sf(a),將a保存到R1中,此時(shí)棧中有兩個(gè)元素,棧頂是R2 = b * c,滿棧;
  • 第十步,將棧頂?shù)膬蓚€(gè)元素做加法運(yùn)算,將結(jié)果a + d * c保存到R1,棧元素減一,同時(shí)從a + b * c的主存地址獲取(fetche)a + b * c的值(發(fā)生內(nèi)存引用)也就是圖中的sf(a + b * c),將a + b * c保存到R0中,此時(shí)棧中有兩個(gè)元素,棧頂是R1 = a + d * c,滿棧;
  • 第十一步,push e入棧操作,發(fā)生underflow,將棧底元素保存到主存發(fā)生一次內(nèi)存引用(ss(a + b * c))R0保存a + b * c的存儲(chǔ)地址,此時(shí)棧頂元素為R2 = e,滿棧;
  • 第十二步,將棧頂?shù)膬蓚€(gè)元素做減法運(yùn)算,將計(jì)算結(jié)果a + d * c - e保存到R1,棧元素減一,同時(shí)從R0保存的主存地址拿出a + b * c的值保存進(jìn)R0,此時(shí)為滿棧,棧頂元素R1 = a + d * c - e
  • 第十三步,將棧頂?shù)膬蓚€(gè)元素做除法運(yùn)算,將計(jì)算結(jié)果(a + b * c) / (a + d * c - e)R0保存,棧元素減一。

統(tǒng)計(jì)一下,利用這個(gè)求值棧計(jì)算過程中間接性的做了4store操作和4fetche操作,也就是說使用該結(jié)構(gòu)棧在正常的流程中額外的增加了8次訪存操作。

我們改變一下棧大小會(huì)發(fā)生什么,將棧的大小增加為4,那么它的執(zhí)行流程將會(huì)是下面這樣。

在這里插入圖片描述

哇嗚,一氣呵成,中間沒有發(fā)生內(nèi)存引用,Good。因?yàn)橛?jì)算該表達(dá)式最多的情況下會(huì)一次性有4個(gè)元素在棧中,那么棧的大小只要滿足,就不會(huì)發(fā)生棧溢出的情況,也就不會(huì)有內(nèi)存引用這樣額外的訪存操作了。

3.3. 棧基架構(gòu)小結(jié)

通過上面的幾個(gè)例子,相信各位已經(jīng)清楚了棧基架構(gòu)的機(jī)器模型。看起來他們是可以成功的完成計(jì)算任務(wù),但是有一個(gè)明顯的問題不知道機(jī)智的你有沒有發(fā)現(xiàn)。第一步的時(shí)候push a,將a入棧,接著后面又有一次push apush c同樣是,我們?cè)僮鲋貜?fù)多余的工作欸!!棧基機(jī)器模型的架構(gòu)很簡(jiǎn)單,指令很密集,但這對(duì)于機(jī)器性能不算是好事,因?yàn)槭褂迷撃P蛯⒁馕吨媾R多次的重新讀取。

如果使用指令集架構(gòu),如MIPS,那么將會(huì)有32個(gè)通用寄存器,可以在任何指令中為任何一個(gè)寄存器命名。那么這時(shí)候,當(dāng)你已經(jīng)loada、b、c、d、e數(shù)值到寄存器空間中一次了,那么之后所有關(guān)于這幾個(gè)數(shù)的操作時(shí)都無需重新load。事實(shí)上這個(gè)問題時(shí)由指令集解決的,并不是基礎(chǔ)機(jī)器模型的問題,也不是微架構(gòu)要解決的問題。

4. 對(duì)比幾種簡(jiǎn)單的機(jī)器模型

上文已經(jīng)介紹了這四種機(jī)器模型,Stack-BasedAccumulatorRegister-MemoryRegister-Register。現(xiàn)在用一個(gè)簡(jiǎn)單的計(jì)算C = A + B,分別使用這四個(gè)機(jī)器模型,看看會(huì)有什么不同。

在這里插入圖片描述

  • Stack-Based Architecture

棧基架構(gòu)的機(jī)器模型的工作過程就是,Push A,將A的值入棧,Push B,將B的值入棧,用棧頂兩個(gè)元素做Add操作,然后將結(jié)果PopC中保存。

  • Accumulator Architecture

累加器的機(jī)器模型工作過程為,Load AAdd BA + B,然后將結(jié)果StoreC中。

  • Register-Memory Architecture

寄存器-存儲(chǔ)器架構(gòu)機(jī)器模型的工作過程,Load R1, AAdd R3, R1, B,將B的值與R1保存的值相加,將結(jié)果保存到R3中,再將R3的值StoreC中。

  • Register-Register Architecture

寄存器-寄存器架構(gòu)機(jī)器模型的工作過程為,Load R1, ALoad R2, B,執(zhí)行Add,將R1R2保存的值相加,并將結(jié)果保存到R3中,再將R3的值StoreC中,完成計(jì)算。

相比前兩個(gè)架構(gòu),后兩個(gè)架構(gòu)在使用A、B之前需要先Load,計(jì)算完后還需要Store,看起來似乎不夠高效,沒有前面兩個(gè)模型簡(jiǎn)潔,但是當(dāng)之后需要重復(fù)性的使用A、B的值進(jìn)行計(jì)算的話,那么后兩個(gè)架構(gòu),將不需要再次Load,而可以直接使用,而前兩個(gè)架構(gòu)則需要重復(fù)性的執(zhí)行PushLoad指令,這樣看起來優(yōu)勢(shì)就會(huì)體現(xiàn)出來了。

覺得這篇文章對(duì)你有幫助的話,就留下一個(gè)贊吧*^v^*
請(qǐng)尊重作者,轉(zhuǎn)載還請(qǐng)注明出處!感謝配合~
[作者]: Imagine Miracle
[版權(quán)]: 本作品采用「署名-非商業(yè)性使用-相同方式共享 4.0 國際」許可協(xié)議進(jìn)行許可。
[本文鏈接]: https://blog.csdn.net/qq_36393978/article/details/128717724

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

分享標(biāo)題:【計(jì)算機(jī)體系結(jié)構(gòu)-02】機(jī)器模型-創(chuàng)新互聯(lián)
文章鏈接:http://vcdvsql.cn/article0/ceosoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)移動(dòng)網(wǎng)站建設(shè)定制開發(fā)企業(yè)建站虛擬主機(jī)做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)