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


多級存儲體系

當前計算機普遍使用的存儲架構即如下圖:

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

所以可以看到我們的當前玩的內存在哪個具體位置。

 

高速緩存,可以做暫存,以便相關單元再次使用;再合適的時候,回寫進內存,比如空間不夠、周期性等

 

 

進程和內存關系

進程大小各不相同,在內存置換過程中,能否准確無誤放置於內存將成為關鍵。(詳細細節自己想,不累述)方案如下:

技術

說明

優勢

劣勢

固定分區

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

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

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

動態分區

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

沒有內部碎片;可以更充分地使用內存

由於需要壓縮外部碎片的開銷,處理器利用率低。

 

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

相鄰塊可以任意拆分組合。最初合成為一個大塊,當需要使用的時候,比如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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM