linux內存布局
❶ linux用戶空間內存分配原則
在用戶空間中動態申請內存的函數為malloc (),這個函數在各種操作系統上的使用都是一致的,malloc ()申請的內存的釋放函數為free()。對於Linux而言,C庫的malloc ()函數一般通過brk ()和mmap ()兩個系統調用從內核申請內存。由於用戶空間C庫的malloc演算法實際上具備一個二次管理能力,所以並不是每次申請和釋放內存都一定伴隨著對內核的系統調用。如,應用程序可以從內核拿到內存後,立即調用free(),由於free()之前調用了mallopt(M_TRIM_THRESHOLD,一1)和mallopt (M_MMAP_MAX,0),這個free ()並不會把內存還給內核,而只是還給了C庫的分配演算法(內存仍然屬於這個進程),因此之後所有的動態內存申請和釋放都在用戶態下進行。另外,Linux內核總是採用按需調頁(Demand Paging),因此當malloc ()返回的時候,雖然是成功返回,但是內核並沒有真正給這個進程內存,這個時候如果去讀申請的內存,內容全部是0,這個頁面的映射是只讀的。只有當寫到某個頁面的時候,內核才在頁錯誤後,真正把這個頁面給這個進程。在Linux內核空間中申請內存涉及的函數主要包括kmalloc( ) 、get free pages ( )和vmalloc ()等。kmalloc ()和_get_free pages ()(及其類似函數)申請的內存位於DMA和常規區域的映射區,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,因此存在較簡單的轉換關系。而vmalloc()在虛擬內存空間給出一塊連續的內存區,實質上,這片連續的虛擬內存在物理內存中並不一定連續,而vmalloc ()申請的虛擬內存和物理內存之間也沒有簡單的換算關系。
❷ linux如何分配大內存
下面是哥去考RHCSA時做的筆記
創建交換分區
eg:應用程序-系統工具-磁碟實用工具-創建分區-類型-交換 分區
mkswap /dev/ha*
free 看到總交換分區的大小
swapon /dev/ha* 開啟交換分區
free 查看總分區大小是否多了
swapon -s 查看swap分區
Vim /etc/fstab
/dev/ha* swap swap defaults 0 0
有必要的話,可以重啟查看一下
❸ linux下查看內存地址空間的分配
cat /proc/iomem
這個可以查看,但不太詳細!
cat /proc/interrupts 是中斷向量。
❹ linux下怎麼設置內存對齊
內存對齊是有規則的:
a. 基本類型:所有的基本類型都有相應的對齊參數,編譯器在編譯時,會用全局的對齊參數和當前類型的對齊參數中較小的一個進行對齊。比如,編譯時指定按8bytes對齊(用#pragma pack(8)實現之),可是由於一個char變數的大小為一個byte,所以最後還是按1byte對齊。
b. 復合類型:復合類型的對齊原則,就是取其成員變數數據類型的位元組數的最大者和在編譯時指定的對齊數兩者之間較小的位元組數進行對齊。如果沒有用諸如#pragma pack指定全局對齊數,則該復合類型的對齊數就是其成員變數數據類型位元組數之最大者。
❺ linux下有沒有可以查看類對象的內存布局的
這個要用調試器來查看吧,調試器能夠查看當前調試程序的內存空間,在調試器中定位到一個內存地址,再結合實際代碼就可以查看內存布局,當然,類對象的內存空間也一目瞭然,查看函數的調用棧都是可以的。
❻ 淺談結構體及linux下內存分配原則
淺談結構體及linux下內存分配原則結構體在程序中的應用是很廣泛的,要處理的問題越復雜,數據量越多月雜,就越需要用到結構體。比如網路,內核,驅動等等。熟練使用結構體對每個程序員都是至關重要的。一個好的結構體不僅能使程序體系結構清晰,而且使得操作靈活,可擴展性強。linux網路之所以很強大,這和它里設計合理的數據結構有很大關系。
www.shiwu.com
結構體定義:[cpp]<span
style=font-size:18px;>struct
a{
int
xx:4;
int
yy:4;
};</span>
結構體初始化:方式一:[cpp]<span
style=font-size:18px;>struct
a
aa
={
xx:2,
yy:3
};</span>
www.shiwu.com
方式二:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=6,
.yy=1,
};</span>
方式三:[cpp]<span
style=font-size:18px;>struct
a
dd={4,2};</span>
在定義中,可以限制變數的位的作用域,比如上面的:int
xx:4;這表明xx的有效域只有4位,也就是能給他賦值的最大值為15,如果超過這個值,編譯器就會報錯:warning:
overflow
in
implicit
constant
conversion。在這里如果你給xx賦值為15,如:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=15,
.yy=1,
};</span>
www.shiwu.com
然後輸出:[cpp]<span
style=font-size:18px;>printf(cc.xx
=
%d/n,cc.xx);</span>
結果會是:-1因為這里定義的xx為int
型,15的二進制位1111,最高位為1,表示為負數,所以取反加1後為0001。所以是-1。這種位域操作的好處是當你不需要用到你定義的類型的長度時,可以加位域操作以節省內存空間。引出的其他問題這里用sizeof(struct
a)得到的是4,如果不加位域限制則是8,至於為什麼是4呢?4bit+4bit應該剛好是1byte啊,應該是1才對啊。這是因為我是在linux下編譯執行的,而在linux對內存分配最小值為類型值的一半。(我在linux下做了實驗)如下我定義了一個結構體:[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:2;
short
int
yy:2;
}bb;</span>
如上,我定義二個short
int類型值,short
int在32位linux下為2位元組,這里二個相加不足一位元組,但是輸出sizeof(struct
a)的值為2。不足一位元組系統自動補滿一位元組。[html]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:2;
}bb;</span>
www.shiwu.com
這個輸出也是2。xx超過一位元組,但是9+2=11,還沒有超過16(2位元組),我猜系統將xx超過的那1bit分到了yy那1bit裡面了。[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:9;
}bb;</span>
這個輸出是4。9+9=18,超過了16,系統各分配了2位元組給xx和yy。作者
linuxblack125125
❼ LINUX內存機制是什麼
Linux 內存機制
Linux支持虛擬內存(Virtual Mmemory),虛擬內存是指使用磁碟當作RAM的擴展,這樣可用的內存的大小就相應地增大了。內核會將暫時不用的內存塊的內容寫到硬碟上,這樣一來,這塊內存就可用於其它目的。當需要用到原始的內容時,它們被重新讀入內存。這些操作對用戶來說是完全透明的;Linux下運行的程序只是看到有大量的內存可供使用而並沒有注意到時不時它們的一部分是駐留在硬碟上的。當然,讀寫硬碟要比直接使用真實內存慢得多(要慢數千倍),所以程序就不會象一直在內存中運行的那樣快。用作虛擬內存的硬碟部分被稱為交換空間(Swap Space)。
一般,在交換空間中的頁面首先被換入內存;如果此時沒有足夠的物理內存來容納它們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬內存來容納所有這些頁面,Linux就會波動而不正常;但經過一段較長的時間Linux會恢復,但此時系統已不可用了。
有時,盡管有許多的空閑內存,仍然會有許多的交換空間正被使用。這種情況是有可能發生的,例如如果在某一時刻有進行交換的必要,但後來一個佔用很多物理內存的大進程結束並釋放內存時。被交換出的數據並不會自動地交換進內存,除非有這個需要時。此時物理內存會在一段時間內保持空閑狀態。對此並沒有什麼可擔心的,但是知道了是怎麼一回事,也就無所謂了。
許多操作系統使用了虛擬內存的方法。因為它們僅在運行時才需要交換空間,以解決不會在同一時間使用交換空間,因此,除了當前正在運行的操作系統的交換空間,其它的就是一種浪費。所以讓它們共享一個交換空間將會更有效率。
注意:如果會有幾個人同時使用這個系統,他們都將消耗內存。然而,如果兩個人同時運行一個程序,內存消耗的總量並不是翻倍,因為代碼頁以及共享的庫只存在一份。
Linux系統常常動不動就使用交換空間,以保持盡可能多的空閑物理內存。即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間:當磁碟閑著,就可以提前做好交換。可以將交換空間分散在幾個硬碟之上。針對相關磁碟的速度以及對磁碟的訪問模式,這樣做可以提高性能。
與訪問物理內存相比,磁碟的讀寫是很慢的。另外,在相應較短的時間內多次讀磁碟同樣的部分也是常有的事。例如,某人也許首先閱讀了一段E-mail消息,然後為了答復又將這段消息讀入編輯器中,然後又在將這個消息拷貝到文件夾中時,使得郵件程序又一次讀入它。或者考慮一下在一個有著許多用戶的系統中 ls命令會被使用多少次。通過將信息從磁碟上僅讀入一次並將其存於內存中,除了第一次讀以外,可以加快所有其它讀的速度。這叫作磁碟緩沖(Disk Buffering),被用作此目的的內存稱為高速緩沖(Buffer Cache)。但是,由於內存是一種有限而又不充足的資源,高速緩沖不可能做的很大(它不可能包容要用到的所有數據)。當緩沖充滿了數據時,其中最長時間不用的數據將被舍棄以騰出內存空間用於新的數據。
對寫磁碟操作來說磁碟緩沖技術同樣有效。一方面,被寫入磁碟的數據常常會很快地又被讀出(例如,原代碼文件被保存到一個文件中,又被編譯器讀入),所以將要被寫的數據放入緩沖中是個好主意。另一方面,通過將數據放入緩沖中,而不是將其立刻寫入磁碟,程序可以加快運行的速度。以後,寫的操作可以在後台完成,而不會拖延程序的執行。
大多數操作系統都有高速緩沖(盡管可能稱呼不同),但是並不是都遵守上面的原理。有些是直接寫(Write-Through):數據將被立刻寫入磁碟(當然,數據也被放入緩存中)。如果寫操作是在以後做的,那麼該緩存被稱為後台寫(Write-Back)。後台寫比直接寫更有效,但也容易出錯:如果機器崩潰,或者突然掉電,緩沖中改變過的數據就被丟失了。如果仍未被寫入的數據含有重要的薄記信息,這甚至可能意味著文件系統(如果有的話)已不完整。
針對以上的原因,出現了很多的日誌文件系統,數據在緩沖區修改後,同時會被文件系統記錄修改信息,這樣即使此時系統掉電,系統重啟後會首先從日誌記錄中恢復數據,保證數據不丟失。當然這些問題不再本文的敘述范圍。
由於上述原因,在使用適當的關閉過程之前,絕對不要關掉電源,Sync命令傾空(Flushes)緩沖,也即,強迫所有未被寫的數據寫入磁碟,可用以確定所有的寫操作都已完成。在傳統的UNIX系統中,有一個叫做update的程序運行於後台,每隔30秒做一次sync操作,因此通常無需手工使用sync命令了。Linux另外有一個後台程序,Bdflush,這個程序執行更頻繁的但不是全面的同步操作,以避免有時sync的大量磁碟I/O操作所帶來的磁碟的突然凍結。
在Linux中,Bdflush是由update啟動的。通常沒有理由來擔心此事,但如果由於某些原因bdflush進程死掉了,內核會對此作出警告,此時你就要手工地啟動它了(/sbin/update)。
緩存(Cache)實際並不是緩沖文件的,而是緩沖塊的,塊是磁碟I/O操作的最小單元(在Linux中,它們通常是1KB)。這樣,目錄、超級塊、其它文件系統的薄記數據以及非文件系統的磁碟數據都可以被緩沖了。緩沖的效力主要是由它的大小決定的。緩沖太小的話等於沒用。它只能容納一點數據,因此在被重用時,所有緩沖的數據都將被傾空。實際的大小依賴於數據讀寫的頻次、相同數據被訪問的頻率。只有用實驗的方法才能知道。
如果緩存有固定的大小,那麼緩存太大了也不好,因為這會使得空閑的內存太小而導致進行交換操作(這同樣是慢的)。為了最有效地使用實際內存,Linux自動地使用所有空閑的內存作為高速緩沖,當程序需要更多的內存時,它也會自動地減小緩沖的大小。
這就是一般情況下Linux內存的一般機制,真正的Linux內存的運行機制遠遠比這個復雜。
❽ Linux系統啟動之後,物理內存的布局是怎麼樣的
2.6版的32位內核以後,內核起始物理地址應該是0x100000,也就是前面有1MB的空間。
0x0開始的第一頁是給bios用的。後面一部分映射了顯卡rom之類的東西。
❾ linux採用什麼方法實現內存的分配和釋放
Linux 採用 Buddy 演算法有效分配和釋放物理頁塊。
linux系統內存管理的特點linux的進程結束後,它佔用的資源全部釋放,但是內存僅僅是設置了標志,標志了這部分內存已經不再使用,可以被重新分配的。當進程需要內存時,linux系統首先從空閑內存中查找分配,空閑內存不足時就會使用不再使用的內存;另外,如果你的程序又一次運行,系統直接使用內存中
的數據,不再從文件系統讀組,提高了效率。這樣一來,linux的系統使用律會很高,伺服器的在98%以上;這樣做的目的是:linux認為內存是最寶貴
的資源,充分利用,不能讓他空閑