成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux 是如何進行內存分配的

系統 Linux
在 Linux 操作系統中,虛擬地址空間的內部又被分為內核空間和用戶空間兩部分,不同位數的系統,地址空間的范圍也不同。比如最常見的 32 位和 64 位系統。

虛擬內存管理回顧

在 Linux 操作系統中,虛擬地址空間的內部又被分為內核空間和用戶空間兩部分,不同位數的系統,地址空間的范圍也不同。比如最常見的 32 位和 64 位系統,如下所示

通過這里可以看出:

  • 32 位系統的內核空間占用 1G,位于最高處,剩下的 3G 是用戶空間;
  • 64 位系統的內核空間和用戶空間都是 128T,分別占據整個內存空間的最高和最低處,剩下的中間部分是未定義的。

再來說說,內核空間與用戶空間的區別:

  • 進程在用戶態時,只能訪問用戶空間內存;
  • 只有進入內核態后,才可以訪問內核空間的內存;

雖然每個進程都各自有獨立的虛擬內存,但是每個虛擬內存中的內核地址,其實關聯的都是相同的物理內存。這樣,進程切換到內核態后,就可以很方便地訪問內核空間內存。

我們看看用戶空間分布的情況,以 32 位系統:

通過這張圖你可以看到,用戶空間內存,從低到高分別是 6 種不同的內存段:

  • 0x0000 0000 到 0x0804 8000 這段虛擬內存地址是一段不可訪問的保留區,因為在大多數操作系統中,數值比較小的地址通常被認為不是一個合法的地址,這塊小地址是不允許訪問的。比如在 C 語言中我們通常會將一些無效的指針設置為 NULL,指向這塊不允許訪問的地址。
  • 代碼段,包括二進制可執行代碼;
  • 數據段,包括已初始化的靜態常量和全局變量;
  • BSS 段,包括未初始化的靜態變量和全局變量;
  • 堆段,包括動態分配的內存,從低地址開始向上增長;
  • 堆空間的上邊是一段待分配區域,用于擴展堆空間的使用
  • 文件映射段,包括動態庫、共享內存等,從低地址開始向上增長
  • 棧段,包括局部變量和函數調用的上下文等。棧的大小是固定的,一般是 8 MB。當然系統也提供了參數,以便我們自定義大小;

申請內存的兩種方式

申請內存空間一般就兩種方法,一種是malloc,另一種是 mmap映射空間。 在使用malloc()分配內存的時候,可能系統調用brk(),也可能調用mmap()。

malloc的調用規律

1. 即分配一塊小型內存(小于或等于128kb),malloc()會調用brk 函數將 堆頂 指針向高地址移動,獲得新的內存空間。

2. 當分配一塊大型內存(大于128kb),mmap() 系統調用中「私有匿名映射」的方式,在文件映射區分配一塊內存

申請內存過程圖

要注意的是,malloc() 分配的是虛擬內存。

如果分配后的虛擬內存沒有被訪問的話,虛擬內存是不會映射到物理內存的,這樣就不會占用物理內存了。

只有在訪問已分配的虛擬地址空間的時候,操作系統通過查找頁表,發現虛擬內存對應的頁沒有在物理內存中,就會觸發缺頁中斷,然后操作系統會建立虛擬內存和物理內存之間的映射關系。

缺頁中斷就是要訪問的頁不在主存,需要操作系統將其調入主存后再進行訪問。在這個時候,被內存映射的文件實際上成了一個分頁交換文件。

malloc 申請的內存,free 釋放內存會歸還給操作系統嗎

  • malloc 通過 brk() 方式申請的內存,free 釋放內存的時候,并不會把內存歸還給操作系統,而是緩存在 malloc 的內存池中,待下次使用;
  • malloc 通過 mmap() 方式申請的內存,free 釋放內存的時候,會把內存歸還給操作系統,內存得到真正的釋放。

mmap 和 brk 分配內存的區別

mmap 來分配內存的問題

mmap 分配的內存每次釋放的時候,都會歸還給操作系統,于是每次 mmap 分配的虛擬地址都是缺頁狀態的,然后在第一次訪問該虛擬地址的時候,就會觸發缺頁中斷。

也就是說,頻繁通過 mmap 分配的內存話,不僅每次都會發生運行態的切換,還會發生缺頁中斷(在第一次訪問虛擬地址后),這樣會導致 CPU 消耗較大。

為了改進這兩個問題,malloc 通過 brk() 系統調用在堆空間申請內存的時候,由于堆空間是連續的,所以直接預分配更大的內存來作為內存池,當內存釋放的時候,就緩存在內存池中。

等下次在申請內存的時候,就直接從內存池取出對應的內存塊就行了,而且可能這個內存塊的虛擬地址與物理地址的映射關系還存在,這樣不僅減少了系統調用的次數,也減少了缺頁中斷的次數,這將大大降低 CPU 的消耗。

只使用 brk 來分配內存的問題

前面我們提到通過 brk 從堆空間分配的內存,并不會歸還給操作系統,那么我們那考慮這樣一個場景。

如果我們連續申請了 10k,20k,30k 這三片內存,如果 10k 和 20k 這兩片釋放了,變為了空閑內存空間,如果下次申請的內存小于 30k,那么就可以重用這個空閑內存空間。

但是如果下次申請的內存大于 30k,沒有可用的空閑內存空間,必須向 OS 申請,實際使用內存繼續增大。

因此,隨著系統頻繁地 malloc 和 free ,尤其對于小塊內存,堆內將產生越來越多不可用的碎片,導致“內存泄露”。而這種“泄露”現象使用 valgrind 是無法檢測出來的。

所以,malloc 實現中,充分考慮了 brk 和 mmap 行為上的差異及優缺點,默認分配大塊內存 (128KB) 才使用 mmap 分配內存空間。


責任編輯:華軒 來源: 今日頭條
相關推薦

2020-10-26 08:24:09

內網信息收集滲透測試

2020-10-28 07:09:13

內網信息收集

2010-03-17 17:19:29

Python數據結構

2013-04-15 17:55:12

Windows認證安全認證

2013-04-16 10:33:58

Windows 安全認微軟

2010-07-21 14:17:07

Linux telne

2024-05-08 08:16:11

2020-08-06 00:14:16

Spring IoC依賴注入開發

2019-02-28 14:04:28

內存固定分配存儲

2011-09-15 11:31:21

linux軟件倉庫

2011-08-22 12:05:50

Linux

2020-07-28 08:10:33

Linux內存虛擬

2011-08-16 17:19:59

linux加密分區

2014-09-19 10:46:36

LuaCC++

2024-12-27 09:21:58

2020-02-12 08:50:05

Linux命令啟動時間

2021-03-15 10:23:44

IT支出技術投資CIO

2020-04-06 14:50:43

MySQLSQL數據庫

2024-05-13 11:12:08

FO-DICOM開源應用開發

2021-08-30 06:59:07

x86處理器內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠亚洲 | 国产激情视频网站 | 国产精品久久国产精品久久 | 一区二区三区av | h视频免费在线观看 | 夜夜撸av | 亚洲一区二区三区四区五区中文 | 精品一区二区三区在线视频 | 日本久久福利 | 国产乱码精品一区二区三区五月婷 | 午夜久久久久 | 一区二区三区亚洲精品国 | 色视频网站 | 国产美女自拍视频 | 精品国产乱码一区二区三 | 韩日三级 | 精品欧美一区二区三区久久久 | 国产成人精品久久二区二区91 | 97中文视频 | 国产高清免费视频 | 成人精品视频 | 日韩人体在线 | 黄色网址在线免费观看 | 久久99国产精品 | 国产一区不卡 | 亚洲一区二区视频在线播放 | 国产精品一区二区久久精品爱微奶 | av一区二区三区 | 手机看片169 | 日韩中文字幕 | av播播 | 成年人在线观看 | 欧美日韩在线高清 | 国产日韩欧美一区二区 | 国产玖玖| 日韩在线一区二区三区 | 欧美日韩看片 | 国产精品区二区三区日本 | 欧美国产日韩一区二区三区 | 欧美日韩成人在线观看 | 欧美精品91 |