A. C++~我想問下"abcd"這個字元串常量是一個什麼類型的指針
是這樣的,其實"abcd"這個字元串是你代碼中給出的常量,存在於頁面緩存之上,也就是程序一運行就已經存在了,與你進行了什麼操作無關。
而char * s="abcd"這句話只是將那個已經存在的內存塊的起始地址付給了s
所以s本身是指針變數,但它卻指向一段頁面緩存,頁面緩存是不允許直接更改的
你可以做如下的實驗
char *s="abcd";//緩存位於頁面
char r[5]="ABCD";//緩存位於棧
char *t=new char[5];//緩存位於堆
通過調試觀察,你會發現這三個指針所得到的地址確實位於不同的區域,
B. UC瀏覽器的頁面緩存文件在哪個文件夾里
具體操作步驟如下:
1、首先打開手機uc瀏覽器,點擊選擇下方「三」圖標按鈕。
C. 堆和棧的區別是啥
1、堆棧空間分配
棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
2、堆棧緩存方式
棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收演算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
3、效率比較
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。
4、存儲內容
棧: 在函數調用時,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。
當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向函數的返回地址,也就是主函數中的下一條指令的地址,程序由該點繼續運行。
堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容由程序員安排。
(3)頁面緩存是在堆中嗎擴展閱讀:
簡介
單片機應用中,堆棧是個特殊存儲區,堆棧屬於RAM空間的一部分,堆棧用於函數調用、中斷切換時保存和恢復現場數據。
堆棧中的物體具有一個特性:第一個放入堆棧中的物體總是被最後拿出來, 這個特性通常稱為先進後出 (FILO—First-In/Last-Out)。 堆棧中定義了一些操作, 兩個最重要的是PUSH和POP。 PUSH(入棧)操作:堆棧指針(SP)加1,然後在堆棧的頂部加入一 個元素。
POP(出棧)操作相反,出棧則先將SP所指示的內部ram單元中內容送入直接地址定址的單元中(目的位置),然後再將堆棧指針(SP)減1.。這兩種操作實現了數據項的插入和刪除。
D. 磁碟緩存,虛擬內存,頁面文件,和物理內存的關系
如果它不存在,但是你能看見它 -- 它是虛擬的(IBM宣傳虛擬內存之用語)。虛擬內存技術是計算機發展史上的一項重要的技術,它幫助應用程序擺脫了「體積」的限制。
記得上大學時,有一本書好像叫做「計算機網路 - 自頂向下」,全名記不太清了。書中從人們接觸最多也最熟悉的「應用層」開始講,一直講到「物理層」,看完這本書後感覺效果不錯。所以按照這種方法我也嘗試著自上而下的去學習「虛存」,從我們最熟悉的C庫介面調用說起,一直談到底層的硬體支持設施。
1、初學者的疑惑
初學者往往都會寫出以下這樣的例子程序來學習malloc和free的使用。
int main() {
int *p = malloc(10000);
printf("p's address is 0x%p\n", p);
free(p);
return 0;
}
但往往結果讓這些初學者們感到疑惑。比如上述的例子,在SUN SPARC 64編譯後其輸出如下:
p's address is 0x100100dc0
看到這樣的結果,初學者往往心裡嘀咕,「這台機器物理內存才4G,其地址空間總共才4294967296(dec),而0x100100dc0轉換十進制為4296019392(dec),這個地址明顯已經超出了我的物理內存的限制,這是怎麼回事呢?」。其實這里的解釋很簡單:因為我們看到的都是「虛擬內存地址」。
2、「堆」為何物
malloc是個極其常見的內存分配介面函數,它主要負責運行時在「堆」上為程序動態分配內存空間。我們總是在口頭上談論著「堆」,那麼「堆」到底為何物呢?我們已經知道了有「虛擬地址」這個東西的存在,想必「堆」和「虛擬地址」有著千絲萬縷的聯系^_^。我們來翻看一些經典書籍中的描述。在CS.APP[注1]中的描述是這樣的:「堆是進程地址空間中的一段「虛擬地址」空間。在大多數的Unix系統中,堆是映射「二進制零區域(demand-zero)」實現的。其位置在bss段後,其增長方向為高地址方向」。
3、內存映射
前面談到「demand-zero」這個新名詞,那麼什麼叫「映射到demand-zero」呢?這里蘊含著一個極其重要的概念「內存映射」。內存映射好似一道橋梁,將放在物理磁碟上的對象和一段進程「虛擬地址」空間連接起來。磁碟上的對象,主要指的就是文件,在多數Unix的實現中支持兩種文件的內存映射,分別為Regular File和匿名文件(如demand-zero)。映射的過程大致為將文件分成若干「虛擬內存基本單元(頁)」大小存於「交換區」,直到CPU指令第一次訪問到某個單元時,這個單元才真正被載入到物理內存中。
4、虛擬內存,何方神聖
看到這是不是有些「雲里霧里」的感覺亞^_^。其實對於用戶進程來說,它是看不到CPU和OS是如何相互配合完成內存管理的。它只認為它面前的是一個這樣的情景:「一個完全被我擁有的CPU、一個從擁有M地址空間的物理內存(M = 2的n次方,n為地址匯流排寬度)...」。這里的用戶進程眼中的「物理內存」實際就是「虛擬內存」。虛擬意味著假象,我們知道一個用戶進程運行時可能僅僅佔用的物理內存的一小部分。看來用戶進程被欺騙了。而這個騙局是由操作系統和CPU共同布置的。為了讓這個騙局一直維持下去,CPU和OS還是做了很多工作的,究竟有哪些工作呢?我們一一來看看。
1) 交換區(swap)
為了支持虛擬內存,操作系統在物理內存、磁碟之間交換數據的基本單元為「頁」。頁的大小是固定的,其因操作系統而異。這樣一個用戶進程在被載入之前首先要被分成若干個「頁」,這些頁存儲在磁碟上。那麼是不是進程啟動後所有的頁都被載入到物理內存中呢?答案是NO。在當前的Unix操作系統中,都有一個叫「交換區」的地方,「交換區」在磁碟上,它存儲的是「已分配的虛擬內存頁」。又有些糊塗是吧,什麼叫已分配的頁呢?一個進程虛擬內存頁的載入流程大致是這樣的:一旦用戶進程一虛擬頁需要被載入,則操作系統會在「交換區」中為該頁分配一個頁,一旦CPU訪問的虛擬地址落入該頁地址空間,則該頁才被換入到物理內存中。在這個過程中虛擬頁有多個狀態,分別如下:
未分配的 - 進程虛擬頁未得到載入指令,仍安靜的待在磁碟上;
未緩存的 - OS為該進程虛擬頁在交換區分配了一個空間,但是該虛擬頁還未被引用;
已緩存的 - 該虛擬頁被引用,被載入到物理內存中。
2) 換入換出
物理內存容量有限,當物理內存無空間存儲新的內存頁的時候,就需要將某些內存頁從物理內存中移出以為新頁騰出空間。這個過程對於那些被移出的頁來說,就叫「換出」;相反對於那些新加入到物理內存中的頁來說就叫做「換入」。
5、從緩存角度看虛存
現代計算機的存儲體系是呈金字塔狀的。越接近頂層,速度越快,容量越小,價格越貴;越接近底層,速度越慢,容量越大,價格越低。這樣就形成了一個逐級緩存的機制。第K層設備永遠是第K+1層設備的緩存。按照這種說法,在早期計算機中,主存是磁碟的緩存,CPU內的高級Cache是主存的緩存。現代計算機基本都支持虛擬內存機制,而虛存頁是存儲在磁碟上的,虛存頁在主存中換入換出。按照緩存的概念,虛存屬於容量大,速度慢的第K+1層,而處於第K層的主存就可以看作是虛擬內存的緩存。那麼一切緩存理論就都可以應用在虛存和物理內存之間了,比如換入換出演算法等。
6、硬體支持
在支持虛擬內存機制的計算機中,CPU都是以虛擬地址形式生成指令地址或者數據地址的,而這個虛擬地址對於物理內存來說是不可見的,那麼是誰來屏蔽這個差異的呢?答案是MMU(Memory Management Unit)。MMU負責將CPU發出的虛擬地址轉換成相應的物理內存地址。MMU不是孤立工作的,OS為其提供了很好的支持,OS在物理內存中為MMU維護著一張全局的頁表,來幫助MMU找到正確地物理內存地址。
E. 緩存是啥意思
緩存指的是將需要頻繁訪問的網路內容存放在離用戶最近、訪問速度更快的系統中,以提高內容訪問速度的一種技術。緩存伺服器就是存放頻繁訪問內容的伺服器。
幀緩沖存儲器(Frame Buffer):簡稱幀緩存或顯存,它是屏幕所顯示畫面的一個直接映象,又稱為位映射圖(Bit Map)或光柵。幀緩存的每一存儲單元對應屏幕上的一個像素,整個幀緩存對應一幀圖像。
可刻錄CD或DVD驅動器一般具有2MB-4MB以上的大容量緩沖器,用於防止緩存欠載(buffer underrun)錯誤,同時可以使刻錄工作平穩、恆定的寫入。一般來說,驅動器越快,就有更多的緩沖存儲器,以處理更高的傳輸速率。
(5)頁面緩存是在堆中嗎擴展閱讀
緩存工作原理
1、讀取順序
CPU要讀取一個數據時,首先從Cache中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入Cache中,可以使得以後對整塊數據的讀取都從Cache中進行,不必再調用內存。
正是這樣的讀取機制使CPU讀取Cache的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在Cache中,只有大約10%需要從內存讀取。
這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先Cache後內存。
2、緩存分類
Intel從Pentium開始將Cache分開,通常分為一級高速緩存L1和二級高速緩存L2。在以往的觀念中,L1 Cache是集成在CPU中的,被稱為片內Cache。在L1中還分數據Cache(D-Cache)和指令Cache(I-Cache)。
它們分別用來存放數據和執行這些數據的指令,而且兩個Cache可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。
3、讀取命中率
CPU在Cache中找到有用的數據被稱為命中,當Cache中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1 Cache的命中率為80%。
也就是說CPU從L1 Cache中找到的有用數據占數據總量的80%,剩下的20%從L2 Cache讀取。由於不能准確預測將要執行的數據,讀取L2的命中率也在80%左右(從L2讀到有用的數據占總數據的16%)。那麼還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。
在一些高端領域的CPU(像Intel的Itanium)中,我們常聽到L3 Cache,它是為讀取L2 Cache後未命中的數據設計的—種Cache,在擁有L3 Cache的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。
F. 簡述什麼是堆棧,以及堆棧中入棧,出棧的過程
堆棧其實是兩種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端
(稱為棧頂(top))
對數據項進行插入和刪除。要點:堆,順序隨意。棧,後進先出(Last-In/First-Out)。
針對棧這種數據結構的基本操作有兩種:壓棧和彈出,
在棧幀中包含兩個標志----棧底和棧頂,其中棧頂標識著要push或pop
的數據的地址,而棧底則表示棧幀中最後一個數據的內存地址。
在Win32中,寄存器esp存放著棧底指針,棧是向低地址方向生長,
因此esp指向棧頂元素
堆棧對比(操作系統):
由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其
操作方式類似於數據結構中的棧棧使用的是一級緩存,
通常都是被調用時處於存儲空間中,調用完畢立即釋放
堆(操作系統):
一般由程序員分配釋放,
若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收演算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些
堆(數據結構)
:堆可以被看成是一棵樹,如:堆排序
棧(數據結構)
:一種後進先出的的數據結構
具體不同語言有不同的描述,可查看各種語言的api
G. "\\\" 這個是字元串常量嗎為什麼
在C語言中,"\\\"不是字元串常量
因為在C語言中,\用於轉義字元,"\\"代表一個字元\的字元串,單獨的"\"是沒有意義的。
H. 網站製作中,所說的緩沖區指的是哪裡 伺服器端的內存里的
緩存區 有很多種,計算機中只要是寄存器設備都基本都有緩存區,用來暫時讀出或寫入的緩存。
客戶-伺服器,怎麼連接,除了網路,還有就是在兩台電腦中都有一個進程進行相互通信,當年請求一個連接的時候,這時候伺服器中的系統就會為你們這個連接創建一個進程,這時候就需要內存空間了,這些進程根據你的要求申請內存空間,這個可以說是兩個進程的緩沖區了,當你結束通信結束進程就自動釋放所佔用的資源,計算機通信其實也是進程在通信,細講起來一大堆了。
I. 是不是安卓的緩存保存在運存中,WP和iPhone的緩存保存在內存中()
樓主你好!
我給你解釋一下為什麼安卓和WP以及IOS的之間的緩存儲存的不同!首先是安卓,安卓手機的緩存是堆砌式的,也就是說有多少內存空間,他就一股腦的往裡面裝,直到內存塞滿為止,這時候你手機應該會提示:你的虛擬內存不足,請清理緩存使用!這就是所謂的安卓手機緩存系統,然後就是WP和ios系統,這兩個系統的緩存是相同的原理,緩存的存儲空間是事先就規定好了的,默認只佔用總內存的是5%,若緩存大小超出設置的緩存空間,會自動把前面的緩存刪除進行替代的,那麼這樣永遠就只佔用總內存的是5%,所有你不會覺得卡,而且好像就是沒有緩存一樣!這樣解釋你應該很清楚吧!
J. 堆和棧的區別 還有什麼建立在堆上 什麼建立在棧上
棧(操作系統):由編譯器自動分配釋放
,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧
棧使用的是一級緩存,
他們通常都是被調用時處於存儲空間中,調用完畢立即釋放
堆(操作系統):
一般由程序員分配釋放,
若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收演算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些
堆(數據結構):堆可以被看成是一棵樹,如:堆排序
棧(數據結構):一種後進先出的數據結構
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在
WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
形象來說,棧就是一條流水線,而流水線中加工的就是方法的主要程序,在分配棧時,由於程序是自上而下順序執行,就將程序指令一條一條壓入棧中,就像流水線一樣。而堆上站著的就是工作人員,他們加工流水線中的商品,由程序員分配:何時加工,如何加工。而我們通常使用new運算符為對象在堆上分配內存(C#),堆上尋找對象的任務交給句柄,而棧中由棧指針管理