淺談計算機系統——內存管理

多級存儲體系html

當前計算機廣泛使用的存儲架構即以下圖:linux

   寄存器+三級高速緩存+內存(主存)+disk(本地磁盤和外連存儲)緩存

因此能夠看到咱們的當前玩的內存在哪一個具體位置。網絡

 

高速緩存,能夠作暫存,以便相關單元再次使用;再合適的時候,回寫進內存,好比空間不夠、週期性等架構

 

 

進程和內存關係socket

進程大小各不相同,在內存置換過程當中,可否準確無誤放置於內存將成爲關鍵。(詳細細節本身想,不累述)方案以下:ide

技術性能

說明優化

優點ui

劣勢

固定分區

在系統生成階段,內存被劃分紅許多靜態分區。進程可裝入大於等於自身大小的分區中。

實現簡單,只須要極少的操做系統開銷。

因爲有內部碎片,對內存的使用不充分;活動進程的最大數量是固定的。

動態分區

分區是動態建立的,於是每一個進程可裝入於自身大小正好相等的分區中

沒有內部碎片;能夠更充分地使用內存

因爲須要壓縮外部碎片的開銷,處理器利用率低。

 

基於以上兩項技術的缺陷,發起了另一種技術,叫夥伴系統

相鄰塊能夠任意拆分組合。最初合成爲一個大塊,當須要使用的時候,好比1MB生2個512KB,再其中1個512KB生2個256KB,直到大小約等於進程大小容量的塊。當最後使用的塊空閒時,塊將自動合併成大塊。

 

分頁技術

  1. 至關於固定分區,可是塊更小;
  2. 採用頁表,映射邏輯地址到物理地址的關係,所以存儲同一個進程的分區能夠不連續

進程最後一個佔用塊可能會有內部碎片。

 

分段技術

  1. 至關於動態分區,可是塊更小;
  2. 也採用頁表技術。

同動態分區,會有較小的外部碎片。

 

頁表技術

邏輯地址:頁號+偏移量(即單個頁的大小)

物理地址:頁框號+偏移量

 

 

虛擬內存

受限於內存的大小瓶頸,考慮在磁盤內劃定特定區域用於內存。使用I/O來換取內存空間。

細節以下:

  1. 須要執行的部分,才放入內存,其餘部分放入虛擬內存;
  2. 當訪問一個再也不內存中的邏輯地址時,將產生一箇中斷;
  3. 爲了減小中斷次數,使用局部性原理,提早將程序從虛擬內存存入主存;

優點:

  1. 進程的大小能夠大於內存空間;
  2. 內存能夠運行更多的進程

 

備註:

對於進程來講,默認是可使用全部內存(包括虛存),

 

linux內存管理模塊架構:

 

 

根據以上架構咱們來看內存還作了哪些優化:

a.     頁表技術

MMU(Memory Management Unit),負責經過頁表技術將物理地址轉化爲虛擬(邏輯)地址,表現爲夥伴系統(buddy system)。

爲了提升地址變換速度,可在地址變換機構中增設一個具備並行查詢能力的特殊高速緩存存儲器,又稱爲聯想寄存器(Associative Memory)或塊表,在IBM系統中取名爲(Translation Look-aside Buffer)TLB用來存放 當前訪問的那些頁表項。

b.     Zoned buddy allocator 分區夥伴系統分配器

內核能夠直接讀取被夥伴系統從新組織過的虛擬地址內存塊,提供給進程的是頁(page)

c.      Slap allocator

夥伴系統裏基本單元可能對某些對象來講仍是太大了,形成過大的內部碎片。因此搭建slap系統,將基本單元再細分爲更小的內存單元,再分配頁,給進程使用。

 

d.     Kswapd

監控交換swap分區(虛擬內存)頁面進出。

e.     Bdflush

髒頁(dirty),由於硬盤(圖中經過buffer對接Disk Driver)的讀寫速度遠趕不上內存的速度,系統就把讀寫比較頻繁的數據事先放到內存中,以提升讀寫速度,這就叫高速緩存,linux是以頁做爲高速緩存的單位,當進程修改了高速緩存裏的數據時,該頁就被內核標記爲髒頁。

Bdflush做爲核心守護進程在合適的時間將內存中的dirty(髒頁)緩存寫到磁盤上,以保持高速緩存中的數據和磁盤中的數據是一致的。

 

hugetlbfs 特殊文件系統(大頁面文件系統)

當對象很大的時候,因爲其採用的默認頁面大小爲 4KB,於是將會產生較多 TLB Miss 和缺頁中斷,增長了尋址時間,從而大大影響應用程序的性能。所以引入大頁面系統來優化,將page單元弄得更大,好比2M。

 

內存分類:

[root@cbs1 sos]# free -h

              total        used        free      shared  buff/cache   available

Mem:            30G        573M        4.7G         90M         25G         29G

Swap:           31G        331M         31G

1.buffer和cache都是爲了解決互訪的兩種設備存在速率差別,使磁盤的IO的讀寫性能或cpu更加高效,減小進程間通訊等待的時間

2.buffer:緩衝區-用於存儲速度不一樣步的設備或優先級不一樣的設備之間傳輸數據,經過buffer能夠減小進程間通訊須要等待的時間,當存儲速度快的設備與存儲速度慢的設備進行通訊時,存儲快的設備先把數據緩存到buffer上,等到系通通一把buffer上的數據寫到速度慢的設備上。常見的有把內存的數據往磁盤進行寫操做(bdflush,這時你能夠查看一下buffers

3.cache:緩存區-用於對讀取速度比較嚴格,卻由於設備間由於存儲設備存在速度差別,而不能馬上獲取數據,這時cache就會爲了加速緩存一部分數據。常見的是CPU和內存之間的數據通訊,由於CPU的速度遠遠高於主內存的速度,CPU從內存中讀取數據需等待很長的時間,而Cache保存着CPU剛用過的數據或循環使用的部分數據,這時Cache中讀取數據會更快,減小了CPU等待的時間,提升了系統的性能。

4.shared

共享內存,顧名思義就是容許兩個不相關的進程訪問同一個邏輯內存,共享內存是兩個正在運行的進程之間共享和傳遞數據的一種很是有效的方式。

共享內存實現進程間通訊。

5. free 是真正還沒有被使用的物理內存數量。
available 是應用程序認爲可用內存數量,available = free + buffer + cache (注:只是大概的計算方法)

 

因此總的優化手段以下:

使用buffer cache緩存文件元數據(metadata)以及寫操做; 
使用page cache緩存DISK IO(文件內容); 
使用shared memory完成進程間通訊; 
使用buffer cache、arp cache和connetion tracking提高網絡IO性能。 

 

DMA/內核空間/用戶空間:

32位系統中:

內核空間(低端內存)又分爲線性區(ZONE_NORMAL)和非線性區,非線性區用來管理超過1G的高端內存(用戶空間)。

每一個區間劃分是不恆定的。不過4G內存以下劃分:

其低地址位置有16MB給DMA(ZONE_DMA),從16M到896M纔是內核能夠直接訪問的地址空間(ZONE_NORMAL),從896M到1G這段空間是預留的物理地址空間(非線性區),來管理用戶空間。

在Linux64位系統中,

低地址空間的1G內存都給了DMA,這個時候DMA的尋址能力就大大增強了;1G以上的地址空間給劃分了ZONE_NORMAL,這段空間均可以被內核直接訪問。因此在64位上,內核能夠直接訪問大於1G的內存地址,再也不須要額外的步驟,效率和性能上也大大增長。

 

Sysctl優化內存:

報錯:「Out  of  socket memory」或者「TCP:too many of orphaned sockets」

 

 

 

參考書籍:

《操做系統-精髓與設計原理》

《深刻Linux內核 架構》

《深刻理解linux內核》

參考連接:

https://blog.csdn.net/Celeste7777/article/details/49560401

http://edsionte.com/techblog/archives/4019#comments

https://www.oschina.net/translate/understanding-virtual-memory

https://www.ibm.com/developerworks/cn/linux/l-cn-hugetlb/#alloc_huge_page

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/pdf/performance_tuning_guide/Red_Hat_Enterprise_Linux-6-Performance_Tuning_Guide-zh-CN.pdf

http://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/ 
http://oss.org.cn/kernel-book/ch06/6.3.3.htm 
http://oss.org.cn/kernel-book/ch06/6.6.2.htm 
http://wiki.dzsc.com/info/6624.html 
http://www.cnblogs.com/daoluanxiaozi/archive/2012/03/12/2392281.html 
http://os.51cto.com/art/201309/411937.htm 
http://www.2cto.com/os/201407/315641.html 
http://blog.chinaunix.net/uid-11278770-id-148460.html 
http://blog.csdn.net/duqi_2009/article/details/15811693 
http://blog.chinaunix.net/uid-28236237-id-3513958.html

https://www.jianshu.com/p/2ffeb3a3aa90

https://blog.csdn.net/ysdaniel/article/details/7307091

相關文章
相關標籤/搜索