自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

操作系統(tǒng)物理內(nèi)存的組織形式

系統(tǒng) 其他OS
為了提高性能和可擴展性,后來有了一種更高級的模式,NUMA(Non-uniform memory access),非一致內(nèi)存訪問。在這種模式下,內(nèi)存不是一整塊。每個 CPU 都有自己的本地內(nèi)存,CPU 訪問本地內(nèi)存不用過總線,因而速度要快很多,每個 CPU 和內(nèi)存在一起,稱為一個 NUMA 節(jié)點。但是,在本地內(nèi)存不足的情況下,每個 CPU 都可以去另外的 NUMA 節(jié)點申請內(nèi)存,這個時候訪問延時就

由于物理地址是連續(xù)的,頁也是連續(xù)的,每個頁大小也是一樣的。因而對于任何一個地址,只要直接除一下每頁的大小,很容易直接算出在哪一頁。每個頁有一個結構 struct page 表示,這個結構也是放在一個數(shù)組里面,這樣根據(jù)頁號,很容易通過下標找到相應的 struct page 結構。

如果是這樣,整個物理內(nèi)存的布局就非常簡單、易管理,這就是最經(jīng)典的平坦內(nèi)存模型(Flat Memory Model)。

在這種模式下,CPU 也會有多個,在總線的一側。所有的內(nèi)存條組成一大片內(nèi)存,在總線的另一側,所有的 CPU 訪問內(nèi)存都要過總線,而且距離都是一樣的,這種模式稱為 SMP(Symmetric multiprocessing),即對稱多處理器。當然,它也有一個顯著的缺點,就是總線會成為瓶頸,因為數(shù)據(jù)都要走它。


為了提高性能和可擴展性,后來有了一種更高級的模式,NUMA(Non-uniform memory access),非一致內(nèi)存訪問。在這種模式下,內(nèi)存不是一整塊。每個 CPU 都有自己的本地內(nèi)存,CPU 訪問本地內(nèi)存不用過總線,因而速度要快很多,每個 CPU 和內(nèi)存在一起,稱為一個 NUMA 節(jié)點。但是,在本地內(nèi)存不足的情況下,每個 CPU 都可以去另外的 NUMA 節(jié)點申請內(nèi)存,這個時候訪問延時就會比較長。

這樣,內(nèi)存被分成了多個節(jié)點,每個節(jié)點再被分成一個一個的頁面。由于頁需要全局唯一定位,頁還是需要有全局唯一的頁號的。但是由于物理內(nèi)存不是連起來的了,頁號也就不再連續(xù)了。于是內(nèi)存模型就變成了非連續(xù)內(nèi)存模型,管理起來就復雜一些。

這里需要指出的是,NUMA 往往是非連續(xù)內(nèi)存模型。而非連續(xù)內(nèi)存模型不一定就是 NUMA,有時候一大片內(nèi)存的情況下,也會有物理內(nèi)存地址不連續(xù)的情況。

當前的主流場景,NUMA 方式。我們首先要能夠表示 NUMA 節(jié)點的概念,于是有了下面這個結構 typedef struct pglist_data pg_data_t,它里面有以下的成員變量:

每一個節(jié)點都有自己的 ID:node_id;

node_mem_map 就是這個節(jié)點的 struct page 數(shù)組,用于描述這個節(jié)點里面的所有的頁;

node_start_pfn 是這個節(jié)點的起始頁號;

node_spanned_pages 是這個節(jié)點中包含不連續(xù)的物理內(nèi)存地址的頁面數(shù);

node_present_pages 是真正可用的物理頁面的數(shù)目。

ZONE_DMA 是指可用于作 DMA(Direct Memory Access,直接內(nèi)存存?。┑膬?nèi)存。DMA 是這樣一種機制:要把外設的數(shù)據(jù)讀入內(nèi)存或把內(nèi)存的數(shù)據(jù)傳送到外設,原來都要通過 CPU 控制完成,但是這會占用 CPU,影響 CPU 處理其他事情,所以有了 DMA 模式。CPU 只需向 DMA 控制器下達指令,讓 DMA 控制器來處理數(shù)據(jù)的傳送,數(shù)據(jù)傳送完畢再把信息反饋給 CPU,這樣就可以解放 CPU。

對于 64 位系統(tǒng),有兩個 DMA 區(qū)域。除了上面說的 ZONE_DMA,還有 ZONE_DMA32。在這里你大概理解 DMA 的原理就可以,不必糾結,我們后面會講 DMA 的機制。

ZONE_NORMAL 是直接映射區(qū),就是上一節(jié)講的,從物理內(nèi)存到虛擬內(nèi)存的內(nèi)核區(qū)域,通過加上一個常量直接映射。

ZONE_HIGHMEM 是高端內(nèi)存區(qū),就是上一節(jié)講的,對于 32 位系統(tǒng)來說超過 896M 的地方,對于 64 位沒必要有的一段區(qū)域。

ZONE_MOVABLE 是可移動區(qū)域,通過將物理內(nèi)存劃分為可移動分配區(qū)域和不可移動分配區(qū)域來避免內(nèi)存碎片。

為了讓 CPU 快速訪問段描述符,在 CPU 里面有段描述符緩存。CPU 訪問這個緩存的速度比內(nèi)存快得多。同樣對于頁面來講,也是這樣的。如果一個頁被加載到 CPU 高速緩存里面,這就是一個熱頁(Hot Page),CPU 讀起來速度會快很多,如果沒有就是冷頁(Cold Page)。由于每個 CPU 都有自己的高速緩存,因而 per_cpu_pageset 也是每個 CPU 一個。

物理內(nèi)存的基本單位,頁的數(shù)據(jù)結構 struct page。這是一個特別復雜的結構,里面有很多的 union,union 結構是在 C 語言中被用于同一塊內(nèi)存根據(jù)情況保存不同類型數(shù)據(jù)的一種方式。這里之所以用了 union,是因為一個物理頁面使用模式有多種。

第一種模式,要用就用一整頁。這一整頁的內(nèi)存,或者直接和虛擬地址空間建立映射關系,我們把這種稱為匿名頁(Anonymous Page)?;蛘哂糜陉P聯(lián)一個文件,然后再和虛擬地址空間建立映射關系,這樣的文件,我們稱為內(nèi)存映射文件(Memory-mapped File)。

如果某一頁是這種使用模式,則會使用 union 中的以下變量:

struct address_space *mapping 就是用于內(nèi)存映射,如果是匿名頁,最低位為 1;如果是映射文件,最低位為 0;

pgoff_t index 是在映射區(qū)的偏移量;

atomic_t _mapcount,每個進程都有自己的頁表,這里指有多少個頁表項指向了這個頁;

struct list_head lru 表示這一頁應該在一個鏈表上,例如這個頁面被換出,就在換出頁的鏈表中;

compound 相關的變量用于復合頁(Compound Page),就是將物理上連續(xù)的兩個或多個頁看成一個獨立的大頁。

第二種模式,僅需分配小塊內(nèi)存。有時候,我們不需要一下子分配這么多的內(nèi)存,例如分配一個 task_struct 結構,只需要分配小塊的內(nèi)存,去存儲這個進程描述結構的對象。為了滿足對這種小內(nèi)存塊的需要,Linux 系統(tǒng)采用了一種被稱為 slab allocator 的技術,用于分配稱為 slab 的一小塊內(nèi)存。它的基本原理是從內(nèi)存管理模塊申請一整塊頁,然后劃分成多個小塊的存儲池,用復雜的隊列來維護這些小塊的狀態(tài)(狀態(tài)包括:被分配了 / 被放回池子 / 應該被回收)。

對于要分配比較大的內(nèi)存,例如到分配頁級別的,可以使用伙伴系統(tǒng)(Buddy System)。

Linux 中的內(nèi)存管理的“頁”大小為 4KB。把所有的空閑頁分組為 11 個頁塊鏈表,每個塊鏈表分別包含很多個大小的頁塊,有 1、2、4、8、16、32、64、128、256、512 和 1024 個連續(xù)頁的頁塊。最大可以申請 1024 個連續(xù)頁,對應 4MB 大小的連續(xù)內(nèi)存。每個頁塊的第一個頁的物理地址是該頁塊大小的整數(shù)倍。


如果有多個 CPU,那就有多個節(jié)點。每個節(jié)點用 struct pglist_data 表示,放在一個數(shù)組里面。

每個節(jié)點分為多個區(qū)域,每個區(qū)域用 struct zone 表示,也放在一個數(shù)組里面。每個區(qū)域分為多個頁。

為了方便分配,空閑頁放在 struct free_area 里面,使用伙伴系統(tǒng)進行管理和分配,每一頁用 struct page 表示。

責任編輯:武曉燕 來源: 51CTO博客
相關推薦

2022-08-03 14:21:00

Maven項目代碼

2021-10-11 08:59:35

項目代碼組織

2009-03-02 10:50:19

虛擬 項目 管理

2009-03-02 18:13:33

虛擬化虛擬管理計算機

2017-03-02 14:38:35

2022-11-28 07:21:53

操作系統(tǒng)內(nèi)存管理

2009-08-17 08:32:56

Linux操作系統(tǒng)內(nèi)存管理Linux

2010-04-20 14:17:21

Unix操作系統(tǒng)

2021-03-28 13:54:31

操作系統(tǒng)內(nèi)存管理

2012-08-13 10:19:03

IBMdW

2022-11-02 07:23:06

2018-08-09 16:12:59

操作系統(tǒng)內(nèi)存分配

2010-04-15 14:40:26

Unix操作系統(tǒng)

2009-12-09 17:25:19

Linux操作系統(tǒng)

2013-03-27 10:52:34

微軟操作系統(tǒng)西班牙開源軟件組織

2010-04-20 17:34:25

Unix操作系統(tǒng)

2021-06-11 07:26:16

操作系統(tǒng)內(nèi)存管理Cpu

2009-08-08 09:50:30

Linux操作系統(tǒng)共享內(nèi)存Linux

2025-01-13 00:30:17

2021-04-19 11:23:29

操作系統(tǒng)計算機DOS
點贊
收藏

51CTO技術棧公眾號