❶ 存儲系統層次結構包含哪些層
第一層:通用寄存器堆 第二層:指令與數據緩沖棧 第三層:高速緩沖存儲器 第四層:主儲存器(DRAM) 第五層:聯機外部儲存器(硬磁碟機) 第六層:離線外部儲存器(磁帶、光碟存儲器等) 這就是存儲器的層次結構~~~ 主要體現在訪問速度~~~ 1,設置多個存儲器並且使他們並行工作。本質:增添瓶頸部件數目,使它們並行工作,從而減緩固定瓶頸。 2,採用多級存儲系統,特別是Cache技術,這是一種減輕存儲器帶寬對系統性能影響的最佳結構方案。本質:把瓶頸部件分為多個流水線部件,加大操作時間的重疊、提高速度,從而減緩固定瓶頸。 3,在微處理機內部設置各種緩沖存儲器,以減輕對存儲器存取的壓力。增加CPU中寄存器的數量,也可大大緩解對存儲器的壓力。本質:緩沖技術,用於減緩暫時性瓶頸。
❷ 什麼情況下會用到棧
棧可以用來在函數調用的時候存儲斷點,做遞歸時要用到棧!
首先 系統或者數據結構棧中數據內容的讀取 與 (壓入push和 彈出pop) 是兩回事! 插入是增加數據 彈出 是刪除數據 ,這些操作只能從棧頂即最低地址作為約束的介面界面入手操作 ,但讀取棧中的數據 是隨便的 沒有介面約束之說。很多人都誤解這個理念從而對棧產生困惑。[1]而系統棧在計算機體系結構中 又起到一個跨部件交互的媒介區域的作用 即 cpu 與內存的交流通道 ,cpu只從系統給我們自己編寫的應用程序所規定的棧入口線性地讀取執行指令, 用一個形象的詞來形容它就是pipeline(管道線、流水線)。cpu內部交互具體參見 EU與BIU的概念介紹。
棧作為一種數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。它按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指針。
棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為後進先出表。
棧可以用來在函數調用的時候存儲斷點,做遞歸時要用到棧!
以上定義是在經典計算機科學中的解釋。
在計算機系統中,棧則是一個具有以上屬性的動態內存區域。程序可以將數據壓入棧中,也可以將數據從棧頂彈出。在i386機器中,棧頂由稱為esp的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大。
棧在程序的運行中有著舉足輕重的作用。最重要的是棧保存了一個函數調用時所需要的維護信息,這常常稱之為堆棧幀或者活動記錄。堆棧幀一般包含如下幾方面的信息:
1.函數的返回地址和參數
2. 臨時變數:包括函數的非靜態局部變數以及編譯器自動生成的其他臨時變數。
❸ 什麼是高速緩沖存儲器在計算機系統中它是如何發揮作用的
高速緩沖存儲器(Cache)實際上是為了把由DRAM組成的大容量內存儲器都看做是高速存儲器而設置的小容量局部存儲器,一般由高速SRAM構成。這種局部存儲器是面向CPU的,引入它是為減小或消除CPU與內存之間的速度差異對系統性能帶來的影響。Cache 通常保存著一份內存儲器中部分內容的副本(拷貝),該內容副本是最近曾被CPU使用過的數據和程序代碼。Cache的有效性是利用了程序對存儲器的訪問在時間上和空間上所具有的局部區域性,即對大多數程序來說,在某個時間片內會集中重復地訪問某一個特定的區域。如PUSH/POP指令的操作都是在棧頂順序執行,變數會重復使用,以及子程序會反復調用等,就是這種局部區域性的實際例證。因此,如果針對某個特定的時間片,用連接在局部匯流排上的Cache代替低速大容量的內存儲器,作為CPU集中重復訪問的區域,系統的性能就會明顯提高。
系統開機或復位時,Cache 中無任何內容。當CPU送出一組地址去訪問內存儲器時,訪問的存儲器的內容才被同時「拷貝」到Cache中。此後,每當CPU訪問存儲器時,Cache 控制器要檢查CPU送出的地址,判斷CPU要訪問的地址單元是否在Cache 中。若在,稱為Cache 命中,CPU可用極快的速度對它進行讀/寫操作;若不在,則稱為Cache未命中,這時就需要從內存中訪問,並把與本次訪問相鄰近的存儲區內容復制到 Cache 中。未命中時對內存訪問可能比訪問無Cache 的內存要插入更多的等待周期,反而會降低系統的效率。而程序中的調用和跳轉等指令,會造成非區域性操作,則會使命中率降低。因此,提高命中率是Cache 設計的主要目標。
❹ "棧"和"棧幀"這兩個概念到底如何區分
1、棧:FILO先進後出的數據結構
棧底是第一個進棧的數據的位置(壓箱底)
棧頂是最後一個進棧的數據位置
2、根據SP指針指向的位置,棧可分為滿棧和空棧
滿棧:當sp指針總是指向最後壓入堆棧的數據(ARM採用滿棧)
棧的作用:
1)保存局部變數
分析代碼:
[html]view plain
#include<stdio.h>
intmain()
{
inta;
a++;
returna;
}</span>
stack:fileformatelf32-littlearm
Disassemblyofsection.text:
00000000<main>:
#include<stdio.h>
intmain()
{
0:e52db004push{fp};(strfp,[sp,#-4]!)@將棧幀底部指針FP壓入棧中;創建屬於main函數的棧幀。
4:e28db000addfp,sp,#0;0x0@fp指針為函數棧幀的底部,
8:e24dd00csubsp,sp,#12;0xc@sp指針為棧幀的頂部,同時為棧的棧頂。
inta;
a++;
c:e51b3008ldrr3,[fp,#-8]@由此三句可知變數a在棧幀中執行了加法操作,及棧幀具有保存局部變數的作用
10:e2833001addr3,r3,#1;0x1
14:e50b3008strr3,[fp,#-8]
returna;
18:e51b3008ldrr3,[fp,#-8]
}
</span>
<spanstyle="font-size:18px;">#include<stdio.h>
voidfunc1(inta,intb,intc,intd,inte,intf)
{
intk;
k=e+f;
}
intmain()
{
func1(1,2,3,4,5,6);
return0;
}
反匯編之後的代碼;
voidfunc1(inta,intb,intc,intd,inte,intf)@多於4個參數
{
0:e52db004push{fp};(strfp,[sp,#-4]!)@保存main函數的棧幀底部指針FP
4:e28db000addfp,sp,#0;0x0
8:e24dd01csubsp,sp,#28;0x1c@由棧幀頂部指針SP創建一片棧幀保存子函數的前四個參數
c:e50b0010strr0,[fp,#-16]@a
10:e50b1014strr1,[fp,#-20]@b
14:e50b2018strr2,[fp,#-24]@c
18:e50b301cstrr3,[fp,#-28]@d
intk;
k=e+f;
1c:e59b3004ldrr3,[fp,#4]@在子函數的棧幀中實現第五個參數與第六個參數的運算
20:e59b2008ldrr2,[fp,#8]@由ldrr2,[fp,#8]知參數保存在main函數的棧幀中,並運算
24:e0833002addr3,r3,r2@以子函數的棧幀底部指針(fp)做參考坐標實現對參數的查找
28:e50b3008strr3,[fp,#-8]
}
2c:e28bd000addsp,fp,#0;0x0
30:e8bd0800pop{fp}
34:e12fff1ebxlr
00000038<main>:
intmain()
{
38:e92d4800push{fp,lr}@由於調用子函數,先保存main函數的棧幀底部指針FP和返回地址LR(當前PC指針的下一地址)
3c:e28db004addfp,sp,#4;0x4@可知先壓入FP,後壓入lr.把此時子函數(被調用者)的棧幀底部指針FP指向保存在子函數棧幀的main函數(調用者)的棧幀底部指針FP
40:e24dd008subsp,sp,#8;0x8@創建棧
func1(1,2,3,4,5,6);
44:e3a03005movr3,#5;0x5
48:e58d3000strr3,[sp]
4c:e3a03006movr3,#6;0x6
50:e58d3004strr3,[sp,#4]
54:e3a00001movr0,#1;0x1@用通用寄存器保存前四個參數的值
58:e3a01002movr1,#2;0x2
5c:e3a02003movr2,#3;0x3
60:e3a03004movr3,#4;0x4
64:ebfffffebl0<func1>
return0;
68:e3a03000movr3,#0;0x0
}
6c:e1a00003movr0,r3
70:e24bd004subsp,fp,#4;0x4
74:e8bd4800pop{fp,lr}
78:e12fff1ebxlr</span>
<spanstyle="font-size:18px;">include<stdio.h>
voidfunc2(inta,intb)
{
intk;
k=a+b;
}
voidfunc1(inta,intb)
{
intc;
func2(3,4);
c=a+b;
}
intmain()
{
func1(1,2);
return0;
}</span>
<spanstyle="font-size:18px;">voidfunc2(inta,intb)
{
0:e52db004push{fp};(strfp,[sp,#-4]!)
4:e28db000addfp,sp,#0;0x0
8:e24dd014subsp,sp,#20;0x14
c:e50b0010strr0,[fp,#-16]@保存寄存器的值
10:e50b1014strr1,[fp,#-20]
intk;
k=a+b;
14:e51b3010ldrr3,[fp,#-16]
18:e51b2014ldrr2,[fp,#-20]
1c:e0833002addr3,r3,r2
20:e50b3008strr3,[fp,#-8]
}
24:e28bd000addsp,fp,#0;0x0
28:e8bd0800pop{fp}
2c:e12fff1ebxlr
00000030<func1>:
voidfunc1(inta,intb)
{
30:e92d4800push{fp,lr}
34:e28db004addfp,sp,#4;0x4
38:e24dd010subsp,sp,#16;0x10
3c:e50b0010strr0,[fp,#-16]@代碼44行調用func2函數後,又使用r0 1保存參數,所以此時將r0 1寄存器的
40:e50b1014strr1,[fp,#-20]@值放入棧中
intc;
func2(3,4);
44:e3a00003movr0,#3;0x3
48:e3a01004movr1,#4;0x4
4c:ebfffffebl0<func2>
c=a+b;
50:e51b3010ldrr3,[fp,#-16]
54:e51b2014ldrr2,[fp,#-20]
58:e0833002addr3,r3,r2
5c:e50b3008strr3,[fp,#-8]
}
60:e24bd004subsp,fp,#4;0x4
64:e8bd4800pop{fp,lr}
68:e12fff1ebxlr
0000006c<main>:
intmain()
{
6c:e92d4800push{fp,lr}
70:e28db004addfp,sp,#4;0x4
func1(1,2);
74:e3a00001movr0,#1;0x1
78:e3a01002movr1,#2;0x2
7c:ebfffffebl30<func1>
return0;
80:e3a03000movr3,#0;0x0
}
84:e1a00003movr0,r3
88:e24bd004subsp,fp,#4;0x4
8c:e8bd4800pop{fp,lr}
90:e12fff1ebxlr</span>
反匯編之後的代碼;
[html]view plain
2)保存函數的參數
分析代碼:
[html]view plain
註:C中,若函數的參數小於等於4個,則用通用寄存器保存其參數值,多於4個的參數保存在棧中
3)保存寄存器的值
分析代碼:
[html]view plain
反匯編之後的代碼;
[html]view plain
初始化棧:即對SP指針賦予一個內存地址(統一標准:2440、6410、210)
在內存的64MB位置即ldr sp, =0x34000000(2440)
ldr sp, =0x54000000(6410)
ldr sp, =0x24000000(210)
由上可知ARM採用滿棧(指向剛入棧的數據)、降棧(由高地址向低地址入棧)
問題:因為ARM不同工作模式有不同的棧,定義棧的技巧是什麼,避免定義相同的地址使用不同棧?
轉自:http://blog.csdn.net/u011467781/article/details/39559737
❺ 計算機內,配置高速緩沖存儲器(CACHE)是為了解決什麼
B,CPU與內存儲器之間速度不匹配問題。
高速緩沖存儲器(Cache)其原始意義是指存取速度比一般隨機存取記憶體(RAM)來得快的一種RAM,一般而言它不像系統主記憶體那樣使用DRAM技術,而使用昂貴但較快速的SRAM技術,也有快取記憶體的名稱。
高速緩沖存儲器是存在於主存與CPU之間的一級存儲器, 由靜態存儲晶元(SRAM)組成,容量比較小但速度比主存高得多, 接近於CPU的速度。在計算機存儲系統的層次結構中,是介於中央處理器和主存儲器之間的高速小容量存儲器。它和主存儲器一起構成一級的存儲器。高速緩沖存儲器和主存儲器之間信息的調度和傳送是由硬體自動進行的。
(5)什麼存儲器記錄棧幀的頂部擴展閱讀:
高速緩沖存儲器組成結構
高速緩沖存儲器是存在於主存與CPU之間的一級存儲器, 由靜態存儲晶元(SRAM)組成,容量比較小但速度比主存高得多, 接近於CPU的速度。
主要由三大部分組成:
1、Cache存儲體:存放由主存調入的指令與數據塊。
2、地址轉換部件:建立目錄表以實現主存地址到緩存地址的轉換。
3、替換部件:在緩存已滿時按一定策略進行數據塊替換,並修改地址轉換部件。
❻ 棧只能順序存儲,這句話對嗎,為什麼
棧只能順序存儲,這句話不對。棧作為一種數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom)。
一個新元素只能從棧頂一端進入,刪除時,只能刪除棧頂的元素,即剛剛被插入的元素。所以棧也稱為後進先出表。線性表可以順序存儲,也可以鏈式存儲,因此棧也可以採用鏈式存儲結構。
(6)什麼存儲器記錄棧幀的頂部擴展閱讀:
棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為後進先出表。
在計算機系統中,棧則是一個具有以上屬性的動態內存區域。程序可以將數據壓入棧中,也可以將數據從棧頂彈出。在i386機器中,棧頂由稱為esp的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大。
棧在程序的運行中有著舉足輕重的作用。最重要的是棧保存了一個函數調用時所需要的維護信息,這常常稱之為堆棧幀或者活動記錄。堆棧幀一般包含如下幾方面的信息:
1、函數的返回地址和參數。
2、臨時變數:包括函數的非靜態局部變數以及編譯器自動生成的其他臨時變數。
鏈式存儲結構的特點:
1、比順序存儲結構的存儲密度小(鏈式存儲結構中每個結點都由數據域與指針域兩部分組成,相比順序存儲結構增加了存儲空間)。
2、邏輯上相鄰的節點物理上不必相鄰。
3、插入、刪除靈活 (不必移動節點,只要改變節點中的指針)。
4、查找節點時鏈式存儲要比順序存儲慢。
5、每個節點是由數據域和指針域組成。
6、由於簇是隨機分配的,這也使數據刪除後覆蓋幾率降低,恢復可能提高。
順序存儲結構的主要優點是節省存儲空間,因為分配給數據的存儲單元全用存放結點的數據(不考慮c/c++語言中數組需指定大小的情況),結點之間的邏輯關系沒有佔用額外的存儲空間。
採用這種方法時,可實現對結點的隨機存取,即每一個結點對應一個序號,由該序號可以直接計算出來結點的存儲地址。但順序存儲方法的主要缺點是不便於修改,對結點的插入、刪除運算時,可能要移動一系列的結點。
參考資料:網路-棧
參考資料:網路-鏈式存儲結構
參考資料:網路-順序存儲結構
❼ 棧結構通常採用的兩種儲存結構是和
順序存儲和鏈接存儲,通稱順序隊列和鏈隊列,
是計算機科學中一種特殊的串列形式的抽象數據類型,其特殊之處在於只能允許在鏈表或數組的一端(稱為堆棧頂端指針,英語:top)。
進行加入數據(英語:push)和輸出數據(英語:pop)的運算。另外堆棧也可以用一維數組或鏈表的形式來完成。堆棧的另外一個相對的操作方式稱為隊列。
由於堆棧數據結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。
堆棧數據結構使用兩種基本操作:推入(壓棧,push)和彈出(彈棧,pop):
推入:將數據放入堆棧的頂端(數組形式或串列形式),堆棧頂端top指針加一。
彈出:將頂端數據數據輸出(回傳),堆棧頂端數據減一。
(7)什麼存儲器記錄棧幀的頂部擴展閱讀:
堆棧是一個特定的存儲區或寄存器,它的一端是固定的,另一端是浮動的。對這個存儲區存入的數據,是一種特殊的數據結構。所有的數據存入或取出,只能在浮動的一端(稱棧頂)進行,嚴格按照「後進先出」的原則存取,位於其中間的元素。
必須在其棧上部(後進棧者)諸元素逐個移出後才能取出。在內存儲器 (隨機存儲器) 中開辟一個區域作為堆棧,叫軟體堆棧; 用寄存器構成的堆棧,叫硬體堆棧。堆棧處理器就是一種硬體堆棧相對寄存器文件處理器來講。
它具有很多優點系統復雜度低;精簡的指令集;晶元面積小;定址方式簡單;代碼體積小;快速的中斷響應,子程序調用能力。這些優點使得堆棧處理器在工業控制領域和航空航天領域有著不可替代的地位。
❽ 匯編中堆棧的理解
你可以把棧理解成一個暫時存放東西的東西
比如你想用AX這個寄存器,但是又不想把AX里原來的數據弄丟了
這時就可以用棧了
先用push指令把ax壓入棧頂
然後就可以用ax這個寄存器了,用完之後用pop指令把原先壓倒棧里的ax里的數據彈出來
對於這個棧,在 8086 CPU 里有兩個專用的寄存器: SS 和 SP ,這兩個寄存器用於指向內存中的棧頂
❾ 帶鏈棧怎麼運算可以有top=bottom=20,如圖
一個,top=bottom=20表示棧頂和棧底指向同一個地址,中間沒有其他的元素,就只剩一個同時指向的元素了。
棧的順序存儲空間為S(1:50),初始狀態為top=0。現經過一系列入棧與退棧運算後,top=20,則棧頂-棧底=20-0=20個元素。
棧是向上增長的,每次壓入一個元素,棧的TOP指針向上移動一位。當壓入第一個元素時,TOP指針指向m+1-1 = m當壓入第二個元素時,TOP指針指向m+1-2 = m-1。以此類推,當壓入第N個元素時,TOP指針指向m+1-N = 20則N = m+1-20 = m-19。
(9)什麼存儲器記錄棧幀的頂部擴展閱讀:
在計算機系統中,棧則是一個具有以上屬性的動態內存區域。程序可以將數據壓入棧中,也可以將數據從棧頂彈出。在i386機器中,棧頂由稱為esp的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大。
棧在程序的運行中有著舉足輕重的作用。最重要的是棧保存了一個函數調用時所需要的維護信息,這常常稱之為堆棧幀或者活動記錄。堆棧幀一般包含如下幾方面的信息:
1、函數的返回地址和參數
2、臨時變數:包括函數的非靜態局部變數以及編譯器自動生成的其他臨時變數。
❿ 最近學習ucos2,關於任務棧哪邊是棧頂哪邊是棧底的問題
可不可以這樣理解:
OSTCBStkBottom :指向棧的可用空間的最高(最低)地址
top --> 指向當前可以使用的單元
bottom就像是一條界限,不管棧的方向是遞增還是遞減,top指針都不能越過bottom指針